OSDN Git Service

1.52.1.658
[gikonavigoeson/gikonavi.git] / Giko.pas
1 unit Giko;
2
3 interface
4
5 uses
6         Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
7         OleCtrls,       ComCtrls, ExtCtrls, Menus, StdCtrls, MMSystem, DateUtils,
8 {$IF Defined(DELPRO) }
9         SHDocVw,
10         MSHTML,
11 {$ELSE}
12         SHDocVw_TLB,
13         MSHTML_TLB,
14 {$IFEND}
15         IdHTTP, ActiveX, ActnList, ImgList,
16         ToolWin, Buttons, IdComponent, UrlMon, Tabs, IdGlobal, StrUtils,
17         CommCtrl, Dialogs, GikoSystem, Setting, BoardGroup, ThreadControl, ItemDownload,
18         Editor, RoundData, GikoPanel, Favorite, HTMLDocumentEvent,
19         HintWindow, GikoCoolBar, GikoListView, Search, ExternalBoardManager,
20         ExternalBoardPlugInMain, StdActns, Variants, ExtActns,IdTCPConnection,
21         IdBaseComponent, IdTCPClient, AppEvnts, BrowserRecord;
22
23 const
24         NGWORDNAME_PANEL = 3;
25         THREADSIZE_PANEL = 2;
26         
27 type
28         TGikoTreeType = (gttNone, gtt2ch, gttHistory, gttFavorite);
29         TToolBarSettingSenderType = (tssNone, tssMain, tssList, tssBrowser);
30         TMinimizeType = (mtNone, mtMinimizing, mtMinimized);
31         TResizeType = (rtNone, rtResizing);
32
33 //      TBrowserRecord = class;
34
35         TGikoForm = class(TForm)
36                 StatusBar: TStatusBar;
37                 MainPanel: TPanel;
38                 ClientPanel: TPanel;
39                 TreeSplitter: TSplitter;
40                 CabinetPanel: TPanel;
41                 TreeView: TTreeView;
42                 ThreadMainPanel: TPanel;
43                 ListSplitter: TSplitter;
44                 ViewPanel: TPanel;
45                 ListView: TGikoListView;
46                 ThreadPanel: TPanel;
47                 MessagePanel: TPanel;
48                 MessageBar: TPanel;
49                 MessageHideButton: TSpeedButton;
50                 MessageListView: TListView;
51                 MessageSplitter: TSplitter;
52                 Panel3: TPanel;
53     CabinetCloseSpeedButton: TSpeedButton;
54                 ToolBar1: TToolBar;
55                 CabinetSelectToolButton: TToolButton;
56                 HistoryToolBar: TToolBar;
57     HistoryShowToolButton: TToolButton;
58     HistoryAllClearToolButton: TToolButton;
59                 ItemIcon16: TImageList;
60                 ItemIcon32: TImageList;
61                 HotToobarImageList: TImageList;
62                 ItemImageList: TImageList;
63                 MainMenu: TMainMenu;
64                 FileMenu: TMenuItem;
65                 DeleteMenu: TMenuItem;
66                 ExitMenu: TMenuItem;
67                 KidokuMenu: TMenuItem;
68                 MidokuMenu: TMenuItem;
69                 AllSelectMenu: TMenuItem;
70                 ViewMenu: TMenuItem;
71                 StdToolBarMenu: TMenuItem;
72                 CabinetMenu: TMenuItem;
73                 H1: TMenuItem;
74                 N4: TMenuItem;
75                 CabinetVisibleMenu: TMenuItem;
76                 MessageMenu: TMenuItem;
77                 StatusBarMenu: TMenuItem;
78                 MMSep03: TMenuItem;
79                 LargeIconMenu: TMenuItem;
80                 SmallIconMenu: TMenuItem;
81                 ListMenu: TMenuItem;
82                 DetailMenu: TMenuItem;
83                 ToolMenu: TMenuItem;
84                 Find1: TMenuItem;
85                 RoundMenu: TMenuItem;
86                 MMSep04: TMenuItem;
87                 OptionMenu: TMenuItem;
88                 HelpMenu: TMenuItem;
89                 G1: TMenuItem;
90                 N1: TMenuItem;
91                 AboutMenu: TMenuItem;
92                 BrowserPopupMenu: TPopupMenu;
93                 ShowThreadMenu: TMenuItem;
94                 ShowBoardMenu: TMenuItem;
95                 ListIconPopupMenu: TPopupMenu;
96                 LargeIconPMenu: TMenuItem;
97                 SmallIconPMenu: TMenuItem;
98                 ListPMenu: TMenuItem;
99                 DetailPMenu: TMenuItem;
100                 ClosePopupMenu: TPopupMenu;
101                 CloseMenu: TMenuItem;
102                 U1: TMenuItem;
103                 N3: TMenuItem;
104                 B1: TMenuItem;
105                 S1: TMenuItem;
106                 N2: TMenuItem;
107                 A1: TMenuItem;
108                 L1: TMenuItem;
109                 N5: TMenuItem;
110                 S2: TMenuItem;
111                 ListPopupMenu: TPopupMenu;
112                 ListRoundPMenu: TMenuItem;
113                 ListReservPMenu: TMenuItem;
114                 LPMSep01: TMenuItem;
115                 ItemRoundPMenu: TMenuItem;
116                 LPMSep02: TMenuItem;
117                 KidokuPMenu: TMenuItem;
118                 MidokuPMenu: TMenuItem;
119                 AllSelectPMenu: TMenuItem;
120                 UrlCopyPMenu: TMenuItem;
121                 LPMSep05: TMenuItem;
122                 DeletePMenu: TMenuItem;
123                 LPMSep06: TMenuItem;
124                 ViewPMenu: TMenuItem;
125                 LargeIconLPMenu: TMenuItem;
126                 SmallIconLPMenu: TMenuItem;
127                 ListLPMenu: TMenuItem;
128                 DetailLPMenu: TMenuItem;
129                 T1: TMenuItem;
130                 B2: TMenuItem;
131                 N8: TMenuItem;
132                 URLC1: TMenuItem;
133                 N9: TMenuItem;
134                 N10: TMenuItem;
135                 G2: TMenuItem;
136                 N11: TMenuItem;
137                 T3: TMenuItem;
138                 L2: TMenuItem;
139                 N12: TMenuItem;
140                 K1: TMenuItem;
141                 N13: TMenuItem;
142                 N14: TMenuItem;
143                 R1: TMenuItem;
144                 A2: TMenuItem;
145                 N15: TMenuItem;
146                 KokoPopupMenu: TPopupMenu;
147                 KokomadePMenu: TMenuItem;
148                 AllPMenu: TMenuItem;
149                 MenuItem1: TMenuItem;
150                 MenuItem2: TMenuItem;
151                 BrowserTabPopupMenu: TPopupMenu;
152                 Close1: TMenuItem;
153                 A3: TMenuItem;
154                 N16: TMenuItem;
155                 A4: TMenuItem;
156                 TreePopupMenu: TPopupMenu;
157                 TreeSelectThreadPupupMenu: TMenuItem;
158                 TreeSelectBoardPupupMenu: TMenuItem;
159                 TPMSep01: TMenuItem;
160                 TreeSelectURLPupupMenu: TMenuItem;
161                 T2: TMenuItem;
162                 L3: TMenuItem;
163                 B3: TMenuItem;
164                 BrowserBottomPanel: TGikoPanel;
165                 CabinetSelectPopupMenu: TPopupMenu;
166                 H2: TMenuItem;
167                 ItemReservPMenu: TMenuItem;
168                 RoundNamePopupMenu: TPopupMenu;
169                 N7: TMenuItem;
170                 B4: TMenuItem;
171                 L4: TMenuItem;
172                 K2: TMenuItem;
173                 A5: TMenuItem;
174                 A6: TMenuItem;
175                 C1: TMenuItem;
176                 V1: TMenuItem;
177                 N19: TMenuItem;
178                 D1: TMenuItem;
179                 D2: TMenuItem;
180                 MessageImageList: TImageList;
181                 ProgressBar: TProgressBar;
182                 URL1: TMenuItem;
183                 NameUrlCopyPMenu: TMenuItem;
184                 URLC2: TMenuItem;
185                 URLN1: TMenuItem;
186                 N21: TMenuItem;
187                 URLC3: TMenuItem;
188                 URLN2: TMenuItem;
189                 N23: TMenuItem;
190                 ListCoolBar: TGikoCoolBar;
191                 ListToolBar: TToolBar;
192                 BrowserCoolBar: TGikoCoolBar;
193                 BrowserToolBar: TToolBar;
194                 ToolButton3: TToolButton;
195                 ToolButton9: TToolButton;
196                 ToolButton11: TToolButton;
197                 ToolButton5: TToolButton;
198                 ListNameToolBar: TToolBar;
199                 ListNameLabel: TLabel;
200                 FolderImage: TImage;
201                 BrowserNameToolBar: TToolBar;
202                 ItemBoardImage: TImage;
203                 BrowserBoardNameLabel: TLabel;
204                 ItemImage: TImage;
205                 BrowserNameLabel: TLabel;
206                 D3: TMenuItem;
207                 N25: TMenuItem;
208                 N26: TMenuItem;
209                 D4: TMenuItem;
210                 S3: TMenuItem;
211                 R2: TMenuItem;
212                 TreeSelectNameURLPupupMenu: TMenuItem;
213                 N27: TMenuItem;
214                 H3: TMenuItem;
215                 I1: TMenuItem;
216                 BrowserTabToolBar: TToolBar;
217                 BrowserTab: TTabControl;
218                 About1: TMenuItem;
219                 N28: TMenuItem;
220                 S4: TMenuItem;
221                 N29: TMenuItem;
222                 N30: TMenuItem;
223                 N31: TMenuItem;
224                 L5: TMenuItem;
225                 L6: TMenuItem;
226                 A7: TMenuItem;
227                 R3: TMenuItem;
228                 FavoriteMenu: TMenuItem;
229                 N32: TMenuItem;
230                 BoardFavoriteAddMenu: TMenuItem;
231                 ThreadFavoriteAddMenu: TMenuItem;
232                 N33: TMenuItem;
233                 TreeSelectFavoriteAddPupupMenu: TMenuItem;
234                 FavoriteTreeView: TTreeView;
235                 StateIconImageList: TImageList;
236                 TopPanel: TPanel;
237                 TopRightPanel: TPanel;
238                 AnimePanel: TPanel;
239                 Animate: TAnimate;
240                 TopCoolPanel: TPanel;
241                 MainCoolBar: TGikoCoolBar;
242                 MenuToolBar: TToolBar;
243                 StdToolBar: TToolBar;
244                 AddressToolBar: TToolBar;
245                 AddressComboBox: TComboBox;
246                 MoveToToolButton: TToolButton;
247                 AddressImageList: TImageList;
248                 AddressToolBarMenu: TMenuItem;
249                 T4: TMenuItem;
250                 Show1: TMenuItem;
251                 N34: TMenuItem;
252                 T5: TMenuItem;
253                 B5: TMenuItem;
254                 N35: TMenuItem;
255                 A8: TMenuItem;
256                 U2: TMenuItem;
257                 F1: TMenuItem;
258                 PreviewTimer: TTimer;
259                 MonazillaWebPageAction1: TMenuItem;
260                 N36: TMenuItem;
261                 H4: TMenuItem;
262                 K3: TMenuItem;
263                 L7: TMenuItem;
264                 N37: TMenuItem;
265                 A9: TMenuItem;
266                 ChevronPopupMenu: TPopupMenu;
267                 N2N1: TMenuItem;
268                 N38: TMenuItem;
269                 F2: TMenuItem;
270                 LinkToolBar: TToolBar;
271                 a10: TMenuItem;
272                 N39: TMenuItem;
273                 T6: TMenuItem;
274                 N40: TMenuItem;
275                 LinkBarPopupMenu: TPopupMenu;
276                 T7: TMenuItem;
277                 ThreadPopupMenu: TPopupMenu;
278                 MenuItem4: TMenuItem;
279                 MenuItem5: TMenuItem;
280                 MenuItem6: TMenuItem;
281                 T8: TMenuItem;
282                 URLN3: TMenuItem;
283                 SelectItemNameCopyAction1: TMenuItem;
284                 B6: TMenuItem;
285                 T9: TMenuItem;
286                 C2: TMenuItem;
287                 SelectComboBox: TComboBox;
288                 MainCoolBarPopupMenu: TPopupMenu;
289                 StdToolBarVisiblePMenu: TMenuItem;
290                 AddressToolBarVisiblePMenu: TMenuItem;
291                 LinkToolBarVisiblePMenu: TMenuItem;
292                 NG1: TMenuItem;
293                 NG2: TMenuItem;
294                 N43: TMenuItem;
295                 N44: TMenuItem;
296                 L9: TMenuItem;
297                 I3: TMenuItem;
298                 N45: TMenuItem;
299                 B9: TMenuItem;
300                 R5: TMenuItem;
301                 T12: TMenuItem;
302                 Show3: TMenuItem;
303                 N46: TMenuItem;
304                 T13: TMenuItem;
305                 B10: TMenuItem;
306                 N47: TMenuItem;
307                 A12: TMenuItem;
308                 U4: TMenuItem;
309                 F4: TMenuItem;
310                 N48: TMenuItem;
311                 T14: TMenuItem;
312                 ToolButton16: TToolButton;
313                 N50: TMenuItem;
314                 A11: TMenuItem;
315                 S5: TMenuItem;
316                 Reload: TMenuItem;
317                 GoBack: TMenuItem;
318                 GoFoward: TMenuItem;
319                 IndividualAbon1: TMenuItem;
320                 N41: TMenuItem;
321                 IndividualAbon2: TMenuItem;
322     AntiIndivAbonMenuItem: TMenuItem;
323                 AntiIndividualAbon: TMenuItem;
324                 N49: TMenuItem;
325                 N51: TMenuItem;
326                 N52: TMenuItem;
327                 SearchBoardName: TMenuItem;
328     TreeSelectLogDeleteSeparator: TMenuItem;
329                 N54: TMenuItem;
330                 A13: TMenuItem;
331                 FavoriteTreePopupMenu: TPopupMenu;
332                 FavoriteTreeRenamePopupMenu: TMenuItem;
333                 FavoriteTreeNewFolderPopupMenu: TMenuItem;
334                 N56: TMenuItem;
335                 FavoriteTreeDeletePopupMenu: TMenuItem;
336                 FavoriteToolBar: TToolBar;
337     FavoriteAddToolButton: TToolButton;
338     FavoriteArrangeToolButton: TToolButton;
339                 FavoriteTreeBrowseFolderPopupMenu: TMenuItem;
340                 N57: TMenuItem;
341                 FavoriteTreeReloadPopupMenu: TMenuItem;
342                 N58: TMenuItem;
343                 FavoriteTreeURLCopyPopupMenu: TMenuItem;
344                 FavoriteTreeNameCopyPopupMenu: TMenuItem;
345                 FavoriteTreeLogDeletePopupMenu: TMenuItem;
346                 N59: TMenuItem;
347                 FavoriteTreeNameURLCopyPopupMenu: TMenuItem;
348                 ToolButton20: TToolButton;
349                 N60: TMenuItem;
350                 ExportFavoriteFileAction1: TMenuItem;
351                 N6: TMenuItem;
352                 N17: TMenuItem;
353     N18: TMenuItem;
354     N20: TMenuItem;
355         N24: TMenuItem;
356     N62: TMenuItem;
357         N61: TMenuItem;
358         N63: TMenuItem;
359     N64: TMenuItem;
360     dummy1: TMenuItem;
361         TreeSelectLogDeletePopupMenu: TMenuItem;
362         N65: TMenuItem;
363     BBSSelectPopupMenu: TPopupMenu;
364                 PlugInMenu: TMenuItem;
365         TreeSelectNamePupupMenu: TMenuItem;
366     BrowserPanel: TPanel;
367         SelectTimer: TTimer;
368     SelectThreadSave: TMenuItem;
369     N55: TMenuItem;
370     N66: TMenuItem;
371     dat1: TMenuItem;
372                 OpenLogFolder: TMenuItem;
373     Browser: TWebBrowser;
374     TabSave: TMenuItem;
375         TabOpen: TMenuItem;
376     ResRangePopupMenu: TPopupMenu;
377     ResRangeHundPMenuItem: TMenuItem;
378     ResRangeKokoPMenuItem: TMenuItem;
379     ResRangeNewPMenuItem: TMenuItem;
380     ResRangeAllPMenuItem: TMenuItem;
381         BrowsBoradHeadAction1: TMenuItem;
382     ThreadRangePopupMenu: TPopupMenu;
383     A15: TMenuItem;
384     L8: TMenuItem;
385         N67: TMenuItem;
386     N68: TMenuItem;
387     S6: TMenuItem;
388     N69: TMenuItem;
389     ResRangeSelectPMenuItem: TMenuItem;
390     ListColumnPopupMenu: TPopupMenu;
391     N70: TMenuItem;
392     ID1: TMenuItem;
393     ID2: TMenuItem;
394     N53: TMenuItem;
395     ID3: TMenuItem;
396     N71: TMenuItem;
397     N72: TMenuItem;
398     N73: TMenuItem;
399     SelectComboBoxPanel: TPanel;
400     SelectComboBoxSplitter: TImage;
401         ToolButton1: TToolButton;
402     N74: TMenuItem;
403     WikiFAQ: TMenuItem;
404     GikoApplicationEvents: TApplicationEvents;
405     N22: TMenuItem;
406     N42: TMenuItem;
407     DAT2: TMenuItem;
408     N75: TMenuItem;
409     DAT3: TMenuItem;
410     N76: TMenuItem;
411     FavoriteTreeItemNameCopyPopupMenu: TMenuItem;
412                                 procedure FormCreate(Sender: TObject);
413                 procedure FormDestroy(Sender: TObject);
414                 procedure BrowserStatusTextChange(Sender: TObject;
415                         const Text: WideString);
416                 procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
417                 procedure TreeViewChanging(Sender: TObject; Node: TTreeNode;
418                         var AllowChange: Boolean);
419                 procedure ListViewKeyDown(Sender: TObject; var Key: Word;
420                         Shift: TShiftState);
421                 procedure ListViewColumnClick(Sender: TObject; Column: TListColumn);
422                 procedure MenuToolBarCustomDrawButton(Sender: TToolBar;
423                         Button: TToolButton; State: TCustomDrawState;
424                         var DefaultDraw: Boolean);
425                 procedure BrowserBeforeNavigate2(Sender: TObject;
426                         const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
427                         Headers: OleVariant; var Cancel: WordBool);
428                 procedure TreeViewCustomDraw(Sender: TCustomTreeView;
429                         const ARect: TRect; var DefaultDraw: Boolean);
430                 procedure TreeViewCustomDrawItem(Sender: TCustomTreeView;
431                         Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
432                 procedure TreeViewExpanded(Sender: TObject; Node: TTreeNode);
433                 procedure ListViewCustomDraw(Sender: TCustomListView;
434                         const ARect: TRect; var DefaultDraw: Boolean);
435                 procedure ListViewMouseDown(Sender: TObject; Button: TMouseButton;
436                         Shift: TShiftState; X, Y: Integer);
437                 procedure TreeViewCollapsed(Sender: TObject; Node: TTreeNode);
438                 procedure MessageListViewResize(Sender: TObject);
439                 procedure       CabinetVisible( isVisible : Boolean );
440                 procedure FormResize(Sender: TObject);
441                 procedure ListPopupMenuPopup(Sender: TObject);
442                 procedure TreePopupMenuPopup(Sender: TObject);
443                 procedure BrowserNewWindow2(Sender: TObject; var ppDisp: IDispatch;
444                         var Cancel: WordBool);
445                 procedure ListSplitterMoved(Sender: TObject);
446                 procedure BrowserTabChange(Sender: TObject);
447                 procedure BrowserTabMouseDown(Sender: TObject; Button: TMouseButton;
448                         Shift: TShiftState; X, Y: Integer);
449                 procedure BrowserTabDragOver(Sender, Source: TObject; X, Y: Integer;
450                         State: TDragState; var Accept: Boolean);
451                 procedure BrowserTabDragDrop(Sender, Source: TObject; X, Y: Integer);
452                 procedure BrowserTabMouseMove(Sender: TObject; Shift: TShiftState; X,
453                         Y: Integer);
454                 procedure BrowserDocumentComplete(Sender: TObject;
455                         const pDisp: IDispatch; var URL: OleVariant);
456                 procedure RoundNamePopupMenuPopup(Sender: TObject);
457                 procedure FormShow(Sender: TObject);
458                 procedure BrowserTabToolBarResize(Sender: TObject);
459                 procedure FavoriteMenuClick(Sender: TObject);
460                 procedure MainCoolBarResize(Sender: TObject);
461                 procedure AddressToolBarResize(Sender: TObject);
462                 procedure AddressComboBoxKeyDown(Sender: TObject; var Key: Word;
463                         Shift: TShiftState);
464                 procedure BrowserEnter(Sender: TObject);
465                 procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean);
466                 procedure PreviewTimerTimer(Sender: TObject);
467                 procedure MessageHideButtonClick(Sender: TObject);
468                 procedure HistoryAllClearToolButtonClick(Sender: TObject);
469                 procedure MainCoolBarBandInfo(Sender: TObject;
470                         var BandInfo: PReBarBandInfoA);
471                 procedure MainCoolBarChevronClick(Sender: TObject;
472                         RebarChevron: PNMRebarChevron);
473                 procedure ListCoolBarBandInfo(Sender: TObject;
474                         var BandInfo: PReBarBandInfoA);
475                 procedure ListCoolBarChevronClick(Sender: TObject;
476                         RebarChevron: PNMRebarChevron);
477                 procedure BrowserCoolBarBandInfo(Sender: TObject;
478                         var BandInfo: PReBarBandInfoA);
479                 procedure BrowserCoolBarChevronClick(Sender: TObject;
480                         RebarChevron: PNMRebarChevron);
481                 procedure ListViewColumnInfo(Sender: TObject; var Column: PLVColumnA);
482                 procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
483                         WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
484                 procedure SelectComboBoxChange(Sender: TObject);
485                 procedure SelectComboBoxKeyDown(Sender: TObject; var Key: Word;
486                         Shift: TShiftState);
487                 procedure SelectComboBoxExit(Sender: TObject);
488                 procedure SelectComboBoxSplitterMouseMove(Sender: TObject;
489                         Shift: TShiftState; X, Y: Integer);
490                 procedure SelectComboBoxSplitterMouseDown(Sender: TObject;
491                         Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
492                 procedure SelectComboBoxSplitterMouseUp(Sender: TObject;
493                         Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
494                 procedure StatusBarResize(Sender: TObject);
495                 procedure SelectComboBoxEnter(Sender: TObject);
496                 procedure FavoriteTreeViewDragDrop(Sender, Source: TObject; X,
497                         Y: Integer);
498                 procedure FavoriteTreeViewDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
499                 procedure FavoriteTreeViewEdited(Sender: TObject; Node: TTreeNode;
500                         var S: String);
501                 procedure FavoriteTreeViewKeyDown(Sender: TObject; var Key: Word;
502                         Shift: TShiftState);
503                 procedure FavoriteTreePopupMenuPopup(Sender: TObject);
504                 procedure LinkToolBarDragDrop(Sender, Source: TObject; X, Y: Integer);
505                 procedure BrowserTabMouseUp(Sender: TObject; Button: TMouseButton;
506                         Shift: TShiftState; X, Y: Integer);
507                 procedure LinkToolBarDragOver(Sender, Source: TObject; X, Y: Integer;
508                         State: TDragState; var Accept: Boolean);
509                 procedure FavoriteTreeViewEndDrag(Sender, Target: TObject; X,
510                         Y: Integer);
511                 procedure ListCoolBarContextPopup(Sender: TObject; MousePos: TPoint;
512                         var Handled: Boolean);
513                 procedure MainCoolBarContextPopup(Sender: TObject; MousePos: TPoint;
514                         var Handled: Boolean);
515                 procedure BrowserCoolBarContextPopup(Sender: TObject; MousePos: TPoint;
516                         var Handled: Boolean);
517                 procedure FavoriteTreeBrowseBoardPopupMenuClick(Sender: TObject);
518     procedure BrowserTabContextPopup(Sender: TObject; MousePos: TPoint;
519       var Handled: Boolean);
520     procedure BrowserTabPopupMenuPopup(Sender: TObject);
521     procedure BrowserTabResize(Sender: TObject);
522     procedure TreeViewKeyDown(Sender: TObject; var Key: Word;
523       Shift: TShiftState);
524     procedure FavoriteTreeViewMouseDown(Sender: TObject;
525                         Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
526     procedure MessagePanelResize(Sender: TObject);
527                 procedure OnResized;
528         procedure SelectTimerTimer(Sender: TObject);
529                 procedure ListViewColumnRightClick(Sender: TObject;
530       Column: TListColumn; Point: TPoint);
531         procedure ListViewCustomDrawItem(Sender: TCustomListView;
532       Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
533     procedure FormActivate(Sender: TObject);
534     procedure BrowserPanelResize(Sender: TObject);
535     procedure MenuToolBarResize(Sender: TObject);
536     procedure ListToolBarResize(Sender: TObject);
537     procedure BrowserToolBarResize(Sender: TObject);
538         procedure KokoPopupMenuPopup(Sender: TObject);
539         procedure ListViewKeyUp(Sender: TObject; var Key: Word;
540           Shift: TShiftState);
541     procedure FavoriteTreeViewEditing(Sender: TObject; Node: TTreeNode;
542       var AllowEdit: Boolean);
543         procedure CabinetCloseSpeedButtonClick(Sender: TObject);
544     procedure FavoriteArrangeToolButtonClick(Sender: TObject);
545     procedure GikoApplicationEventsMessage(var Msg: tagMSG;
546           var Handled: Boolean);
547     procedure GikoApplicationEventsDeactivate(Sender: TObject);
548     procedure GikoApplicationEventsException(Sender: TObject; E: Exception);
549     procedure TreeViewMouseDown(Sender: TObject; Button: TMouseButton;
550       Shift: TShiftState; X, Y: Integer);
551     procedure GetResURLMenuClick(Sender: TObject);
552         private
553                 { Private \90é\8c¾ }
554                 FEnabledCloseButton: Boolean;
555                 FClickNode: TTreeNode;
556                 FHttpState: Boolean;
557                 FHint: TResPopup;
558                 FPreviewBrowser: TWebBrowser;
559                 FPreviewURL: string;
560                 FBrowserSizeHeight: Integer;
561                 FBrowserSizeWidth: Integer;
562                 FTabHintIndex: Integer;
563                 FListStyle: TViewStyle;                         //\83\8a\83X\83g\83A\83C\83R\83\93\83X\83^\83C\83\8b
564                 FItemNoVisible: Boolean;                        //\83\8a\83X\83g\94Ô\8d\86\95\\8e¦\83t\83\89\83O
565                 FViewType: TGikoViewType;                       //\83\8a\83X\83g\83A\83C\83e\83\80\95\\8e¦\83^\83C\83v
566                 FActiveList: TObject;
567                 FActiveContent: TBrowserRecord; //
568                 FActiveBBS : TBBS;
569                 FHistoryList: TList;                                    //\83q\83X\83g\83\8a\83\8a\83X\83g
570                 FTreeType: TGikoTreeType;
571                 FWorkCount: Integer;
572                 FNameCookie: string;
573                 FMailCookie: string;
574                 FDownloadTitle: string;                         //\83_\83E\83\93\83\8d\81[\83h\92\86\82Ì\83^\83C\83g\83\8b\96¼
575                 FDownloadMax: Integer;                          //\83_\83E\83\93\83\8d\81[\83h\92\86\82Ì\8dÅ\91å\83T\83C\83Y
576                 FEvent: THTMLDocumentEventSink;//\83u\83\89\83E\83U\83h\83L\83\85\83\81\83\93\83g\83C\83x\83\93\83g
577                 IsDraggingSelectComboBox : Boolean;
578                 DraggingSelectComboBoxPosition : TPoint;
579                 FSearchDialog: TSearchDialog;
580                 FDropSpaceNode: TTreeNode;
581                 FDragTime : Cardinal;                                                           ///< \83\8a\83\93\83N\82ÌD&D\97p
582                 FDragButton : TToolButton;                                      ///< \83\8a\83\93\83N\82ÌD&D\97p\82ÉDrag\82µ\82Ä\82éButton\95Û\91
583                 FDragWFirst : Boolean;                                                  ///< WebTab\82ÌD&D\97p
584                 FListViewBackGroundColor : TColor;      ///< ListView\82ÌBackGroundColor
585                 FUseOddResOddColor : Boolean;                   ///< \8eæ\93¾\83\8c\83X\90\94\82Æ\83X\83\8c\83b\83h\82Ì\83\8c\83X\90\94\82ª\88á\82Á\82½\82Æ\82«\82É\91¼\82Ì\90F\82Å\95\\8e¦
586                 FOddColor : TColor;                                                                     ///< \82»\82Ì\90F
587                 FSelectResWord  : string;                                               ///< \83\8c\83X\8di\8d\9e\83\8f\81[\83h
588                 FIsIgnoreResize : TResizeType;                  ///< \83\8a\83T\83C\83Y\83C\83x\83\93\83g\82ð\96³\8e\8b\82·\82é\82©\82Ç\82¤\82©
589                 FIsMinimize                     : TMinimizeType;                ///< \8dÅ\8f¬\89»\82µ\82Ä\82¢\82é\8dÅ\92\86\82©
590                 FOldFormWidth           : Integer;                                      ///< \92¼\91O\82Ì\83E\83B\83\93\83h\83E\82Ì\95\9d
591                 FToolBarSettingSender : TToolBarSettingSenderType;      ///< \83c\81[\83\8b\83o\81[\90Ý\92è\82ð\83N\83\8a\83b\83N\82µ\82½\83N\81[\83\8b\83o\81[
592                 FMouseDownPos           : TPoint;                                       ///< \83u\83\89\83E\83U\83^\83u\82Å\83}\83E\83X\82ð\89\9f\82µ\82½\82Æ\82«\82Ì\8dÀ\95W
593                 FBrowsers: TList;
594                 FResRangeMenuSelect     : Longint;                      ///< ResRangeButton \82Å\91I\91ð\82³\82ê\82Ä\82¢\82é\8d\80\96Ú (\83t\83H\81[\83}\83b\83g\82Í ResRange \8cÝ\8a·)
595                 FStartUp : Boolean;
596                 FIsHandledWheel : Boolean;                      ///< \8aù\82É\8eó\82¯\8eæ\82Á\82½ WM_MOUSEWHEEL \82©\82Ç\82¤\82©
597                                 DiffComp: Boolean;                      //Add by Genyakun \83X\83\8c\82ª\8dX\90V\82³\82ê\82½\82Æ\82«\82ÉTrue\82É\82È\82é
598                 FOrigenCaption: String;                         //\82¨\8bC\82É\93ü\82è\83c\83\8a\81[\82Ì\83A\83C\83e\83\80\95Ò\8fW\8e\9e\82Ì\95Ò\8fW\91O\82Ì\95\8e\9a\97ñ
599                 FPreviewBrowserRect: TRect;                     ///< \83v\83\8c\83r\83\85\81[\82Ì\95\\8e¦\88Ê\92u\82ð\8bL\89¯\82·\82é
600                 FActionListGroupIndexes: array of Integer;      ///<GikoDM\8fã\82Ì\83A\83N\83V\83\87\83\93\83\8a\83X\83g\82Ì\8ae\83A\83N\83V\83\87\83\93\82É\90Ý\92è\82³\82ê\82½GroupIndex\82ð\95Û\91\82·\82é\94z\97ñ
601                 procedure DownloadEnd(Sender: TObject; Item: TDownloadItem);
602                 procedure DownloadMsg(Sender: TObject; Item: TDownloadItem; Msg: string; Icon: TGikoMessageIcon);
603                 procedure WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer; Number: Integer; const AWorkTitle: string);
604                 procedure WorkEnd(Sender: TObject; AWorkMode: TWorkMode; Number: Integer);
605                 procedure Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer; Number: Integer);
606                 procedure ListClick;
607                 procedure ListDoubleClick(Shift: TShiftState);
608                 function Hook(var Message: TMessage): Boolean;
609                 procedure AddRoundNameMenu(MenuItem: TMenuItem);
610                 procedure SetMenuFont;
611                 procedure CreateFavMenu(Node: TTreeNode; MenuItem: TMenuItem);
612                 procedure FavoriteClick(Sender: TObject; ActiveTab: Boolean); overload;
613                 procedure FavoriteClick(Sender: TObject); overload;
614                 procedure FavoriteDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
615                 function OnDocumentContextMenu(Sender: TObject): WordBool;
616                 procedure ShowTextPopup;
617                 function GetWidthAllToolButton(ToolBar: TToolBar): Integer;
618                 procedure MenuBarChevronMenu;
619                 procedure LinkBarChevronMenu;
620                 procedure ToolBarChevronMenu(ToolBar: TToolBar);
621                 procedure LinkToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer);
622                 procedure LinkToolButtonOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
623                 procedure LinkToolButtonOnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
624                 procedure LinkToolButtonOnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
625                 procedure LinkToolButtonStartDrag(Sender: TObject; var DragObject: TDragObject);
626                 function TreeNodeDataFind(Node: TTreeNode; FindPointer: Pointer): TTreeNode;
627                 procedure FavoriteMoveTo( SenderNode, SourceNode: TTreeNode );
628                 procedure FavoriteAddTo( SenderNode: TTreeNode; Source: TObject );
629                 procedure FavoriteDragDrop( SenderNode: TTreeNode; Source: TObject );
630                 //
631                 procedure SetListViewBackGroundColor(value: TColor);
632                 procedure BBSMenuItemOnClick( Sender : TObject );
633                 /// CoolBar \82Ì\90Ý\92è\82ð\95Ï\90\94\82É\95Û\91
634                 procedure       SaveCoolBarSettings;
635                 procedure       SaveMainCoolBarSettings;
636                 procedure       SaveBoardCoolBarSettings;
637                 procedure       SaveBrowserCoolBarSettings;
638                 /// CoolBar \82Ì\90Ý\92è\82ð\95Ï\90\94\82©\82ç\95\9c\8c³
639                 procedure       LoadCoolBarSettings;
640                 /// \8dÅ\8f¬\89»\82³\82ê\82é
641                 procedure OnMinimize;
642                 /// \8dÅ\8f¬\89»\82³\82ê\82½
643                 procedure OnMinimized;
644                 /// TreeView \82ª\83N\83\8a\83b\83N\82³\82ê\82½
645                 procedure TreeClick( Node : TTreeNode );
646                 /// TreeView \82ª\83_\83u\83\8b\83N\83\8a\83b\83N\82³\82ê\82½
647                 procedure TreeDoubleClick( Node : TTreeNode );
648                 /// \8ae\8f\8a\82É\82 \82é\83L\83\83\83r\83l\83b\83g\81E BBS \83\81\83j\83\85\81[\82ð\83Z\83b\83g\81^\8dX\90V
649                 procedure SetBBSMenu;
650                 /// \83^\83u\8eæ\93¾
651                 function GetTabURLs(AStringList: TStringList) : Boolean;
652                 /// ListColumnPopupMenu \83A\83C\83e\83\80\82Ì\83N\83\8a\83b\83N\83C\83x\83\93\83g
653                 procedure       ListColumnPopupMenuOnClick( Sender : TObject );
654                 //! \8di\82è\8d\9e\82Ý\95\8e\9a\97ñ\90Ý\92è
655                 procedure SetSelectWord( const text : string );
656                 //\8c»\8dÝ\82Ì\83J\81[\83\\83\8b\82ð\8eæ\93¾\82·\82é
657                 function GetScreenCursor(): TCursor;
658                 //\83J\81[\83\\83\8b\82ð\90Ý\92è\82·\82é
659                 procedure SetScreenCursor(Cursor : TCursor);
660                 //! \83_\83E\83\93\83\8d\81[\83h\83R\83\93\83g\83\8d\81[\83\8b\83X\83\8c\83b\83h\82Ì\90\90¬
661                 procedure CreateControlThread();
662                 //! \83u\83\89\83E\83U\82Ì\90\90¬
663                 procedure CreateBrowsers(count: Integer);
664                 //! ActionList\82ÌGroupIndex\82Ì\95Û\91
665                 procedure GetGroupIndex(ActionList: TActionList);
666                 //! ActionList\82ÌGroupIndex\82Ì\90Ý\92è
667                 procedure SetGroupIndex(ActionList: TActionList);
668                 //! \8ew\92è\82³\82ê\82½\83X\83\8c\83b\83h\82ð\8aJ\82­(\83\8d\83O\82ª\96³\82¢\82Æ\82« or \8ew\92èJUMP\82Ü\82Å\91«\82è\82È\82¢\82Æ\82«\82ÍDL\82·\82é)
669                 procedure OpenThreadItem(Thread: TThreadItem; URL: String);
670                 //! ListView\81i\83X\83\8c\83b\83h\88ê\97\97\81j\82ð\8dX\90V\82·\82é
671                 procedure RefreshListView(Thread: TThreadItem);
672                 //! \83X\83\8c\83b\83h\88ê\97\97\82Ì\95\\8e¦\94Í\88Í\90Ý\92è\83`\83F\83b\83N\83N\83\8a\83A
673                 procedure ClearThreadRengeAction;
674         protected
675                 procedure CreateParams(var Params: TCreateParams); override;
676                 procedure WndProc(var Message: TMessage); override;
677                 procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR;
678                 procedure WMSettingChange(var Message: TWMWinIniChange); message WM_SETTINGCHANGE;
679                 procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;
680
681         public
682                 { Public \90é\8c¾ }
683                 LastRoundTime: TDateTime;
684                 BrowserNullTab: TBrowserRecord;
685                 FControlThread: TThreadControl;
686                 procedure MoveToURL(const inURL: string);
687                 function InsertBrowserTab(ThreadItem: TThreadItem; ActiveTab: Boolean = True) : TBrowserRecord;
688                 procedure ReloadBBS;
689                 function GetHttpState: Boolean;
690                 procedure SetEnabledCloseButton(Enabled: Boolean);
691                 function GetTreeNode(Data: TObject): TTreeNode;
692                 procedure ListViewAllSelect;
693                 property ListStyle: TViewStyle read FListStyle write FListStyle;
694                 property ItemNoVisible: Boolean read FItemNoVisible write FItemNoVisible;
695                 property ViewType: TGikoViewType read FViewType write FViewType;
696                 property NameCookie: string read FNameCookie write FNameCookie;
697                 property MailCookie: string read FMailCookie write FMailCookie;
698                 property ClickNode: TTreeNode read FClickNode write FClickNode;
699                 property TreeType: TGikoTreeType read FTreeType write FTreeType;
700                 property ActiveContent: TBrowserRecord read FActiveContent write FActiveContent;
701                 property ResRangeMenuSelect: Longint read FResRangeMenuSelect write FResRangeMenuSelect;
702                 property SelectResWord  : string read FSelectResWord write FSelectResWord;
703                 property BrowserSizeWidth: Integer read FBrowserSizeWidth write FBrowserSizeWidth;
704                 property BrowserSizeHeight: Integer read FBrowserSizeHeight write FBrowserSizeHeight;
705                 property SearchDialog: TSearchDialog read FSearchDialog write FSearchDialog;
706                 property ToolBarSettingSender : TToolBarSettingSenderType
707                                                  read FToolBarSettingSender write FToolBarSettingSender;
708                 property ScreenCursor : TCursor read GetScreenCursor write SetScreenCursor;
709                 property ActiveBBS : TBBS read FActiveBBS write FActiveBBS;
710                 property WorkCount: Integer read FWorkCount write FWorkCount;
711                 procedure SetContent(inThread: TBrowserRecord);
712                 function GetActiveContent: TThreadItem;
713                 function GetActiveList: TObject;
714
715                 procedure SetListViewType(AViewType: TGikoViewType); overload;
716                 procedure SetListViewType(AViewType: TGikoViewType; SelectText: string; KubetsuChk: Boolean); overload;
717                 procedure PlaySound(SoundEventName: string);
718                 function AddHistory( FavItem: TFavoriteThreadItem ): Boolean;
719                 procedure ClearHistory;
720                 procedure       SaveHistory;
721                 procedure       LoadHistory;
722                 procedure ShowBBSTree( inBBS : TBBS );
723                 procedure ShowBBSTreeOld( inBBS : TBBS );
724                 procedure ShowHistoryTree;
725                 procedure SetHistoryTreeNode;
726                 procedure AddMessageList(ACaption: string; AObject: TObject; Icon: TGikoMessageIcon);
727                 procedure SetBrowserTabState;
728                 procedure SetToolBarPopup;
729                 procedure ShowFavoriteAddDialog( Item : TObject );
730                 procedure FavoritesURLReplace(oldURLs: TStringList; newURLs: TStringList);
731                 procedure RoundListURLReplace(oldURLs: TStringList; newURLs: TStringList);
732                 property ListViewBackGroundColor: TColor read FListViewBackGroundColor write SetListViewBackGroundColor;
733                 property UseOddResOddColor : Boolean read FUseOddResOddColor write FUseOddResOddColor;
734                 property OddColor : TColor read FOddColor write FOddColor;
735                 function FindToolBarButton( bar : TToolBar; action : TAction ) : TToolButton;
736                 procedure OnPlugInMenuItem( Sender : TObject );
737                 procedure TabFileURLReplace(oldURLs: TStringList; newURLs: TStringList);
738                 /// ListView \82Ì\83J\83\89\83\80\95\9d\82¨\82æ\82Ñ\88Ê\92u\82Ì\95Û\91¶ KuroutSetting\82©\82ç\82æ\82Ñ\82¾\82µ\82½\82¢\82Ì\82Å
739                 procedure ActiveListColumnSave;
740                 procedure SetActiveList(Obj: TObject);
741                 property ActiveList: TObject read GetActiveList write SetActiveList;
742                 /// CoolBar \82ª\83T\83C\83Y\95Ï\8dX\82³\82ê\82½
743                 procedure       CoolBarResized(Sender: TObject; CoolBar: TCoolBar);
744                 //\93¯\88êID\82Ì\82 \82Ú\81`\82ñ
745                 procedure IndividualAbonID(Atype : Integer);
746                 //\82±\82Ì\83\8c\83X\82 \82Ú\81`\82ñ
747                 procedure IndividualAbon(Atag, Atype : Integer);
748                 //\83u\83\89\83E\83U\82Ì\8dÄ\95`\89æ true:\91S\82Ä\82Ì\83^\83u false:\83A\83N\83e\83B\83u\82È\83^\83u\82Ì\82Ý
749                 procedure RepaintAllTabsBrowser();
750                 //\83\8a\83\93\83N\83o\81[\90Ý\92è
751                 procedure SetLinkBar;
752                 procedure FavoriteBrowseFolder( node: TTreeNode );
753                 //\83X\83\8c\83b\83h\82Ì\83_\83E\83\93\83\8d\81[\83h
754                 procedure DownloadContent(ThreadItem: TThreadItem; ForceDownload: Boolean = False);
755                 //\94Â\82Ì\83_\83E\83\93\83\8d\81[\83h
756                 procedure DownloadList(Board: TBoard; ForceDownload: Boolean = False);
757                 //\97\9a\97ð\82©\82ç\8dí\8f\9c
758                 procedure DeleteHistory( threadItem: TThreadItem );
759                 //\83^\83u\82ð\8dí\8f\9c
760                 procedure DeleteTab(ThreadItem: TThreadItem); overload;
761                 procedure DeleteTab(BrowserRecord: TBrowserRecord); overload;
762                 //\8c»\8dÝ\95\\8e¦\82µ\82Ä\82¢\82é\83X\83\8c\83b\83h\82ð\83X\83N\83\8d\81[\83\8b
763                 procedure BrowserMovement(const AName: string);
764                 //Application\82ÌMainForm\82ð\8eæ\93¾\82·\82é
765                 function GetMainForm(): TComponent;
766                 procedure SelectTreeNode(Item: TObject; CallEvent: Boolean);
767                 //! \83}\83E\83X\83W\83F\83X\83`\83\83\81[\8aJ\8en
768                 procedure OnGestureStart(Sender: TObject);
769                 //! \83}\83E\83X\83W\83F\83X\83`\83\83\81[\92\86
770                 procedure OnGestureMove(Sender: TObject);
771                 //! \83}\83E\83X\83W\83F\83X\83`\83\83\81[\8fI\97¹
772                 procedure OnGestureEnd(Sender: TObject);
773                 /// \83o\83\93\83h\95\9d\82ð\8dÄ\8cv\8eZ\81E\8dÄ\90Ý\92è\82·\82é
774                 procedure ResetBandInfo( bar : TGikoCoolBar; band : TToolBar );
775                 //\83X\83N\83\8a\81[\83\93\8fã\82ÉEditorForm\82ª\82¢\82é\82©
776                 function EditorFormExists(): boolean;
777                 //\83X\83N\83\8a\81[\83\93\8fã\82É\82¢\82é\82·\82×\82Ä\82ÌEditorForm\82©\82ç\96¼\91O\97\9a\97ð\82ð\8dí\8f\9c\82·\82é
778                 procedure AllEditroFormNameTextClearClear();
779                 //\83X\83N\83\8a\81[\83\93\8fã\82É\82¢\82é\82·\82×\82Ä\82ÌEditorForm\82©\82ç\83\81\81[\83\8b\97\9a\97ð\82ð\8dí\8f\9c\82·\82é
780                 procedure AllEditroFormMailTextClearClear();
781                 //ListView\82Å\91I\91ð\82³\82ê\82Ä\82¢\82é\83A\83C\83e\83\80\82ð\8eæ\93¾\82·\82é
782                 procedure SelectListItem(List: TList);
783                 /// \83^\83u\95Û\91
784                 function SaveTabURLs : Boolean;
785                 /// \83^\83u\93Ç\82Ý\8fo\82µ
786                 function LoadTabURLs : Boolean;
787                 //\8ew\92è\82µ\82½\83\8c\83X\82ð\83R\83s\81[\82·\82é
788                 procedure KonoresCopy(Number: Integer; ReplaceTag : Boolean);
789                 //
790                 procedure ModifySelectList;
791                 //
792                 procedure SetSelectItemRound(RoundFlag: Boolean; RoundName: string); overload;
793                 //
794                 procedure SetSelectItemRound(RoundFlag: Boolean; RoundName: string; ParentName: string); overload;
795                 //
796                 procedure SetSelectRoundName(Sender: TObject);
797                 //
798                 function GetCoolBand(CoolBar: TCoolBar; Control: TWinControl): TCoolBand;
799                 //
800                 function WebBrowserClick(Sender: TObject): WordBool;
801                 //! \83c\81[\83\8b\83o\81[\82É\83X\83\8c\8di\8d\9e\82Ý\83R\83\93\83{\83{\83b\83N\83X\82ð\90Ý\92è\82·\82é
802                 procedure SetSelectComboBox();
803
804         published
805                 property EnabledCloseButton: Boolean read FEnabledCloseButton write SetEnabledCloseButton;
806         end;
807
808         TFavoriteMenuItem = class(TMenuItem)
809         private
810                 FData : Pointer;
811         public
812                 property Data: Pointer read FData write FData;
813         end;
814
815         TBBSMenuItem = class(TMenuItem)
816         private
817                 FData : Pointer;
818         public
819                 property Data: Pointer read FData write FData;
820         end;
821
822         TLinkToolButton = class(TToolButton)
823         private
824                 FData : Pointer;
825         public
826                 property Data: Pointer read FData write FData;
827         end;
828
829 var
830         GikoForm: TGikoForm;
831
832 implementation
833
834 uses
835         GikoUtil, IndividualAbon, Math, Kotehan, KeySetting,
836         YofUtils, ShellAPI, ToolBarUtil, ToolBarSetting,
837         GikoXMLDoc, RoundName, IniFiles, FavoriteAdd,
838         FavoriteArrange, AddressHistory, Preview, Gesture,
839         About, Option, Round, Splash, Sort, ListSelect, Imm,
840         NewBoard, MojuUtils, Clipbrd, GikoBayesian,Y_TextConverter,
841         HTMLCreate, ListViewUtils, GikoDataModule, GikoMessage,
842   InputAssistDataModule;
843
844 const
845         BLANK_HTML: string = 'about:blank';
846         BROWSER_COUNT           = 5;    //\83u\83\89\83E\83U\82Ì\90\94
847         //D&D臒l
848         DandD_THRESHOLD = 5;    //D&D\82Ìè\87\92l\81ipixcel)
849         //\83v\83\8c\83r\83\85\81[\83t\83@\83C\83\8b\96¼
850         HTML_FILE_NAME  = 'temp_preview.html';
851         ITEM_ICON_THREADLOG1            = 6;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82 \82è\81j
852         ITEM_ICON_THREADLOG2            = 7;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82 \82è\81j
853         //\83\81\83b\83Z\81[\83WID
854         USER_TREECLICK                                  = WM_USER + 2000;
855         USER_RESIZED            = WM_USER + 2001;
856         USER_MINIMIZED                                  = WM_USER + 2002;
857         USER_SETLINKBAR                                 = WM_USER + 2003;
858         USER_DOCUMENTCOMPLETE           = WM_USER + 2004;       ///< wParam : TWebBrowser
859 {$R *.DFM}
860
861 procedure TGikoForm.CreateParams(var Params: TCreateParams);
862 begin
863         inherited;
864         if FormStyle in [fsNormal, fsStayOnTop] then begin
865                 if BorderStyle in [bsSingle, bsSizeable] then begin
866                         Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
867                         Params.WndParent := 0;
868                 end;
869         end;
870 end;
871
872 procedure TGikoForm.FormCreate(Sender: TObject);
873 const
874         TVS_NOTOOLTIPS = $0080;
875 var
876         FileName: string;
877         Style: DWORD;
878         msg: string;
879         i: Integer;
880         wp: TWindowPlacement;
881 begin
882 {$IFDEF DEBUG}
883         AllocConsole;
884         Writeln('============================================================');
885         Writeln(' \83M\83R\83i\83r\83f\83o\83b\83\83R\83\93\83\\81[\83\8b');
886         Writeln('');
887         Writeln(' \82±\82Ì\89æ\96Ê\82ð\95Â\82\82È\82¢\82Å\82­\82¾\82³\82¢\81B');
888         Writeln(' \8fI\97¹\8e\9e\82Í\81A\83M\83R\83i\83r\83E\83B\83\93\83h\83E\82ð\95Â\82\82Ä\82­\82¾\82³\82¢');
889         Writeln('============================================================');
890 {$ENDIF}
891 //try
892         Sort.SetSortDate(Now());
893         
894         FTreeType := gttNone;
895         // \8bN\93®\8e\9e\82É\95Û\91\82³\82ê\82Ä\82µ\82Ü\82¤\91Î\8dô
896         FStartUp := true;
897         Application.HookMainWindow(Hook);
898         FIsIgnoreResize := rtResizing;
899         //ActionList\82ÌGuoupIndex\82ð\95Û\91\82µ\82Ä\81A0\82É\83N\83\8a\83A\82·\82é\81B
900         //(\8bN\93®\8e\9e\82É\83c\81[\83\8b\83{\83^\83\93\82ÌDown\83v\83\8d\83p\83e\83B\82ð\94½\89f\82³\82¹\82é\93s\8d\87\8fãGroupIndex\82Í\90Ý\92è\82Å\82«\82È\82¢)
901         //\82±\82ê\88È\8cãSet\81`\82Å\8dÄ\90Ý\92è\82·\82é\82Ü\82Å\81AAction\82ÌChecked\82ð\82¢\82\82é\82Æ\82«\82Í\92\8d\88Ó\81I
902         GetGroupIndex(GikoDM.GikoFormActionList);
903         FSearchDialog := nil;
904         CreateBrowsers(BROWSER_COUNT);
905
906         //\83\81\83j\83\85\81[\83t\83H\83\93\83g
907         SetMenuFont;
908
909         //\8eè\82Ì\83J\81[\83\\83\8b
910         Screen.Cursors[5] := LoadCursor(HInstance, 'GIKOHAND');
911
912         //\83A\83h\83\8c\83X\97\9a\97ð\93Ç\82Ý\8d\9e\82Ý
913         AddressHistoryDM.ReadHistory(AddressComboBox.Items, GikoSys.Setting.MaxRecordCount);
914
915         EnabledCloseButton := True;
916
917         //\83\8a\83X\83g\83X\83^\83C\83\8b
918         ListView.ViewStyle := GikoSys.Setting.ListStyle;
919
920         //\83A\83j\83\81\83p\83l\83\8b\88Ê\92u
921         AnimePanel.Top := 0;
922         AnimePanel.Left := 0;
923
924         //\8ae\8eí\89Â\8e\8b\8fó\91Ô\82È\82Ç\90Ý\92è
925
926         //\83L\83\83\83r\83l\83b\83g
927         CabinetPanel.Width := GikoSys.Setting.CabinetWidth;
928
929         //\83\81\83b\83Z\81[\83W\83o\81[
930         GikoDM.MsgBarVisibleAction.Checked := GikoSys.Setting.MessageBarVisible;
931         GikoDM.MsgBarVisibleActionExecute(nil);
932         MessagePanel.Height := GikoSys.Setting.MessegeBarHeight;
933
934         //\83X\83e\81[\83^\83X\83o\81[
935         GikoDM.StatusBarVisibleAction.Checked := GikoSys.Setting.StatusBarVisible;
936         GikoDM.StatusBarVisibleActionExecute(nil);
937
938         //\83t\83H\83\93\83g\81E\90F\90Ý\92è
939         TreeView.Items.BeginUpdate;
940         FavoriteTreeView.Items.BeginUpdate;
941         ListView.Items.BeginUpdate;
942         try
943                 TreeView.Font.Name := GikoSys.Setting.CabinetFontName;
944                 TreeView.Font.Size := GikoSys.Setting.CabinetFontSize;
945                 TreeView.Font.Color := GikoSys.Setting.CabinetFontColor;
946                 TreeView.Color := GikoSys.Setting.CabinetBackColor;
947                 FavoriteTreeView.Font.Assign(TreeView.Font);
948                 FavoriteTreeView.Color := GikoSys.Setting.CabinetBackColor;
949
950                 ListView.Font.Name := GikoSys.Setting.ListFontName;
951                 ListView.Font.Size := GikoSys.Setting.ListFontSize;
952                 ListView.Font.Color := GikoSys.Setting.ListFontColor;
953                 ListView.Font.Style := [];
954                 if GikoSys.Setting.ListFontBold then
955                         ListView.Font.Style := [fsbold];
956                 if GikoSys.Setting.ListFontItalic then
957                         ListView.Font.Style := ListView.Font.Style + [fsitalic];
958
959                 ListViewBackGroundColor := clWhite;                                                                                             // \83f\83t\83H\83\8b\83g\82É\90Ý\92è\82µ\82½\82Ì\82¿
960                 ListViewBackGroundColor := GikoSys.Setting.ListBackColor;       // \83\86\81[\83U\92è\8b`\82É\95Ï\8dX
961                 FUseOddResOddColor := GikoSys.Setting.UseOddColorOddResNum;
962                 FOddColor := GikoSys.Setting.OddColor;
963
964         finally
965                 TreeView.Items.EndUpdate;
966                 FavoriteTreeView.Items.EndUpdate;
967                 ListView.Items.EndUpdate;
968         end;
969         //ViewNoButton.Down := GikoSys.Setting.ListViewNo;
970         GikoDM.ListNumberVisibleAction.Checked := GikoSys.Setting.ListViewNo;
971
972         //\83~\83\85\81[\83g\82Ì\8fó\91Ô\82ð\90Ý\92è
973         GikoDM.MuteAction.Checked := GikoSys.Setting.Mute;
974
975         // \83\8c\83X\95\\8e¦\94Í\88Í
976         FResRangeMenuSelect := GikoSys.ResRange;
977         case GikoSys.ResRange of
978         Ord( grrAll ):
979                 begin
980                         GikoDM.AllResAction.Execute;
981                 end;
982         Ord( grrSelect ):
983                 begin
984                         SelectComboBox.Text := SelectComboBox.Items[ 1 ];
985                         GikoDM.SelectResAction.Checked := True;
986                 end;
987         else
988                 case FResRangeMenuSelect of
989                 Ord( grrKoko ): GikoDM.OnlyKokoResAction.Checked        := True;
990                 Ord( grrNew ):  GikoDM.OnlyNewResAction.Checked := True;
991                 100:                    GikoDM.OnlyAHundredResAction.Checked            := True;
992                 end;
993         end;
994
995         // \83X\83\8c\83b\83h\88ê\97\97\95\\8e¦\94Í\88Í
996         case GikoSys.Setting.ThreadRange of
997         gtrAll:
998                 begin
999                         GikoDM.AllItemAction.Checked := True;
1000                         ViewType := gvtAll;
1001                 end;
1002         gtrLog:
1003                 begin
1004                         GikoDM.LogItemAction.Checked := True;
1005                         ViewType := gvtLog;
1006                 end;
1007         gtrNew:
1008                 begin
1009                         GikoDM.NewItemAction.Checked := True;
1010                         ViewType := gvtNew;
1011                 end;
1012         gtrLive:
1013                 begin
1014                         GikoDM.LiveItemAction.Checked := True;
1015                         ViewType := gvtLive;
1016                 end;
1017         gtrArch:
1018                 begin
1019                         GikoDM.ArchiveItemAction.Checked := True;
1020                         ViewType := gvtArch;
1021                 end;
1022         end;
1023
1024
1025         //\83u\83\89\83E\83U\83^\83u\83t\83H\83\93\83g
1026         BrowserTab.Font.Name := GikoSys.Setting.BrowserTabFontName;
1027         BrowserTab.Font.Size := GikoSys.Setting.BrowserTabFontSize;
1028         BrowserTab.Font.Style := [];
1029         if GikoSys.Setting.BrowserTabFontBold then
1030                 BrowserTab.Font.Style := [fsBold];
1031         if GikoSys.Setting.BrowserTabFontItalic then
1032                 BrowserTab.Font.Style := GikoForm.BrowserTab.Font.Style + [fsItalic];
1033         BrowserTab.DoubleBuffered := True;
1034         FDragWFirst := false;
1035         SetContent(BrowserNullTab);                                                                                                     //\83u\83\89\83E\83U\82ð\8bó\94\92\95\\8e¦
1036
1037         //\83u\83\89\83E\83U\83^\83u
1038         GikoDM.BrowserTabVisibleAction.Checked := GikoSys.Setting.BrowserTabVisible;
1039
1040         if GikoSys.Setting.BrowserTabPosition = gtpTop then begin
1041                 GikoDM.BrowserTabTopAction.Checked := True;
1042         end else begin
1043                 GikoDM.BrowserTabBottomAction.Checked := True;
1044         end;
1045
1046         if GikoSys.Setting.BrowserTabStyle = gtsTab then begin
1047                 GikoDM.BrowserTabTabStyleAction.Checked := True;
1048         end else if GikoSys.Setting.BrowserTabStyle = gtsButton then begin
1049                 GikoDM.BrowserTabButtonStyleAction.Checked := True;
1050         end else begin
1051                 GikoDM.BrowserTabFlatStyleAction.Checked := True;
1052         end;
1053
1054         //\83v\83\8d\83O\83\8c\83X\83o\81[\82Ì\8f\89\8aú\89»
1055         ProgressBar.Parent := StatusBar;
1056         ProgressBar.Top := 2;
1057         ProgressBar.Left := 0;
1058         ProgressBar.Width := StatusBar.Panels[0].Width;
1059         ProgressBar.Height := StatusBar.Height - 2;
1060         ProgressBar.Position := 0;
1061
1062         // \8aO\95\94\94Â\83v\83\89\83O\83C\83\93\82ð\83\8d\81[\83h(ReadBoardFile, LoadHistory \82æ\82è\90æ\82É\8ds\82¤\82±\82Æ)
1063         InitializeBoardPlugIns;
1064
1065         // \83{\81[\83h\83t\83@\83C\83\8b\97ñ\8b\93(ReadFavorite \82æ\82è\90æ\82É\8ds\82¤\82±\82Æ)
1066         GikoSys.ListBoardFile;
1067         //\81@\98A\91±\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\83E\83B\83\93\83h\83E\82Ì\83\81\83\82\83\8a\82ª\95s\92è\82É
1068         try
1069         // \83X\83v\83\89\83b\83V\83\85\83E\83B\83\93\83h\83E\82Ì\83v\83\8d\83O\83\8c\83X\83o\81[\82Ì\90Ý\92è
1070                 if (SplashWindow <> nil) then begin
1071                         SplashWindow.ProgressBar.Max := Length(BBSs) * 20;
1072                 end;
1073         except
1074         end;
1075         // \82·\82×\82Ä\82ÌBBS\82ð\93Ç\82Ý\8d\9e\82ñ\82Å\82¨\82­
1076         for i := Length(BBSs) - 1 downto 0 do begin
1077                 if not BBSs[i].IsBoardFileRead then
1078                         GikoSys.ReadBoardFile(BBSs[i]);
1079
1080                 if SplashWindow <> nil then begin
1081                         SplashWindow.ProgressBar.StepBy(20);
1082                         SplashWindow.Update;
1083                 end;
1084         end;
1085
1086         //\8f\84\89ñ\83f\81[\83^\93Ç\82Ý\8d\9e\82Ý
1087         RoundList := TRoundList.Create;
1088         RoundList.LoadRoundBoardFile;
1089         RoundList.LoadRoundThreadFile;
1090
1091         //TreeView\82Ì\8e×\96\82\8fL\82¢ToolTip\82ð\94ñ\95\\8e¦
1092         Style := GetWindowLong(TreeView.Handle, GWL_STYLE);
1093         Style := Style or TVS_NOTOOLTIPS;
1094         SetWindowLong(TreeView.Handle, GWL_STYLE, Style);
1095
1096         // \83c\83\8a\81[\82ð\83\81\83C\83\93\82¾\82¯\95\\8e¦\82É\82µ\82Ä\8dÅ\91å\89»
1097         TreeView.Align := alClient;
1098         FavoriteTreeView.Align := alClient;
1099         FavoriteTreeView.Visible := False;
1100
1101         // \83\81\83j\83\85\81[\82É\92Ç\89Á
1102         SetBBSMenu;
1103
1104         //\8dÅ\91å\89»\81E\83E\83B\83\93\83h\83E\88Ê\92u\95\9c\8c³
1105         wp.length := sizeof(wp);
1106         wp.rcNormalPosition.Top := GikoSys.Setting.WindowTop;
1107         wp.rcNormalPosition.Left := GikoSys.Setting.WindowLeft;
1108         wp.rcNormalPosition.Bottom := GikoSys.Setting.WindowTop + GikoSys.Setting.WindowHeight;
1109         wp.rcNormalPosition.Right := GikoSys.Setting.WindowLeft + GikoSys.Setting.WindowWidth;
1110         wp.showCmd := SW_HIDE;
1111         SetWindowPlacement(Handle, @wp);
1112         //Self.Update;
1113
1114         if GikoSys.Setting.WindowMax then
1115                 WindowState := wsMaximized;
1116
1117         //\83M\83R\83A\83j\83\81
1118         try
1119                 FileName := GikoSys.GetAppDir + 'gikoNavi.avi';
1120                 if FileExists(FileName) then
1121                         Animate.FileName := FileName;
1122         except
1123         end;
1124
1125         //\83N\83b\83L\81[
1126         FNameCookie := '';
1127         FMailCookie := '';
1128
1129         //\83u\83\89\83E\83U\83T\83C\83Y\95Ï\8dX\82Ì\8f\89\8aú\89»
1130         FBrowserSizeHeight := GikoSys.Setting.ListHeight;
1131         FBrowserSizeWidth := GikoSys.Setting.ListWidth;
1132
1133
1134         // \83q\83X\83g\83\8a\83\8a\83X\83g(LoadHistory \82æ\82è\82à\90æ\82É\8ds\82¤\82±\82Æ)
1135         FHistoryList := TList.Create;
1136
1137         // \97\9a\97ð\93Ç\82Ý\8d\9e\82Ý
1138         LoadHistory;
1139
1140         //\82¨\8bC\82É\93ü\82è\93Ç\82Ý\8d\9e\82Ý
1141         FavoriteDM.SetFavTreeView(FavoriteTreeView);
1142         FavoriteDM.ReadFavorite;
1143
1144         GikoDM.ArrangeAction.Checked := not (GikoSys.Setting.ListOrientation = gloVertical);
1145         GikoDM.ArrangeAction.Execute;
1146
1147         if GikoSys.Setting.ListOrientation = gloHorizontal then begin
1148                 case GikoSys.Setting.ListWidthState of
1149                         glsMax: begin
1150                                 ViewPanel.Width := 1;
1151                                 GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_NORMAL;
1152                                 GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_MIN;
1153                         end;
1154                         glsMin: begin
1155                                 ViewPanel.Width := GikoSys.Setting.ListWidth;
1156                                 GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_MAX;
1157                                 GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_NORMAL;
1158                         end;
1159                         else begin
1160                                 ViewPanel.Width := GikoSys.Setting.ListWidth;
1161                                 GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_MAX;
1162                                 GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_MIN;
1163                         end;
1164                 end;
1165         end else begin
1166                 case GikoSys.Setting.ListHeightState of
1167                         glsMax: begin
1168                                 ViewPanel.Height := 1;
1169                                 GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_NORMAL;
1170                                 GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_MIN;
1171                         end;
1172                         glsMin: begin
1173                                 ViewPanel.Height := GikoSys.Setting.ListHeight;
1174                                 GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_MAX;
1175                                 GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_NORMAL;
1176                         end;
1177                         else begin
1178                                 ViewPanel.Height := GikoSys.Setting.ListHeight;
1179                                 GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_MAX;
1180                                 GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_MIN;
1181                         end;
1182                 end;
1183         end;
1184
1185         //\83_\83E\83\93\83\8d\81[\83h\83I\83u\83W\83F\83N\83g
1186         CreateControlThread();
1187
1188         // \8di\8d\9e\8c\9f\8dõ\97\9a\97ð
1189         SelectComboBox.Items.Assign( GikoSys.Setting.SelectTextList );
1190
1191         //\83u\83\89\83E\83U\83^\83u\90Ý\92è
1192         SetBrowserTabState;
1193
1194         BrowserBoardNameLabel.Caption := '';
1195         BrowserNameLabel.Caption := '';
1196         FWorkCount := 0;
1197
1198         FTabHintIndex := -1;
1199
1200         //\83c\81[\83\8b\83o\81[Wrapable
1201         ListToolBar.Wrapable := GikoSys.Setting.ListToolBarWrapable;
1202         BrowserToolBar.Wrapable := GikoSys.Setting.BrowserToolBarWrapable;
1203
1204         MakeDefaultINIFile();
1205         //\83c\81[\83\8b\83{\83^\83\93\93Ç\82Ý\8d\9e\82Ý
1206         ReadToolBarSetting(GikoDM.GikoFormActionList, StdToolBar);
1207         ReadToolBarSetting(GikoDM.GikoFormActionList, ListToolBar);
1208         ReadToolBarSetting(GikoDM.GikoFormActionList, BrowserToolBar);
1209         SetToolBarPopup;
1210
1211         //ListToolBar\82É\82¢\82é\82©\82à\82µ\82ê\82È\82¢\8di\8d\9e\82ÝComboBox\82ð\94z\92u
1212         SetSelectComboBox();
1213
1214         //\83A\83h\83\8c\83X\83o\81[
1215         AddressComboBox.TabStop := GikoSys.Setting.AddressBarTabStop;
1216
1217         //\83\8a\83\93\83N\83o\81[
1218         SetLinkBar;
1219         //\83N\81[\83\8b\83o\81[\95\9c\8c³\82ÍFormShow\82É\88Ú\93®\82µ\82½
1220
1221         //\83{\81[\83h\83t\83@\83C\83\8b\82ª\96³\82¢\8fê\8d\87\82Í\83\81\83b\83Z\81[\83W\95\\8e¦
1222         if not FileExists(GikoSys.GetBoardFileName) then begin
1223                 msg := '\82±\82Ì\83\81\83b\83Z\81[\83W\82Í\83M\83R\83i\83r\82ð\8f\89\82ß\82Ä\8eg\97p\82·\82é\82Æ\82«\82É\82P\89ñ\82¾\82¯\95\\8e¦\82³\82ê\82Ü\82·' + #13#10#13#10
1224                                  + '\82±\82ê\82©\82ç\81A\81u\82Q\82¿\82á\82ñ\82Ë\82é\81v\82Ì\83A\83h\83\8c\83X\88ê\97\97\82ð\83_\83E\83\93\83\8d\81[\83h\82µ\82Ü\82·' + #13#10
1225                                  + '\8e\9f\82É\8fo\82Ä\82­\82é\89æ\96Ê\82Å\81A\81u\8dX\90V\81v\83{\83^\83\93\82ð\89\9f\82µ\82Ä\82­\82¾\82³\82¢\81B';
1226                 MsgBox(SplashWindow.Handle, msg, '\83M\83R\83i\83r', MB_OK or MB_ICONINFORMATION);
1227                 GikoDM.NewBoardAction.Execute;
1228         end;
1229
1230         //\83L\81[\90Ý\92è\93Ç\82Ý\8d\9e\82Ý
1231         GikoSys.LoadKeySetting(GikoDM.GikoFormActionList, GikoSys.GetMainKeyFileName);
1232
1233         //\8dÅ\8fI\8f\84\89ñ\8e\9e\8aÔ
1234 //      FLastRoundTime := 0;
1235
1236         //ResHint
1237         FHint := TResPopup.Create(Self);
1238
1239         ListView.OnData := TListViewUtils.ListViewData;
1240
1241         // \8dÅ\8cã\82É\91I\91ð\82³\82ê\82½\83L\83\83\83r\83l\83b\83g\82Ì\95\9c\8c³
1242         CabinetVisible( False );
1243         if GikoSys.Setting.CabinetVisible then begin
1244                 i := CabinetSelectPopupMenu.Items.Count - 1;
1245                 if GikoSys.Setting.CabinetIndex = i - 1 then
1246                         GikoDM.CabinetHistoryAction.Execute
1247                 else if GikoSys.Setting.CabinetIndex = i then
1248                         GikoDM.CabinetFavoriteAction.Execute
1249                 else begin
1250                         if GikoSys.Setting.CabinetIndex < Length( BBSs ) then
1251                                 ShowBBSTree( BBSs[ GikoSys.Setting.CabinetIndex ] );
1252                         // \8bN\93®\8e\9e\82É\95Û\91\82³\82ê\82Ä\82µ\82Ü\82¤\91Î\8dô 2
1253                         FIsIgnoreResize := rtResizing;
1254                         GikoDM.CabinetBBSAction.Execute;
1255                 end;
1256         end else begin
1257                 ShowBBSTreeOld( BBSs[ 0 ] );
1258                 PostMessage( Handle, USER_TREECLICK, 0, 0 );
1259         end;
1260
1261         //\88ø\90\94\82ª\82 \82Á\82½\82ç\83X\83\8c\82ð\8aJ\82­\81i\96¢\8eæ\93¾\82È\82ç\83_\83E\83\93\83\8d\81[\83h\81j
1262         for i := 1 to ParamCount do     begin
1263                 MoveToURL(ParamStr(i));
1264         end;
1265
1266         GikoDM.RepaintStatusBar;
1267         StatusBarResize(Sender);
1268
1269         dummy1.Caption  := ItemReservPMenu.Caption;
1270         dummy1.Hint     := ItemReservPMenu.Hint;
1271
1272         //Samba24\82Ì\83t\83@\83C\83\8b\83`\83F\83b\83N
1273         GikoSys.SambaFileExists();
1274
1275 {$IFDEF SPAM_FILTER_ENABLED}
1276         // \83X\83p\83\80\83t\83B\83\8b\83^\8aw\8fK\97\9a\97ð
1277         GikoSys.Bayesian.LoadFromFile( GikoSys.Setting.GetSpamFilterFileName );
1278 {$ENDIF}
1279
1280         // \83}\83E\83X\83W\83F\83X\83`\83\83\81[
1281         MouseGesture := TMouseGesture.Create;
1282         GikoSys.Setting.Gestures.LoadGesture(
1283                 GikoSys.Setting.GetGestureFileName, GikoDM.GikoFormActionList );
1284         MouseGesture.Margin := GikoSys.Setting.Gestures.Margin;
1285         MouseGesture.OnGestureStart := OnGestureStart;
1286         MouseGesture.OnGestureMove := OnGestureMove;
1287         MouseGesture.OnGestureEnd := OnGestureEnd;
1288         if GikoSys.Setting.GestureEnabled then
1289                 MouseGesture.SetHook( Handle );
1290
1291         //2ch\8c¾\8cê\93Ç\82Ý\8fo\82µ
1292         GikoSys.SetGikoMessage;
1293
1294         //\83I\81[\83g\83\8d\83O\83C\83\93
1295         if GikoSys.Setting.AutoLogin then
1296                 GikoDM.LoginAction.Execute;
1297
1298         GikoSys.Setting.BeLogin := GikoSys.Setting.BeAutoLogin;
1299
1300         //\83L\83\83\83v\83V\83\87\83\93\82ª\8fã\8f\91\82«\82³\82ê\82Ä\82µ\82Ü\82¤\82Ì\82Å\81A\82±\82±\82Å\8dÄ\90Ý\92è
1301         FavoriteAddToolButton.Caption := '\92Ç\89Á...';
1302         AntiIndivAbonMenuItem.Caption := '\8cÂ\95Ê\82 \82Ú\81`\82ñ\89ð\8f\9c';
1303
1304         //\93ü\97Í\83A\83V\83X\83g\8b@\8d\\82Ì\8f\89\8aú\89»
1305         InputAssistDM.Init(GikoSys.GetInputAssistFileName);
1306 end;
1307
1308 // CoolBar \82Ì\90Ý\92è\82ð\95Ï\90\94\82É\95Û\91
1309 procedure TGikoForm.SaveCoolBarSettings;
1310 begin
1311
1312         if IsIconic( Handle ) or (FIsIgnoreResize <> rtNone) then
1313                 Exit;
1314         SaveMainCoolBarSettings;
1315         SaveBoardCoolBarSettings;
1316         SaveBrowserCoolBarSettings;
1317
1318 end;
1319 procedure TGikoForm.SaveMainCoolBarSettings;
1320 var
1321         i : Integer;
1322         CoolSet : TCoolSet;
1323 begin
1324         //\83N\81[\83\8b\83o\81[\95Û\91¶(Main)
1325         for i := 0 to MAIN_COOLBAND_COUNT - 1 do begin
1326                 CoolSet.FCoolID := MainCoolBar.Bands[i].ID;
1327                 CoolSet.FCoolWidth := MainCoolBar.Bands[i].Width;
1328                 CoolSet.FCoolBreak := MainCoolBar.Bands[i].Break;
1329                 GikoSys.Setting.MainCoolSet[i] := CoolSet;
1330         end;
1331 end;
1332 procedure TGikoForm.SaveBoardCoolBarSettings;
1333 var
1334         i : Integer;
1335         CoolSet : TCoolSet;
1336 begin
1337         //\83N\81[\83\8b\83o\81[\95Û\91¶(Board)
1338         for i := 0 to LIST_COOLBAND_COUNT - 1 do begin
1339                 CoolSet.FCoolID := ListCoolBar.Bands[i].ID;
1340                 CoolSet.FCoolWidth := ListCoolBar.Bands[i].Width;
1341                 CoolSet.FCoolBreak := ListCoolBar.Bands[i].Break;
1342                 GikoSys.Setting.ListCoolSet[i] := CoolSet;
1343         end;
1344 end;
1345 procedure TGikoForm.SaveBrowserCoolBarSettings;
1346 var
1347         i : Integer;
1348         CoolSet : TCoolSet;
1349 begin
1350         //\83N\81[\83\8b\83o\81[\95Û\91¶(Browser)
1351         for i := 0 to BROWSER_COOLBAND_COUNT - 1 do begin
1352                 CoolSet.FCoolID := BrowserCoolBar.Bands[i].ID;
1353                 CoolSet.FCoolWidth := BrowserCoolBar.Bands[i].Width;
1354                 CoolSet.FCoolBreak := BrowserCoolBar.Bands[i].Break;
1355                 GikoSys.Setting.BrowserCoolSet[i] := CoolSet;
1356         end;
1357 end;
1358 // CoolBar \82Ì\90Ý\92è\82ð\95Ï\90\94\82©\82ç\95\9c\8c³
1359 procedure TGikoForm.LoadCoolBarSettings;
1360 var
1361         i                               : Integer;
1362         CoolSet : TCoolSet;
1363 begin
1364
1365         //\83N\81[\83\8b\83o\81[\95\9c\8c³(Main)
1366         MainCoolBar.Bands.BeginUpdate;
1367         try
1368 //              for i := 0 to MainCoolBar.Bands.Count - 1 do begin
1369                 for i := MAIN_COOLBAND_COUNT - 1 downto 0 do begin
1370                         CoolSet := GikoSys.Setting.MainCoolSet[i];
1371                         if (CoolSet.FCoolID = -1) or (CoolSet.FCoolWidth = -1) then begin
1372                                 FIsIgnoreResize := rtNone;
1373                                 SaveCoolBarSettings;
1374                                 Exit;
1375                         end;
1376                         MainCoolBar.Bands.FindItemID(CoolSet.FCoolID).Index := i;
1377                         MainCoolBar.Bands[i].Break := CoolSet.FCoolBreak;
1378                         MainCoolBar.Bands[i].Width := CoolSet.FCoolWidth;
1379                 end;
1380         finally
1381                 MainCoolBar.Bands.EndUpdate;
1382         end;
1383
1384         //\83N\81[\83\8b\83o\81[\95\9c\8c³(Board)
1385         ListCoolBar.Bands.BeginUpdate;
1386         try
1387 //              for i := 0 to ListCoolBar.Bands.Count - 1 do begin
1388                 for i := LIST_COOLBAND_COUNT - 1 downto 0 do begin
1389                         CoolSet := GikoSys.Setting.ListCoolSet[i];
1390                         if (CoolSet.FCoolID = -1) or (CoolSet.FCoolWidth = -1) then begin
1391                                 FIsIgnoreResize := rtNone;
1392                                 SaveCoolBarSettings;
1393                                 Exit;
1394                         end;
1395                         ListCoolBar.Bands.FindItemID(CoolSet.FCoolID).Index := i;
1396                         ListCoolBar.Bands[i].Break := CoolSet.FCoolBreak;
1397                         ListCoolBar.Bands[i].Width := CoolSet.FCoolWidth;
1398                 end;
1399         finally
1400                 ListCoolBar.Bands.EndUpdate;
1401         end;
1402
1403         //\83N\81[\83\8b\83o\81[\95\9c\8c³(Browser)
1404         BrowserCoolBar.Bands.BeginUpdate;
1405         try
1406 //              for i := 0 to BrowserCoolBar.Bands.Count - 1 do begin
1407                 for i := BROWSER_COOLBAND_COUNT - 1 downto 0 do begin
1408                         CoolSet := GikoSys.Setting.BrowserCoolSet[i];
1409                         if (CoolSet.FCoolID = -1) or (CoolSet.FCoolWidth = -1) then begin
1410                                 FIsIgnoreResize := rtNone;
1411                                 SaveCoolBarSettings;
1412                                 Exit;
1413                         end;
1414                         BrowserCoolBar.Bands.FindItemID(CoolSet.FCoolID).Index := i;
1415                         BrowserCoolBar.Bands[i].Break := CoolSet.FCoolBreak;
1416                         BrowserCoolBar.Bands[i].Width := CoolSet.FCoolWidth;
1417                 end;
1418         finally
1419                 BrowserCoolBar.Bands.EndUpdate;
1420         end;
1421
1422 end;
1423 //
1424 procedure TGikoForm.FormShow(Sender: TObject);
1425 begin
1426         if FStartUp then begin
1427                 ShowWindow(Application.Handle, SW_HIDE);
1428
1429                 //FormCreate\82Å\82â\82é\82Æ\89Â\8e\8b\90Ý\92è\82ª\94½\89f\82³\82ê\82È\82¢\8fê\8d\87\82ª\82 \82é\82Ì\82ÅFormShow\82Å\82â\82é\82±\82Æ\82É\82µ\82½
1430                 //\83c\81[\83\8b\83o\81[\95\\8e¦
1431                 GikoDM.StdToolBarVisibleAction.Checked := GikoSys.Setting.StdToolBarVisible;
1432                 GikoDM.StdToolBarVisibleActionExecute( nil );
1433                 GikoDM.AddressBarVisibleAction.Checked := GikoSys.Setting.AddressBarVisible;
1434                 GikoDM.AddressBarVisibleActionExecute( nil );
1435                 GikoDM.LinkBarVisibleAction.Checked := GikoSys.Setting.LinkBarVisible;
1436                 GikoDM.LinkBarVisibleActionExecute( nil );
1437                 GikoDM.ListToolBarVisibleAction.Checked := GikoSys.Setting.ListToolBarVisible;
1438                 GikoDM.ListToolBarVisibleActionExecute( nil );
1439                 GikoDM.ListNameBarVisibleAction.Checked := GikoSys.Setting.ListNameBarVisible;
1440                 GikoDM.ListNameBarVisibleActionExecute( nil );
1441                 GikoDM.BrowserToolBarVisibleAction.Checked := GikoSys.Setting.BrowserToolBarVisible;
1442                 GikoDM.BrowserToolBarVisibleActionExecute( nil );
1443                 GikoDM.BrowserNameBarVisibleAction.Checked := GikoSys.Setting.BrowserNameBarVisible;
1444                 GikoDM.BrowserNameBarVisibleActionExecute( nil );
1445
1446                 // CoolBar \95\9c\8c³
1447                 LoadCoolBarSettings;
1448
1449                 //\8fd\97v\81@\82±\82ê\82ª\82È\82¢\82Æ\83c\81[\83\8b\83{\83^\83\93\82Ì\8dX\90V\82ª\82¨\82©\82µ\82­\82È\82é
1450 //              ResetBandInfo( ListCoolBar, ListToolBar );
1451                 FIsIgnoreResize := rtNone;
1452
1453                 //FormCrete\82©\82ç\88Ú\93®\81B
1454                 if GikoSys.Setting.TabAutoLoadSave then begin
1455                         GikoDM.TabAutoLoadAction.Execute;
1456                 end;
1457
1458         //ActionList\82ÌGroupIndex\82ð\8c³\82É\96ß\82·
1459                 SetGroupIndex(GikoDM.GikoFormActionList);
1460
1461                 FStartUp := false;
1462         end;
1463 end;
1464
1465 procedure TGikoForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
1466 begin
1467 //      if GikoForm.WindowState <> wsMinimized then
1468 //              SaveCoolBarSettings;
1469         CanClose := True;
1470         if ( GikoSys.Setting.ShowDialogForEnd ) and
1471                         (MessageDlg('\83M\83R\83i\83r\82ð\8fI\97¹\82µ\82Ä\82æ\82ë\82µ\82¢\82Å\82·\82©\81H', mtConfirmation,[mbOk, mbCancel], 0) = mrCancel ) then begin
1472                 CanClose := false;
1473                         Exit;
1474         end;
1475
1476         if GikoSys.Setting.TabAutoLoadSave then begin
1477                 GikoDM.TabAutoSaveAction.Execute;
1478         end;
1479
1480         if (SearchDialog <> nil) then begin
1481                 if (SearchDialog.Visible) then begin
1482                         SearchDialog.Close;
1483                         try
1484                                 SearchDialog.Release;
1485                         except
1486                         end;
1487                         SearchDialog := nil;
1488                 end;
1489         end;
1490         {    //2ch\8c¾\8cȩ̂²ÙFree
1491                 if GikoSys.Setting.Gengo <> nil then begin
1492                                 GikoSys.Setting.Gengo.Free;
1493         end;
1494         }
1495         Application.UnhookMainWindow(Hook);
1496         Application.Terminate;
1497 end;
1498
1499 procedure TGikoForm.FormDestroy(Sender: TObject);
1500 var
1501         i                               : Integer;
1502 //      CoolSet: TCoolSet;
1503         wp                      : TWindowPlacement;
1504         tmpBool : Boolean;
1505 begin
1506         // \83}\83E\83X\83W\83F\83X\83`\83\83\81[\8aJ\95ú
1507         try
1508                 MouseGesture.UnHook;
1509         except
1510         end;
1511         try
1512                 ActiveListColumnSave;
1513         except
1514         end;
1515         try
1516                 //\8dÅ\91å\89»\81E\83E\83B\83\93\83h\83E\88Ê\92u\95Û\91
1517                 wp.length := sizeof(wp);
1518                 GetWindowPlacement(Handle, @wp);
1519                 GikoSys.Setting.WindowTop := wp.rcNormalPosition.Top;
1520                 GikoSys.Setting.WindowLeft := wp.rcNormalPosition.Left;
1521                 GikoSys.Setting.WindowHeight := wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top;
1522                 GikoSys.Setting.WindowWidth := wp.rcNormalPosition.Right - wp.rcNormalPosition.Left;
1523                 GikoSys.Setting.WindowMax := WindowState = wsMaximized;
1524
1525                 GikoSys.Setting.ListStyle := ListView.ViewStyle;
1526                 GikoSys.Setting.CabinetVisible := GikoDM.CabinetVisibleAction.Checked;
1527                 GikoSys.Setting.CabinetWidth := CabinetPanel.Width;
1528                 GikoSys.Setting.ListHeight := FBrowserSizeHeight;
1529                 GikoSys.Setting.ListWidth := FBrowserSizeWidth;
1530                 if GikoDM.ArrangeAction.Checked then
1531                         GikoSys.Setting.ListOrientation := gloVertical
1532                 else
1533                         GikoSys.Setting.ListOrientation := gloHorizontal;
1534                 GikoSys.Setting.MessegeBarHeight := MessagePanel.Height;
1535         except
1536         end;
1537
1538         try
1539                 // \83\8c\83X\95\\8e¦\94Í\88Í
1540                 if not GikoSys.Setting.ResRangeHold then
1541                         GikoSys.Setting.ResRange := FResRangeMenuSelect;
1542         except
1543         end;
1544         if WindowState <> wsNormal then
1545                 WindowState := wsNormal;
1546         SaveCoolBarSettings;
1547         try
1548                 GikoSys.Setting.WriteWindowSettingFile;
1549                 GikoSys.Setting.WriteNameMailSettingFile;
1550         except
1551         end;
1552         // \83\8a\83A\83\8b\83^\83C\83\80\82É\95Û\91\82³\82ê\82é\82Ì\82Å\81A\82Ü\82½\81A\83E\83B\83\93\83h\83E\83T\83C\83Y\82ª CoolBar \82æ\82è
1553         // \8f¬\82³\82­\82È\82Á\82Ä\82¢\82é\82Æ\82«\82É\95Û\91\82·\82é\82Æ\92l\82ª\8fã\8f\91\82«\82³\82ê\82Ä\82µ\82Ü\82¤\82Ì\82Å\82±\82±\82Å\82Í\95Û\91\82µ\82È\82¢
1554
1555                 // \81ªFormDestroy\92\86\82É\88Ú\93®\82µ\82½\82Ì\82Å\81A\82±\82±\82Å\95Û\91\82µ\82È\82¢\82Æ\82¢\82¯\82È\82¢\82Æ\8ev\82¤\81B\81i\82à\82\82ã\81@2004/04/09\81j
1556         // CoolBar \95Û\91
1557         //if (GikoForm.WindowState <> wsMinimized) and (GikoForm.WindowState <> wsMaximized) then
1558
1559         //\93ü\97Í\83A\83V\83X\83g\8b@\8d\\82Ì\90Ý\92è\82Ì\95Û\91
1560         InputAssistDM.SaveToFile(GikoSys.GetInputAssistFileName);
1561
1562         //\82¨\8bC\82É\93ü\82è\95Û\91
1563         try
1564                 //FavoriteDM\82Í\8e©\93®\90\90¬\83t\83H\81[\83\80\82È\82Ì\82Å\81A\89ð\95ú\82Í\8e©\93®\93I\82É\82³\82ê\82é
1565                 FavoriteDM.WriteFavorite;
1566                 FavoriteDM.Clear;
1567         except
1568         end;
1569         LockWindowUpdate(Self.Handle);
1570         try
1571                 //\83^\83u\83N\83\8d\81[\83Y
1572                 tmpBool := GikoSys.Setting.ShowDialogForAllTabClose;
1573                 GikoSys.Setting.ShowDialogForAllTabClose := false;
1574                 GikoDM.AllTabCloseAction.Execute;
1575                 GikoSys.Setting.ShowDialogForAllTabClose := tmpBool;
1576         except
1577         end;
1578         try
1579                 for i := FBrowsers.Count - 1 downto 0 do begin
1580                         TWebBrowser(FBrowsers[i]).Free;
1581                 end;
1582                 FBrowsers.Clear;
1583                 FBrowsers.Capacity := 0;
1584         finally
1585                 FBrowsers.Free;
1586         end;
1587         try
1588                 if BrowserNullTab <> nil then begin
1589                         BrowserNullTab.Browser := nil;  {*BrowserNullTab\82ÌBrowser\82Í\90Ý\8cv\8e\9e\82É\93\\82è\95t\82¯\82Ä\82é\93z
1590                                                                                          *\82È\82Ì\82Å\82±\82±\82ÅFree\82³\82ê\82é\82Æ\8d¢\82é\82Ì\82Å\82Í\82¸\82µ\82Ä\82µ\82Ü\82¤\81B
1591                                                                                          *}
1592                         BrowserNullTab.Free;
1593                 end;
1594         except
1595         end;
1596
1597         try
1598                 TreeView.Items.BeginUpdate;
1599                 TreeView.Items.GetFirstNode.Free;
1600                 TreeView.Items.Clear;
1601                 TreeView.Items.EndUpdate;
1602         except
1603         end;
1604
1605         //\83A\83h\83\8c\83X\97\9a\97ð\95Û\91
1606         try
1607                 //AddressHistoryDM\82Í\8e©\93®\90\90¬\83t\83H\81[\83\80\82È\82Ì\82Å\81A\89ð\95ú\82Í\8e©\93®\93I\82É\82³\82ê\82é\81B
1608                 AddressHistoryDM.WriteHistory(AddressComboBox.Items, GikoSys.Setting.MaxRecordCount);
1609         except
1610         end;
1611
1612         //\83q\83X\83g\83\8a\83\8a\83X\83g\95Û\91
1613         try
1614                 SaveHistory;
1615         except
1616         end;
1617         try
1618                 try
1619                         ClearHistory;
1620                 except
1621                 end;
1622         finally
1623                 FHistoryList.Free;
1624         end;
1625
1626         //\8f\84\89ñ\83\8a\83X\83g\95Û\91¶&\94j\8aü
1627         try
1628                 RoundList.SaveRoundFile;
1629         except
1630         end;
1631         try
1632                 try
1633                         RoundList.Clear;
1634                 except
1635                 end;
1636         finally
1637                 RoundList.Free;
1638          end;
1639
1640         try
1641                 try
1642                         FControlThread.Terminate;
1643                         FControlThread.WaitFor;
1644                 except
1645                 end;
1646         finally
1647                 FControlThread.Free;
1648         end;
1649
1650         // TBBS \82Í\95Û\8e\9d\82µ\82Ä\82¢\82é TCategory, TBoard, TThreadItem \82·\82×\82Ä\82ð\8aJ\95ú\82·\82é
1651         // TBoard, TThreadItem \82Ì\83f\83X\83g\83\89\83N\83^\82Í\83v\83\89\83O\83C\83\93\82É\94j\8aü\82ð\93`\82¦\82é\82Ì\82Å
1652         // BoardPluteIns \82Ì\8aJ\95ú\82æ\82è\90æ\82É\8ds\82¤\82±\82Æ
1653         for i := Length(BoardGroups) - 1 downto 0 do begin
1654                 //BoardGroups[i].Clear;
1655                 BoardGroups[i].Free;
1656         end;
1657
1658         try
1659                 for i := Length( BBSs ) - 1 downto 0 do begin
1660                         if BBSs[ i ] <> nil then
1661                                 BBSs[ i ].Free;
1662                         BBSs[ i ] := nil;
1663                 end;
1664         except
1665         end;
1666
1667         try
1668                 if FEvent <> nil then
1669                         FEvent.Free;
1670
1671                 //Hint\94j\8aü
1672                 if FHint <> nil then begin
1673                         FHint.ReleaseHandle;
1674                         FHint.Free;
1675                         FHint := nil;
1676                 end;
1677                 //Preview\94j\8aü
1678                 if TPreviewBrowser <> nil then begin
1679                         FPreviewBrowser.Free;
1680                         FPreviewBrowser := nil;
1681                 end;
1682         except
1683         end;
1684         LockWindowUpdate(0);
1685 end;
1686
1687 // \8ae\8f\8a\82É\82 \82é\83L\83\83\83r\83l\83b\83g\81E BBS \83\81\83j\83\85\81[\82ð\83Z\83b\83g\81^\8dX\90V
1688 procedure TGikoForm.SetBBSMenu;
1689 var
1690         i                       : Integer;
1691         item    : TBBSMenuItem;
1692 begin
1693
1694         // \83\81\83j\83\85\81[\82ð\8dí\8f\9c
1695         for i := CabinetSelectPopupMenu.Items.Count - 1 downto 0 do begin
1696                 try
1697                         if CabinetSelectPopupMenu.Items[ i ] is TBBSMenuItem then begin
1698                                 CabinetSelectPopupMenu.Items[ i ].Free;
1699                                 CabinetMenu.Items[ i ].Free;
1700                                 BBSSelectPopupMenu.Items[ i ].Free;
1701                         end;
1702                 except
1703                 end;
1704         end;
1705
1706         // \83\81\83j\83\85\81[\82ð\90Ý\92è
1707         for i := Length( BBSs ) - 1 downto 0 do begin
1708                 try
1709                         item                                    := TBBSMenuItem.Create( PopupMenu );
1710                         item.Caption    := BBSs[ i ].Title;
1711                         item.Data                       := BBSs[ i ];
1712                         item.OnClick    := BBSMenuItemOnClick;
1713                         CabinetSelectPopupMenu.Items.Insert( 0, item );
1714                         item                                    := TBBSMenuItem.Create( PopupMenu );
1715                         item.Caption    := BBSs[ i ].Title;
1716                         item.Data                       := BBSs[ i ];
1717                         item.OnClick    := BBSMenuItemOnClick;
1718                         CabinetMenu.Insert( 0, item );
1719                         item                                    := TBBSMenuItem.Create( PopupMenu );
1720                         item.Caption    := BBSs[ i ].Title;
1721                         item.Data                       := BBSs[ i ];
1722                         item.OnClick    := BBSMenuItemOnClick;
1723                         BBSSelectPopupMenu.Items.Insert( 0, Item );
1724                 except
1725                 end;
1726         end;
1727
1728 end;
1729
1730 procedure TGikoForm.ReloadBBS;
1731 var
1732         i                       : Integer;
1733         tmpBool: Boolean;
1734 begin
1735     LockWindowUpdate(Self.Handle);
1736
1737         //\83^\83u\83N\83\8d\81[\83Y
1738         tmpBool := GikoSys.Setting.ShowDialogForAllTabClose;
1739         GikoSys.Setting.ShowDialogForAllTabClose := false;
1740         GikoDM.AllTabCloseAction.Execute;
1741         GikoSys.Setting.ShowDialogForAllTabClose := tmpBool;
1742         SetContent(BrowserNullTab);
1743         //TreeView\83N\83\8a\83A\81iBBS2ch.Free\82Ì\8cã\82É\83N\83\8a\83A\82·\82é\82ÆXP\83X\83^\83C\83\8b\8e\9e\82É\83G\83\89\81[\8fo\82é\81j
1744         TreeView.Items.Clear;
1745
1746         //\8f\84\89ñ\83\8a\83X\83g\95Û\91
1747         try
1748                 RoundList.SaveRoundFile;
1749         except
1750         end;
1751         //\8f\84\89ñ\83\8a\83X\83g\82ð\94j\8aü
1752         try
1753                 RoundList.Clear;
1754         except
1755         end;
1756
1757         //\97\9a\97ð\82Ì\95Û\91\82Æ\94j\8aü
1758         try
1759                 SaveHistory;
1760                 ClearHistory;
1761         except
1762         end;
1763
1764         //\82¨\8bC\82É\93ü\82è\82Ì\95Û\91\82Æ\94j\8aü
1765         try
1766                 FavoriteDM.WriteFavorite;
1767                 FavoriteDM.Clear;
1768         except
1769         end;
1770
1771         //\94Â\81E\83X\83\8c\81EPLUGIN\82Ì\94j\8aü
1772         for i := Length(BoardGroups) - 1 downto 0 do begin
1773                 try
1774                         BoardGroups[i].Free;
1775                 except
1776                 end;
1777         end;
1778         //BBS\94j\8aü
1779         try
1780                 for i := Length( BBSs ) - 1 downto 0 do begin
1781                         if BBSs[ i ] <> nil then
1782                                 BBSs[ i ].Free;
1783                         BBSs[ i ] := nil;
1784                 end;
1785         except
1786         end;
1787
1788         ActiveList := nil;
1789
1790         FTreeType := gttNone;
1791
1792         //============\82±\82±\82©\82ç\89º\82Å\81A\8dÄ\90¶================================//
1793
1794         // \8aO\95\94\94Â\83v\83\89\83O\83C\83\93\82ð\83\8d\81[\83h(ReadBoardFile, LoadHistory \82æ\82è\90æ\82É\8ds\82¤\82±\82Æ)
1795         InitializeBoardPlugIns;
1796
1797         GikoSys.ListBoardFile;          //\83{\81[\83h\83t\83@\83C\83\8b\93Ç\8d\9e
1798
1799         // \82·\82×\82Ä\82ÌBBS\82ð\93Ç\82Ý\8d\9e\82ñ\82Å\82¨\82­
1800         for i := Length(BBSs) - 1 downto 0 do begin
1801                 if not BBSs[i].IsBoardFileRead then
1802                         GikoSys.ReadBoardFile(BBSs[i]);
1803         end;
1804
1805         // BBS \83\81\83j\83\85\81[\82Ì\8dX\90V
1806         SetBBSMenu;
1807
1808         ShowBBSTree( BBSs[ 0 ] );
1809
1810         // \97\9a\97ð\93Ç\82Ý\8d\9e\82Ý
1811         LoadHistory;
1812
1813         //\82¨\8bC\82É\93ü\82è\93Ç\82Ý\8d\9e\82Ý
1814         FavoriteDM.ReadFavorite;
1815
1816         SetLinkBar;
1817
1818         //\8f\84\89ñ\82Ì\93Ç\82Ý\8d\9e\82Ý
1819         RoundList.LoadRoundBoardFile;
1820         RoundList.LoadRoundThreadFile;
1821
1822         LockWindowUpdate(0);
1823         //
1824         GikoDM.TabsOpenAction.Execute;
1825 end;
1826
1827
1828 procedure TGikoForm.BrowserStatusTextChange(Sender: TObject; const Text: WideString);
1829 var
1830         p: TPoint;
1831         s: string;
1832         tmp2: string;
1833         URL: string;
1834         ATitle: Boolean;
1835
1836         threadItem      : TThreadItem;
1837         board                           : TBoard;
1838         Protocol, Host, Path, Document, Port, Bookmark: string;
1839
1840         wkInt: Integer;
1841         wkIntSt: Integer;
1842         wkIntTo: Integer;
1843         ActiveFileName: string;
1844         e: IHTMLElement;
1845         Ext: string;
1846         PathRec: TPathRec;
1847 begin
1848         if not( TObject(Sender) is TWebBrowser )then
1849                 Exit;
1850         try
1851                 try
1852                         if (TWebBrowser(Sender) <> nil) and (not TWebBrowser(Sender).Busy) and (Assigned(TWebBrowser(Sender).Document)) then begin
1853                                 if LowerCase(OleVariant(IHTMLDocument2(TWebBrowser(Sender).Document)).charset) <> 'shift_jis' then begin
1854                                         OleVariant(IHTMLDocument2(TWebBrowser(Sender).Document)).charset := 'shift_jis';
1855                                 end;
1856                         end;
1857                 except
1858                 end;
1859         finally
1860         end;
1861         if PreviewTimer.Enabled then
1862                 PreviewTimer.Enabled := False;
1863         Application.CancelHint;
1864         try
1865                 if GetActiveContent <> nil then
1866                         ActiveFileName := ChangeFileExt(ExtractFileName(GetActiveContent.FileName), '')
1867                 else
1868                         ActiveFileName := '';
1869         except
1870                 FActiveContent := nil;
1871                 Exit;
1872         end;
1873
1874         StatusBar.Panels[1].Text := Text;
1875
1876         if FHint <> nil then begin
1877                 FHint.ReleaseHandle;
1878                 FHint.ClearAllRes;
1879         end;
1880         if FPreviewBrowser <> nil then
1881                 ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
1882
1883         if not GikoSys.Setting.UnActivePopup then
1884                 if not GikoForm.Active then
1885                         Exit;
1886
1887 //file:///C:/Borland/Projects/gikoNavi/test/read.cgi/qa/990576336/10
1888 //file:///C:/Borland/Projects/gikoNavi/test/read.cgi/qa/990576336/10-15
1889
1890         s := '';
1891         Ext := AnsiLowerCase(ExtractFileExt(Text));
1892         if (Pos('http://', Text) = 1) and (GikoSys.Setting.PreviewVisible) and
1893                         ((Ext = '.jpg') or (Ext = '.jpeg') or (Ext = '.gif') or (Ext = '.png')) then begin
1894                 if FPreviewBrowser = nil then begin
1895                         FPreviewBrowser := TPreviewBrowser.Create(Self);
1896                         ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
1897                         TOleControl(FPreviewBrowser).Parent := nil;
1898                 end;
1899                 FPreviewBrowser.Navigate(BLANK_HTML);//\91O\89ñ\82Ì\83v\83\8c\83r\83\85\81[\89æ\91\9c\8fÁ\8b\8e\97p
1900                 FPreviewURL := Text;
1901                 PreviewTimer.Interval := GikoSys.Setting.PreviewWait;
1902                 PreviewTimer.Enabled := True;
1903         end else if (Pos('about:blank', Text) = 1) or (Pos('http://', Text) = 1) or (Pos('mailto:', Text) = 1) then begin
1904                 if Pos('mailto:', Text) = 1 then begin
1905                         s := StringReplace(Text, 'mailto:', '', [rfIgnoreCase]);
1906                         //\83M\83R\83i\83r\83X\83\8c \83p\81[\83g3\82Ì466\8e\81\82É\8a´\8eÓ
1907                         GetCursorPos(p);
1908                         p.x := p.x - TWebBrowser(Sender).ClientOrigin.x;
1909                         p.y := p.y - TWebBrowser(Sender).ClientOrigin.y;
1910                         e := IHTMLDocument2(TWebBrowser(Sender).Document).elementFromPoint(p.x, p.y);
1911                         if (Assigned(e)) then begin
1912                                 tmp2 := ZenToHan(e.Get_outerText);
1913                                 if (GikoSys.IsNumeric(tmp2)) then begin
1914                                         //\82\93\82Í\83\8c\83X\94Ô\8d\86\82Á\82Û\82¢\82Á\82·\81B
1915                                         wkIntSt := StrToInt64(tmp2);
1916                                         wkIntTo := StrToInt64(tmp2);
1917                                                 //s := GetThreadText(wkBBS, wkKey, wkIntSt, wkIntTo, False, False);
1918                                         FHint.PopupType := gptThread;
1919                                         HTMLCreater.SetResPopupText(FHint, GetActiveContent, wkIntSt, wkIntTo, False, False);
1920                                 end else begin
1921                                         FHint.PopupType := gptRaw;
1922                                         FHint.Caption := s;
1923                                 end;
1924                         end;
1925                 end else begin
1926                         threadItem := GetActiveContent;
1927                         URL := THTMLCreate.GetRespopupURL(Text, threadItem.URL);
1928                         PathRec := Gikosys.Parse2chURL2(URL);
1929                         if (PathRec.FNoParam) then begin
1930                                 PathRec.FSt := 1;
1931                                 PathRec.FTo := 1;
1932                         end else begin
1933                                 Gikosys.GetPopupResNumber(URL,PathRec.FSt,PathRec.FTo);
1934                         end;
1935                         GikoSys.ParseURI( URL, Protocol, Host, Path, Document, Port, Bookmark );
1936
1937                         if PathRec.FDone or (not GikoSys.Is2chHost( Host )) then begin
1938
1939                                 URL := GikoSys.GetBrowsableThreadURL( URL );
1940                                 wkIntSt := PathRec.FSt;
1941                                 wkIntTo := PathRec.FTo;
1942
1943                                 if (wkIntSt = 0) and (wkIntTo = 0) then begin
1944                                         wkIntSt := 1;
1945                                         wkIntTo := 1;
1946                                 end else if (wkIntSt = 0) and (wkIntTo > 0) then begin
1947                                         wkIntSt := wkIntTo;
1948                                 end else if (wkIntSt > 0) and (wkIntTo = 0) then begin
1949                                         wkIntTo := wkIntSt;
1950                                 end else if wkIntSt > wkIntTo then begin
1951                                         wkInt := wkIntTo;
1952                                         wkIntTo := wkIntSt;
1953                                         wkIntSt := wkInt;
1954                                 end;
1955                                 if (FActiveContent <> nil) and (FActiveContent.Thread.URL = URL) then
1956                                         ATitle := false
1957                                 else
1958                                         ATitle := true;
1959
1960                                 threadItem := BBSsFindThreadFromURL( URL );
1961
1962                                 if (threadItem = nil) and GikoSys.Is2chHost( Host ) then begin
1963                                         board := BBSs[ 0 ].FindBBSID( PathRec.FBBS );
1964                                         if board <> nil then begin
1965                                                 if not board.IsThreadDatRead then
1966                                                         GikoSys.ReadSubjectFile( board );
1967                                                 threadItem := board.FindThreadFromFileName( PathRec.FKey + '.dat' );
1968                                         end;
1969                                 end;
1970
1971                                 if threadItem <> nil then begin
1972                                         //HintData := GetThreadText(PathRec.FBBS, PathRec.FKey, wkIntSt, wkIntTo, ATitle, PathRec.FFirst);
1973                                         //URL\82Ì\8dÅ\8cã\82É/\82ª\95t\82¢\82Ä\82¢\82È\82¢\82Æ\82«\97p
1974                                         if ( IntToStr(wkIntSt) = ChangeFileExt(threadItem.FileName, '') ) then begin
1975                                                 wkIntSt := 1;
1976                                                 wkIntTo := 1;
1977                                         end;
1978                                         FHint.PopupType := gptThread;
1979                                         HTMLCreater.SetResPopupText(FHint, threadItem, wkIntSt, wkIntTo, ATitle, PathRec.FFirst );
1980                                 end;
1981                         end;
1982                 end;
1983
1984                 if FHint.PopupType = gptRaw then begin
1985                         if FHint.Caption <> '' then
1986                                 ShowTextPopup;
1987                 end else begin
1988                         if (FHint.ResCount <> 0) or (FHint.Title <> '') then
1989                                 ShowTextPopup;
1990                 end;
1991         end;
1992 end;
1993
1994 procedure TGikoForm.SetEnabledCloseButton(Enabled: Boolean);
1995 var
1996         SysMenu: HMenu;
1997 begin
1998         FEnabledCloseButton := Enabled;
1999         SysMenu := GetSystemMenu(Handle, False);
2000
2001         if Enabled then begin
2002                 EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED);
2003         end else begin
2004                 EnableMenuItem(SysMenu, SC_CLOSE, MF_BYCOMMAND or MF_GRAYED);
2005         end;
2006
2007         DrawMenuBar(Handle);
2008 end;
2009
2010 procedure TGikoForm.TreeViewChanging(Sender: TObject; Node: TTreeNode;
2011         var AllowChange: Boolean);
2012 begin
2013 //\83\\81[\83g\8f\87\82ð\95Û\91\82·\82é\82æ\82¤\82É\82µ\82½\82Ì\82Å\8dí\8f\9c
2014 //      if FTreeType = gtt2ch then
2015 //              FSortIndex := -1;
2016 end;
2017
2018 procedure TGikoForm.ListViewKeyDown(Sender: TObject; var Key: Word;
2019         Shift: TShiftState);
2020 var
2021         pos     : TPoint;
2022 begin
2023         if GetActiveList is TBoard then begin
2024                 case Key of
2025                 VK_BACK:;       //      UpFolderButtonClick(Sender);
2026                 VK_SPACE:                       ListDoubleClick(Shift);
2027                 VK_RETURN:              ListClick;
2028                 VK_APPS:
2029                         begin
2030                                 if ListView.Selected <> nil then begin
2031                                         pos.X := ListView.Column[ 0 ].Width;
2032                                         pos.Y := ListView.Selected.Top;
2033                                 end else begin
2034                                         pos.X := ListView.Left;
2035                                         pos.Y := ListView.Top;
2036                                 end;
2037                                 Windows.ClientToScreen( ListView.Handle, pos );
2038                                 ListPopupMenu.Popup( pos.X, pos.Y );
2039                         end;
2040                 end;
2041         end else begin // TBBS, TCategory
2042                 case Key of
2043                 VK_BACK:;       //      UpFolderButtonClick(Sender);
2044                 VK_SPACE:                       ListClick;
2045                 VK_RETURN:              ListDoubleClick(Shift);
2046                 VK_APPS:
2047                         begin
2048                                 if ListView.Selected <> nil then begin
2049                                         pos.X := ListView.Column[ 0 ].Width;
2050                                         pos.Y := ListView.Selected.Top;
2051                                 end else begin
2052                                         pos.X := ListView.Left;
2053                                         pos.Y := ListView.Top;
2054                                 end;
2055                                 Windows.ClientToScreen( ListView.Handle, pos );
2056                                 ListPopupMenu.Popup( pos.X, pos.Y );
2057                         end;
2058                 end;
2059         end;
2060 end;
2061
2062 function TGikoForm.GetHttpState: Boolean;
2063 begin
2064         Result := FHttpState;
2065 end;
2066
2067 procedure TGikoForm.ListViewColumnClick(Sender: TObject;
2068         Column: TListColumn);
2069 var
2070         id, idx                 : Integer;
2071         orderList               : TList;
2072         vSortIndex              : Integer;
2073         vSortOrder              : Boolean;
2074 begin
2075         idx := TListViewUtils.ActiveListTrueColumn( Column ).Tag;
2076         if TObject( FActiveList ) is TBBS then begin
2077                 orderList := GikoSys.Setting.BBSColumnOrder;
2078                 vSortIndex := GikoSys.Setting.BBSSortIndex;
2079                 vSortOrder := GikoSys.Setting.BBSSortOrder;
2080         end else if TObject( FActiveList ) is TCategory then begin
2081                 orderList := GikoSys.Setting.CategoryColumnOrder;
2082                 vSortIndex := GikoSys.Setting.CategorySortIndex;
2083                 vSortOrder := GikoSys.Setting.CategorySortOrder;
2084         end else if TObject( FActiveList ) is TBoard then begin
2085                 orderList := GikoSys.Setting.BoardColumnOrder;
2086                 vSortIndex := GikoSys.Setting.BoardSortIndex;
2087                 vSortOrder := GikoSys.Setting.BoardSortOrder;
2088         end else
2089                 Exit;
2090
2091         id := Integer( orderList[ idx ] );
2092
2093
2094         if vSortIndex = id then
2095                 vSortOrder := not vSortOrder
2096         else begin
2097                 vSortOrder := id = 0;
2098         end;
2099
2100         TListViewUtils.ListViewSort(Sender, ListView, Column, GikoDM.ListNumberVisibleAction.Checked, vSortOrder);
2101 end;
2102
2103 procedure TGikoForm.MenuToolBarCustomDrawButton(Sender: TToolBar;
2104         Button: TToolButton; State: TCustomDrawState; var DefaultDraw: Boolean);
2105 var
2106         ARect: TRect;
2107 begin
2108         DefaultDraw := True;
2109         Exit;
2110         DefaultDraw := False;
2111         if (cdsSelected in State) or (cdsHot in State) then begin
2112                 Sender.Canvas.Brush.Color := clHighlight;
2113                 Sender.Canvas.Font.Color := clHighlightText;
2114         end else begin
2115                 Sender.Canvas.Brush.Color := clBtnFace;
2116                 Sender.Canvas.Font.Color := clBtnText;
2117         end;
2118         ARect := Rect(Button.Left, Button.Top, Button.Left + Button.Width, Button.Top + Button.Height);
2119         Sender.Canvas.FillRect(ARect);
2120         DrawText(Sender.Canvas.Handle, PChar(Button.Caption), -1, ARect, DT_SINGLELINE or DT_VCENTER or DT_CENTER);
2121 end;
2122
2123 function TGikoForm.GetTreeNode(Data: TObject): TTreeNode;
2124 var
2125         Nodes: TTreeNodes;
2126         i: integer;
2127 begin
2128         Nodes := TreeView.Items;
2129
2130         for i := 0 to Nodes.Count - 1 do begin
2131                 if Nodes.Item[i].Data = Data then begin
2132                         Result := Nodes.Item[i];
2133                         Exit;
2134                 end;
2135         end;
2136         Result := nil;
2137 end;
2138
2139 procedure TGikoForm.BrowserBeforeNavigate2(Sender: TObject;
2140         const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
2141         Headers: OleVariant; var Cancel: WordBool);
2142 var
2143         sNo: string;
2144         p: TPoint;
2145 const
2146         kMenuName: string = 'menu:';
2147 begin
2148
2149         if Pos(kMenuName, URL) <> 0 then begin
2150                 sNo := Copy( URL, Pos( kMenuName, URL ) + Length( kMenuName ), Length( URL ) );
2151                 
2152                 if not GikoSys.IsNumeric(sNo) then Exit;
2153
2154                 Cancel := True;
2155                 GetCursorpos(p);
2156                 KokoPopupMenu.Tag := StrToInt(sNo);
2157                 KokoPopupMenu.Popup(p.x, p.y);
2158         end else if Pos('mailto', LowerCase(URL)) <> 0 then begin
2159                 Cancel := not GikoSys.Setting.OpenMailer;
2160         end;
2161
2162 end;
2163
2164 procedure TGikoForm.TreeViewCustomDraw(Sender: TCustomTreeView;
2165         const ARect: TRect; var DefaultDraw: Boolean);
2166 var
2167         NodeRect: TRect;
2168         i, j: Integer;
2169         IsBoardNode: Boolean;
2170         Cnt: Integer;
2171         CntText: string;
2172         TextWidth: Integer;
2173         TextRect: TRect;
2174         Board: TBoard;
2175         Category: TCategory;
2176         Bitmap: TBitmap;
2177         NodeWidth: Integer;
2178 begin
2179         DefaultDraw := True;
2180
2181         if FTreeType = gttHistory then Exit;
2182
2183         TreeView.Canvas.Font.Color := clBlue;
2184         IsBoardNode := False;
2185         for i := 0 to TreeView.Items.Count - 1 do begin
2186                 Cnt := 0;
2187                 if not TreeView.Items[i].IsVisible then
2188                         continue;
2189
2190                 if TObject(TreeView.Items[i].Data) is TCategory then begin
2191                         if TreeView.Items[i].Expanded then
2192                                 continue;
2193
2194                         IsBoardNode := False;
2195                         Category := TCategory(TreeView.Items[i].Data);
2196                         for j := 0 to Category.Count - 1 do begin
2197                                 Board := Category.Items[j];
2198                                 if Board <> nil then begin
2199                                         if Board.UnRead > 0 then begin
2200                                                 Cnt := 1;
2201                                                 Break;
2202                                         end;
2203                                 end;
2204                         end;
2205                         if Cnt <> 1 then
2206                                 continue;
2207                 end else if TObject(TreeView.Items[i].Data) is TBoard then begin
2208                         IsBoardNode := True;
2209                         Board := TBoard(TreeView.Items[i].Data);
2210
2211                         Cnt := Board.UnRead;
2212                         if Cnt <= 0 then
2213                                 continue;
2214                 end else
2215                         continue;
2216
2217                 Bitmap := TBitmap.Create;
2218                 try
2219                         Bitmap.Canvas.Font.Assign(TreeView.Canvas.Font);
2220                         Bitmap.Canvas.Font.Style := [fsBold];
2221                         NodeWidth := Bitmap.Canvas.TextWidth(TreeView.Items[i].Text);
2222                 finally
2223                         Bitmap.Free;
2224                 end;
2225
2226                 NodeRect := TreeView.Items[i].DisplayRect(True);
2227
2228                 if IsBoardNode then
2229                         CntText := '(' + IntToStr(Cnt) + ')'
2230                 else if Cnt = 1 then
2231                         CntText := '(+)';
2232
2233
2234                 TextWidth := TreeView.Canvas.TextWidth(CntText);
2235
2236                 TextRect := Rect(NodeRect.Left + NodeWidth + 8,
2237                                                                                  NodeRect.Top,
2238                                                                                  NodeRect.Left + NodeWidth + TextWidth + 8,
2239                                                                                  NodeRect.Bottom);
2240                 DrawText(TreeView.Canvas.Handle,
2241                                                  PChar(CntText),
2242                                                  -1,
2243                                                  TextRect,
2244                                                  DT_SINGLELINE or DT_VCENTER);
2245         end;
2246         TreeViewCustomDrawItem(nil, nil, [], DefaultDraw);
2247 end;
2248
2249 procedure TGikoForm.TreeViewCustomDrawItem(Sender: TCustomTreeView;
2250         Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
2251 var
2252         Board: TBoard;
2253         Category: TCategory;
2254         i: Integer;
2255 begin
2256         DefaultDraw := True;
2257
2258         if FTreeType = gttHistory then Exit;
2259
2260         TreeView.Canvas.Font.Style := [];
2261         if Node <> nil then begin
2262                 if TObject(Node.Data) is TCategory then begin
2263                         Category := TCategory(Node.Data);
2264                         for i := 0 to Category.Count - 1 do begin
2265                                 Board := Category.Items[i];
2266                                 if Board <> nil then begin
2267                                         if Board.UnRead > 0 then begin
2268                                                 TreeView.Canvas.Font.Style := [fsBold];
2269                                                 Break;
2270                                         end;
2271                                 end;
2272                         end;
2273                 end else if TObject(Node.Data) is TBoard then begin
2274                         Board := TBoard(Node.Data);
2275                         if Board.UnRead > 0 then
2276                                 TreeView.Canvas.Font.Style := [fsBold];
2277                 end;
2278         end;
2279 end;
2280
2281 procedure TGikoForm.TreeViewExpanded(Sender: TObject; Node: TTreeNode);
2282 begin
2283         TreeView.Invalidate;
2284
2285         if TObject(Node.Data) is TBBS then begin
2286                 TBBS(Node.Data).NodeExpand := True;
2287         end else if TObject(Node.Data) is TCategory then begin
2288                 TCategory(Node.Data).NodeExpand := True;
2289         end else if TObject(Node.Data) is TBoard then begin
2290                 TBoard(Node.Data).NodeExpand := True;
2291         end;
2292 end;
2293
2294 procedure TGikoForm.ListViewAllSelect;
2295 begin
2296         ListView.SetFocus;
2297         ListView.SelectAll;
2298 end;
2299 procedure TGikoForm.DownloadMsg(Sender: TObject; Item: TDownloadItem; Msg: string; Icon: TGikoMessageIcon);
2300 begin
2301         AddMessageList(Msg, nil, Icon);
2302 end;
2303 // *************************************************************************
2304 //! \83_\83E\83\93\83\8d\81[\83h\82ª\8a®\97¹\82µ\82½\82Æ\82«\82É\94­\90\82·\82é\83C\83x\83\93\83g
2305 // *************************************************************************
2306 procedure TGikoForm.DownloadEnd(Sender: TObject; Item: TDownloadItem);
2307 var
2308         ATitle: string;
2309         s: string;
2310         boardPlugIn : TBoardPlugIn;
2311         i: Integer;
2312         Res : TResRec;
2313 begin
2314         try
2315                 if Item.DownType = gdtBoard then
2316                         ATitle := Item.Board.Title
2317                 else
2318                         ATitle := Item.ThreadItem.Title;
2319                 if ATitle = '' then
2320                         ATitle := GikoSys.GetGikoMessage(gmUnKnown);
2321
2322                 if Item.State in [gdsComplete, gdsDiffComplete] then begin
2323                         //\90³\8fí\8fI\97¹
2324                         if Item.DownType = gdtBoard then begin
2325                                 //\94Â
2326                                 Item.SaveListFile;
2327                                 AddMessageList(ATitle + ' ' + GikoSys.GetGikoMessage(gmSureItiran), nil, gmiOK);
2328                                 if GetActiveList = Item.Board then begin
2329                                         FActiveList := nil;
2330                                         //\8e©\93®\83\\81[\83g\82Ì\8fê\8d\87\94Â\88ê\97\97\82Ì\83\\81[\83g\8f\87\82ð\83N\83\8a\83A\82·\82é
2331                                         if (GikoSys.Setting.AutoSortThreadList) then begin
2332                                                 GikoSys.Setting.BoardSortIndex := 0;
2333                                                 GikoSys.Setting.BoardSortOrder := True;
2334                                         end;
2335                                         Sort.SetSortDate(Now());
2336                                         SetActiveList(Item.Board);
2337                                 end;
2338                                 Item.Board.Modified := True;
2339                                 Item.Board.IsThreadDatRead := True;
2340                                 PlaySound('New');
2341                                 ListView.Refresh;
2342                         end else if Item.DownType = gdtThread then begin
2343                                 //\83X\83\8c
2344                                 Item.SaveItemFile;
2345                                 Item.ThreadItem.NewArrival := True;
2346                                 //if (Item.ThreadItem.IsBoardPlugInAvailable) and (Item.ThreadItem.Title = '') then begin
2347                                 if (Item.ThreadItem.ParentBoard.IsBoardPlugInAvailable) and (Item.ThreadItem.Title = '') then begin
2348                                         //boardPlugIn           := Item.ThreadItem.BoardPlugIn;
2349                                         boardPlugIn             := Item.ThreadItem.ParentBoard.BoardPlugIn;
2350                                         THTMLCreate.DivideStrLine(boardPlugIn.GetDat( DWORD( Item.ThreadItem ), 1 ), @Res);
2351                                         Item.ThreadItem.Title := Res.FTitle;
2352                                         ATitle := Item.ThreadItem.Title;
2353                                 end else if ATitle = '\81i\96¼\8fÌ\95s\96¾\81j' then begin
2354                                         THTMLCreate.DivideStrLine(GikoSys.ReadThreadFile(Item.ThreadItem.GetThreadFileName, 1), @Res);
2355                                         ATitle := Res.FTitle;
2356                                 end;
2357                                 for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
2358                                         if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread = Item.ThreadItem then begin
2359                                                 TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
2360                                                 break;
2361                                         end;
2362                                 end;
2363                                 if GikoSys.Setting.BrowserTabVisible then begin
2364                                         if GetActiveContent = Item.ThreadItem then
2365                                                 InsertBrowserTab(Item.ThreadItem)
2366                                         else if (ListView.Selected <> nil ) and ( TObject(ListView.Selected.Data) is TThreadItem ) and ( Item.ThreadItem = TThreadItem(ListView.Selected.Data)) then
2367                                                 InsertBrowserTab(Item.ThreadItem, True)
2368                                         else
2369                                                 InsertBrowserTab(Item.ThreadItem, False);
2370
2371                                 end else begin
2372                                         if (GetActiveContent = Item.ThreadItem) or (FActiveContent = nil) or(FActiveContent.Browser = BrowserNullTab.Browser) then
2373                                                                                                 InsertBrowserTab(Item.ThreadItem);
2374                                 end;
2375
2376                                                                 Application.ProcessMessages;
2377
2378                                 if Item.State = gdsComplete then begin
2379                                         PlaySound('New');
2380                                                                                 AddMessageList(ATitle + ' ' + GikoSys.GetGikoMessage(gmSureSyutoku), nil, gmiOK);
2381                                                                                 //Add by Genyakun
2382                                                                                 DiffComp := True;
2383                                 end else begin
2384                                         PlaySound('NewDiff');
2385                                                                                 AddMessageList(ATitle + ' ' + GikoSys.GetGikoMessage(gmSureDiff), nil, gmiOK);
2386                                                                                 //Add by Genyakun
2387                                                                                 DiffComp := True;
2388                                 end;
2389
2390                                 //\8f\84\89ñ\82 \82è\82Ì\8fê\8d\87\81\95\82P\82O\82O\82O\92´\82Í\8f\84\89ñ\8dí\8f\9c
2391                                 if (Item.ThreadItem.Round) and (Item.ThreadItem.Count > 1000) then begin
2392                                         Item.ThreadItem.Round := False;
2393                                         //Item.ThreadItem.RoundName := '';
2394                                         AddMessageList('\81\9a1000\94­\8c¾\82ð\92´\82¦\82½\82Ì\82Å\8f\84\89ñ\82ð\8dí\8f\9c\82µ\82Ü\82µ\82½ - [' + Item.ThreadItem.Title + ']', nil, gmiOK);
2395                                 end;
2396                                 TreeView.Refresh;
2397                                 //ListView\82Å\82±\82Ì\83X\83\8c\82ª\8aÜ\82Ü\82ê\82é\94Â\82ð\95\\8e¦\82µ\82Ä\82¢\82é\82Æ\82«\82Ì\8dX\90V\8f\88\97\9d
2398                                 if (ActiveList <> nil) and (ActiveList is TBoard) then begin
2399                                         TBoard(ActiveList).LogThreadCount := TBoard(ActiveList).GetLogThreadCount;
2400                                         TBoard(ActiveList).NewThreadCount := TBoard(ActiveList).GetNewThreadCount;
2401                                         TBoard(ActiveList).UserThreadCount:= TBoard(ActiveList).GetUserThreadCount;
2402                     //ListView\82Ì\83A\83C\83e\83\80\82Ì\8cÂ\90\94\82à\8dX\90V
2403                                         case GikoForm.ViewType of
2404                                                 gvtAll: ListView.Items.Count := TBoard(ActiveList).Count;
2405                                                 gvtLog: ListView.Items.Count := TBoard(ActiveList).LogThreadCount;
2406                                                 gvtNew: ListView.Items.Count := TBoard(ActiveList).NewThreadCount;
2407                                                 gvtArch: ListView.Items.Count := TBoard(ActiveList).ArchiveThreadCount;
2408                                                 gvtLive: ListView.Items.Count := TBoard(ActiveList).LiveThreadCount;
2409                                                 gvtUser: ListView.Items.Count := TBoard(ActiveList).UserThreadCount;
2410                                         end;
2411                                 end;
2412                                 RefreshListView(Item.ThreadItem);
2413                         end;
2414
2415                 end else if Item.State = gdsNotModify then begin
2416                         //\95Ï\8dX\83i\83V
2417 {                       if (Item.DownType = gdtThread) and (AddHistory(Item.ThreadItem)) then begin
2418                                 //SetContent(Item.ThreadItem);
2419                                 InsertBrowserTab(Item.ThreadItem);
2420                         end;}
2421                                                 AddMessageList(ATitle + ' ' + GikoSys.GetGikoMessage(gmNotMod), nil, gmiSAD);
2422                         PlaySound('NoChange');
2423                         Screen.Cursor := crDefault;
2424                 end else if Item.State = gdsAbort then begin
2425                         //\92\86\92f
2426                                                 AddMessageList(ATitle + ' ' + GikoSys.GetGikoMessage(gmAbort), nil, gmiOK);
2427                 end else if Item.State = gdsError then begin
2428                         //\83G\83\89\81[
2429                         s := Item.ErrText;
2430                         if s <> '' then
2431                                 s := ':' + s;
2432                         AddMessageList(ATitle + ' ' + GikoSys.GetGikoMessage(gmError) + ' (' + IntToStr(Item.ResponseCode) + ')' + s, nil, gmiNG);
2433 //                      if Item.ResponseCode = 302 then
2434 //                              AddMessageList('\94Â\82ª\88Ú\93]\82µ\82½\82©\82à\82µ\82ê\82È\82¢\82Ì\82Å\94Â\8dX\90V\82ð\8ds\82Á\82Ä\82­\82¾\82³\82¢\81B', nil, gmiNG);
2435                         PlaySound('Error');
2436                 end;
2437         finally
2438                 Item.Free;
2439                 Dec(FWorkCount);
2440                 if FWorkCount < 0 then FWorkCount := 0;
2441                 if FWorkCount = 0 then begin
2442                         try
2443                                 Animate.Active := False;
2444                         finally
2445                                 Screen.Cursor := crDefault;
2446                         end;
2447                 end;
2448
2449         end;
2450 end;
2451
2452 procedure TGikoForm.WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer; Number: Integer; const AWorkTitle: string);
2453 begin
2454 //      SetProgressValue(Number, 0, AWorkCountMax);
2455 //      ProgressBar.Visible := True;
2456         ProgressBar.Position := 0;
2457         ProgressBar.Max := AWorkCountMax;
2458         FDownloadTitle := AWorkTitle;
2459         StatusBar.Panels[1].Text := FDownloadTitle + ' - \83_\83E\83\93\83\8d\81[\83h\82ð\8aJ\8en\82µ\82Ü\82·';
2460         FDownloadMax := AWorkCountMax;
2461 end;
2462
2463 procedure TGikoForm.WorkEnd(Sender: TObject; AWorkMode: TWorkMode; Number: Integer);
2464 begin
2465         ProgressBar.Position := 0;
2466         if FDownloadMax <> 0 then
2467                 StatusBar.Panels[1].Text := FDownloadTitle + ' - \83_\83E\83\93\83\8d\81[\83h\82ª\8a®\97¹\82µ\82Ü\82µ\82½';
2468 end;
2469
2470 procedure TGikoForm.Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer; Number: Integer);
2471 begin
2472         ProgressBar.Position := AWorkCount;
2473 //      SetProgressValue(Number, AWorkCount);
2474         StatusBar.Panels[1].Text := FDownloadTitle + ' - \83_\83E\83\93\83\8d\81[\83h\92\86 (' + IntToStr(AWorkCount) + '/' + IntToStr(FDownloadMax) + ')';
2475 end;
2476
2477 procedure TGikoForm.AddMessageList(ACaption: string; AObject: TObject; Icon: TGikoMessageIcon);
2478 var
2479         ListItem: TListItem;
2480 begin
2481         MessageListView.Items.BeginUpdate;
2482         try
2483                 ListItem := MessageListView.Items.Add;
2484                 ListItem.Caption := ACaption;
2485                 ListItem.Data := AObject;
2486                 ListItem.MakeVisible(False);
2487                 case Icon of
2488                         gmiOK:   ListItem.ImageIndex := 0;
2489                         gmiSAD: ListItem.ImageIndex := 1;
2490                         gmiNG:   ListItem.ImageIndex := 2;
2491                         gmiWhat: ListItem.ImageIndex := 3;
2492                 end;
2493         finally
2494                 MessageListView.Items.EndUpdate;
2495         end;
2496 end;
2497
2498
2499 function TGikoForm.InsertBrowserTab(
2500         ThreadItem      : TThreadItem;
2501         ActiveTab               : Boolean = True
2502 ) : TBrowserRecord;
2503 var
2504         i, j, idx               : Integer;
2505         favItem                 : TFavoriteThreadItem;
2506         newBrowser      : TBrowserRecord;
2507 begin
2508
2509         Result := nil;
2510         if Threaditem = nil then Exit;
2511
2512         if ThreadItem.IsLogFile then begin
2513                 //\82¨\8bC\82É\93ü\82è\82Ì\91S\82Ä\8aJ\82­\82Æ\82©\82â\82é\82Æ\81A\8d¡\8aJ\82¢\82Ä\82é\83X\83\8c\82Ìbrowser\82ð\95t\82¯\91Ö\82¦\82é\8b°\82ê\82ª\82 \82é
2514                 //\8fí\82É\82S\94Ô\96Ú\82ÉActive\82Ì\83u\83\89\83E\83U\82ª\97\88\82È\82¢\82æ\82¤\82É\88Ú\93®\82³\82¹\82é
2515                 if (FActiveContent <> nil) and (FActiveContent.Browser <> nil) and
2516                         (FActiveContent.Browser <> BrowserNullTab.Browser)then begin
2517                         j := FBrowsers.IndexOf(FActiveContent.Browser);
2518                         if j = BROWSER_COUNT - 1 then
2519                                 FBrowsers.Move(BROWSER_COUNT - 1, 0);
2520                 end;
2521                 favItem := TFavoriteThreadItem.Create(ThreadItem.URL, ThreadItem.Title );
2522                 if not AddHistory( favItem ) then
2523                         favItem.Free;
2524
2525                 for i := 0 to BrowserTab.Tabs.Count - 1 do begin
2526                         if TObject(BrowserTab.Tabs.Objects[i]) is TBrowserRecord then begin
2527                                 if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread = ThreadItem then begin
2528                                         Result := TBrowserRecord( BrowserTab.Tabs.Objects[i] );
2529                                         if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser = nil then begin
2530                                                 for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
2531                                                         if TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
2532                                                                 ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
2533                                                                 break;
2534                                                         end;
2535                                                 end;
2536                                                 TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
2537                                                 TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
2538                                                 FBrowsers.Move(BROWSER_COUNT - 1, 0);
2539                                         end;
2540                                         if ActiveTab then begin
2541                                                 BrowserTab.TabIndex := i;
2542                                                         BrowserTab.OnChange(nil);
2543                                                 BrowserTab.Repaint;
2544                                         end;
2545                                         Exit;
2546                                 end;
2547                         end;
2548                 end;
2549                 idx := BrowserTab.TabIndex;
2550                 if GikoSys.Setting.BrowserTabAppend = gtaFirst then begin
2551                         newBrowser := TBrowserRecord.Create;
2552                         for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
2553                                 if TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
2554                                         ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
2555                                         break;
2556                                 end;
2557                         end;
2558                         newBrowser.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
2559                         FBrowsers.Move(BROWSER_COUNT - 1, 0);
2560                         //newBrowser.Browser.Navigate(BLANK_HTML);
2561                         newBrowser.thread := ThreadItem;
2562                         newBrowser.Repaint := true;
2563 //                      newBrowser.OnlyHundred := GikoSys.OnlyAHundredRes;
2564
2565                         BrowserTab.Tabs.InsertObject(0, GikoSys.GetShortName(ThreadItem.Title, 20), newBrowser);
2566                         if (not GikoSys.Setting.BrowserTabVisible) and (BrowserTab.Tabs.Count > 1) then begin
2567                                 DeleteTab( TBrowserRecord( BrowserTab.Tabs.Objects[ 1 ] ) );
2568                         end;// else begin
2569                         //end;
2570                         BrowserTab.Repaint;
2571                         if ActiveTab then begin
2572                                 BrowserTab.TabIndex := 0;
2573                         end;
2574
2575                 end else begin
2576                         newBrowser := TBrowserRecord.Create;
2577                         for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
2578                                 if TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
2579                                         ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
2580                                         break;
2581                                 end;
2582                         end;
2583                         newBrowser.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
2584                         FBrowsers.Move(BROWSER_COUNT - 1, 0);
2585                         //newBrowser.Browser.Navigate(BLANK_HTML);
2586                         newBrowser.thread := ThreadItem;
2587 //                      newBrowser.OnlyHundred := GikoSys.OnlyAHundredRes;
2588                         newBrowser.Repaint := true;
2589
2590                         i := BrowserTab.Tabs.AddObject(GikoSys.GetShortName(ThreadItem.Title, 20), newBrowser);
2591                         if (not GikoSys.Setting.BrowserTabVisible) and (BrowserTab.Tabs.Count > 1) then begin
2592                                 DeleteTab( TBrowserRecord( BrowserTab.Tabs.Objects[ 0 ] ) );
2593                         end;
2594                         //end;
2595                         BrowserTab.Repaint;
2596                         if ActiveTab then begin
2597                                 if (not GikoSys.Setting.BrowserTabVisible) and (BrowserTab.Tabs.Count > 0) then
2598                                         BrowserTab.TabIndex := 0
2599                                 else
2600                                         BrowserTab.TabIndex := i;
2601                         end;
2602                 end;
2603                 Result := newBrowser;
2604                 if(ActiveTab) or (idx = -1) then begin
2605                         BrowserTab.OnChange(nil);
2606                 end;
2607         end else begin
2608                 if BrowserNullTab = nil then begin
2609                         BrowserNullTab := TBrowserRecord.Create;
2610                         BrowserNullTab.Browser := Browser;
2611                 end;
2612 //              if BrowserNullTab.thread <> ThreadItem then begin
2613 //                      BrowserNullTab.Movement := '';
2614 //              end;
2615                 BrowserNullTab.thread := ThreadItem;
2616                 Result := BrowserNullTab;
2617                 BrowserTab.TabIndex := -1;
2618                 SetContent(BrowserNullTab);
2619         end;
2620
2621         if GikoSys.Setting.URLDisplay then
2622                 AddressComboBox.Text := ThreadItem.URL;
2623
2624 end;
2625
2626 procedure TGikoForm.SetContent(inThread : TBrowserRecord);
2627 var
2628         BBSID: string;
2629         FileName: string;
2630         sTitle: string;
2631         doc: Variant;
2632         s: string;
2633         i: Integer;
2634         idx: Integer;
2635         ThreadItem: TThreadItem;
2636         Thread: TBrowserRecord;
2637         ThreadTitle, ThreadPTitle: string;
2638         ThreadIsLog, {ThreadUnRead,} ThreadNewArraical: boolean;
2639 begin
2640         Thread := inThread;
2641         idx := BrowserTab.TabIndex;
2642         if (FActiveContent <> nil) and
2643                 (FActiveContent.Thread <> Thread.Thread) and
2644                 (FActiveContent.Browser <> nil) and
2645                 (Assigned(FActiveContent.Browser.Document)) then begin
2646                 try
2647                 try
2648                         FActiveContent.Thread.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document).Body).ScrollTop;
2649                 except
2650                         on E: Exception do
2651                                 MsgBox(Handle, E.Message, 'SetContent[<-ScrollTop]', 0);
2652                 end;
2653                 finally
2654                 end;
2655         end;
2656         if not (Assigned(Thread)) or (Thread.Thread = nil) then begin
2657                 Thread.Browser.Navigate(BLANK_HTML);
2658                 BrowserBoardNameLabel.Caption := '';
2659                 ItemBoardImage.Picture := nil;
2660                 BrowserNameLabel.Caption := '';
2661                 ItemImage.Picture := nil;
2662         BrowserNullTab.Thread := nil;
2663                 //TOleControl(BrowserNullTab.Browser).Visible := true;
2664                 ShowWindow(BrowserNullTab.Browser.Handle, SW_SHOW);
2665                 FActiveContent := nil;
2666                 Exit;
2667         end     else if Thread.Browser = nil then begin
2668                 if FActiveContent.Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then
2669                         FBrowsers.Move(BROWSER_COUNT - 1, 0);
2670                 for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
2671                         if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
2672                                 ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[i]));
2673                                 break;
2674                         end;
2675                 end;
2676                 Thread.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
2677                 FBrowsers.Move(BROWSER_COUNT - 1, 0);
2678         end;
2679
2680         ThreadTitle := Thread.Thread.Title;
2681         ThreadPTitle := Thread.Thread.ParentBoard.Title;
2682         //ThreadScrollTop := Thread.Thread.ScrollTop;
2683         ThreadIsLog := Thread.Thread.IsLogFile;
2684         ThreadItem := Thread.Thread;
2685         ThreadNewArraical :=  Thread.Thread.NewArrival;
2686         //ThreadUnRead := Thread.Thread.UnRead;
2687         BBSID := ThreadItem.ParentBoard.BBSID;
2688         FileName := ThreadItem.FileName;
2689
2690         if GetCapture = ListView.Handle then
2691                 ReleaseCapture;
2692
2693         Screen.Cursor := crHourGlass;
2694
2695
2696         try
2697                 if(FActiveContent <> nil) and (FActiveContent <> Thread) then begin
2698                         if (FActiveContent.Browser <> BrowserNullTab.Browser) then
2699                                 ShowWindow(FActiveContent.Browser.Handle, SW_HIDE);
2700                 end;
2701                 ShowWindow(Thread.Browser.Handle, SW_SHOW);
2702                 if (not Assigned(Thread.Browser.Document)) then begin
2703                         Thread.Browser.Navigate('about:blank');
2704                 end;
2705                 while (Thread.Browser.ReadyState <> READYSTATE_COMPLETE) and
2706                                 (Thread.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
2707                         Application.ProcessMessages;
2708                         if idx <> BrowserTab.TabIndex then begin
2709                                 Exit;
2710                         end;
2711                 end;
2712
2713                 if (Thread <> nil) and (ThreadItem <>nil) then begin
2714                         BrowserBoardNameLabel.Caption := ThreadPTitle;
2715                         ItemIcon16.GetBitmap(4, ItemBoardImage.Picture.Bitmap);
2716                         BrowserNameLabel.Caption := ThreadTitle;
2717                         ItemImage.Picture := nil;
2718                         if ThreadIsLog then
2719                                 if ThreadNewArraical then
2720                                         ItemImageList.GetBitmap(2, ItemImage.Picture.Bitmap)
2721                                 else
2722                                         ItemImageList.GetBitmap(0, ItemImage.Picture.Bitmap)
2723                         else
2724                                 ItemImageList.GetBitmap(1, ItemImage.Picture.Bitmap);
2725
2726                         ItemImage.Left := BrowserBoardNameLabel.Left + BrowserBoardNameLabel.Width + 8;
2727                         BrowserNameLabel.Left := ItemImage.Left + 20;
2728
2729                 end;
2730                 //ActiveContent\81@\82Ì\8dX\90V
2731                 FActiveContent := Thread;
2732
2733                 if not ThreadIsLog then begin
2734                         Self.Caption := GikoDataModule.CAPTION_NAME ;
2735                         //\83X\83e\81[\83^\83X\83o\81[\82É\95\\8e¦\82µ\82Ä\82¢\82é\83X\83\8c\82Ì\97e\97Ê\82ð\8fÁ\8b\8e
2736                         StatusBar.Panels[THREADSIZE_PANEL].Text := '';
2737                         try
2738                                 Thread.Browser.BringToFront;
2739                                 s := '<HTML><BODY><CENTER>\82±\82Ì\83X\83\8c\83b\83h\82Í\8eæ\93¾\82µ\82Ä\82¢\82Ü\82¹\82ñ</CENTER></BODY></HTML>';
2740                                 doc := Idispatch( olevariant(Thread.Browser.ControlInterface).Document) as IHTMLDocument2;
2741                                 doc.open;
2742                                 doc.charset := 'Shift_JIS';
2743                                 doc.Write(s);
2744                                 doc.Close;
2745                         finally
2746                                 
2747                         end;
2748                 end else begin
2749                         Self.Caption := GikoDataModule.CAPTION_NAME + ' - [' + ThreadTitle + ']';
2750                         //\83X\83e\81[\83^\83X\83o\81[\82É\95\\8e¦\82µ\82Ä\82¢\82é\83X\83\8c\82Ì\97e\97Ê\82ð\95\\8e¦
2751                         StatusBar.Panels[THREADSIZE_PANEL].Text := Format('%6.2f kB', [ThreadItem.Size / 1024]);
2752                         StatusBar.Panels[THREADSIZE_PANEL].Width :=
2753                                 Max(StatusBar.Canvas.TextWidth(StatusBar.Panels[THREADSIZE_PANEL].Text), 70);
2754                         //Thread.Repaint\82Í\81A\83X\83L\83\93\93\99\82Ì\90Ý\92è\82ð\95Ï\8dX\82µ\82½\82Æ\82«\81AThread\82ð\83_\83E\83\93\83\8d\81[\83h\82µ\82½\82Æ\82«
2755                         //\90V\8bK\82ÉThread\82ð\8aJ\82¢\82½\82Æ\82«\82É\90^\82É\82È\82Á\82Ä\82¢\82é\81B
2756                         if Thread.Repaint then begin
2757                                 Thread.Repaint := false;
2758
2759                                 Thread.Browser.OnStatusTextChange := nil;
2760                                 LockWindowUpdate(Thread.Browser.ParentWindow);
2761                                 HTMLCreater.CreateHTML2(Thread.Browser, ThreadItem, sTitle);
2762                                 Thread.Browser.OnStatusTextChange := BrowserStatusTextChange;
2763                                 PostMessage( Handle, USER_DOCUMENTCOMPLETE, Integer( Thread.Browser ), 0 );
2764                         end;
2765                 end;
2766
2767                 RefreshListView(ThreadItem);
2768         finally
2769                 Screen.Cursor := crDefault;
2770         end;
2771 end;
2772
2773 function TGikoForm.GetActiveContent: TThreadItem;
2774 begin
2775         try
2776                 if FActiveContent <> nil then
2777                         Result := FActiveContent.Thread
2778                 else
2779                         Result := nil;
2780         except
2781                 Result := nil;
2782         end;
2783
2784 end;
2785
2786 procedure TGikoForm.SetActiveList(Obj: TObject);
2787 var
2788         idx     : Integer;
2789 begin
2790 //      if FActiveList <> Obj then begin
2791                 FActiveList := Obj;
2792         try
2793                         if ListView.Selected <> nil then
2794                                 idx := ListView.Selected.Index
2795                         else
2796                                 idx := -1;
2797         except
2798                 idx := -1;
2799         end;
2800                 ListView.Items.Count := 0;
2801                 ListView.Items.Clear;
2802                 ListView.Selected := nil;
2803 //      ListView.Columns.Clear;
2804                 if (FActiveContent <> nil) and (FActiveContent.Thread <> nil)
2805                         and (FActiveContent.Thread.IsLogFile) then begin
2806                         try
2807                                 Self.Caption := GikoDataModule.CAPTION_NAME + ' - [' + FActiveContent.Thread.Title + ']'
2808                         except
2809                                 on E: Exception do begin
2810                                         //\83X\83\8c\88ê\97\97DL\8cã\82È\82Ç\82ÉFActiveContent\82Ì\8e\9d\82ÂThread\82ª
2811                                         //\8dí\8f\9c\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82ª\82 \82é\82Ì\82Å\82±\82±\82Ä\8f\88\97\9d\82·\82é
2812                                         ReleaseBrowser(FActiveContent);
2813                                         FActiveContent.Thread := nil;
2814                                         Self.Caption := GikoDataModule.CAPTION_NAME;
2815                                 end;
2816                         end;
2817                 end else
2818                         Self.Caption := GikoDataModule.CAPTION_NAME;
2819                 //Application.Title := CAPTION_NAME;
2820
2821 //              ActiveListColumnSave;
2822
2823                 Screen.Cursor := crHourGlass;
2824                 try
2825                         if Obj is TBBS then begin
2826                                 TListViewUtils.SetCategoryListItem(TBBS(obj), ListView, GikoDM.ListNumberVisibleAction.Checked);
2827                         end else if Obj is TCategory then begin
2828                                 TListViewUtils.SetBoardListItem(TCategory(Obj), ListView, GikoDM.ListNumberVisibleAction.Checked);
2829                         end else if Obj is TBoard then begin
2830                                 TListViewUtils.SetThreadListItem(TBoard(Obj), ListView,  GikoDM.ListNumberVisibleAction.Checked);
2831                         end;
2832                 finally
2833                         Screen.Cursor := crDefault;
2834                 end;
2835
2836                 if idx >= 0  then begin
2837                         if idx >= ListView.Items.Count then
2838                                 idx := ListView.Items.Count - 1;
2839                         ListView.ItemIndex := idx;
2840                         ListView.ItemFocused := ListView.Items.Item[ idx ];
2841                 end;
2842 //      end;
2843 end;
2844
2845
2846 //\81\9a\81\9a\83q\83\8d\83\86\83L\83\81\83\82
2847 //\82»\82Ì\82¤\82¿interface\82ð\8eg\82¤
2848 function TGikoForm.GetActiveList: TObject;
2849 begin
2850         Result := FActiveList;
2851 end;
2852
2853 procedure TGikoForm.SetListViewType(AViewType: TGikoViewType);
2854 begin
2855         SetListViewType(AViewType, '', False);
2856 end;
2857
2858 procedure TGikoForm.SetListViewType(AViewType: TGikoViewType; SelectText: string; KubetsuChk: Boolean);
2859 var
2860         Board: TBoard;
2861         i: Integer;
2862 begin
2863         for i := Length( BBSs ) - 1 downto 0 do begin
2864                 BBSs[i].SelectText := SelectText;
2865                 BBSs[i].KubetsuChk := KubetsuChk;
2866         end;
2867         ViewType := AViewType;
2868         if ActiveList is TBoard then begin
2869                 Board := TBoard(ActiveList);
2870                 case ViewType of
2871                         //gvtAll: ListView.Items.Count := Board.Count;
2872                         gvtLog: Board.LogThreadCount := Board.GetLogThreadCount;
2873                         gvtNew: Board.NewThreadCount := Board.GetNewThreadCount;
2874                         gvtArch: Board.ArchiveThreadCount := Board.GetArchiveThreadCount;
2875                         gvtLive: Board.LiveThreadCount := Board.GetLiveThreadCount;
2876                         gvtUser: Board.UserThreadCount:= Board.GetUserThreadCount;
2877
2878                 end;
2879
2880                 SetActiveList(Board);
2881         end;
2882 end;
2883
2884 procedure TGikoForm.ListViewCustomDraw(Sender: TCustomListView;
2885         const ARect: TRect; var DefaultDraw: Boolean);
2886 var
2887         s: string;
2888         p: TPoint;
2889 //      Board: TBoard;
2890 begin
2891         if ListView.Items.Count = 0 then begin
2892                 DefaultDraw := true;
2893                 ListView.Canvas.Brush.Color := ListView.Color;
2894                 ListView.Canvas.FillRect(ARect);
2895
2896                 case ViewType of
2897                         gvtAll: begin
2898                                 ListView.Canvas.Font.Color := clWindowText;
2899                                 s := '\82±\82Ì\83r\83\85\81[\82É\82Í\83A\83C\83e\83\80\82ª\82 \82è\82Ü\82¹\82ñ\81B';
2900                         end;
2901                         gvtLog: begin
2902                                 ListView.Canvas.Font.Color := clBlue;
2903                                 s := '\82±\82Ì\83r\83\85\81[\82É\82Í\83\8d\83O\97L\82è\83A\83C\83e\83\80\82ª\82 \82è\82Ü\82¹\82ñ\81B';
2904                         end;
2905                         gvtNew: begin
2906                                 ListView.Canvas.Font.Color := clGreen;
2907                                 s := '\82±\82Ì\83r\83\85\81[\82É\82Í\90V\92\85\83A\83C\83e\83\80\82ª\82 \82è\82Ü\82¹\82ñ\81B';
2908                         end;
2909                         gvtArch: begin
2910                                 ListView.Canvas.Font.Color := clFuchsia;
2911                                 s := '\82±\82Ì\83r\83\85\81[\82É\82ÍDAT\97\8e\82¿\83A\83C\83e\83\80\82ª\82 \82è\82Ü\82¹\82ñ\81B';
2912                         end;
2913                         gvtLive: begin
2914                                 ListView.Canvas.Font.Color := clMaroon;
2915                                 s := '\82±\82Ì\83r\83\85\81[\82É\82Í\90\91\83A\83C\83e\83\80\82ª\82 \82è\82Ü\82¹\82ñ\81B';
2916                         end;
2917                         gvtUser: begin
2918                                 ListView.Canvas.Font.Color := clNavy;
2919                                 s := '\82±\82Ì\83r\83\85\81[\82É\82Í\83^\83C\83g\83\8b\82ª\81u%s\81v\82ð\8aÜ\82Þ\83A\83C\83e\83\80\82ª\82 \82è\82Ü\82¹\82ñ\81B';
2920                                 if GetActiveList is TBoard then
2921                                         s := Format(s, [TBoard(GetActiveList).ParentCategory.ParenTBBS.SelectText]);
2922 //                                      SelectText]);
2923                         end;
2924                         else begin
2925                                 s := '';
2926                         end;
2927                 end;
2928
2929                 p := Point((ListView.ClientWidth div 2) - (ListView.Canvas.TextWidth(s) div 2),
2930                                                          (ListView.ClientHeight div 2) - (ListView.Canvas.TextHeight(s) div 2));
2931                 ListView.Canvas.TextOut(p.X, p.Y, s);
2932         end else begin
2933                 DefaultDraw := True;
2934         end;
2935 end;
2936
2937 procedure TGikoForm.DownloadList(Board: TBoard; ForceDownload: Boolean = False);
2938 var
2939         Item: TDownloadItem;
2940 begin
2941         if not Board.IsThreadDatRead then
2942                 GikoSys.ReadSubjectFile(Board);
2943         Item := TDownloadItem.Create;
2944         try
2945                 Item.Board := Board;
2946                 Item.DownType := gdtBoard;
2947                 Item.ForceDownload := ForceDownload;
2948                 FControlThread.AddItem(Item);
2949                 if FWorkCount = 0 then begin
2950                         try
2951                                 Animate.Active := True;
2952                         except
2953                         end;
2954                         Screen.Cursor := crAppStart;
2955                 end;
2956                 Inc(FWorkCount);
2957         finally
2958                 //Item.Free;
2959         end;
2960 end;
2961
2962 procedure TGikoForm.DownloadContent(ThreadItem: TThreadItem; ForceDownload: Boolean = False);
2963 var
2964         Item: TDownloadItem;
2965 begin
2966         Item := TDownloadItem.Create;
2967         try
2968                 Item.ThreadItem := ThreadItem;
2969                 Item.DownType := gdtThread;
2970                 Item.ForceDownload := ForceDownload;
2971                 FControlThread.AddItem(Item);
2972                 if FWorkCount = 0 then begin
2973                         try
2974                                 Animate.Active := True;
2975                         except
2976                         end;
2977                         Screen.Cursor := crAppStart;
2978                 end;
2979                 Inc(FWorkCount);
2980         finally
2981 //              Item.Free;
2982         end;
2983 end;
2984
2985 procedure TGikoForm.PlaySound(SoundEventName: string);
2986 var
2987         FileName: string;
2988 begin
2989         if not GikoSys.Setting.Mute then begin
2990                 FileName := GikoSys.Setting.FindSoundFileName(SoundEventName);
2991                 if FileExists(FileName) then begin
2992                         if not sndPlaySound(PChar(FileName), SND_ASYNC or SND_NOSTOP) then begin
2993                                 sndPlaySound(nil, SND_SYNC);
2994                                 Application.ProcessMessages;
2995                                 Sleep(10);
2996                                 sndPlaySound(PChar(FileName), SND_ASYNC);
2997                         end;
2998                 end;
2999         end;
3000 end;
3001
3002 function TGikoForm.AddHistory( favItem : TFavoriteThreadItem ): Boolean;
3003 var
3004         i: Integer;
3005         Item: TFavoriteThreadItem;
3006         Node: TTreeNode;
3007 begin
3008 //      Result := False;
3009 //      if (GetActiveContent = ThreadItem) and
3010 //                      (ThreadItem.Count <= ThreadItem.Kokomade) then
3011 //              Exit;
3012 //      if GetActiveContent = ThreadItem then
3013 //              Exit;
3014
3015         Result := True;
3016         if FTreeType = gttHistory then
3017         TreeView.Selected := nil;
3018
3019         for i := 0 to FHistoryList.Count - 1 do begin
3020                 if TObject(FHistoryList[i]) is TFavoriteThreadItem then begin
3021                         Item := TFavoriteThreadItem(FHistoryList[i]);
3022                         if Item.URL = favItem.URL then begin
3023 //                              SetContent(ThreadItem);
3024                                 FHistoryList.Move(i, 0);
3025                                 if FTreeType = gttHistory then
3026                                         if TreeView.Items.GetFirstNode <> TreeView.Items[ i ] then
3027                                                 TreeView.Items[ i ].MoveTo( TreeView.Items.GetFirstNode, naInsert );
3028                                                                 Result := false;
3029                                 Exit;
3030                         end;
3031                 end;
3032         end;
3033
3034         if FHistoryList.Count > 0 then
3035                 FHistoryList.Insert( 0, favItem )
3036         else
3037                 FHistoryList.Add( favItem );
3038 //      SetContent(ThreadItem);
3039 //      while GikoSys.Setting.AddressHistoryCount < FHistoryList.Count do begin
3040         while GikoSys.Setting.MaxRecordCount < FHistoryList.Count do begin
3041                 i := FHistoryList.Count - 1;
3042                 TObject( FHistoryList.Items[ i ] ).Free;
3043                 FHistoryList.Delete( i );
3044         end;
3045
3046         if FTreeType = gttHistory then begin
3047                 Node := TreeView.Items.Add( nil, favItem.Title );
3048                 Node.MoveTo( TreeView.Items.GetFirstNode, naInsert );
3049                 {
3050                 if favItem.NewArrival then begin
3051                         Node.ImageIndex := ITEM_ICON_THREADNEW1;
3052                         Node.SelectedIndex := ITEM_ICON_THREADNEW2;
3053                 end else begin
3054                         Node.ImageIndex := ITEM_ICON_THREADLOG1;
3055                         Node.SelectedIndex := ITEM_ICON_THREADLOG2;
3056                 end;
3057                 }
3058                 // \95\89\89×\82ð\82©\82¯\82½\82­\82È\82¢\82Ì\82Å NewArrival \82Ì\83`\83F\83b\83N\82ð\8ds\82í\82È\82¢
3059                 // \81¦favItem.Item \83v\83\8d\83p\83e\83B\82Í dat \82Ì\93Ç\82Ý\8d\9e\82Ý\82ð\95K\97v\82Æ\82·\82é
3060                 Node.ImageIndex := ITEM_ICON_THREADLOG1;
3061                 Node.SelectedIndex := ITEM_ICON_THREADLOG2;
3062                 Node.Data := favItem;
3063                 //while GikoSys.Setting.AddressHistoryCount < TreeView.Items.Count do begin
3064                 while GikoSys.Setting.MaxRecordCount < TreeView.Items.Count do begin
3065                         i := TreeView.Items.Count - 1;
3066                         TreeView.Items.Item[ i ].Delete;
3067                 end;
3068         end;
3069 end;
3070
3071 procedure TGikoForm.DeleteHistory( threadItem: TThreadItem );
3072 var
3073         i: Integer;
3074 begin
3075         for i := 0 to FHistoryList.Count - 1 do begin
3076                 if threadItem.URL = TFavoriteThreadItem( FHistoryList.Items[i] ).URL then begin
3077                         TFavoriteThreadItem( FHistoryList.Items[ i ] ).Free;
3078                         FHistoryList.Delete(i);
3079             FHistoryList.Capacity := FHistoryList.Count;
3080                         Break;
3081                 end;
3082         end;
3083 end;
3084
3085 procedure TGikoForm.ClearHistory;
3086 var
3087         i : Integer;
3088 begin
3089         //FHistoryList.Clear;
3090
3091         try
3092                 for i := FHistoryList.Count - 1 downto 0 do begin
3093                         if TObject(FHistoryList[ i ]) is TFavoriteThreadItem then
3094                 TFavoriteThreadItem(FHistoryList[ i ]).Free
3095             else if TObject(FHistoryList[ i ]) is TFavoriteBoardItem then
3096                 TFavoriteBoardItem(FHistoryList[ i ]).Free;
3097
3098                         //FHistoryList.Delete(i);
3099         end;
3100         except
3101         end;
3102
3103         FHistoryList.Clear;
3104     FHistoryList.Capacity := FHistoryList.Count;
3105
3106 end;
3107
3108 procedure TGikoForm.SaveHistory;
3109 var
3110         i, bound        : Integer;
3111         saveList        : TstringList;
3112 begin
3113
3114         saveList := TStringList.Create;
3115         try
3116                 FHistoryList.Pack;
3117         FHistoryList.Capacity := FHistoryList.Count;
3118                 saveList.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');
3119                 saveList.Add('<address>');
3120                 bound := FHistoryList.Count - 1;
3121                 for i := bound downto 0 do begin
3122                         // title \82Í\8d¡\82Ì\82Æ\82±\82ë\8eg\82Á\82Ä\82¢\82È\82¢
3123                         saveList.Add(
3124                                 '<history url="' + HtmlEncode( TFavoriteThreadItem( FHistoryList[ i ] ).URL ) + '"' +
3125                                 ' title="' + HtmlEncode( MojuUtils.Sanitize(TFavoriteThreadItem( FHistoryList[ i ] ).Title )) + '"/>');
3126                 end;
3127                 saveList.Add('</address>');
3128                 saveList.SaveToFile( GikoSys.GetConfigDir + 'History.xml' );
3129         finally
3130                 saveList.Free;
3131         end;
3132
3133 end;
3134
3135 procedure TGikoForm.LoadHistory;
3136 var
3137         i, bound                : Integer;
3138         fileName                : string;
3139         XMLDoc                  : IXMLDocument;
3140         XMLNode                 : IXMLNode;
3141         HistoryNode     : IXMLNode;
3142         s                                               : string;
3143         favItem                 : TFavoriteThreadItem;
3144 {$IFDEF DEBUG}
3145         st, rt : Cardinal;
3146 {$ENDIF}
3147 begin
3148 {$IFDEF DEBUG}
3149         st := GetTickCount;
3150 {$ENDIF}
3151
3152         fileName := GikoSys.GetConfigDir + 'History.xml';
3153
3154         if FileExists( fileName ) then begin
3155                 try
3156                         XMLDoc := IXMLDocument.Create;
3157                         //XMLDoc := LoadXMLDocument(FileName);
3158                         LoadXMLDocument(FileName, XMLDoc);
3159                         try
3160                                 XMLNode := XMLDoc.DocumentElement;
3161
3162                                 if XMLNode.NodeName = 'address' then begin
3163                                         bound := XMLNode.ChildNodes.Count - 1;
3164                                         for i := 0 to bound do begin
3165                                                 HistoryNode := XMLNode.ChildNodes[i];
3166                                                 if HistoryNode.NodeName = 'history' then begin
3167                                                         //if FReadCount >= sl.Count then begin
3168                                                                 s := Trim(HistoryNode.Attributes['url']);
3169                                                                 if s <> '' then begin
3170                                                                         favItem := TFavoriteThreadItem.Create(
3171                                                                                 s, MojuUtils.UnSanitize(HistoryNode.Attributes[ 'title' ]) );
3172                                                                         if not AddHistory( favItem ) then
3173                                                                                 favItem.Free;
3174                                                                 end;
3175                                                         //end;
3176                                                 end;
3177                                         end;
3178                                 end;
3179                         finally
3180                                 XMLDoc.Free;
3181                         end;
3182                 except
3183                 end;
3184         end;
3185 {$IFDEF DEBUG}
3186         rt := GetTickCount - st;
3187         Writeln('Runtime(Load Histroy) : ' + IntToStr(rt) + ' ms');
3188 {$ENDIF}
3189
3190 end;
3191
3192 procedure TGikoForm.ShowBBSTreeOld(
3193         inBBS : TBBS
3194 );
3195 var
3196         i, b            : Integer;
3197         item            : TMenuItem;
3198 begin
3199         try
3200                 FavoriteTreeView.Visible := False;
3201                 FavoriteToolBar.Hide;
3202                 TreeView.Visible := True;
3203
3204                 b := CabinetSelectPopupMenu.Items.Count - 1;
3205                 for i := 0 to b do begin
3206                         item := CabinetSelectPopupMenu.Items[ i ];
3207                         if item is TBBSMenuItem then begin
3208                                 if TBBSMenuItem( item ).Data = inBBS then begin
3209                                         item.Checked := True;
3210                                         // CabinetMenu ?? CabinetSelectPopupMenu ??????????????
3211                                         CabinetMenu.Items[ i ].Checked := True;
3212                                         GikoSys.Setting.CabinetIndex := i;
3213                                         Continue;
3214                                 end;
3215                         end;
3216                         item.Checked := False;
3217                         // CabinetMenu ?? CabinetSelectPopupMenu ??????????????
3218                         CabinetMenu.Items[ i ].Checked := False;
3219                 end;
3220                 CabinetSelectToolButton.Caption := inBBS.Title;
3221
3222                 GikoDM.CabinetHistoryAction.Checked := False;
3223                 GikoDM.CabinetFavoriteAction.Checked := False;
3224
3225                 if (FTreeType <> gtt2ch) or (FActiveBBS <> inBBS) then begin
3226                         FTreeType := gtt2ch;
3227                         HistoryToolBar.Hide;
3228                         FActiveBBS := inBBS;
3229                         TListViewUtils.SetBoardTreeNode(inBBS, TreeView);
3230                         TreeView.Items.GetFirstNode.Expanded := True;                           //?c???[?g?b?v???????J??
3231                         //?c???[??g?b?v?????I????
3232                         if GetActiveList = nil then
3233                                 TreeView.Selected := TreeView.Items[0]
3234                         else begin
3235                                 for i := 0 to TreeView.Items.Count - 1 do begin
3236                                         if TreeView.Items[i].Data = GetActiveList then begin
3237                                                 TreeView.Selected := TreeView.Items[i];
3238                                                 Exit;
3239                                         end;
3240                                 end;
3241                                 TreeView.Selected := TreeView.Items[0]
3242                         end;
3243                 end;
3244         except
3245         end;
3246
3247 end;
3248
3249 procedure TGikoForm.ShowBBSTree(
3250         inBBS : TBBS
3251 );
3252 var
3253         i, b            : Integer;
3254         item            : TMenuItem;
3255 begin
3256
3257         try
3258                 FavoriteTreeView.Visible := False;
3259                 FavoriteToolBar.Hide;
3260                 TreeView.Visible := True;
3261
3262                 b := CabinetSelectPopupMenu.Items.Count - 1;
3263                 for i := 0 to b do begin
3264                         item := CabinetSelectPopupMenu.Items[ i ];
3265                         if item is TBBSMenuItem then begin
3266                                 if TBBSMenuItem( item ).Data = inBBS then begin
3267                                         item.Checked := True;
3268                                         // CabinetMenu \82Í CabinetSelectPopupMenu \82Æ\93¯\82\82Æ\8c\88\82ß\82¤\82¿\82µ\82¿\82á\82¤
3269                                         CabinetMenu.Items[ i ].Checked := True;
3270                                         GikoSys.Setting.CabinetIndex := i;
3271                                         Continue;
3272                                 end;
3273                         end;
3274                         item.Checked := False;
3275                         // CabinetMenu \82Í CabinetSelectPopupMenu \82Æ\93¯\82\82Æ\8c\88\82ß\82¤\82¿\82µ\82¿\82á\82¤
3276                         CabinetMenu.Items[ i ].Checked := False;
3277                 end;
3278                 CabinetSelectToolButton.Caption := inBBS.Title;
3279
3280                 GikoDM.CabinetHistoryAction.Checked := False;
3281                 GikoDM.CabinetFavoriteAction.Checked := False;
3282
3283                 if (FTreeType <> gtt2ch) or (FActiveBBS <> inBBS)
3284                         or (not (CabinetPanel.Visible)) then begin
3285                         FTreeType := gtt2ch;
3286                         HistoryToolBar.Hide;
3287                         FActiveBBS := inBBS;
3288                         TListViewUtils.SetBoardTreeNode(inBBS, TreeView);
3289                         TreeView.Items.GetFirstNode.Expanded := True;                           //\83c\83\8a\81[\83g\83b\83v\8d\80\96Ú\82¾\82¯\82ð\8aJ\82­
3290                         //\83c\83\8a\81[\82Ì\83g\83b\83v\8d\80\96Ú\82ð\91I\91ð\82·\82é
3291                         if GetActiveList = nil then begin
3292                                 try
3293                                         TreeClick( TreeView.Items[0] );
3294                                 except
3295                                 end;
3296                         end else begin
3297                                 for i := 0 to TreeView.Items.Count - 1 do begin
3298                                         if TreeView.Items[i].Data = GetActiveList then begin
3299                                                 TreeClick( TreeView.Items[i] );
3300                                                 Exit;
3301                                         end;
3302                                 end;
3303                                 TreeClick( TreeView.Items[0] );
3304                         end;
3305                 end;
3306         except
3307         end;
3308
3309 end;
3310
3311 procedure TGikoForm.ShowHistoryTree;
3312 var
3313         i, b : Integer;
3314         item : TMenuItem;
3315 begin
3316         if CabinetPanel.Visible then begin
3317                 if FTreeType = gttHistory then begin
3318                         CabinetVisible( False );
3319                         GikoDM.CabinetHistoryAction.Checked := False;
3320                 end else begin
3321                         GikoDM.CabinetHistoryAction.Checked := True;
3322                 end;
3323         end else begin
3324                 CabinetVisible( True );
3325                 GikoDM.CabinetHistoryAction.Checked := True;
3326         end;
3327
3328         // BBS...BBS, History, Favorite
3329         GikoSys.Setting.CabinetIndex := CabinetSelectPopupMenu.Items.Count - 2;
3330
3331         FavoriteTreeView.Visible := False;
3332         TreeView.Visible := True;
3333
3334         GikoDM.CabinetBBSAction.Checked := False;
3335         GikoDM.CabinetFavoriteAction.Checked := False;
3336
3337         if FTreeType <> gttHistory then begin
3338                 b := CabinetSelectPopupMenu.Items.Count - 1;
3339                 for i := 0 to b do begin
3340                         item := CabinetSelectPopupMenu.Items[ i ];
3341                         if item is TBBSMenuItem then begin
3342                                 item.Checked := False;
3343                                 // CabinetMenu \82Í CabinetSelectPopupMenu \82Æ\93¯\82\82Æ\8c\88\82ß\82¤\82¿\82µ\82¿\82á\82¤
3344                                 CabinetMenu.Items[ i ].Checked := False;
3345                         end;
3346                 end;
3347
3348                 FTreeType := gttHistory;
3349                 HistoryToolBar.Show;
3350                 FavoriteToolBar.Hide;
3351                 SetHistoryTreeNode;
3352                 CabinetSelectToolButton.Caption := '\97\9a\97ð\83\8a\83X\83g';
3353         end;
3354 end;
3355
3356 procedure TGikoForm.SetHistoryTreeNode;
3357 var
3358         i: Integer;
3359         Node: TTreeNode;
3360         Item: TFavoriteThreadItem;
3361 begin
3362         TreeView.Items.BeginUpdate;
3363         try
3364                 TreeView.Items.Clear;
3365                 for i := 0 to FHistoryList.Count - 1 do begin
3366                         Item := TFavoriteThreadItem(FHistoryList[i]);
3367                         Node := TreeView.Items.Add(nil, Item.Title);
3368                         {
3369                         if Item.Item.NewArrival then begin
3370                                 Node.ImageIndex := ITEM_ICON_THREADNEW1;
3371                                 Node.SelectedIndex := ITEM_ICON_THREADNEW2;
3372                         end else begin
3373                                 Node.ImageIndex := ITEM_ICON_THREADLOG1;
3374                                 Node.SelectedIndex := ITEM_ICON_THREADLOG2;
3375                         end;
3376                         }
3377                         // \95\89\89×\82ð\82©\82¯\82½\82­\82È\82¢\82Ì\82Å NewArrival \82Ì\83`\83F\83b\83N\82ð\8ds\82í\82È\82¢
3378                         // \81¦Item.Item \83v\83\8d\83p\83e\83B\82Í dat \82Ì\93Ç\82Ý\8d\9e\82Ý\82ð\95K\97v\82Æ\82·\82é
3379                         Node.ImageIndex := ITEM_ICON_THREADLOG1;
3380                         Node.SelectedIndex := ITEM_ICON_THREADLOG2;
3381                         Node.Data := Item;
3382                 end;
3383         finally
3384                 TreeView.Items.EndUpdate;
3385         end;
3386 end;
3387
3388 procedure TGikoForm.SelectTreeNode(Item: TObject; CallEvent: Boolean);
3389 var
3390         ChangeEvent: TTVChangedEvent;
3391         ChangingEvent: TTVChangingEvent;
3392         i: Integer;
3393         bbs : TBBS;
3394 begin
3395         if Item is TCategory then
3396                 bbs := TCategory( Item ).ParenTBBS
3397         else if Item is TBoard then
3398                 bbs := TBoard( Item ).ParentCategory.ParenTBBS
3399         else
3400                 bbs := nil;
3401
3402         if (FTreeType = gtt2ch) and (FActiveBBS = bbs) then begin
3403                 if Item <> FActiveList then begin
3404                         ChangeEvent := nil;
3405                         ChangingEvent := nil;
3406
3407                         if not CallEvent then begin
3408                                 ChangeEvent := TreeView.OnChange;
3409                                 ChangingEvent := TreeView.OnChanging;
3410                         end;
3411                         try
3412                                 if not CallEvent then begin
3413                                         TreeView.OnChange := nil;
3414                                         TreeView.OnChanging := nil;
3415                                 end;
3416                                 //Application.ProcessMessages;
3417                                 for i := 0 to TreeView.Items.Count - 1 do begin
3418                                         if TreeView.Items[i].Data = Item then begin
3419                                                 TreeView.Items[i].Selected := True;
3420                                                 if CallEvent then
3421                                                         TreeClick(TreeView.Items[i]);
3422                                                 Break;
3423                                         end;
3424                                 end;
3425                                 //Application.ProcessMessages;
3426                         finally
3427                                 if not CallEvent then begin
3428                                         TreeView.OnChange := ChangeEvent;
3429                                         TreeView.OnChanging := ChangingEvent;
3430                                 end;
3431                         end;
3432                 end;
3433         end else begin
3434                 if Item <> FActiveList then begin
3435                         ActiveListColumnSave;
3436                         if (Item is TBBS) or (Item is TCategory) then begin
3437                                 ListView.Columns.Clear;
3438                                 SetActiveList( Item );
3439                         end else if Item is TBoard then begin
3440                                 if not TBoard( Item ).IsThreadDatRead then begin
3441                                         Screen.Cursor := crHourGlass;
3442                                         try
3443                                                 if not TBoard( Item ).IsThreadDatRead then
3444                                                         GikoSys.ReadSubjectFile(TBoard( Item ));
3445                                         finally
3446                                                 Screen.Cursor := crDefault;
3447                                         end;
3448                                 end;
3449                                 Sort.SetSortDate(Now());
3450                                 SetActiveList( Item );
3451                         end;
3452                 end;
3453         end;
3454
3455         if Item is TBoard then begin // not TCategory
3456                 if GikoSys.Setting.ListOrientation = gloHorizontal then begin
3457                         if GikoSys.Setting.ListWidthState = glsMax then begin
3458                                 GikoDM.BrowserMinAction.Execute;
3459                                 if GikoForm.Visible then
3460                                         ListView.SetFocus;
3461                         end;
3462                 end else begin
3463                         if GikoSys.Setting.ListHeightState = glsMax then begin
3464                                 GikoDM.BrowserMinAction.Execute;
3465                                 if GikoForm.Visible then
3466                                         ListView.SetFocus;
3467                         end;
3468                 end;
3469         end;
3470 end;
3471
3472 procedure TGikoForm.ListViewMouseDown(Sender: TObject;
3473         Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
3474 var
3475         listItem                : TListItem;
3476         threadItem      : TThreadItem;
3477         pos                                     : TPoint;
3478 //      t: Cardinal;
3479 begin
3480         case Button of
3481         mbMiddle:
3482                 begin
3483                         if not (GetActiveList is TBoard) then Exit;
3484                         listItem := ListView.GetItemAt( X, Y );
3485                         if listItem = nil then Exit;
3486                         if not (TObject(listItem.Data) is TThreadItem) then Exit;
3487
3488                         threadItem := TThreadItem(ListItem.Data);
3489                         InsertBrowserTab(threadItem, False);
3490                         if threadItem.IsLogFile then
3491                                 ListView.UpdateItems(listItem.Index, listItem.Index);
3492                 end;
3493         mbLeft:
3494                 begin
3495                         //\82±\82±\82ÅDblClick\8fE\82í\82È\82¢\82Æ\81AClick\83C\83x\83\93\83g\82ª\97D\90æ\82µ\82Ä\8bN\82«\82Ä\82µ\82Ü\82¤\82Ì\82Å
3496                         if (ssDouble in Shift) then
3497                                 ListDoubleClick(Shift)
3498                         else
3499                                 ListClick;
3500                 end;
3501         mbRight:
3502                 begin
3503                         pos.X := X;
3504                         pos.Y := Y;
3505                         Windows.ClientToScreen( ListView.Handle, pos );
3506                         ListPopupMenu.Popup( pos.X, pos.Y );
3507                 end;
3508         end;
3509
3510 end;
3511
3512 procedure TGikoForm.ListClick;
3513 var
3514         ListItem: TListItem;
3515         ThreadItem: TThreadItem;
3516 begin
3517         if ListView.SelCount <> 1 then Exit;
3518         ListItem := ListView.Selected;
3519         if ListItem = nil then Exit;
3520         if not (TObject(ListItem.Data) is TThreadItem) then Exit;
3521
3522         ThreadItem := TThreadItem(ListItem.Data);
3523         if ThreadItem.IsLogFile then begin
3524                 InsertBrowserTab(ThreadItem);
3525                 ListView.UpdateItems(ListItem.Index, ListItem.Index);
3526         end else begin
3527                 InsertBrowserTab(ThreadItem);
3528         end;
3529
3530         if GikoSys.Setting.BrowserAutoMaximize = gbmClick then begin
3531                 if GikoSys.Setting.ListOrientation = gloHorizontal then begin
3532                         if GikoSys.Setting.ListWidthState = glsMin then begin
3533                                 GikoDM.BrowserMaxAndFocusAction.Execute;
3534                         end;
3535                 end else begin
3536                         if GikoSys.Setting.ListHeightState = glsMin then begin
3537                                 GikoDM.BrowserMaxAndFocusAction.Execute;
3538                         end;
3539                 end;
3540         end;
3541 end;
3542
3543 procedure TGikoForm.ListDoubleClick(Shift: TShiftState);
3544 var
3545         ThreadItem: TThreadItem;
3546         shiftDown: Boolean;
3547 begin
3548         shiftDown := (ssShift in Shift);
3549
3550         if ListView.Selected = nil then Exit;
3551
3552         if TObject(ListView.Selected.Data) is TCategory then begin
3553                 SelectTreeNode(ListView.Selected.Data, True);
3554         end else if TObject(ListView.Selected.Data) is TBoard then begin
3555                 SelectTreeNode(ListView.Selected.Data, True)
3556         end else if TObject(ListView.Selected.Data) is TThreadItem then begin
3557                 Application.ProcessMessages;
3558                 ThreadItem := TThreadItem(ListView.Selected.Data);
3559                 DownloadContent(ThreadItem, shiftDown);
3560
3561                 if GikoSys.Setting.BrowserAutoMaximize = gbmDoubleClick then begin
3562                         if GikoSys.Setting.ListOrientation = gloHorizontal then begin
3563                                 if GikoSys.Setting.ListWidthState = glsMin then begin
3564                                         GikoDM.BrowserMaxAction.Execute;
3565                                         GikoDM.SetFocusForBrowserAction.Execute;
3566                                 end;
3567                         end else begin
3568                                 if GikoSys.Setting.ListHeightState = glsMin then begin
3569                                         GikoDM.BrowserMaxAction.Execute;
3570                                         GikoDM.SetFocusForBrowserAction.Execute;
3571                                 end;
3572                         end;
3573                 end;
3574         end;
3575 end;
3576
3577 procedure TGikoForm.BrowserMovement(const AName: string);
3578 begin
3579         // Access Violation \82ª\8bN\82«\82é\8e\96\82ª\82 \82é\82Ì\82Å\8d¡\8cã\97v\83`\83F\83b\83N
3580         if(BrowserTab.Tabs.Count > 0) and (BrowserTab.TabIndex >= 0)
3581                 and (FActiveContent <> nil) then begin
3582                 FActiveContent.Move(AName);
3583         end;
3584 end;
3585
3586 procedure TGikoForm.TreeViewCollapsed(Sender: TObject; Node: TTreeNode);
3587 begin
3588         if TObject(Node.Data) is TBBS then begin
3589                 TBBS(Node.Data).NodeExpand := False;
3590         end else if TObject(Node.Data) is TCategory then begin
3591                 TCategory(Node.Data).NodeExpand := False;
3592         end else if TObject(Node.Data) is TBoard then begin
3593                 TBoard(Node.Data).NodeExpand := False;
3594         end;
3595         if (TreeView.Selected <> nil) and (TreeView.Selected = Node) then begin
3596         TreeClick(TreeView.Selected);
3597         end;
3598 end;
3599
3600 procedure TGikoForm.MessageListViewResize(Sender: TObject);
3601 begin
3602 //      MessageListView.Column[0].Width := MessageListView.ClientWidth - 16;
3603 end;
3604 procedure       TGikoForm.CabinetVisible( isVisible : Boolean );
3605 begin
3606         TreeSplitter.Visible := isVisible;
3607         CabinetPanel.Visible := isVisible;
3608         GikoDM.CabinetVisibleAction.Checked := isVisible;
3609 end;
3610
3611 procedure TGikoForm.SelectListItem(List: TList);
3612 var
3613         TmpListItem: TListItem;
3614 begin
3615         List.Clear;
3616         List.Capacity := 0;
3617         TmpListItem := ListView.Selected;
3618         while TmpListItem <> nil do begin
3619                 List.Add(TmpListItem.Data);
3620                 TmpListItem := ListView.GetNextItem(TmpListItem, sdAll, [isSelected]);
3621         end;
3622
3623 end;
3624
3625 procedure TGikoForm.FormResize(Sender: TObject);
3626 begin
3627
3628         MessageListView.Column[0].Width := MessageListView.ClientWidth - 32;
3629         MainCoolBar.Width := TopPanel.Width - TopRightPanel.Width;
3630
3631         if GikoSys.Setting.ListOrientation = gloHorizontal then begin
3632                 if GikoSys.Setting.ListWidthState = glsMin then begin
3633                         // \8dÅ\8f¬\95\\8e¦\82É\82·\82é
3634                         ViewPanel.Width := ThreadMainPanel.Width - 80;
3635                 end;
3636         end else begin
3637                 if GikoSys.Setting.ListHeightState = glsMin then begin
3638                         // \8dÅ\8f¬\95\\8e¦\82É\82·\82é
3639                         ViewPanel.Height := ThreadMainPanel.Height - BrowserCoolBar.Height - 7;
3640                 end;
3641         end;
3642
3643         FIsIgnoreResize := rtResizing;
3644         PostMessage( Handle, USER_RESIZED, 0, 0 );
3645
3646
3647 end;
3648
3649 procedure TGikoForm.DeleteTab(BrowserRecord: TBrowserRecord);
3650 var
3651         i, j, idx: Integer;
3652         doc: Variant;
3653 begin
3654         idx := BrowserTab.TabIndex;
3655         FTabHintIndex := -1;
3656         for i := 0 to BrowserTab.Tabs.Count - 1 do begin
3657                 if TBrowserRecord(BrowserTab.Tabs.Objects[i]) = BrowserRecord then begin
3658                         try
3659                                 if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser <> nil then begin
3660                                         doc := TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser.Document;
3661                                         TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ScrollTop := doc.Body.ScrollTop;
3662                                 end;
3663                         except
3664                                 TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ScrollTop := 0;
3665                         end;
3666                         if( FActiveContent = TBrowserRecord(BrowserTab.Tabs.Objects[i]) ) then
3667                                 FActiveContent := nil;
3668                         if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser <> nil then begin
3669                                 j := FBrowsers.IndexOf(TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser);
3670                                 if j <> -1 then
3671                                         FBrowsers.Move(j, BROWSER_COUNT - 1);
3672                         end;
3673                         BrowserTab.Tabs.BeginUpdate;
3674                         try
3675                                 TBrowserRecord(BrowserTab.Tabs.Objects[i]).Free;
3676                                 if ( BrowserTab.Tabs.Count - 1 = i ) and
3677                                         ( BrowserTab.TabRect(i).Left
3678                                                 <= BrowserTab.DisplayRect.Left ) then begin
3679                                         BrowserTab.ScrollTabs(-1);
3680                                 end;
3681                                 BrowserTab.Tabs.Delete(i);
3682                                 if idx > i then begin
3683                                         BrowserTab.TabIndex := idx - 1;
3684                                 end else begin
3685                                         if BrowserTab.Tabs.Count -1 >= idx then
3686                                                 BrowserTab.TabIndex := idx
3687                                         else
3688                                                 BrowserTab.TabIndex := BrowserTab.Tabs.Count - 1;
3689                                 end;
3690                         finally
3691                                 BrowserTab.Tabs.EndUpdate;
3692                         end;
3693                         if BrowserTab.Tabs.Count = 0 then begin
3694                                 BrowserNullTab.Thread := nil;
3695                         end;
3696                         if(BrowserTab.TabIndex <> -1) and
3697                                 ( TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser = nil) then begin
3698                                 for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
3699                                         if(TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser
3700                                                  = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) )then
3701                                         begin
3702                                                 ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
3703                                                 break;
3704                                         end;
3705                                 end;
3706                                 TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser
3707                                          :=  TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
3708                                 TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Repaint := true;
3709                                 FBrowsers.Move(BROWSER_COUNT - 1, 0);
3710                         end;
3711                         if( FActiveContent = nil) then
3712                                 BrowserTab.OnChange(nil);
3713                         Exit;
3714                 end;
3715         end;
3716 end;
3717 procedure TGikoForm.DeleteTab(ThreadItem: TThreadItem);
3718 var
3719         i, j, idx: Integer;
3720         doc: Variant;
3721 begin
3722         idx := BrowserTab.TabIndex;
3723         FTabHintIndex := -1;
3724         for i := 0 to BrowserTab.Tabs.Count - 1 do begin
3725                 if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread = ThreadItem then begin
3726                         try
3727                                 if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser <> nil then begin
3728                                         doc := TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser.Document;
3729                                         TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ScrollTop := doc.Body.ScrollTop;
3730
3731                                 end;
3732                         except
3733                                 TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ScrollTop := 0;
3734                         end;
3735                         if(FActiveContent = TBrowserRecord(BrowserTab.Tabs.Objects[i])) then
3736                                 FActiveContent := nil;
3737                         if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser <> nil then begin
3738                                 j := FBrowsers.IndexOf(TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser);
3739                                 if j <> -1 then
3740                                         FBrowsers.Move(j, BROWSER_COUNT - 1);
3741                         end;
3742                         BrowserTab.Tabs.BeginUpdate;
3743                         try
3744                                 TBrowserRecord(BrowserTab.Tabs.Objects[i]).Free;
3745                                 if ( BrowserTab.Tabs.Count - 1 = i ) and
3746                                         ( BrowserTab.TabRect(i).Left
3747                                                 <= BrowserTab.DisplayRect.Left ) then begin
3748                                         BrowserTab.ScrollTabs(-1);
3749                                 end;
3750                                 BrowserTab.Tabs.Delete(i);
3751                                 if idx > i then begin
3752                                         BrowserTab.TabIndex := idx - 1;
3753                                 end else begin
3754                                         if BrowserTab.Tabs.Count -1 >= idx then
3755                                                 BrowserTab.TabIndex := idx
3756                                         else
3757                                                 BrowserTab.TabIndex := BrowserTab.Tabs.Count - 1;
3758                                 end;
3759                         finally
3760                                 BrowserTab.Tabs.EndUpdate;
3761                         end;
3762                         if(BrowserTab.TabIndex <> -1) and
3763                                 ( TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser = nil) then begin
3764                                 for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
3765                                         if(TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser
3766                                                  = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) )then
3767                                         begin
3768                                                 ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
3769                                                 break;
3770                                         end;
3771                                 end;
3772                                 TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser
3773                                          :=  TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
3774                                 TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Repaint := true;
3775                                 FBrowsers.Move(BROWSER_COUNT - 1, 0);
3776                         end;
3777
3778                         if( FActiveContent = nil) then
3779                                 BrowserTab.OnChange(nil);
3780                         Exit;
3781                 end;
3782         end;
3783 end;
3784 function TGikoForm.Hook(var Message: TMessage): Boolean;
3785 begin
3786         //\83T\83u\83t\83H\81[\83\80\82ª\83\81\83C\83\93\83\81\83j\83\85\81[\82ð\8e\9d\82½\82È\82¢\82Æ\82«\82É\81A\83\81\83C\83\93\83t\83H\81[\83\80\82Ì
3787         //\83\81\83j\83\85\81[\82Ì\83V\83\87\81[\83g\83J\83b\83g\83L\81[\82ª\83T\83u\83\81\83j\83\85\81[\82©\82ç\93ü\97Í\82³\82ê\82é\82Ì\82ð\89ñ\94ð
3788         Result := False;
3789         case Message.Msg of
3790         CM_APPKEYDOWN:
3791                 Result := True;         //\83V\83\87\81[\83g\83J\83b\83g\83L\81[\96³\8cø
3792         CM_APPSYSCOMMAND:
3793                 Result := True;  // \83A\83N\83Z\83\89\83\8c\81[\83^\82ð\96³\8cø\82É\82·\82é
3794         end;
3795 end;
3796
3797 procedure TGikoForm.ListPopupMenuPopup(Sender: TObject);
3798 begin
3799         ItemRoundPMenu.Visible := (GetActiveList is TBoard);
3800         ItemReservPMenu.Visible := (GetActiveList is TBoard);
3801         LPMSep01.Visible := (GetActiveList is TBoard);
3802         ListRoundPMenu.Visible := (GetActiveList is TCategory);// or (GetActiveList is TBoard);
3803         ListReservPMenu.Visible := (GetActiveList is TCategory);// or (GetActiveList is TBoard);
3804         LPMSep02.Visible := (GetActiveList is TCategory) or (GetActiveList is TBoard);
3805         KidokuPMenu.Visible := (GetActiveList is TBoard);
3806         MidokuPMenu.Visible := (GetActiveList is TBoard);
3807         UrlCopyPMenu.Visible := (GetActiveList is TCategory) or (GetActiveList is TBoard);
3808         NameUrlCopyPMenu.Visible := (GetActiveList is TCategory) or (GetActiveList is TBoard);
3809         AllSelectPMenu.Visible := (GetActiveList is TCategory) or (GetActiveList is TBoard);
3810         LPMSep05.Visible := (GetActiveList is TCategory) or (GetActiveList is TBoard);
3811         DeletePMenu.Visible := (GetActiveList is TBoard);
3812         LPMSep06.Visible := (GetActiveList is TCategory) or (GetActiveList is TBoard);
3813         BoardFavoriteAddMenu.Visible := (GetActiveList is TCategory);
3814         ThreadFavoriteAddMenu.Visible := (GetActiveList is TBoard);
3815
3816         AddRoundNameMenu(ItemReservPMenu);
3817         AddRoundNameMenu(ListReservPMenu);
3818 end;
3819
3820 procedure TGikoForm.TreePopupMenuPopup(Sender: TObject);
3821 begin
3822         FClickNode := TreeView.Selected;
3823         if FClickNode = nil then begin
3824                 TreeSelectThreadPupupMenu.Visible := False;
3825                 TreeSelectBoardPupupMenu.Visible := False;
3826                 TPMSep01.Visible := False;
3827                 TreeSelectURLPupupMenu.Visible := False;
3828                 TreeSelectNamePupupMenu.Visible := False;
3829                 TreeSelectNameURLPupupMenu.Visible := False;
3830                 TreeSelectFavoriteAddPupupMenu.Visible := False;
3831                 TreeSelectLogDeleteSeparator.Visible := False;
3832                 TreeSelectLogDeletePopupMenu.Visible := False;
3833         end else if TObject(FClickNode.Data) is TBoard then begin
3834                 TreeSelectThreadPupupMenu.Visible := False;
3835                 TreeSelectBoardPupupMenu.Visible := True;
3836                 TPMSep01.Visible := True;
3837                 TreeSelectURLPupupMenu.Visible := True;
3838                 TreeSelectNamePupupMenu.Visible := True;
3839                 TreeSelectNameURLPupupMenu.Visible := True;
3840                 TreeSelectFavoriteAddPupupMenu.Visible := True;
3841                 TreeSelectLogDeleteSeparator.Visible := False;
3842                 TreeSelectLogDeletePopupMenu.Visible := False;
3843         end else if TObject(FClickNode.Data) is TFavoriteBoardItem then begin
3844                 TreeSelectThreadPupupMenu.Visible := False;
3845                 TreeSelectBoardPupupMenu.Visible := True;
3846                 TPMSep01.Visible := True;
3847                 TreeSelectURLPupupMenu.Visible := True;
3848                 TreeSelectNamePupupMenu.Visible := True;
3849                 TreeSelectNameURLPupupMenu.Visible := True;
3850                 TreeSelectFavoriteAddPupupMenu.Visible := True;
3851                 TreeSelectLogDeleteSeparator.Visible := False;
3852                 TreeSelectLogDeletePopupMenu.Visible := False;
3853         end else if (TObject(FClickNode.Data) is TThreadItem) then begin
3854                 TreeSelectThreadPupupMenu.Visible := True;
3855                 TreeSelectBoardPupupMenu.Visible := False;
3856                 TPMSep01.Visible := True;
3857                 TreeSelectURLPupupMenu.Visible := True;
3858                 TreeSelectNamePupupMenu.Visible := True;
3859                 TreeSelectNameURLPupupMenu.Visible := True;
3860                 TreeSelectFavoriteAddPupupMenu.Visible := True;
3861                 TreeSelectLogDeleteSeparator.Visible := True;
3862                 TreeSelectLogDeletePopupMenu.Visible := True;
3863         end else if (TObject(FClickNode.Data) is TFavoriteThreadItem) then begin
3864                 TreeSelectThreadPupupMenu.Visible := True;
3865                 TreeSelectBoardPupupMenu.Visible := False;
3866                 TPMSep01.Visible := True;
3867                 TreeSelectURLPupupMenu.Visible := True;
3868                 TreeSelectNamePupupMenu.Visible := True;
3869                 TreeSelectNameURLPupupMenu.Visible := True;
3870                 TreeSelectFavoriteAddPupupMenu.Visible := True;
3871                 TreeSelectLogDeleteSeparator.Visible := True;
3872                 TreeSelectLogDeletePopupMenu.Visible := True;
3873         end else if (TObject(FClickNode.Data) is TCategory) then begin
3874                 TreeSelectThreadPupupMenu.Visible := False;
3875                 TreeSelectBoardPupupMenu.Visible := False;
3876                 TPMSep01.Visible := False;
3877                 TreeSelectURLPupupMenu.Visible := False;
3878                 TreeSelectNamePupupMenu.Visible := True;
3879                 TreeSelectNameURLPupupMenu.Visible := False;
3880                 TreeSelectFavoriteAddPupupMenu.Visible := False;
3881                 TreeSelectLogDeleteSeparator.Visible := False;
3882                 TreeSelectLogDeletePopupMenu.Visible := False;
3883         end else if FClickNode.IsFirstNode then begin
3884                 TreeSelectThreadPupupMenu.Visible := False;
3885                 TreeSelectBoardPupupMenu.Visible := False;
3886                 TPMSep01.Visible := False;
3887                 TreeSelectURLPupupMenu.Visible := False;
3888                 TreeSelectNamePupupMenu.Visible := True;
3889                 TreeSelectNameURLPupupMenu.Visible := False;
3890                 TreeSelectFavoriteAddPupupMenu.Visible := False;
3891                 TreeSelectLogDeleteSeparator.Visible := False;
3892                 TreeSelectLogDeletePopupMenu.Visible := False;
3893         end else begin
3894                 TreeSelectThreadPupupMenu.Visible := False;
3895                 TreeSelectBoardPupupMenu.Visible := False;
3896                 TPMSep01.Visible := False;
3897                 TreeSelectURLPupupMenu.Visible := False;
3898                 TreeSelectNamePupupMenu.Visible := False;
3899                 TreeSelectNameURLPupupMenu.Visible := False;
3900                 TreeSelectFavoriteAddPupupMenu.Visible := False;
3901                 TreeSelectLogDeleteSeparator.Visible := False;
3902                 TreeSelectLogDeletePopupMenu.Visible := False;
3903         end;
3904 end;
3905
3906 procedure TGikoForm.BrowserNewWindow2(Sender: TObject;
3907         var ppDisp: IDispatch; var Cancel: WordBool);
3908 var
3909         Text: string;
3910         Html: string;
3911         URL: string;
3912         idx: Integer;
3913         wkIntSt: Integer;
3914         wkIntTo: Integer;
3915     BNum, BRes: string;
3916     threadItem: TThreadItem;
3917 begin
3918
3919         Cancel := True;
3920         if (IHTMLDocument2(TWebBrowser(Sender).Document).activeElement <> nil) then begin
3921                 Text := IHTMLDocument2(TWebBrowser(Sender).Document).activeElement.Get_outerText;
3922                 Html := IHTMLDocument2(TWebBrowser(Sender).Document).activeElement.Get_outerHTML;
3923                 if(AnsiPos('>>', Text) = 1) or (AnsiPos('>', Text) = 1)
3924                         or (AnsiPos('\81\84\81\84', Text) = 1) or (AnsiPos('\81\84', Text) = 1) then begin
3925                         if GikoSys.Setting.ResAnchorJamp then begin
3926                                 Text := ZenToHan(Trim(Text));
3927
3928                                 if(AnsiPos('>>', Text) = 1) then begin
3929                                         //Text := Copy(Text, 3, Length(Text) - 2);
3930                                         Delete(Text, 1, 2);
3931                                 end else begin
3932                                         //Text := Copy(Text, 2, Length(Text) - 1);
3933                                         Delete(Text, 1, 1);
3934                                 end;
3935
3936                                 if AnsiPos('-', Text) <> 0 then begin
3937                                         wkIntSt := StrToIntDef(Copy(Text, 1, AnsiPos('-', Text) - 1), 0);
3938                                         Text := Copy(Text, AnsiPos('-', Text) + 1, Length(Text));
3939                                         wkIntTo := StrToIntDef(Text, 0);
3940                                         if wkIntTo < wkIntSt then
3941                                                 wkIntSt := wkIntTo;
3942                                 end else begin
3943                                         wkIntSt := StrToIntDef(Text, 0);
3944                                 end;
3945
3946                                 if wkIntSt <> 0 then begin
3947                                         FActiveContent.IDAnchorPopup('');
3948                                         BrowserMovement(IntToStr(wkIntSt));
3949                                 end;
3950
3951
3952                         end;
3953                 end else begin
3954             ////'http://be.2ch.net/test/p.php?i='+id+'&u=d:'+bas+num
3955
3956                         URL := GikoSys.GetHRefText(Html);
3957                         URL := GikoSys.HTMLDecode(URL);
3958             if AnsiPos('BE:', URL) = 1 then begin
3959                                 BNum := Copy(URL, 4, AnsiPos('/', URL) - 4);
3960                                 BRes := Copy(URL, AnsiPos('/', URL) + 1,  Length(URL));
3961                 threadItem := FActiveContent.Thread;
3962                 if threadItem = nil then Exit;
3963                 URL := BE_PHP_URL + BNum + '&u=d'
3964                         + CustomStringReplace(threadItem.URL, 'l50', '') + BRes;
3965             end;
3966
3967                         if( AnsiPos('http://', URL) = 1) or (AnsiPos('https://', URL) = 1) or
3968                                 ( AnsiPos('ftp://', URL) = 1) then begin
3969                                 //\83A\83h\83\8c\83X\83o\81[\82Ì\97\9a\97ð
3970                                 if GikoSys.Setting.LinkAddAddressBar then begin
3971                                         idx := AddressComboBox.Items.IndexOf(URL);
3972                                         if idx = -1 then begin
3973                                                 AddressComboBox.Items.Insert(0, URL);
3974                                                 if AddressComboBox.Items.Count > GikoSys.Setting.AddressHistoryCount then
3975                                                         AddressComboBox.Items.Delete(AddressComboBox.Items.Count - 1);
3976                                         end else begin
3977                                                 AddressComboBox.Items.Delete(idx);
3978                                                 AddressComboBox.Items.Insert(0, URL);
3979                                         end;
3980                                 end;
3981                                 MoveToURL( URL );
3982                         end;
3983                 end;
3984         end;
3985
3986 end;
3987
3988 procedure TGikoForm.ListSplitterMoved(Sender: TObject);
3989 begin
3990         if Mouse.Capture <> 0 then
3991                 Exit;
3992         if GikoSys.Setting.ListOrientation = gloHorizontal then begin
3993                 if (ViewPanel.Width > 1) and (ViewPanel.Width <= (ThreadMainPanel.Width - 80)) then
3994                         FBrowserSizeWidth := ViewPanel.Width;
3995         end else begin
3996                 if (ViewPanel.Height > 1) and (ViewPanel.Height <= (ThreadMainPanel.Height - BrowserCoolBar.Height)) then
3997                         FBrowserSizeHeight := ViewPanel.Height;
3998         end;
3999         if GikoSys.Setting.ListOrientation = gloHorizontal then begin
4000                 if ViewPanel.Width < 2 then begin
4001                         ViewPanel.Width := 1;
4002                         GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_NORMAL;
4003                         GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_MIN;
4004                         GikoSys.Setting.ListWidthState := glsMax;
4005                 end else if ViewPanel.Width > (ThreadMainPanel.Width - 80) then begin
4006                         GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_MAX;
4007                         GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_NORMAL;
4008                         GikoSys.Setting.ListWidthState := glsMin;
4009                 end else begin
4010                         GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_MAX;
4011                         GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_WIDTH_MIN;
4012                         GikoSys.Setting.ListWidthState := glsNormal;
4013                 end;
4014         end else begin
4015                 if ViewPanel.Height < 2 then begin
4016                         ViewPanel.Height := 1;
4017                         GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_NORMAL;
4018                         GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_MIN;
4019                         GikoSys.Setting.ListHeightState := glsMax;
4020                 end else if ViewPanel.Height > (ThreadMainPanel.Height - BrowserCoolBar.Height - 7) then begin
4021                         GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_MAX;
4022                         GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_NORMAL;
4023                         GikoSys.Setting.ListHeightState := glsMin;
4024                 end else begin
4025                         GikoDM.BrowserMaxAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_MAX;
4026                         GikoDM.BrowserMinAction.ImageIndex := GikoDataModule.TOOL_ICON_HEIGHT_MIN;
4027                         GikoSys.Setting.ListHeightState := glsNormal;
4028                 end;
4029         end;
4030 {       if (Mouse.Capture = 0) and (ViewPanel.Height > 1) and (not ArrangeAction.Checked) then
4031                 FBrowserSizeHeight := ViewPanel.Height
4032         else if (Mouse.Capture = 0) and (ViewPanel.Width > 1) and (ArrangeAction.Checked) then
4033                 FBrowserSizeWidth := ViewPanel.Width;}
4034 end;
4035
4036 procedure TGikoForm.BrowserTabChange(Sender: TObject);
4037 var
4038         i, j: Integer;
4039         idx: Integer;
4040 begin
4041         BrowserTab.Tabs.BeginUpdate;
4042         try
4043                 if not BrowserTab.Dragging then begin
4044                         FTabHintIndex := -1;
4045                         BrowserTab.Hint := '';
4046                         idx := BrowserTab.TabIndex;
4047                         if idx = -1 then begin
4048                                 SetContent(BrowserNullTab);
4049
4050                         end else if(BrowserTab.Tabs.Objects[idx] <> nil) and (BrowserTab.Tabs.Objects[idx] is TBrowserRecord) then begin
4051                                 if TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser <> nil then begin
4052                                         j := FBrowsers.IndexOf(TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser);
4053                                         if j <> -1 then
4054                                                 FBrowsers.Move(j ,0);
4055                                 end else begin
4056                                         if( FActiveContent <> nil ) and (FActiveContent.Browser <> nil) and
4057                                                 (FActiveContent.Browser <> BrowserNullTab.Browser) and
4058                                                 (FActiveContent.Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1])) then
4059                                                 FBrowsers.Move(BROWSER_COUNT - 1, 0);
4060
4061                                         for i := 0 to BrowserTab.Tabs.Count - 1 do begin
4062                                                 if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
4063                                                         ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[i]));
4064                                                         break;
4065                                                 end;
4066                                         end;
4067                                         TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
4068                                         TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Repaint := true;
4069                                         FBrowsers.Move(BROWSER_COUNT - 1, 0);
4070                                 end;
4071                                 MoveWindow(TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser.Handle, 0, 0, BrowserPanel.Width, BrowserPanel.Height, false);
4072                                 TOleControl(TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser).BringToFront;
4073                                 SetContent(TBrowserRecord(BrowserTab.Tabs.Objects[idx]));
4074
4075                                 if (GikoSys.Setting.URLDisplay) and (GetActiveContent <> nil) then
4076                                         AddressComboBox.Text := GetActiveContent.URL;
4077
4078                                 if ((TreeView.Visible) and (TreeView.Focused)) or ((FavoriteTreeView.Visible) and (FavoriteTreeView.Focused)) or
4079                                         (ListView.Focused) or (SelectComboBox.Focused) or (AddressComboBox.Focused)
4080                                 then
4081                                 else
4082                                         GikoDM.SetFocusForBrowserAction.Execute;
4083                         end;
4084                 end;
4085         finally
4086                 BrowserTab.Tabs.EndUpdate;
4087         end;
4088 end;
4089
4090
4091 procedure TGikoForm.BrowserTabMouseDown(Sender: TObject;
4092         Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
4093 var
4094         p: TPoint;
4095         p2: TPoint;
4096         idx: Integer;
4097 begin
4098         if Button = mbMiddle then begin
4099                 // \83}\83E\83X\92\86\83{\83^\83\93
4100                 GetCursorPos(p);
4101                 p2 := p;
4102                 p := BrowserTab.ScreenToClient(p);
4103                 idx := BrowserTab.IndexOfTabAt(p.X, p.Y);
4104                 if idx <> -1 then
4105                         DeleteTab(TBrowserRecord(BrowserTab.Tabs.Objects[idx]));
4106         end else if Button = mbLeft then begin
4107                 FDragWFirst := true;
4108                 FMouseDownPos.X := X;
4109                 FMouseDownPos.Y := Y;
4110         end;
4111
4112 end;
4113
4114 procedure TGikoForm.SetBrowserTabState;
4115 var
4116         CoolBand: TCoolBand;
4117 begin
4118         BrowserBottomPanel.AutoSize := False;
4119         if GikoSys.Setting.BrowserTabVisible then begin
4120                 BrowserTab.Hide;
4121                 BrowserTab.Tabs.BeginUpdate;
4122                 try
4123                         if GikoSys.Setting.BrowserTabStyle = gtsTab then begin
4124                                 BrowserTab.Style := tsTabs;
4125                                 if GikoSys.Setting.BrowserTabPosition = gtpTop then
4126                                         BrowserTab.TabPosition := tpTop
4127                                 else
4128                                         BrowserTab.TabPosition := tpBottom;
4129                         end else if GikoSys.Setting.BrowserTabStyle = gtsButton then begin
4130                                 BrowserTab.TabPosition := tpTop;
4131                                 BrowserTab.Style := tsButtons;
4132                         end else begin
4133                                 BrowserTab.TabPosition := tpTop;
4134                                 BrowserTab.Style := tsFlatButtons
4135                         end;
4136
4137                         if GikoSys.Setting.BrowserTabPosition = gtpTop then begin
4138                                 BrowserTab.Parent := BrowserTabToolBar;
4139                                 BrowserBottomPanel.Hide;
4140                                 CoolBand := GetCoolBand(BrowserCoolBar, BrowserTabToolBar);
4141                                 if CoolBand <> nil then
4142                                         CoolBand.Visible := True;
4143                         end else begin
4144                                 BrowserTab.Parent := BrowserBottomPanel;
4145                                 BrowserTab.Top := 0;
4146                                 BrowserTab.Left := 0;
4147                                 BrowserBottomPanel.Show;
4148                                 CoolBand := GetCoolBand(BrowserCoolBar, BrowserTabToolBar);
4149                                 if CoolBand <> nil then
4150                                         CoolBand.Visible := False;
4151                         end;
4152                 finally
4153                         BrowserTab.Tabs.EndUpdate;
4154                         BrowserTab.Show;
4155                 end;
4156         end else begin
4157                 CoolBand := GetCoolBand(BrowserCoolBar, BrowserTabToolBar);
4158                 if CoolBand <> nil then
4159                         CoolBand.Visible := False;
4160                 BrowserBottomPanel.Visible := False;
4161                 GikoDM.AllTabCloseAction.Execute;
4162         end;
4163 end;
4164
4165 procedure TGikoForm.BrowserTabDragOver(Sender, Source: TObject; X,
4166         Y: Integer; State: TDragState; var Accept: Boolean);
4167 var
4168         idx: Integer;
4169 begin
4170         idx := BrowserTab.IndexOfTabAt(X, Y);
4171         Accept := (Source = BrowserTab) and (BrowserTab.TabIndex <> idx);
4172 end;
4173
4174 procedure TGikoForm.BrowserTabDragDrop(Sender, Source: TObject; X,
4175         Y: Integer);
4176 var
4177         idx: Integer;
4178 begin
4179         idx := BrowserTab.IndexOfTabAt(X, Y);
4180         if idx <> -1 then
4181                 BrowserTab.Tabs.Move(BrowserTab.TabIndex, idx);
4182 end;
4183
4184 procedure TGikoForm.BrowserTabMouseMove(Sender: TObject;
4185         Shift: TShiftState; X, Y: Integer);
4186 var
4187         TabIdx: Integer;
4188         ThreadItem: TThreadItem;
4189 begin
4190
4191         TabIdx := BrowserTab.IndexOfTabAt(x, y);
4192
4193         if ( ssLeft in Shift ) and ( BrowserTab.Style = tsTabs ) then begin
4194                 if FDragWFirst = false then begin
4195                         FDragWFirst := true;
4196                 end else begin
4197                         BrowserTab.EndDrag(false);
4198                         BrowserTab.BeginDrag(false, DandD_THRESHOLD);
4199                         FDragWFirst := false;
4200                 end;
4201         end else begin
4202                 BrowserTab.EndDrag(false);
4203                 FDragWFirst := false;
4204         end;
4205         
4206         if (FTabHintIndex <> TabIdx) and (TabIdx <> -1) then begin
4207                 Application.CancelHint;
4208                 ThreadItem := TBrowserRecord(BrowserTab.Tabs.Objects[TabIdx]).Thread;
4209                 if ThreadItem.Title <> BrowserTab.Tabs[TabIdx] then begin
4210                         BrowserTab.Hint := ThreadItem.Title;
4211                         Application.ShowHint := True;
4212                 end else begin
4213                         BrowserTab.Hint := '';
4214                         Application.ShowHint := True;
4215                 end;
4216                 FTabHintIndex := TabIdx;
4217         end;
4218
4219 end;
4220
4221 procedure TGikoForm.BrowserDocumentComplete(Sender: TObject;
4222         const pDisp: IDispatch; var URL: OleVariant);
4223 var
4224         FDispHtmlDocument: DispHTMLDocument;
4225         BrowserRecord :TBrowserRecord;
4226         i :Integer;
4227         doc                                     : Variant;
4228         threadItem      : TThreadItem;
4229 begin
4230         if TObject(Sender) is TWebBrowser then begin
4231                 BrowserRecord := nil;
4232                 if TWebBrowser(Sender) <> Browser then begin
4233                         for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
4234                                 if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser = TWebBrowser(Sender) then begin
4235                                                 BrowserRecord := TBrowserRecord(BrowserTab.Tabs.Objects[i]);
4236                                                 break;
4237                                 end;
4238                         end;
4239                         if BrowserRecord <> nil then begin
4240                                 if BrowserRecord.Event <> nil then
4241                                         BrowserRecord.Event.Free;
4242                                 FDispHtmlDocument := Idispatch(OleVariant(BrowserRecord.Browser.ControlInterface).Document) as DispHTMLDocument;
4243                                 BrowserRecord.Event := THTMLDocumentEventSink.Create(Self, FDispHtmlDocument, HTMLDocumentEvents2);
4244                                 BrowserRecord.Event.OnContextMenu := OnDocumentContextMenu;
4245                                 BrowserRecord.Event.OnClick := WebBrowserClick;  //\92Ç\89Á\82µ\82½OnClick\83C\83x\83\93\83g
4246                         end;
4247                 end else begin
4248                         if GetActiveContent <> nil then begin
4249                                 FDispHtmlDocument := Idispatch(OleVariant(Browser.ControlInterface).Document) as DispHTMLDocument;
4250                                 if FEvent <> nil then
4251                                         FEvent.Free;
4252                                 FEvent := THTMLDocumentEventSink.Create(Self, FDispHtmlDocument, HTMLDocumentEvents2);
4253                                 FEvent.OnContextMenu := OnDocumentContextMenu;
4254                                 FEvent.OnClick := WebBrowserClick;  //\92Ç\89Á\82µ\82½OnClick\83C\83x\83\93\83g
4255                         end else begin
4256                                 if FEvent <> nil then begin
4257                                         FEvent.Free;
4258                                         FEvent := nil;
4259                                 end;
4260                         end;
4261
4262                 end;
4263
4264                 if (BrowserRecord <> nil) and
4265                          Assigned( BrowserRecord.Thread ) then begin
4266                         threadItem := BrowserRecord.Thread;
4267
4268                         if (threadItem.JumpAddress > 0) then begin
4269                                 if threadItem.UnRead then begin
4270                                         threadItem.UnRead := False;
4271                                         TreeView.Refresh;
4272                                         RefreshListView(threadItem);
4273                                 end;
4274                                 // \83X\83N\83\8d\81[\83\8b\90æ\82ª\8eæ\93¾\8aO\82Ì\83\8c\83X\82Ì\8e\9e\82Í\8fI\92[\82É\88Ú\93®
4275                                 //if (StrToIntDef(BrowserRecord.Movement, 0) <= BrowserRecord.Thread.Count) then begin
4276                                 if (threadItem.JumpAddress <= BrowserRecord.Thread.Count) then begin
4277                                         BrowserRecord.Move(IntToStr(threadItem.JumpAddress));
4278                                         threadItem.JumpAddress := 0;
4279                                 end else begin
4280                                         BrowserRecord.Move(IntToStr(BrowserRecord.Thread.Count));
4281                                 end;
4282
4283                         end else if threadItem.UnRead then begin
4284                                 threadItem.UnRead := False;
4285                                 TreeView.Refresh;
4286                                 BrowserRecord.Move('new');
4287                                 RefreshListView(threadItem);
4288                         end else if threadItem.ScrollTop <> 0 then begin
4289                                 try
4290                                         doc := Idispatch( OleVariant( BrowserRecord.Browser.ControlInterface ).Document ) as IHTMLDocument2;
4291                                         doc.Body.ScrollTop := threadItem.ScrollTop;
4292                                 except
4293                                         on E: Exception do
4294                                                 MsgBox(Handle, E.Message, 'SetContent[ScrollTop<-]', 0);
4295                                 end;
4296                         end;
4297                 end;
4298         end;
4299         LockWindowUpdate(0);
4300 end;
4301
4302 procedure TGikoForm.RoundNamePopupMenuPopup(Sender: TObject);
4303 begin
4304         AddRoundNameMenu(RoundNamePopupMenu.Items);
4305 end;
4306
4307 procedure TGikoForm.AddRoundNameMenu(MenuItem: TMenuItem);
4308 var
4309         i: Integer;
4310         Item: TMenuItem;
4311 begin
4312         MenuItem.Clear;
4313         Item := TMenuItem.Create(Self);
4314         Item.Caption := '\90V\82µ\82¢\96¼\91O\82Å\8f\84\89ñ\97\\96ñ(&N)...';
4315         Item.OnClick := GikoDM.SelectNewRoundNameExecute;
4316         MenuItem.Add(Item);
4317         Item := TMenuItem.Create(Self);
4318         Item.Caption := '\8f\84\89ñ\83\8a\83X\83g\82©\82ç\8dí\8f\9c(&D)';
4319         Item.OnClick := GikoDM.SelectDeleteRoundExecute;
4320         MenuItem.Add(Item);
4321         Item := TMenuItem.Create(Self);
4322         Item.Caption := '-';
4323         MenuItem.Add(Item);
4324         for i := 0 to RoundList.RoundNameList.Count - 1 do begin
4325                 Item := TMenuItem.Create(Self);
4326                 Item.Caption := RoundList.RoundNameList[i];
4327                 Item.OnClick := SetSelectRoundName;
4328                 MenuItem.Add(Item);
4329         end;
4330 end;
4331
4332 procedure TGikoForm.SetSelectItemRound(RoundFlag: Boolean; RoundName: string; ParentName: string);
4333 var
4334         threadItem : TThreadItem;
4335 begin
4336         if ParentName <> 'dummy1' then begin
4337                 SetSelectItemRound(RoundFlag, RoundName);
4338         end else begin
4339                 threadItem := GetActiveContent;
4340                 if threadItem <> nil then begin
4341                         threadItem.RoundName := RoundName;
4342                         if RoundFlag then
4343                                 RoundList.RoundNameList.Add(RoundName);
4344                         threadItem.Round := RoundFlag;
4345                 end;
4346         end;
4347 end;
4348
4349 procedure TGikoForm.SetSelectItemRound(RoundFlag: Boolean; RoundName: string);
4350 var
4351         i{, idx}: Integer;
4352         List: TList;
4353 begin
4354         List := TList.Create;
4355         try
4356                 SelectListItem(List);
4357                 for i := 0 to List.Count - 1 do begin
4358                         if TObject(List[i]) is TBoard then begin
4359                                 TBoard(List[i]).RoundName := RoundName;
4360                                 if RoundFlag then
4361                                         RoundList.RoundNameList.Add(RoundName);
4362                                 TBoard(List[i]).Round := RoundFlag;
4363                         end else if TObject(List[i]) is TThreadItem then begin
4364                                 if TThreadItem(List[i]).IsLogFile then begin
4365                                         TThreadItem(List[i]).RoundName := RoundName;
4366                                         if RoundFlag then
4367                                                 RoundList.RoundNameList.Add(RoundName);
4368                                         TThreadItem(List[i]).Round := RoundFlag;
4369                                 end;
4370                         end;
4371                 end;
4372         finally
4373                 List.Free;
4374         end;
4375 end;
4376
4377 procedure TGikoForm.SetSelectRoundName(Sender: TObject);
4378 var
4379         MenuItem: TMenuItem;
4380 begin
4381         if Sender is TMenuItem then begin
4382                 MenuItem := TMenuItem(Sender);
4383                 SetSelectItemRound(True, StripHotKey(MenuItem.Caption), TMenuItem(Sender).Parent.Name);
4384                 ListView.Refresh;
4385         end;
4386 end;
4387
4388 function TGikoForm.GetCoolBand(CoolBar: TCoolBar; Control: TWinControl): TCoolBand;
4389 var
4390         i: Integer;
4391 begin
4392         Result := nil;
4393         if CoolBar = nil then
4394                 Exit;
4395         for i := 0 to CoolBar.Bands.Count - 1 do begin
4396                 if CoolBar.Bands[i].Control = Control then begin
4397                         Result := CoolBar.Bands[i];
4398                         Exit;
4399                 end;
4400         end;
4401 end;
4402
4403 procedure TGikoForm.BrowserTabToolBarResize(Sender: TObject);
4404 begin
4405         if BrowserTab.Parent = BrowserTabToolBar then
4406                 BrowserTab.Width := BrowserTabToolBar.Width;
4407 end;
4408
4409 procedure TGikoForm.WMSettingChange(var Message: TWMWinIniChange);
4410 begin
4411         SetMenuFont;
4412 end;
4413
4414 procedure TGikoForm.SetMenuFont;
4415 begin
4416 //      GikoSys.MenuFont(MenuToolBar.Font);
4417 //      MenuToolBar.Buttons[0].AutoSize := False;
4418 //      MenuToolBar.Buttons[0].AutoSize := True;
4419 //      MenuToolBar.Font.Color := clMenuText;
4420         GikoSys.MenuFont(MainCoolBar.Font);
4421         MenuToolBar.Buttons[0].AutoSize := False;
4422         MenuToolBar.Buttons[0].AutoSize := True;
4423         MainCoolBar.AutoSize := False;
4424         MainCoolBar.AutoSize := True;
4425
4426         GikoSys.MenuFont(ListCoolBar.Font);
4427         GikoSys.MenuFont(BrowserCoolBar.Font);
4428 //      MenuToolBar.Font.Color := clMenuText;
4429 end;
4430
4431 procedure TGikoForm.FavoriteMenuClick(Sender: TObject);
4432 var
4433         NewMenu: TMenuItem;
4434 begin
4435         if FavoriteDM.Modified then begin
4436                 FavoriteMenu.Clear;
4437
4438                 //\82¨\8bC\82É\93ü\82è\82Ì\92Ç\89Á
4439                 NewMenu := TMenuItem.Create(MainMenu);
4440                 NewMenu.Action := GikoDM.FavoriteAddAction;
4441                 FavoriteMenu.Add(NewMenu);
4442                 //\82¨\8bC\82É\93ü\82è\82Ì\90®\97\9d
4443                 NewMenu := TMenuItem.Create(FavoriteMenu);
4444                 NewMenu.Action := GikoDM.FavoriteArrangeAction;
4445                 FavoriteMenu.Add(NewMenu);
4446                 //\83Z\83p\83\8c\81[\83^
4447                 FavoriteMenu.InsertNewLineAfter(NewMenu);
4448                 CreateFavMenu(FavoriteDM.TreeView.Items.GetFirstNode, FavoriteMenu);
4449                 FavoriteDM.Modified := false;
4450         end;
4451 end;
4452
4453 procedure TGikoForm.CreateFavMenu(Node: TTreeNode; MenuItem: TMenuItem);
4454 var
4455         i: Integer;
4456         NewMenu: array of TMenuItem;
4457 begin
4458         SetLength(NewMenu, Node.Count);
4459         Node := Node.getFirstChild;
4460         i := 0;
4461         while ( Node <> nil ) do begin
4462                 NewMenu[i] := TFavoriteMenuItem.Create(nil);
4463                 NewMenu[i].AutoHotkeys := maAutomatic;
4464                 NewMenu[i].Caption := CustomStringReplace(Node.Text, '&', '&&');
4465                 TFavoriteMenuItem(NewMenu[i]).Data := Node.Data;
4466
4467                 if TObject(Node.Data) is TFavoriteFolder then begin
4468                         NewMenu[i].ImageIndex := GikoDataModule.TOOL_ICON_FAV_FOLDER;
4469                         CreateFavMenu(Node, NewMenu[i]);
4470                 end else if TObject(Node.Data) is TFavoriteBoardItem then begin
4471                         NewMenu[i].ImageIndex := GikoDataModule.TOOL_ICON_FAV_BOARD;
4472                         NewMenu[i].OnClick := FavoriteClick;
4473                 end else if TObject(Node.Data) is TFavoriteThreadItem then begin
4474                         NewMenu[i].ImageIndex := GikoDataModule.TOOL_ICON_FAV_THREAD;
4475                         NewMenu[i].OnClick := FavoriteClick;
4476                 end;
4477         Inc(i);
4478                 Node := Node.getNextSibling;
4479         end;
4480         MenuItem.Add(NewMenu);
4481 end;
4482
4483 procedure TGikoForm.ShowFavoriteAddDialog( Item : TObject );
4484 var
4485         Dlg                     : TFavoriteAddDialog;
4486         ItemURL : string;
4487         Data            : Pointer;
4488         Node            : TTreeNode;
4489 begin
4490
4491         if Item is TFavoriteBoardItem then
4492                 Item := TFavoriteBoardItem( Item ).Item
4493         else if Item is TFavoriteThreadItem then
4494                 Item := TFavoriteThreadItem( Item ).Item;
4495
4496         Node := FavoriteTreeView.Items.GetFirstNode;
4497         if Item is TBoard then begin
4498                 ItemURL := TBoard( Item ).URL;
4499                 while Node <> nil do begin
4500                         Data := Node.Data;
4501                         if TObject( Data ) is TFavoriteBoardItem then begin
4502                                 if ItemURL = TFavoriteBoardItem( Data ).URL then begin
4503                                         if Application.MessageBox( '\8aù\82É\82¨\8bC\82É\93ü\82è\82É\93o\98^\82³\82ê\82Ä\82¢\82Ü\82·\81B\82»\82ê\82Å\82à\92Ç\89Á\82µ\82Ü\82·\82©\81H', '\82¨\8bC\82É\93ü\82è\82Ì\92Ç\89Á', MB_YESNO ) = IDNO then
4504                                                 Exit;
4505                                         Break;
4506                                 end;
4507                         end;
4508                         Node := Node.GetNext;
4509                 end;
4510                 Dlg := TFavoriteAddDialog.Create(Self);
4511                 try
4512                         Dlg.SetBoard( TBoard( Item ) );
4513                         Dlg.ShowModal;
4514                 finally
4515                         Dlg.Release;
4516                 end;
4517         end else if Item is TThreadItem then begin
4518                 ItemURL := TThreadItem( Item ).URL;
4519                 while Node <> nil do begin
4520                         Data := Node.Data;
4521                         if TObject( Data ) is TFavoriteThreadItem then begin
4522                                 if ItemURL = TFavoriteThreadItem( Data ).URL then begin
4523                                         if Application.MessageBox( '\8aù\82É\82¨\8bC\82É\93ü\82è\82É\93o\98^\82³\82ê\82Ä\82¢\82Ü\82·\81B\82»\82ê\82Å\82à\92Ç\89Á\82µ\82Ü\82·\82©\81H', '\82¨\8bC\82É\93ü\82è\82Ì\92Ç\89Á', MB_YESNO ) = IDNO then
4524                                                 Exit;
4525                                         Break;
4526                                 end;
4527                         end;
4528                         Node := Node.GetNext;
4529                 end;
4530                 Dlg := TFavoriteAddDialog.Create(Self);
4531                 try
4532                         Dlg.SetThreadItem( TThreadItem( Item ) );
4533                         Dlg.ShowModal;
4534                 finally
4535                         Dlg.Release;
4536                 end;
4537         end;
4538
4539         SetLinkBar;
4540 end;
4541
4542 procedure TGikoForm.FavoriteClick(Sender: TObject);
4543 begin
4544         FavoriteClick( Sender, True );
4545 end;
4546
4547 procedure TGikoForm.FavoriteClick(Sender: TObject; ActiveTab: Boolean);
4548 var
4549         Board: TBoard;
4550         ThreadItem: TThreadItem;
4551         FavBoard: TFavoriteBoardItem;
4552         FavThread: TFavoriteThreadItem;
4553         Item: TObject;
4554 begin
4555 //      Item := nil;
4556         if Sender is TFavoriteMenuItem then
4557                 Item := TFavoriteMenuItem(Sender).Data
4558         else if Sender is TLinkToolButton then
4559                 Item := TLinkToolButton(Sender).Data
4560         else if Sender is TTreeNode then
4561                 Item := TTreeNode( Sender ).Data
4562         else
4563                 Exit;
4564
4565         if TObject(Item) is TFavoriteBoardItem then begin
4566                 FavBoard := TFavoriteBoardItem(Item);
4567                 Board := FavBoard.Item;
4568                 if Board <> nil then begin
4569                         if (FTreeType = gtt2ch) and (FActiveBBS <> Board.ParentCategory.ParenTBBS) then
4570                                 ShowBBSTree( Board.ParentCategory.ParenTBBS );
4571                         SelectTreeNode(Board, True);
4572                 end;
4573         end else if TObject(Item) is TFavoriteThreadItem then begin
4574                 FavThread := TFavoriteThreadItem(Item);
4575                 ThreadItem := FavThread.Item;
4576                 if ThreadItem = nil then
4577                         Exit;
4578
4579                 InsertBrowserTab(ThreadItem, ActiveTab);
4580
4581                 if GikoSys.Setting.ListOrientation = gloHorizontal then begin
4582                         if GikoSys.Setting.ListWidthState = glsMin then begin
4583                                 GikoDM.BrowserMaxAndFocusAction.Execute;
4584                         end;
4585                 end else begin
4586                         if GikoSys.Setting.ListHeightState = glsMin then begin
4587                                 GikoDM.BrowserMaxAndFocusAction.Execute;
4588                         end;
4589                 end;
4590         end;
4591 end;
4592
4593 procedure TGikoForm.BBSMenuItemOnClick(
4594         Sender  : TObject
4595 );
4596 begin
4597
4598         if Sender is TBBSMenuItem then
4599                 ShowBBSTree( TBBSMenuItem( Sender ).Data );
4600
4601 end;
4602
4603 procedure TGikoForm.MainCoolBarResize(Sender: TObject);
4604 begin
4605         TopPanel.Height := Max(MainCoolBar.Height, AnimePanel.Height);
4606
4607 end;
4608 //! \8ew\92è\82³\82ê\82½\83X\83\8c\83b\83h\82ð\8aJ\82­(\83\8d\83O\82ª\96³\82¢\82Æ\82« or \8ew\92èJUMP\82Ü\82Å\91«\82è\82È\82¢\82Æ\82«\82ÍDL\82·\82é)
4609 procedure TGikoForm.OpenThreadItem(Thread: TThreadItem; URL: String);
4610 var
4611         stRes, edRes : Int64;
4612         browserRec : TBrowserRecord;
4613         threadNumber : String;
4614         doc : Variant;
4615 begin
4616         stRes := 0;
4617         edRes := 0;
4618         Thread.JumpAddress := 0;
4619         // \83^\83u\82ð\90\90¬
4620         browserRec := InsertBrowserTab(Thread);
4621         if (browserRec <> nil) then begin
4622                 // JUMP\82·\82×\82«\83\8c\83X\94Ô\8d\86\82ª\82 \82é\82©\83`\83F\83b\83N\82·\82é
4623                 threadNumber := ChangeFileExt(Thread.FileName, '');
4624                 GikoSys.GetPopupResNumber( URL, stRes, edRes );
4625                 // \83X\83\8c\82Ì\94Ô\8d\86\82ð\83\8c\83X\94Ô\82Æ\8cë\82Á\82Ä\94F\8e¯\82µ\82Ä\82¢\82é\82Ì\82ð\83N\83\8a\83A
4626                 if (StrToInt64(threadNumber) = stRes) then begin
4627                         if not (AnsiEndsText(threadNumber + '/' + threadNumber, URL))
4628                                 and (Pos('&st=' + threadNumber , URL) = 0) then begin
4629                                 stRes := 0;
4630                         end;
4631                 end;
4632                 if ( stRes > 0 ) then begin
4633                         Thread.JumpAddress := stRes;
4634                 end;
4635                 // \83\8d\83O\82ð\8e\9d\82Á\82Ä\82¢\82È\82¢\82© JUMP\82·\82×\82«\83\8c\83X\94Ô\8d\86\82Ü\82Å\8eæ\93¾\82µ\82Ä\82¢\82È\82¢\82Æ\82«\82ÍDL\82·\82é
4636                 if (not Thread.IsLogFile) or (stRes > Thread.Count) then begin
4637                         DownloadContent(Thread);
4638                 end else if (not browserRec.Repaint) and (stRes > 0) then begin
4639                         browserRec.Move(IntToStr(stRes));
4640                         Thread.JumpAddress := 0;
4641                         try
4642                                 doc := Idispatch( OleVariant( browserRec.Browser.ControlInterface ).Document ) as IHTMLDocument2;
4643                                 Thread.ScrollTop := doc.Body.ScrollTop;
4644                         except
4645                         end;
4646                 end;
4647         end;
4648 end;
4649
4650 procedure TGikoForm.MoveToURL(const inURL: string);
4651 var
4652         protocol, host, path, document, port, bookmark : string;
4653         URL, protocol2, host2, path2, document2, port2, bookmark2 : string;
4654         tmp1, tmp2: string;
4655         BBSID, BBSKey: string;
4656         {tmpBoard,} Board: TBoard;
4657         ThreadItem: TThreadItem;
4658         i, bi                                   : Integer;
4659         boardURL                        : string;
4660         tmpThread                       : TThreadItem;
4661         shiftDown                       : Boolean;
4662         ctrlDown                        : Boolean;
4663 begin
4664
4665         GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
4666         GikoSys.Parse2chURL( inURL, path, document, BBSID, BBSKey );
4667
4668
4669         shiftDown       := GetAsyncKeyState(VK_SHIFT) = Smallint($8001);
4670         ctrlDown        := GetAsyncKeyState(VK_CONTROL) = Smallint($8001);
4671         if shiftDown then begin
4672                 GikoSys.OpenBrowser(inURL, gbtUserApp);
4673                 Exit;
4674         end else if ctrlDown then begin
4675                 GikoSys.OpenBrowser(inURL, gbtIE);
4676                 Exit;
4677         end;
4678
4679         //===== \83v\83\89\83O\83C\83\93
4680         try
4681                 //\8dì\8bÆ\92\86//
4682                 bi := Length(BoardGroups) - 1;
4683                 for i := 1 to bi do begin
4684                         if (BoardGroups[i].BoardPlugIn <> nil) and (Assigned(Pointer(BoardGroups[i].BoardPlugIn.Module))) then begin
4685                                 case BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) of
4686                                 atThread:
4687                                         begin
4688                                                 boardURL        := BoardGroups[i].BoardPlugIn.ExtractBoardURL( inURL );
4689                                                 Board           := BBSsFindBoardFromURL( boardURL );
4690
4691
4692                                                 if Board = nil then begin
4693                                                         //break;
4694                                                         // \81¦\8dì\82Á\82Ä\82à\92Ç\89Á\82·\82é\82Æ\82±\82ë\82ª\96³\82¢\82Ì\82Å\8c\83\82µ\82­\95Û\97¯
4695                                                         //GikoSys.OpenBrowser(inURL, gbtUserApp);
4696                                                         //Exit;
4697                                                         {
4698                                                         Board := GikoSys.GetUnknownBoard( tmpThread.BoardPlugIn, boardURL );
4699                                                         if (FTreeType = gtt2ch) and (FActiveBBS = BBSs[ 1 ]) then
4700                                                                 ShowBBSTree( BBSs[ 1 ] );
4701                                                         }
4702                                                 end else begin
4703                                                         tmpThread               := TThreadItem.Create( BoardGroups[i].BoardPlugIn, Board, inURL );
4704                                                         if not Board.IsThreadDatRead then begin
4705                                                                 GikoSys.ReadSubjectFile( Board );
4706                                                                 tmpThread.Free;
4707                                                                 Exit;
4708                                                         end;
4709                                                         ThreadItem := Board.FindThreadFromFileName( tmpThread.FileName );
4710                                                         if ThreadItem = nil then begin
4711                                                                 //tmpThread\82ð\82±\82Á\82¿\82Í\8aJ\95ú\82µ\82Ä\82Í\82¢\82¯\82È\82¢
4712                                                                 ThreadItem := tmpThread;
4713                                                                 Board.Insert( 0, ThreadItem );
4714                                                                 if ActiveList is TBoard then begin
4715                                                                         if TBoard(ActiveList) = Board then
4716                                                                                 ListView.Items.Count := ListView.Items.Count + 1;
4717                                                                 end;
4718                                                         end else begin
4719                                                                 tmpThread.Free;
4720                                                         end;
4721                                                         OpenThreadItem(ThreadItem, inURL);
4722                                                         Exit;
4723                                                 end;
4724                                         end;
4725
4726                                 atBoard:
4727                                         begin
4728                                                 Board := BBSsFindBoardFromURL(
4729                                                                         BoardGroups[i].BoardPlugIn.ExtractBoardURL( inURL )
4730                                                                         );
4731                                                 if Board <> nil then begin
4732                                                         if FActiveBBS <> Board.ParentCategory.ParenTBBS then
4733                                                                 ShowBBSTree( Board.ParentCategory.ParenTBBS );
4734                                                         SelectTreeNode( Board, True );
4735                                                         Exit;
4736                                                 end;
4737                                         end;
4738                                 end;
4739                         end;
4740                 end;
4741         except
4742                 // exception \82ª\94­\90\82µ\82½\8fê\8d\87\82Í\93à\95\94\8f\88\97\9d\82É\94C\82¹\82½\82¢\82Ì\82Å\82±\82±\82Å\82Í\89½\82à\82µ\82È\82¢
4743         end;
4744
4745
4746         if (Length( Trim(BBSKey) ) > 0) and (Length( Trim(BBSID) ) > 0) then begin
4747                 boardURL := GikoSys.Get2chThreadURL2BoardURL( inURL );
4748                 Board := BBSsFindBoardFromURL( boardURL );
4749                 if Board = nil then begin
4750                          // \93ü\82é\82×\82«\94Â\82ª\8c©\82Â\82©\82ç\82È\82©\82Á\82½\82Ì\82Å\81A\95\81\92Ê\82Ì\83u\83\89\83E\83U\82Å\8aJ\82­
4751                          GikoSys.OpenBrowser(inURL, gbtUserApp);
4752                          Exit;
4753                 end else begin
4754                         // \8aO\95\94\82Ì\94Â\82È\82Ì\82É2ch\82ÌURL\82É\82³\82ê\82Ä\82µ\82Ü\82Á\82½\93z\82ð\82±\82±\82Å\8am\94F\82·\82é
4755                         URL :=  Board.URL;
4756                         GikoSys.ParseURI(URL , protocol2, host2, path2, document2, port2, bookmark2 );
4757                         tmp1 := Copy(host, AnsiPos('.', host) + 1, Length(host));
4758                         tmp2 := Copy(host2, AnsiPos('.', host2) + 1, Length(host2));
4759                         if ( not GikoSys.Is2chHost(tmp1)) and (tmp1 <> tmp2) then begin
4760                                 GikoSys.OpenBrowser(inURL, gbtUserApp);
4761                                 Exit;
4762                         end;
4763                 end;
4764
4765                 if not Board.IsThreadDatRead then
4766                         GikoSys.ReadSubjectFile(Board);
4767                 URL := GikoSys.Get2chBrowsableThreadURL( inURL );
4768                 ThreadItem := Board.FindThreadFromURL( URL );
4769                 //\81@\89ß\8b\8e\83\8d\83O\91q\8cÉ\82©\82ç\81A\83_\83E\83\\82µ\82½\83X\83\8c\82ª\94­\8c©\82Å\82«\82È\82¢\82Ì\82Å\82±\82±\82Å\92T\82·\82æ\82¤\82É\82·\82é (2004/01/22)
4770                 if ThreadItem = nil then begin
4771                         ThreadItem := Board.FindThreadFromFileName( BBSKey + '.dat' );
4772                 end;
4773                 try
4774                         // \83X\83\8c\83b\83h\83A\83C\83e\83\80\82ª\82È\82¢\82È\82ç\90\90¬\82·\82é\81B
4775                         if ThreadItem = nil then begin
4776                                 ThreadItem := TThreadItem.Create( nil, Board, URL );
4777                                 ThreadItem.FileName := ChangeFileExt(BBSKey, '.dat');
4778                                 Board.Insert(0, ThreadItem);
4779                                 if ActiveList is TBoard then begin
4780                                         if TBoard(ActiveList) = Board then
4781                                                 ListView.Items.Count := ListView.Items.Count + 1;
4782                                 end;
4783                         end;
4784                         // \83\8d\83O\82È\82µ\83X\83\8c\83b\83h\82Ì\82Æ\82«\82Í\81A\83z\83X\83g\96¼\82Ì\83`\83F\83b\83N\82ð\82·\82é
4785                         if (not ThreadItem.IsLogFile) then begin
4786                                 if AnsiPos(Host, Board.URL) = 0 then
4787                                         ThreadItem.DownloadHost := Host
4788                                 else
4789                                         ThreadItem.DownloadHost := '';
4790                         end;
4791                         OpenThreadItem(ThreadItem, inURL);
4792                 except
4793                 end;
4794         end else begin
4795                 Board := BBSsFindBoardFromURL( inURL );
4796                 if Board = nil then begin
4797                         GikoSys.OpenBrowser(inURL, gbtAuto);
4798                 end else begin
4799                         if FActiveBBS <> Board.ParentCategory.ParenTBBS then
4800                                 ShowBBSTree( Board.ParentCategory.ParenTBBS );
4801                         SelectTreeNode( Board, True );
4802                 end;
4803         end;
4804 end;
4805
4806 procedure TGikoForm.AddressToolBarResize(Sender: TObject);
4807 begin
4808         AddressComboBox.Width := AddressToolBar.Width - MoveToToolButton.Width - 10;
4809         CoolBarResized( Sender, MainCoolBar );
4810 end;
4811
4812 procedure TGikoForm.AddressComboBoxKeyDown(Sender: TObject; var Key: Word;
4813         Shift: TShiftState);
4814 begin
4815         if Key = VK_RETURN then
4816                 GikoDM.MoveToAction.Execute;
4817 end;
4818
4819 procedure TGikoForm.BrowserEnter(Sender: TObject);
4820 begin
4821         Browser.DoObjectVerb(OLEIVERB_UIACTIVATE);
4822 end;
4823
4824 procedure TGikoForm.WMCopyData(var Message: TWMCopyData);
4825 var
4826         CDS:PCopyDataStruct;
4827         PC:PChar;
4828         sURL: string;
4829 begin
4830         CDS := Message.CopyDataStruct;
4831         GetMem(PC, CDS^.cbData);
4832         try
4833                 lstrcpy(PC,CDS^.lpData);
4834                 SetString(sURL, PC,lstrlen(PC));
4835                 MoveToURL(sURL);
4836         finally
4837                 FreeMem(PC);
4838         end;
4839         Message.Result := 1;
4840 end;
4841
4842 procedure TGikoForm.WndProc(var Message: TMessage);
4843 var
4844         senderBrowser   : TWebBrowser;
4845         url                                             : OleVariant;
4846 begin
4847         try
4848                 case Message.Msg of
4849                 CM_DIALOGCHAR:
4850                         if not (ssAlt in KeyDataToShiftState(TWMChar(Message).KeyData)) then
4851                                 Exit;
4852                 WM_SYSCOMMAND:
4853                         if Message.WParam = SC_MINIMIZE then
4854                                 OnMinimize;
4855                 USER_TREECLICK:
4856                         TreeClick( TreeView.Selected );
4857                 USER_RESIZED:
4858                         OnResized;
4859                 USER_MINIMIZED:
4860                         OnMinimized;
4861                 USER_SETLINKBAR:
4862                         SetLinkBar;
4863                 USER_DOCUMENTCOMPLETE:
4864                         if (Message.WParam <> 0) and
4865                                  (TObject(Message.WParam) is TWebBrowser) then begin
4866                                 senderBrowser := TWebBrowser( Message.WParam );
4867                                 BrowserDocumentComplete( senderBrowser, senderBrowser.Parent, url );
4868                         end;
4869                 end;
4870
4871                 inherited;
4872         except
4873         end;
4874 end;
4875
4876 procedure TGikoForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
4877 var
4878         handle: THandle;
4879 begin
4880         Handled := False;
4881         //\83A\83h\83\8c\83X\82à\82µ\82­\82Í\8di\82è\8d\9e\82Ý\83R\83\93\83{\83{\83b\83N\83X\82à\82µ\82­\82Í\82¨\8bC\82É\93ü\82è\82ª\95Ò\8fW\92\86\82Í
4882         //\83V\83\87\81[\83g\83J\83b\83g\82È\82Ç\82ð\96³\8cø\82É\82·\82é
4883         if ((FavoriteTreeView.Visible) and (FavoriteTreeView.IsEditing)) then begin
4884                 if Msg.CharCode in [VK_BACK] then begin
4885                         //BS\82ª\82Q\89ñ\91\97\82ç\82ê\82é\95s\8bï\8d\87\89ñ\94ð
4886                         if Msg.KeyData > 0 then begin
4887                                 handle := GetFocus;
4888                                 if handle <> 0 then
4889                                         SendMessage(handle, WM_CHAR, Msg.CharCode, Msg.KeyData);
4890                                 Handled := True;
4891                         end;
4892                 end else
4893                 //\82¨\8bC\82É\93ü\82è\82ÍESC\82Å\92E\8fo\82µ\82½\82¢\82Ì\82Å\81A\82»\82ê\82à\91\97\82é
4894                 if Msg.CharCode in [VK_INSERT, VK_DELETE, VK_HOME, VK_END, VK_PRIOR, VK_NEXT, VK_ESCAPE] then begin
4895                         handle := GetFocus;
4896                         if handle <> 0 then
4897                                 SendMessage(handle, WM_KEYDOWN, Msg.CharCode, Msg.KeyData);
4898                         Handled := True;
4899                 end;
4900         end     else if (AddressComboBox.Focused) or (SelectComboBox.Focused) then begin
4901                 if Msg.CharCode in [VK_BACK] then begin
4902                         //BS\82ª\82Q\89ñ\91\97\82ç\82ê\82é\95s\8bï\8d\87\89ñ\94ð
4903                         if Msg.KeyData > 0 then begin
4904                                 handle := GetFocus;
4905                                 if handle <> 0 then
4906                                         SendMessage(handle, WM_CHAR, Msg.CharCode, Msg.KeyData);
4907                                 Handled := True;
4908                         end;
4909                 end else if Msg.CharCode in [VK_INSERT, VK_DELETE, VK_HOME, VK_END, VK_PRIOR, VK_NEXT] then begin
4910                         handle := GetFocus;
4911                         if handle <> 0 then
4912                                 SendMessage(handle, WM_KEYDOWN, Msg.CharCode, Msg.KeyData);
4913                         Handled := True;
4914                 end;
4915         end else begin
4916                 Handled := GikoDM.GikoFormActionList.IsShortCut(Msg);
4917         end;
4918 end;
4919
4920 procedure TGikoForm.PreviewTimerTimer(Sender: TObject);
4921 var
4922         p: TPoint;
4923         ARect: TRect;
4924         sl: TStringList;
4925         html: string;
4926         HtmlFileName: string;
4927
4928         NavURL: OleVariant;
4929         Flags: OleVariant;
4930         TargetFrameName: OleVariant;
4931         PostData: OleVariant;
4932         Headers: OleVariant;
4933         WindowHeight: Integer;
4934         WindowWidth: Integer;
4935
4936 //      Style: Longint;
4937         Referer: string;
4938         Protocol, Host, Path, Document, Port, Bookmark: string;
4939 begin
4940         PreviewTimer.Enabled := False;
4941
4942         GetCursorpos(p);
4943
4944         case GikoSys.Setting.PreviewSize of
4945                 gpsXSmall: begin
4946                         WindowWidth := 128;
4947                         WindowHeight := 96;
4948                 end;
4949                 gpsSmall: begin
4950                         WindowWidth := 256;
4951                         WindowHeight := 192;
4952                 end;
4953                 gpsLarge: begin
4954                         WindowWidth := 512;
4955                         WindowHeight := 384;
4956                 end;
4957                 gpsXLarge: begin
4958                         WindowWidth := 640;
4959                         WindowHeight := 480;
4960                 end;
4961                 else begin      //gpsMedium
4962                         WindowWidth := 384;
4963                         WindowHeight := 288;
4964                 end;
4965         end;
4966
4967         ARect := Rect(0, 0, WindowWidth, WindowHeight);
4968
4969         case GikoSys.Setting.PopupPosition of
4970                 gppRightTop:            OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y - (ARect.Bottom - ARect.Top) -     15);
4971                 gppRight:                       OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y - ((ARect.Bottom - ARect.Top) div 2));
4972                 gppRightBottom: OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y + 15);
4973                 gppTop:                                 OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y - (ARect.Bottom - ARect.Top) -  15);
4974                 gppCenter:                      OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y - ((ARect.Bottom - ARect.Top) div 2));
4975                 gppBottom:                      OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y + 15);
4976                 gppLeftTop:                     OffsetRect(ARect, p.x + 15, p.y - (ARect.Bottom - ARect.Top) -  15);
4977                 gppLeft:                                OffsetRect(ARect, p.x + 15, p.y - ((ARect.Bottom - ARect.Top) div 2));
4978                 gppLeftBottom:  OffsetRect(ARect, p.x + 15, p.y + 15);          //\83M\83R\83i\83r\83X\83\8c \83p\81[\83g\82P\82Ì453\8e\81\82É\8a´\8eÓ
4979         end;
4980
4981         html := '<html><head>'#13#10
4982                                 + '<SCRIPT>'#13#10
4983                                 + 'function init() {'#13#10
4984                                 + '     if ((document.body.clientHeight >= Image1.height) && (document.body.clientWidth >= Image1.width)) {'#13#10
4985                                 + '     } else {'#13#10
4986                                 + '             var dh, ih;'#13#10
4987                                 + '             dh = document.body.clientWidth / document.body.clientHeight;'#13#10
4988                                 + '             ih = Image1.width / Image1.height;'#13#10
4989                                 + '             if (document.body.clientWidth < document.body.clientHeight) {'#13#10
4990                                 + '                     if (ih > dh)'#13#10
4991                                 + '                             Image1.width = document.body.clientWidth;'#13#10
4992                                 + '                     else'#13#10
4993                                 + '                             Image1.height = document.body.clientHeight;'#13#10
4994                                 + '             } else {'#13#10
4995                                 + '                     if (ih < dh)'#13#10
4996                                 + '                             Image1.height = document.body.clientHeight;'#13#10
4997                                 + '                     else'#13#10
4998                                 + '                             Image1.width = document.body.clientWidth;'#13#10
4999                                 + '             }'#13#10
5000                                 + '     }'#13#10
5001                                 + '     Message.style.display = "none";'#13#10
5002                                 + '}'#13#10
5003                                 + '</SCRIPT>'#13#10
5004                                 + '</head>'#13#10
5005                                 + '<body topmargin="0" leftmargin="0" style="border-width: 1px; overflow:hidden; border-style: solid;" onLoad="init()">'#13#10
5006                                 + '<div align="center" id="Message">\83v\83\8c\83r\83\85\81[\8dì\90¬\92\86</div>'#13#10
5007                                 + '<div align="center"><img name="Image1" border="0" src="%ImageURL%"></div>'#13#10
5008                                 + '</body></html>';
5009         sl := TStringList.Create;
5010         try
5011                 try
5012                         HtmlFileName := GikoSys.GetAppDir + HTML_FILE_NAME;
5013                         sl.Text := AnsiReplaceStr(html, '%ImageURL%', FPreviewURL);
5014                         sl.SaveToFile(HtmlFileName);
5015                 finally
5016                         sl.Free;
5017                 end;
5018         except
5019         end;
5020
5021         NavURL := HtmlFileName;
5022         Flags := 0;
5023         TargetFrameName := '';
5024         PostData := '';
5025
5026         GikoSys.ParseURI(FPreviewURL, Protocol, Host, Path, Document, Port, Bookmark);
5027         Referer := Protocol + '://' + Host;
5028         if Port <> '' then
5029                 Referer := Referer + ':' + Port;
5030         Referer := Referer + Path;
5031         Headers := 'Referer: ' + Referer;
5032         FPreviewBrowser.Navigate(NavURL, Flags, TargetFrameName, PostData, Headers);
5033         if ARect.Top + WindowHeight > Screen.DesktopHeight then
5034                 ARect.Top := Screen.DesktopHeight - WindowHeight;
5035         if ARect.Left + WindowWidth > Screen.DesktopWidth then
5036                 ARect.Left := Screen.DesktopWidth - WindowWidth;
5037         if ARect.Left < Screen.DesktopLeft then ARect.Left := Screen.DesktopLeft;
5038         if ARect.Bottom < Screen.DesktopTop then ARect.Bottom := Screen.DesktopTop;
5039
5040         SetWindowPos(FPreviewBrowser.Handle, HWND_TOPMOST, ARect.Left, ARect.Top, WindowWidth, WindowHeight, SWP_NOACTIVATE or SWP_HIDEWINDOW);
5041         ShowWindow(FPreviewBrowser.Handle, SW_SHOWNOACTIVATE);
5042         FPreviewBrowserRect := ARect;
5043 //      Style := GetWindowLong(FPreviewBrowser.Handle, GWL_EXSTYLE);
5044 //      SetWindowLong(FPreviewBrowser.Handle, GWL_EXSTYLE, Style xor WS_EX_APPWINDOW);
5045
5046 end;
5047
5048 procedure TGikoForm.WMSetCursor(var Message: TWMSetCursor);
5049 var
5050         Pos : TPoint;
5051 begin
5052
5053         if PreviewTimer.Enabled then
5054                 PreviewTimer.Enabled := False;
5055         if (FHint <> nil) and (IsWindowVisible(FHint.Handle)) then begin
5056                 FHint.ReleaseHandle;
5057                 FHint.ClearAllRes;
5058         end;
5059
5060         if (FPreviewBrowser <> nil)
5061                 and (IsWindowVisible(FPreviewBrowser.Handle)) then begin
5062         //\82±\82±\82Å\8fÁ\82³\82ê\82é\82Ì\82ª\96â\91è
5063         //\82½\82Ô\82ñ\82±\82ê\82Å\95\\8e¦\94Í\88Í\94»\92è\82Å\82«\82Ä\82¢\82é\82Í\82¸
5064                 Pos := Mouse.CursorPos;
5065                 Pos.X := Pos.X + Left;
5066                 Pos.Y := Pos.Y + Top;
5067                 if (FPreviewBrowserRect.Left > Pos.X) or
5068                         (FPreviewBrowserRect.Right < Pos.X) or
5069                         (FPreviewBrowserRect.Top > Pos.Y) or
5070                         (FPreviewBrowserRect.Bottom < Pos.Y) then begin
5071                         ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
5072                 end;
5073         end;
5074
5075         Message.Result := 1;
5076         inherited;
5077 end;
5078 procedure TGikoForm.MessageHideButtonClick(Sender: TObject);
5079 begin
5080         GikoDM.MsgBarCloseAction.Execute;
5081 end;
5082
5083 function TGikoForm.OnDocumentContextMenu(Sender: TObject): WordBool;
5084 var
5085         Doc: IHtmlDocument2;
5086         Range: IHTMLTxtRange;
5087         s: string;
5088         Num: Integer;
5089         ThreadItem: TThreadItem;
5090 begin
5091         Result := False;
5092         FactiveContent.IDAnchorPopup('');
5093         Doc := FactiveContent.Browser.Document as IHtmlDocument2;
5094         if Assigned(Doc) then begin
5095                 Range := Doc.selection.createRange as IHTMLTxtRange;
5096                 s := CustomStringReplace(Range.text, '\81@', ' ');//\91S\8ap\8bó\94\92\82ð\94¼\8ap\8bó\94\92\82É
5097                 s := ZenToHan(Trim(s));
5098                 if GikoSys.IsNumeric(s) then begin
5099
5100                         ThreadItem := GetActiveContent;
5101                         if ThreadItem <> nil then begin
5102                                 Num := StrToInt64(s);
5103                                 FHint.PopupType := gptThread;
5104                                 HTMLCreater.SetResPopupText(FHint, ThreadItem, Num, Num, False, False);
5105                                 if FHint.ResCount <> 0 then
5106                                         ShowTextPopup;
5107                                 Result := False;
5108                         end else
5109                                 Result := True;
5110                 end else begin
5111                         Result := True;
5112                 end;
5113         end;
5114 end;
5115
5116 procedure TGikoForm.ShowTextPopup;
5117 var
5118         p: TPoint;
5119         ARect: TRect;
5120 begin
5121 //      if Trim(s) = '' then
5122 //              Exit;
5123         try
5124                 FHint.Font.Name := GikoSys.Setting.HintFontName;
5125                 FHint.Font.Size := GikoSys.Setting.HintFontSize;
5126                 FHint.Font.Color := GikoSys.Setting.HintFontColor;
5127                 FHint.Color := GikoSys.Setting.HintBackColor;
5128                 FHint.HeaderBold := GikoSys.Setting.ResPopupHeaderBold;
5129                 GetCursorpos(p);
5130                 if FHint.PopupType = gptRaw then
5131                         ARect := FHint.CalcHintRect(Screen.Width, FHint.Caption, nil)
5132                 else
5133                         ARect := FHint.CalcHintRect(Screen.Width, '', nil);
5134                 case GikoSys.Setting.PopupPosition of
5135                         gppRightTop:            OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y - (ARect.Bottom - ARect.Top) -     15);
5136                         gppRight:                       OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y - ((ARect.Bottom - ARect.Top) div 2));
5137                         gppRightBottom: OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y + 15);
5138                         gppTop:                                 OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y - (ARect.Bottom - ARect.Top) -  15);
5139                         gppCenter:                      OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y - ((ARect.Bottom - ARect.Top) div 2));
5140                         gppBottom:                      OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y + 15);
5141                         gppLeftTop:                     OffsetRect(ARect, p.x + 15, p.y - (ARect.Bottom - ARect.Top) -  15);
5142                         gppLeft:                                OffsetRect(ARect, p.x + 15, p.y - ((ARect.Bottom - ARect.Top) div 2));
5143                         gppLeftBottom:  OffsetRect(ARect, p.x + 15, p.y + 15);          //\83M\83R\83i\83r\83X\83\8c \83p\81[\83g\82P\82Ì453\8e\81\82É\8a´\8eÓ
5144                 end;
5145                 //FHint.ActivateHint(ARect, s);
5146                 if FHint.PopupType = gptRaw then
5147                         FHint.ActivateHint(ARect, FHint.Caption)
5148                 else
5149                         FHint.ActivateHint(ARect, '');
5150         except
5151                 FHint.ReleaseHandle;
5152                 FHint.ClearAllRes;
5153         end;
5154 end;
5155
5156 procedure TGikoForm.HistoryAllClearToolButtonClick(Sender: TObject);
5157 const
5158         DEL_MSG = '\91S\97\9a\97ð\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\82æ\82ë\82µ\82¢\82Å\82·\82©\81H';
5159         DEL_TITLE = '\8dí\8f\9c\8am\94F';
5160 begin
5161         if FTreeType = gttHistory then begin
5162                 if (GetKeyState( VK_SHIFT ) and $80000000) = 0 then
5163                         if MsgBox(Handle, DEL_MSG, DEL_TITLE, MB_YESNO or MB_ICONWARNING or MB_DEFBUTTON2) <> ID_YES then
5164                                 Exit;
5165                 ClearHistory;
5166                 FHistoryList.Clear;
5167                 TreeView.Items.Clear;
5168         end;
5169 end;
5170
5171 procedure TGikoForm.SetLinkBar;
5172 var
5173         i: Integer;
5174         j: Integer;
5175         ToolButton: TLinkToolButton;
5176         MenuItem: TMenuItem;
5177         oldIgnoreResize : TResizeType;
5178 begin
5179         oldIgnoreResize := FIsIgnoreResize;
5180         FIsIgnoreResize := rtResizing;
5181         MainCoolBar.Bands.BeginUpdate;
5182         try
5183                 LinkBarPopupMenu.Items.Clear;
5184                 for i := LinkToolBar.ButtonCount - 1 downto 0 do
5185                         //LinkToolBar.RemoveControl(LinkToolBar.Buttons[i]);
5186                         LinkToolBar.Buttons[i].Free;
5187                 for i := 0 to FavoriteTreeView.Items.Count - 1 do begin
5188                         if FavoriteTreeView.Items[i].Text = Favorite.FAVORITE_LINK_NAME then begin
5189                                 for j := 0 to FavoriteTreeView.Items[i].Count - 1 do begin
5190                                         ToolButton := TLinkToolButton.Create(LinkToolBar);
5191 //                    ToolButton.Parent := LinkToolBar;
5192                                         if TObject(FavoriteTreeView.Items[i].Item[j].Data) is TFavoriteFolder then begin
5193                                                 MenuItem := TMenuItem.Create(Self);
5194                                                 CreateFavMenu(FavoriteTreeView.Items[i].Item[j], MenuItem);
5195                                                 LinkBarPopupMenu.Items.Add(MenuItem);
5196                                                 ToolButton.MenuItem := MenuItem;
5197                                                 ToolButton.ImageIndex := GikoDataModule.TOOL_ICON_FAV_FOLDER;
5198                                         end else if TObject(FavoriteTreeView.Items[i].Item[j].Data) is TFavoriteBoardItem then begin
5199                                                 ToolButton.ImageIndex := GikoDataModule.TOOL_ICON_FAV_BOARD;
5200                                                 ToolButton.OnClick := FavoriteClick;
5201                                         end else if TObject(FavoriteTreeView.Items[i].Item[j].Data) is TFavoriteThreadItem then begin
5202                                                 ToolButton.ImageIndex := GikoDataModule.TOOL_ICON_FAV_THREAD;
5203                                                 ToolButton.OnClick := FavoriteClick;
5204                                         end;
5205                                         ToolButton.Caption := FavoriteTreeView.Items[i].Item[j].Text;
5206                                         ToolButton.Left := 10000;
5207                                         ToolButton.Data := FavoriteTreeView.Items[i].Item[j].Data;
5208                                         ToolButton.AutoSize := True;
5209                                         ToolButton.OnDragDrop := LinkToolButtonDragDrop;
5210                                         ToolButton.OnDragOver := FavoriteDragOver;
5211                                         ToolButton.OnMouseDown := LinkToolButtonOnMouseDown;
5212                                         ToolButton.OnMouseMove := LinkToolButtonOnMouseMove;
5213                                         ToolButton.OnMouseUp := LinkToolButtonOnMouseUp;
5214                                         ToolButton.OnStartDrag := LinkToolButtonStartDrag;
5215                                         //ToolButton.DragMode := dmAutomatic;
5216                                         ToolButton.DragMode := dmManual;
5217                                         ToolButton.PopupMenu := FavoriteTreePopupMenu;
5218
5219                                         LinkToolBar.InsertControl(ToolButton);
5220                                 end;
5221                                 break;
5222                         end;
5223                 end;
5224 {               if LinkToolBar.ButtonCount = 0 then begin
5225                         ToolButton := TLinkToolButton.Create(LinkToolBar);
5226                         ToolButton.Style := tbsButton;
5227                         ToolButton.ImageIndex := -1;
5228                         ToolButton.Caption := '';
5229                         LinkToolBar.InsertControl(ToolButton);
5230                 end;}
5231         finally
5232                 MainCoolBar.Bands.EndUpdate;
5233                 LoadCoolBarSettings;
5234                 FIsIgnoreResize := oldIgnoreResize;
5235         end;
5236 end;
5237
5238 procedure TGikoForm.FavoriteDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
5239 var
5240         Node: TTreeNode;
5241         bound: TRect;
5242         height: Integer;
5243         Change: Boolean;
5244 begin
5245
5246         if Sender = FavoriteTreeView then begin
5247                 Node := FavoriteTreeView.GetNodeAt(X, Y);
5248
5249                 if Node = nil then
5250                         Exit;
5251
5252                 bound := Node.DisplayRect( False );
5253                 height := bound.Bottom - bound.Top;
5254                 if (bound.Top + height / 2) <= Y then
5255                         Node := FavoriteTreeView.GetNodeAt(X, Y + height);
5256
5257                 if Node = nil then
5258                         Exit;
5259
5260                 if Node.IsFirstNode then
5261                         Exit;
5262
5263                 Change := True;
5264
5265                 if FDropSpaceNode <> nil then
5266                         if FDropSpaceNode.AbsoluteIndex = Node.AbsoluteIndex then
5267                                 Change := False;
5268
5269                 if Change then begin
5270                         if FDropSpaceNode <> nil then
5271                                 FDropSpaceNode.Free;
5272
5273                         FDropSpaceNode := FavoriteDM.TreeView.Items.AddChildObjectFirst(Node.Parent, '', nil );
5274                         FDropSpaceNode.MoveTo( Node, naInsert );
5275                         FDropSpaceNode.ImageIndex := -1;
5276                         FDropSpaceNode.SelectedIndex := -1;
5277                 end;
5278         end;
5279
5280         if Source = FavoriteTreeView then begin
5281                 if FavoriteTreeView.Selected = FavoriteTreeView.Items.GetFirstNode then begin
5282                         Accept := False;
5283                         Exit;
5284                 end;
5285                 Accept := True;
5286         end else if Source = BrowserTab then
5287                 Accept := True
5288         else if Source = ListView then
5289                 Accept := True
5290         else if Source is TLinkToolButton then
5291                 Accept := True
5292         else if Source = TreeView then
5293                 Accept := True
5294         else
5295                 Accept := False;
5296 end;
5297
5298 procedure TGikoForm.FavoriteTreeViewDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
5299 begin
5300
5301         FavoriteDragOver( Sender, Source, X, Y, State, Accept );
5302
5303 end;
5304 procedure TGikoForm.LinkToolButtonStartDrag(Sender: TObject; var DragObject: TDragObject);
5305 begin
5306          //     FDragging := true;
5307 end;
5308
5309 procedure TGikoForm.LinkToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer);
5310 var
5311         SenderNode: TTreeNode;
5312         LinkToolButton: TLinkToolButton;
5313 begin
5314
5315         LinkToolButton := TLinkToolButton( Sender );
5316         SenderNode := TreeNodeDataFind( FavoriteTreeView.Items.GetFirstNode, LinkToolButton.Data );
5317         SenderNode.Selected := False;
5318         FavoriteDragDrop( SenderNode, Source );
5319
5320         SetLinkBar;
5321
5322 end;
5323
5324 procedure TGikoForm.LinkToolButtonOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
5325 var
5326         favButton                       : TLinkToolButton;
5327         favThreadItem   : TFavoriteThreadItem;
5328 begin
5329
5330         case Button of
5331         mbMiddle:
5332                 begin
5333                         if Sender is TLinkToolButton then begin
5334                                 favButton := TLinkToolButton( Sender );
5335                                 if TObject( favButton.Data ) is TFavoriteThreadItem then begin
5336                                         favThreadItem := TFavoriteThreadItem( favButton.Data );
5337                                         if favThreadItem.Item <> nil then
5338                                                 InsertBrowserTab( favThreadItem.Item, False );
5339                                 end;
5340                         end;
5341                 end;
5342         end;
5343
5344 end;
5345
5346 procedure TGikoForm.LinkToolButtonOnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
5347 var
5348         Now : Cardinal;
5349 begin
5350         TToolButton( Sender ).DragMode := dmManual;
5351         if ssLeft in Shift then begin
5352 //              TToolButton( Sender ).Down := true;   // \83\8a\83\93\83N\83c\81[\83\8b\83o\81[\82Ì\8b\93\93®\95s\90R\82Ì\8c´\88ö\82Ì\82æ\82¤\82È\82Ì\82Å\83R\83\81\83\93\83g\83A\83E\83g\82µ\82½(2003-dec-02)
5353                 if FDragTime = 0 then begin
5354                         FDragTime := GetTickCount();
5355                 end else begin
5356                         Now := GetTickCount();
5357                         if (Now - FDragTime) > 500 then begin
5358                                 if FDragButton <> TToolButton( Sender ) then begin
5359                                         try
5360                                                 FDragButton := TToolButton( Sender );
5361                                                 TToolButton(Sender).BeginDrag(false ,5);
5362                                                 FDragTime := 0;
5363                                         except
5364                                                 {$IF Defined(debug)}
5365                                                 ShowMessage('Error');
5366                                                 {$IFEND}
5367                                         end;
5368                                 end;
5369                         end;
5370                 end;
5371         end else begin
5372                 FDragTime := 0;
5373         end;
5374 end;
5375
5376 procedure TGikoForm.LinkToolButtonOnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
5377 begin
5378         FDragTime := 0;
5379 end;
5380
5381 function TGikoForm.GetWidthAllToolButton(ToolBar: TToolBar): Integer;
5382 var
5383         i: Integer;
5384 begin
5385         Result := 0;
5386         for i := 0 to ToolBar.ButtonCount - 1 do
5387                 if ToolBar.Buttons[i].Visible then
5388                         Result := Result + ToolBar.Buttons[i].Width;
5389 end;
5390
5391 procedure TGikoForm.MainCoolBarBandInfo(Sender: TObject; var BandInfo: PReBarBandInfoA);
5392 var
5393         Control : TWinControl;
5394         i, idx  : Integer;
5395 begin
5396         Control := FindControl(BandInfo^.hwndChild);
5397         if Control = nil then
5398                 Exit;
5399         idx := 0;
5400         for i := MainCoolBar.Bands.Count - 1 downto 0 do begin
5401                 if MainCoolBar.Bands[ i ].Control.Handle = Control.Handle then begin
5402                         idx := MainCoolBar.Bands[ i ].ID;
5403                         Break;
5404                 end;
5405         end;
5406         Canvas.Font.Handle := GetStockObject( DEFAULT_GUI_FONT );
5407         if (Control = MenuToolBar) or (Control = StdToolBar) then begin
5408                 BandInfo^.fMask                         := BandInfo.fMask or RBBIM_CHILDSIZE or RBBIM_STYLE or RBBIM_IDEALSIZE;
5409                 BandInfo^.fStyle                        := BandInfo.fStyle or RBBS_USECHEVRON;
5410                 BandInfo^.cxMinChild    := 0;
5411                 BandInfo^.cx                                    := GikoSys.Setting.MainCoolSet[ idx ].FCoolWidth;
5412                 BandInfo^.cxIdeal                       := GetWidthAllToolButton(TToolBar(Control));
5413         end else if Control = LinkToolBar then begin
5414                 BandInfo^.fMask                         := BandInfo.fMask or RBBIM_CHILDSIZE or RBBIM_STYLE or RBBIM_IDEALSIZE;
5415                 BandInfo^.fStyle                        := BandInfo.fStyle or RBBS_USECHEVRON;
5416                 BandInfo^.cxMinChild    := 0;
5417                 BandInfo^.cx                                    := GikoSys.Setting.MainCoolSet[ idx ].FCoolWidth + Canvas.TextWidth( '\83\8a\83\93\83N' );
5418                 BandInfo^.cxIdeal                       := GetWidthAllToolButton(TToolBar(Control));
5419         end else begin // AddressToolBar
5420                 BandInfo^.fMask                         := BandInfo.fMask or RBBIM_CHILDSIZE;
5421                 BandInfo^.cxMinChild    := 0;
5422                 BandInfo^.cx                                    := GikoSys.Setting.MainCoolSet[ idx ].FCoolWidth + Canvas.TextWidth( '\83A\83h\83\8c\83X' );
5423         end;
5424 end;
5425
5426 procedure TGikoForm.MainCoolBarChevronClick(Sender: TObject; RebarChevron: PNMRebarChevron);
5427 var
5428         i : Integer;
5429         Idx: Integer;
5430         p: TPoint;
5431 begin
5432         ChevronPopupMenu.Items.Clear;
5433         Idx := 0;
5434         for i := 0 to MainCoolBar.Bands.Count - 1 do begin
5435                 if MainCoolBar.Bands[ i ].Visible then begin
5436                         if Idx = Int64(RebarChevron^.uBand) then begin
5437                                 Idx := i;
5438                                 break;
5439                         end;
5440                         Inc( Idx );
5441                 end;
5442         end;
5443         if (Idx >= 0) and (MainCoolBar.Bands.Count > Idx) then begin
5444                 if MainCoolBar.Bands[Idx].Control = MenuToolbar then begin
5445                         MenuBarChevronMenu;
5446                 end else if MainCoolBar.Bands[Idx].Control = StdToolbar then begin
5447                         ToolBarChevronMenu(StdToolBar);
5448                 end else if MainCoolBar.Bands[Idx].Control = LinkToolbar then begin
5449                         LinkBarChevronMenu;
5450                 end else
5451                         Exit;
5452                 p := MainCoolBar.ClientToScreen(Point(RebarChevron^.rc.left, RebarChevron^.rc.bottom));
5453                 ChevronPopupMenu.Popup(p.x, p.y);
5454         end;
5455 end;
5456
5457 procedure TGikoForm.MenuBarChevronMenu;
5458         procedure SetSubMenu(MenuItem: TMenuItem; PopupItem: TMenuItem);
5459         var
5460                 i: Integer;
5461                 Item: TMenuItem;
5462         begin
5463                 MenuItem.Click;
5464                 for i := 0 to MenuItem.Count - 1 do begin
5465 //                      Item := nil;
5466                         if MenuItem[i] is TFavoriteMenuItem then begin
5467                                 Item := TFavoriteMenuItem.Create(Self);
5468                                 TFavoriteMenuItem(Item).Data := TFavoriteMenuItem(MenuItem[i]).Data;
5469                         end else
5470                                 Item := TMenuItem.Create(Self);
5471                         Item.Caption := MenuItem[i].Caption;
5472                         Item.Action := MenuItem[i].Action;
5473                         Item.ImageIndex := MenuItem[i].ImageIndex;
5474                         Item.OnClick := MenuItem[i].OnClick;
5475                         PopupItem.Add(Item);
5476                         if MenuItem[i].Count > 0 then
5477                                 SetSubMenu(MenuItem[i], Item);
5478                 end;
5479         end;
5480 var
5481         i: Integer;
5482         w: Integer;
5483         bw: Integer;
5484         Item: TMenuItem;
5485 begin
5486         ChevronPopupMenu.Items.Clear;
5487         ChevronPopupMenu.Images := MainMenu.Images;
5488         bw := GetWidthAllToolButton(MenuToolBar);
5489         if MenuToolBar.Width < bw then begin
5490                 w := 0;
5491                 for i := 0 to MenuToolBar.ButtonCount - 1 do begin
5492                         w := w + MenuToolBar.Buttons[i].Width;
5493                         if MenuToolBar.Width <= w then begin
5494                                 Item := TMenuItem.Create(Self);
5495                                 Item.Caption := MenuToolBar.Buttons[i].MenuItem.Caption;
5496                                 //Item.Action := MenuToolBar.Buttons[i].MenuItem.Action;
5497                                 ChevronPopupMenu.Items.Add(Item);
5498                                 SetSubMenu(MenuToolbar.Buttons[i].MenuItem, Item);
5499                         end;
5500                 end;
5501         end;
5502 end;
5503
5504 procedure TGikoForm.ToolBarChevronMenu(ToolBar: TToolBar);
5505         procedure SetSubMenu(PopupMenu: TPopupMenu; PopupItem: TMenuItem);
5506         var
5507                 i: Integer;
5508                 Item: TMenuItem;
5509         begin
5510                 if Assigned(PopupMenu.OnPopup) then
5511                         PopupMenu.OnPopup(nil);
5512                 for i := 0 to PopupMenu.Items.Count - 1 do begin
5513 //                      Item := nil;
5514                         if PopupMenu.Items[i] is TFavoriteMenuItem then begin
5515                                 Item := TFavoriteMenuItem.Create(Self);
5516                                 TFavoriteMenuItem(Item).Data := TFavoriteMenuItem(PopupMenu.Items[i]).Data;
5517                         end else
5518                         Item := TMenuItem.Create(Self);
5519                         Item.Caption := PopupMenu.Items[i].Caption;
5520                         Item.Action := PopupMenu.Items[i].Action;
5521                         Item.ImageIndex := PopupMenu.Items[i].ImageIndex;
5522                         Item.OnClick := PopupMenu.Items[i].OnClick;
5523                         PopupItem.Add(Item);
5524                 end;
5525         end;
5526 var
5527         i: Integer;
5528         w: Integer;
5529         bw: Integer;
5530         Item: TMenuItem;
5531 begin
5532         ChevronPopupMenu.Items.Clear;
5533         ChevronPopupMenu.Images := ToolBar.HotImages;
5534         bw := GetWidthAllToolButton(ToolBar);
5535         if ToolBar.Width < bw then begin
5536                 w := 0;
5537                 for i := 0 to ToolBar.ButtonCount - 1 do begin
5538                         if ToolBar.Buttons[i].Visible then
5539                                 w := w + ToolBar.Buttons[i].Width;
5540                         if ToolBar.Width <= w then begin
5541                                 if ToolBar.Buttons[i].Tag = 0 then begin
5542                                         Item := TMenuItem.Create(Self);
5543                                         if ToolBar.Buttons[i].Style = tbsSeparator then
5544                                                 Item.Caption := '-'
5545                                         else begin
5546                                                 //\83X\83\8c\8di\8d\9e\82ÝComBox\82ÌTPanel\82ð\94r\8f\9c\82·\82é
5547                                                 if TObject(ToolBar.Buttons[i]) is TPanel then begin
5548                                                         Continue;
5549                                                 end else begin
5550                                                         Item.Caption := ToolBar.Buttons[i].Caption;
5551                                                         Item.Action := ToolBar.Buttons[i].Action;
5552                                                 end;
5553                                                 //Item.Visible := True;
5554                                         end;
5555                                         ChevronPopupMenu.Items.Add(Item);
5556                                         if ToolBar.Buttons[i].DropdownMenu <> nil then begin
5557                                                 Item.Action := nil;
5558                                                 Item.OnClick := nil;
5559                                                 SetSubMenu(ToolBar.Buttons[i].DropdownMenu, Item);
5560                                         end;
5561                                 end;
5562                         end;
5563                 end;
5564         end;
5565 end;
5566
5567 procedure TGikoForm.LinkBarChevronMenu;
5568 var
5569         i: Integer;
5570         j: Integer;
5571         w: Integer;
5572         Item: TFavoriteMenuItem;
5573         bw: Integer;
5574         Button: TLinkToolButton;
5575 begin
5576         ChevronPopupMenu.Items.Clear;
5577         ChevronPopupMenu.Images := LinkToolBar.Images;
5578         bw := GetWidthAllToolButton(LinkToolBar);
5579         if LinkToolBar.Width < bw then begin
5580                 w := 0;
5581                 for i := 0 to FavoriteTreeView.Items.Count - 1 do begin
5582                         if FavoriteTreeView.Items[i].Text = Favorite.FAVORITE_LINK_NAME then begin
5583                                 for j := 0 to FavoriteTreeView.Items[i].Count - 1 do begin
5584                                         w := w + LinkToolBar.Buttons[j].Width;
5585                                         if LinkToolBar.Width <= w then begin
5586                                                 if LinkToolBar.Buttons[j] is TLinkToolButton then begin
5587                                                         Button := TLinkToolButton(LinkToolBar.Buttons[j]);
5588                                                         Item := TFavoriteMenuItem.Create(Self);
5589                                                         if TObject(Button.Data) is TFavoriteFolder then begin
5590                                                                 CreateFavMenu(FavoriteTreeView.Items[i].Item[j], Item);
5591                                                         end else if TObject(Button.Data) is TFavoriteBoardItem then begin
5592                                                                 Item.OnClick := FavoriteClick;
5593                                                         end else if TObject(Button.Data) is TFavoriteThreadItem then begin
5594                                                                 Item.OnClick := FavoriteClick;
5595                                                         end;
5596                                                         Item.Data := Button.Data;
5597                                                         Item.Caption := LinkToolBar.Buttons[j].Caption;
5598                                                         Item.ImageIndex := LinkToolBar.Buttons[j].ImageIndex;
5599                                                         ChevronPopupMenu.Items.Add(Item);
5600                                                 end;
5601                                         end;
5602                                 end;
5603                                 break;
5604                         end;
5605                 end;
5606         end;
5607 end;
5608
5609 {!
5610 \brief  \83o\83\93\83h\95\9d\82ð\8dÄ\8cv\8eZ\81E\8dÄ\90Ý\92è\82·\82é
5611 \param  bar             \83o\83\93\83h\82ª\8f\8a\91®\82·\82é CoolBar
5612 \param  band    \8dÄ\8cv\8eZ\81E\8dÄ\90Ý\92è\82·\82é\83o\83\93\83h
5613
5614 \93Æ\8e©\82É\83o\83\93\83h\82É\94z\92u\82³\82ê\82Ä\82¢\82é\83R\83\93\83g\83\8d\81[\83\8b\82Ì\83T\83C\83Y\82ð\95Ï\8dX\82µ\82½\8fê\8d\87\82É
5615 \83V\83F\83u\83\8d\83\93\82Ì\95\\8e¦\88Ê\92u\82ð\8dÄ\90Ý\92è\82·\82é\82½\82ß\82É\8eg\97p\82µ\82Ü\82·\81B
5616 }
5617 procedure TGikoForm.ResetBandInfo( bar : TGikoCoolBar; band : TToolBar );
5618 var
5619         bandInfo        : tagREBARBANDINFOA;
5620         pBandInfo       : PReBarBandInfoA;
5621         lResult         : Integer;
5622         h                                       : HWND;
5623         i, idx          : Integer;
5624 begin
5625
5626         h                                                                               := band.Handle;
5627         pBandInfo := @bandInfo;
5628         ZeroMemory( pBandInfo, sizeof( bandInfo ) );
5629         bandInfo.cbSize                 := sizeof( bandInfo );
5630         bandInfo.hwndChild      := h;
5631         bandInfo.cyMinChild     := bar.Height;
5632         bar.OnBandInfo( nil, pBandInfo );
5633         // band \82Ì\83C\83\93\83f\83b\83N\83X\82ð\92T\82·
5634         idx := 0;
5635         for i := bar.Bands.Count - 1 downto 0 do begin
5636                 if bar.Bands[ i ].Control.Handle = h then begin
5637                         idx := i;
5638                         Break;
5639                 end;
5640         end;
5641         // \90Ý\92è
5642         lResult := SendMessage( bar.Handle, RB_SETBANDINFO, idx, Integer( pBandInfo ) );
5643
5644 end;
5645
5646 procedure TGikoForm.ListCoolBarBandInfo(Sender: TObject; var BandInfo: PReBarBandInfoA);
5647 var
5648         Control: TWinControl;
5649         i, idx  : Integer;
5650 begin
5651         Control := FindControl(BandInfo^.hwndChild);
5652         if Control = nil then
5653                 Exit;
5654         idx := 0;
5655         for i := ListCoolBar.Bands.Count - 1 downto 0 do begin
5656                 if ListCoolBar.Bands[ i ].Control.Handle = Control.Handle then begin
5657                         idx := ListCoolBar.Bands[ i ].ID;
5658                         Break;
5659                 end;
5660         end;
5661         if Control = ListToolBar then begin
5662                 BandInfo^.fMask                         := BandInfo.fMask or RBBIM_CHILDSIZE or RBBIM_STYLE or RBBIM_IDEALSIZE;
5663                 BandInfo^.fStyle                        := BandInfo.fStyle or RBBS_USECHEVRON;
5664                 BandInfo^.cxMinChild    := 0;
5665                 BandInfo^.cx                                    := GikoSys.Setting.ListCoolSet[ idx ].FCoolWidth;
5666                 BandInfo^.cxIdeal                       := GetWidthAllToolButton(TToolBar(Control));
5667         end else begin
5668                 BandInfo^.fMask                         := BandInfo.fMask or RBBIM_CHILDSIZE;
5669                 BandInfo^.cxMinChild    := 0;
5670                 BandInfo^.cx                                    := GikoSys.Setting.ListCoolSet[ idx ].FCoolWidth;
5671         end;
5672 end;
5673
5674 procedure TGikoForm.ListCoolBarChevronClick(Sender: TObject; RebarChevron: PNMRebarChevron);
5675 var
5676         Idx: Integer;
5677         p: TPoint;
5678 begin
5679         ChevronPopupMenu.Items.Clear;
5680         Idx := RebarChevron^.uBand;
5681         if (Idx >= 0) and (ListCoolBar.Bands.Count > Idx) then begin
5682                 if ListCoolBar.Bands[Idx].Control = ListToolBar then begin
5683                         ToolBarChevronMenu(ListToolBar);
5684                 end else
5685                         Exit;
5686                 p := ListCoolBar.ClientToScreen(Point(RebarChevron^.rc.left, RebarChevron^.rc.bottom));
5687                 ChevronPopupMenu.Popup(p.x, p.y);
5688         end;
5689 end;
5690
5691 procedure TGikoForm.BrowserCoolBarBandInfo(Sender: TObject; var BandInfo: PReBarBandInfoA);
5692 var
5693         Control: TWinControl;
5694         i, idx  : Integer;
5695 begin
5696         Control := FindControl(BandInfo^.hwndChild);
5697         if Control = nil then
5698                 Exit;
5699         idx := 0;
5700         for i := BrowserCoolBar.Bands.Count - 1 downto 0 do begin
5701                 if BrowserCoolBar.Bands[ i ].Control.Handle = Control.Handle then begin
5702                         idx := BrowserCoolBar.Bands[ i ].ID;
5703                         Break;
5704                 end;
5705         end;
5706         if Control = BrowserToolBar then begin
5707                 BandInfo^.fMask                         := BandInfo.fMask or RBBIM_CHILDSIZE or RBBIM_STYLE or RBBIM_IDEALSIZE;
5708                 BandInfo^.fStyle                        := BandInfo.fStyle or RBBS_USECHEVRON;
5709                 BandInfo^.cxMinChild    := 0;
5710                 BandInfo^.cx                                    := GikoSys.Setting.BrowserCoolSet[ idx ].FCoolWidth;
5711                 BandInfo^.cxIdeal                       := GetWidthAllToolButton(TToolBar(Control));
5712         end else begin
5713                 BandInfo^.fMask                         := BandInfo.fMask or RBBIM_CHILDSIZE;
5714                 BandInfo^.cxMinChild    := 0;
5715                 BandInfo^.cx                                    := GikoSys.Setting.BrowserCoolSet[ idx ].FCoolWidth;
5716         end;
5717 end;
5718
5719 procedure TGikoForm.BrowserCoolBarChevronClick(Sender: TObject; RebarChevron: PNMRebarChevron);
5720 var
5721         Idx: Integer;
5722         p: TPoint;
5723 begin
5724         ChevronPopupMenu.Items.Clear;
5725         Idx := RebarChevron^.uBand;
5726         if (Idx >= 0) and (BrowserCoolBar.Bands.Count > Idx) then begin
5727                 if BrowserCoolBar.Bands[Idx].Control = BrowserToolBar then
5728                         ToolBarChevronMenu(BrowserToolBar)
5729                 else
5730                         Exit;
5731                 p := BrowserCoolBar.ClientToScreen(Point(RebarChevron^.rc.left, RebarChevron^.rc.bottom));
5732                 ChevronPopupMenu.Popup(p.x, p.y);
5733         end;
5734 end;
5735
5736 procedure TGikoForm.ListViewColumnInfo(Sender: TObject; var Column: PLVColumnA);
5737 begin
5738         if Column^.iImage = -1 then begin
5739                 Column^.mask := Column^.mask or LVCF_FMT;
5740         end else begin
5741                 Column^.mask := Column^.mask or LVCF_FMT or LVCF_IMAGE;
5742                 Column^.fmt := Column^.fmt or LVCFMT_IMAGE or LVCFMT_BITMAP_ON_RIGHT;
5743         end;
5744 end;
5745
5746 function TGikoForm.FindToolBarButton( bar : TToolBar; action : TAction ) : TToolButton;
5747 var
5748         i : Integer;
5749 begin
5750         Result := nil;
5751         for i := bar.ButtonCount - 1 downto 0 do begin
5752                 if bar.Buttons[ i ].Action = action then begin
5753                         Result := bar.Buttons[ i ];
5754                         Break;
5755                 end;
5756         end;
5757 end;
5758
5759 procedure TGikoForm.SetToolBarPopup;
5760 var
5761         i                                                                       : Integer;
5762         aIEButton                                       : TToolButton;
5763         aCabinetBBSButton       : TToolButton;
5764         aResRangeButton         : TToolButton;
5765         aThreadRangeButton:     TToolButton;
5766 begin
5767         for i := 0 to StdToolBar.ButtonCount - 1 do begin
5768         end;
5769         for i := 0 to ListToolBar.ButtonCount - 1 do begin
5770                 if ListToolBar.Buttons[i].Action = GikoDM.IconStyle then
5771                         ListToolBar.Buttons[i].DropdownMenu := ListIconPopupMenu;
5772                 if ListToolBar.Buttons[i].Action = GikoDM.SelectReservAction then
5773                         ListToolBar.Buttons[i].DropdownMenu := RoundNamePopupMenu;
5774         end;
5775         aIEButton                                       := FindToolBarButton( BrowserToolBar, GikoDM.IEAction );
5776         if aIEButton <> nil then
5777                 aIEButton.DropdownMenu                                  := BrowserPopupMenu;
5778         aCabinetBBSButton       := FindToolBarButton( StdToolBar, GikoDM.CabinetBBSAction );
5779         if aCabinetBBSButton <> nil then
5780                 aCabinetBBSButton.DropdownMenu  := BBSSelectPopupMenu;
5781         aResRangeButton         := FindToolBarButton( BrowserToolBar, GikoDM.ResRangeAction );
5782         if aResRangeButton <> nil then
5783                 aResRangeButton.DropdownMenu            := ResRangePopupMenu;
5784         aThreadRangeButton:= FindToolBarButton( ListToolBar, GikoDM.ThreadRangeAction );
5785         if aThreadRangeButton <> nil then
5786                 aThreadRangeButton.DropdownMenu := ThreadRangePopupMenu;
5787 end;
5788
5789 procedure TGikoForm.FormMouseWheel(Sender: TObject; Shift: TShiftState;
5790         WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
5791 var
5792         Wnd: THandle;
5793         delta: Integer;
5794 //      browserPos : TPoint;
5795 const
5796         ICON_SIZE = 16;
5797 begin
5798         Wnd := WindowFromPoint(Mouse.CursorPos);
5799         Handled := True;
5800         if WheelDelta > 0 then
5801                 Delta := -1
5802         else
5803                 Delta := 1;
5804
5805         if (Wnd = BrowserTab.Handle) or
5806                  (Wnd = BrowserTab.Parent.Handle) then begin
5807                 BrowserTab.ScrollTabs(Delta);
5808         end else begin
5809                 if FIsHandledWheel then begin
5810                         FIsHandledWheel := False;
5811                         Handled := False;
5812                 end else begin
5813                         FIsHandledWheel := True;
5814                         if (Wnd = TreeView.Handle) or  (Wnd = FavoriteTreeView.Handle)
5815                         or (Wnd = ListView.Handle) or (Wnd = MessageListView.Handle)
5816                         then
5817                                 SendMessage( Wnd, WM_MOUSEWHEEL, WheelDelta shl 16, (Mouse.CursorPos.X shl 16) or Mouse.CursorPos.Y )
5818                         else
5819                                 Handled := False;
5820
5821                 end;
5822         end;
5823 end;
5824
5825 procedure TGikoForm.SetSelectWord( const text : string );
5826 begin
5827         // \83X\83\8c\88ê\97\97\82Ì\94Í\88Í\8ew\92è\82ð\89ð\8f\9c
5828         ClearThreadRengeAction;
5829
5830         if Length( text ) = 0 then
5831         begin
5832                 GikoDM.AllItemAction.Checked := True;
5833                 SetListViewType( gvtAll )
5834         end else begin
5835                 SetListViewType( gvtUser, text, false );
5836         end;
5837 end;
5838
5839 procedure TGikoForm.SelectComboBoxChange(Sender: TObject);
5840 begin
5841
5842         SetSelectWord( SelectComboBox.Text );
5843
5844 end;
5845
5846 procedure TGikoForm.SelectComboBoxKeyDown(Sender: TObject; var Key: Word;
5847         Shift: TShiftState);
5848 var
5849   IMC: HIMC;
5850   Len: integer;
5851   Str: string;
5852   tmp: string;
5853 begin
5854
5855         if Key = VK_Return then
5856         begin
5857                 ModifySelectList;
5858         end else if Key = 229 then begin
5859                 if GikoSys.Setting.UseUndecided then begin
5860                         IMC := ImmGetContext(SelectComboBox.Handle); //\83R\83\93\83e\83L\83X\83g\8eæ\93¾
5861                         Len := ImmGetCompositionString(IMC, GCS_COMPSTR, nil, 0); //\82Ü\82¸\92·\82³\82ð\8eæ\93¾
5862                         SetLength(Str, Len + 1); //Buffer\82Ì\83\81\83\82\83\8a\82ð\90Ý\92è
5863                         ImmGetCompositionString(IMC, GCS_COMPSTR, PChar(Str), Len + 1); //\82Ü\82¸\92·\82³\82ð\8eæ\93¾
5864                         ImmReleaseContext(SelectComboBox.Handle, IMC);  //\83R\83\93\83e\83L\83X\83g\89ð\95ú
5865                         SetLength(Str, Len);
5866                         if SelectComboBox.SelLength > 0 then begin //\91I\91ð\92\86\82Ì\95\8e\9a\97ñ\82ª\82 \82é\82©
5867                                 tmp := Copy(SelectComboBox.Text, 1, SelectComboBox.SelStart);
5868                                 Str := tmp + Str + Copy(SelectComboBox.Text, SelectComboBox.SelStart + SelectComboBox.SelLength + 1, Length(SelectComboBox.Text));
5869                         end else
5870                                 Str := SelectComboBox.Text + Str;
5871
5872                         if (Length(Str) > 0) then begin
5873                                 SetSelectWord(Str);
5874                         end;
5875                 end;
5876         end else if Length( SelectComboBox.Text ) = 0 then
5877         begin
5878                 {* SelectComboBox.Text\82ª\8bó\82Å\82à\81A\93ü\97Í\93r\92\86\82ÅEsc\82µ\82½\82Æ\82©
5879                  * \8bó\82Ì\82Æ\82«\82ÉDel\83L\81[\82ð\89\9f\82µ\82½\82Æ\82©\82È\82Ì\82Å\81A\83X\83\8c\82Ì\8di\8d\9e\82Ý\82ð\88Û\8e\9d\82·\82é\81B
5880                  * \81i\82±\82±\82Å\82Í\89½\82à\82µ\82È\82¢\81j
5881                  *}
5882         end else begin
5883         // \83X\83\8c\88ê\97\97\82Ì\94Í\88Í\8ew\92è\82ð\89ð\8f\9c
5884                 ClearThreadRengeAction;
5885         end;
5886
5887 end;
5888 //! \83X\83\8c\83b\83h\88ê\97\97\82Ì\95\\8e¦\94Í\88Í\90Ý\92è\83`\83F\83b\83N\83N\83\8a\83A
5889 procedure TGikoForm.ClearThreadRengeAction;
5890 begin
5891         // \83`\83\89\82Â\82­\82Æ\8c\99\82¾\82©\82ç\81A\88ê\89\9e\89\9f\82µ\82Ä\82 \82é\82Æ\82«\82¾\82¯\8f\88\97\9d\82·\82é
5892         if GikoDM.AllItemAction.Checked then
5893                 GikoDM.AllItemAction.Checked := False;
5894         if GikoDM.LogItemAction.Checked then
5895                 GikoDM.LogItemAction.Checked := False;
5896         if GikoDM.NewItemAction.Checked then
5897                 GikoDM.NewItemaction.Checked := False;
5898         if GikoDM.LiveItemAction.Checked then
5899                 GikoDM.LiveItemAction.Checked := False;
5900         if GikoDM.ArchiveItemAction.Checked then
5901                 GikoDM.ArchiveItemAction.Checked := False;
5902
5903 end;
5904
5905 procedure TGikoForm.SelectComboBoxExit(Sender: TObject);
5906 begin
5907
5908         ModifySelectList;
5909
5910         if Length( SelectComboBox.Text ) = 0 then
5911         begin
5912                 SelectComboBox.Text := GikoDataModule.SELECTCOMBOBOX_NAME;
5913                 SelectComboBox.Color := GikoDataModule.SELECTCOMBOBOX_COLOR;
5914         end;
5915
5916 end;
5917
5918 // \8di\82è\8d\9e\82Ý\8c\9f\8dõ\82Ì\97\9a\97ð\8dX\90V
5919 procedure TGikoForm.ModifySelectList;
5920 var
5921         idx : Integer;
5922         oldText : string;
5923 begin
5924
5925         try
5926                 if not SelectComboBoxPanel.Visible then
5927                         exit;
5928
5929                 if Length( SelectComboBox.Text ) > 0 then
5930                 begin
5931                         oldText := SelectComboBox.Text;
5932                         idx := GikoSys.Setting.SelectTextList.IndexOf( oldText );
5933                         if idx <> -1 then
5934                                 GikoSys.Setting.SelectTextList.Delete( idx );
5935                         idx := SelectComboBox.Items.IndexOf( oldText );
5936                         if idx <> -1 then
5937                                 SelectComboBox.Items.Delete( idx );
5938                         GikoSys.Setting.SelectTextList.Insert( 0, oldText );
5939                         SelectComboBox.Items.Insert( 0, oldText );
5940                         SelectComboBox.Text := oldText;
5941                 end;
5942         except
5943         end;
5944
5945 end;
5946
5947
5948 procedure TGikoForm.SelectComboBoxSplitterMouseMove(Sender: TObject;
5949         Shift: TShiftState; X, Y: Integer);
5950 var
5951         pos                             : TPoint;
5952         w                                       : Integer;
5953 begin
5954         If (SelectComboBoxPanel.Visible) and (IsDraggingSelectComboBox) Then begin
5955                 pos.X := X;
5956                 pos.Y := Y;
5957                 pos := SelectComboBoxSplitter.ClientToScreen( pos );
5958                 //w := SelectComboBox.Width + (pos.X - DraggingSelectComboBoxPosition.X);
5959                 w := SelectComboBoxPanel.Width + (pos.X - DraggingSelectComboBoxPosition.X);
5960
5961                 If w <= 50 Then Begin
5962                         // \8e\9f\82Ì\88Ú\93®\82Ì\8aî\8f\80\82ª\81u\89ß\82¬\82Ä\82µ\82Ü\82Á\82½\88Ê\92u\81v\82Å\82Í\82È\82­
5963                         // \81u\8e~\82Ü\82Á\82½(50pixel)\88Ê\92u\81v\82É\82È\82é\82æ\82¤\82É
5964                         pos.X := pos.X + (50 - w);
5965
5966                         // \8f¬\82³\82­\82È\82è\82·\82¬\82È\82¢\82æ\82¤\82É
5967                         w := 50;
5968                 End;
5969
5970                 // \83`\83\89\82Â\82«\8cy\8c¸\82Ì\88×
5971                 //If SelectComboBox.Width <> w Then Begin
5972                 If SelectComboBoxPanel.Width <> w Then Begin
5973                         SelectComboBoxPanel.Width := w;
5974                         SelectComboBox.Width := SelectComboBoxPanel.Width - SelectComboBoxSplitter.Width;
5975                         GikoSys.Setting.SelectComboBoxWidth := w;
5976                         DraggingSelectComboBoxPosition := pos;
5977
5978                         // \83V\83F\83u\83\8d\83\93\88Ê\92u\82ª\95Ï\82í\82é\82Ì\82Å BandInfo \82Ì\8dÄ\90Ý\92è
5979                         ResetBandInfo( ListCoolBar, ListToolBar );
5980                 End;
5981         End;
5982
5983 end;
5984
5985 procedure TGikoForm.SelectComboBoxSplitterMouseDown(Sender: TObject;
5986         Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
5987 var
5988         pos : TPoint;
5989 begin
5990         IsDraggingSelectComboBox := True;
5991         pos.X := X;
5992         pos.Y := Y;
5993         DraggingSelectComboBoxPosition := SelectComboBoxSplitter.ClientToScreen( pos );
5994
5995 end;
5996
5997 procedure TGikoForm.SelectComboBoxSplitterMouseUp(Sender: TObject;
5998         Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
5999 begin
6000         IsDraggingSelectComboBox := False;
6001
6002 end;
6003
6004 procedure TGikoForm.StatusBarResize(Sender: TObject);
6005 begin
6006         StatusBar.Panels[1].Width := StatusBar.Width -
6007                                         StatusBar.Panels[0].Width -
6008                                         StatusBar.Panels[THREADSIZE_PANEL].Width -
6009                                         StatusBar.Panels[NGWORDNAME_PANEL].Width;
6010 end;
6011 procedure TGikoForm.SelectComboBoxEnter(Sender: TObject);
6012 begin
6013
6014         if (Length( SelectComboBox.Text ) = 0) or
6015                 (SelectComboBox.Text = GikoDataModule.SELECTCOMBOBOX_NAME) then
6016         begin
6017                 SelectComboBox.Text := '';
6018                 SelectComboBox.Color := clWindow;
6019         end;
6020
6021 end;
6022
6023 procedure TGikoForm.FavoriteMoveTo( SenderNode, SourceNode: TTreeNode );
6024 begin
6025
6026         if (SenderNode = nil) or (SourceNode = nil) or (SenderNode = SourceNode) then
6027                 Exit;
6028
6029         if TObject(SenderNode.Data) is TFavoriteFolder then
6030                 SourceNode.MoveTo(SenderNode, naAddChild)
6031         else
6032                 SourceNode.MoveTo(SenderNode, naInsert);
6033
6034 end;
6035
6036 procedure TGikoForm.FavoriteAddTo( SenderNode: TTreeNode; Source: TObject );
6037 var
6038         Node: TTreeNode;
6039         FavNode: TTreeNode;
6040         FavoBoardItem: TFavoriteBoardItem;
6041         FavoThreadItem: TFavoriteThreadItem;
6042         Board: TBoard;
6043         ThreadItem: TThreadItem;
6044 begin
6045
6046         if (SenderNode = nil) or (Source = nil) then
6047                 Exit;
6048
6049         if not (TObject(SenderNode.Data) is TFavoriteFolder) then
6050                 FavNode := SenderNode.Parent
6051         else
6052                 FavNode := SenderNode;
6053
6054         Node := nil;
6055
6056         if Source is TBoard then begin
6057                 Board := TBoard( Source );
6058                 FavoBoardItem                           := TFavoriteBoardItem.CreateWithItem( Board );
6059                 Node := FavoriteDM.TreeView.Items.AddChildObject(FavNode, Board.Title, FavoBoardItem);
6060                 Node.ImageIndex := 15;
6061                 Node.SelectedIndex := 15;
6062         end else if Source is TFavoriteBoardItem then begin
6063                 FavoBoardItem := TFavoriteBoardItem( Source );
6064                 Board := FavoBoardItem.Item;
6065                 if Board <> nil then
6066                         if not Board.IsThreadDatRead then
6067                                 GikoSys.ReadSubjectFile(Board);
6068                 Node := FavoriteDM.TreeView.Items.AddChildObject(FavNode, Board.Title, Source);
6069                 Node.ImageIndex := 15;
6070                 Node.SelectedIndex := 15;
6071         end else if Source is TThreadItem then begin
6072                 ThreadItem := TThreadItem( Source );
6073                 FavoThreadItem                          := TFavoriteThreadItem.CreateWithItem( ThreadItem );
6074                 Node := FavoriteDM.TreeView.Items.AddChildObject(FavNode, ThreadItem.Title, FavoThreadItem);
6075                 Node.ImageIndex := 16;
6076                 Node.SelectedIndex := 16;
6077         end else if Source is TBrowserRecord then begin
6078                 ThreadItem := TBrowserRecord( Source ).Thread;
6079                 FavoThreadItem                          := TFavoriteThreadItem.CreateWithItem( ThreadItem );
6080                 Node := FavoriteDM.TreeView.Items.AddChildObject(FavNode, ThreadItem.Title, FavoThreadItem);
6081                 Node.ImageIndex := 16;
6082                 Node.SelectedIndex := 16;
6083         end else if Source is TFavoriteThreadItem then begin
6084                 FavoThreadItem := TFavoriteThreadItem( Source );
6085                 ThreadItem := FavoThreadItem.Item;
6086                 Node := FavoriteDM.TreeView.Items.AddChildObject(FavNode, ThreadItem.Title, Source);
6087                 Node.ImageIndex := 16;
6088                 Node.SelectedIndex := 16;
6089         end;
6090
6091         if not (TObject(SenderNode.Data) is TFavoriteFolder) then
6092                 if Node <> nil then
6093                         FavoriteMoveTo( SenderNode, Node );
6094
6095 end;
6096
6097 procedure TGikoForm.FavoriteDragDrop( SenderNode: TTreeNode; Source: TObject );
6098 var
6099         idx: Integer;
6100         SourceNode: TTreeNode;
6101         LinkToolButton: TLinkToolButton;
6102 begin
6103
6104         if SenderNode = nil then
6105                 Exit;
6106
6107         if not (TObject( SenderNode.Data ) is TFavoriteFolder) then
6108                 if FDropSpaceNode <> nil then
6109                         SenderNode := FDropSpaceNode;
6110
6111         if Source = FavoriteTreeView then begin
6112                 SourceNode := FavoriteTreeView.Selected;
6113                 FavoriteMoveTo( SenderNode, SourceNode );
6114         end else if Source is TLinkToolButton then begin
6115                 LinkToolButton := TLinkToolButton( Source );
6116                 SourceNode := TreeNodeDataFind( FavoriteTreeView.Items.GetFirstNode, LinkToolButton.Data );
6117                 FavoriteMoveTo( SenderNode, SourceNode );
6118         end else if Source = BrowserTab then begin
6119                 idx := BrowserTab.TabIndex;
6120                 FavoriteAddTo( SenderNode, BrowserTab.Tabs.Objects[idx] );
6121         end else if Source = ListView then begin
6122                 FavoriteAddTo( SenderNode, ListView.Selected.Data );
6123         end else if Source = TreeView then begin
6124                 FavoriteAddTo( SenderNode, TreeView.Selected.Data );
6125         end;
6126 end;
6127
6128 procedure TGikoForm.FavoriteTreeViewDragDrop(Sender, Source: TObject; X,
6129         Y: Integer);
6130 var
6131         SenderNode: TTreeNode;
6132 begin
6133
6134         SenderNode := FavoriteTreeView.GetNodeAt(X, Y);
6135         if SenderNode <> nil then begin
6136                 FavoriteDragDrop( SenderNode, Source );
6137         end;
6138
6139         //\8bó\94\92\8d\80\96Ú\82ª\82¢\82½\82ç\8dí\8f\9c\82·\82é
6140         if FDropSpaceNode <> nil then begin
6141                 try
6142                         FDropSpaceNode.Delete;
6143                 finally
6144                         FDropSpaceNode := nil;
6145                 end;
6146         end;
6147         //\8dX\90V\82µ\82½\82±\82Æ\82ð\8b³\82¦\82é
6148         FavoriteDM.Modified := true;
6149
6150         SetLinkBar;
6151
6152 end;
6153
6154 procedure TGikoForm.FavoriteTreeViewEdited(Sender: TObject;
6155         Node: TTreeNode; var S: String);
6156 begin
6157         //\8dX\90V\82µ\82½\82±\82Æ\82ð\8b³\82¦\82é
6158         FavoriteDM.Modified := true;
6159
6160         FavoriteTreeView.ReadOnly := True;
6161         SetLinkBar;
6162
6163 end;
6164
6165 procedure TGikoForm.FavoriteTreeViewKeyDown(Sender: TObject; var Key: Word;
6166         Shift: TShiftState);
6167 begin
6168         if not TTreeView(Sender).IsEditing then begin
6169                 Case Key of
6170                 VK_F2:
6171                         begin
6172                                 FClickNode := FavoriteTreeView.Selected;
6173                                 GikoDM.FavoriteTreeViewRenameActionExecute( Sender );
6174                         end;
6175                 VK_DELETE:
6176                         begin
6177                                 FClickNode := FavoriteTreeView.Selected;
6178                                 GikoDM.FavoriteTreeViewDeleteActionExecute( Sender );
6179                         end;
6180                 VK_RETURN:
6181                         begin
6182                         FavoriteClick( FavoriteTreeView.Selected );
6183                         FavoriteTreeView.Selected.Expanded := not FavoriteTreeView.Selected.Expanded;
6184                         end;
6185                 VK_SPACE:
6186                         begin
6187                         FClickNode := FavoriteTreeView.Selected;
6188                         GikoDM.FavoriteTreeViewReloadActionExecute( Sender );
6189                         end;
6190                 end;
6191         end else begin
6192                 //\95Ò\8fW\92\86\82ÉESC\82ð\89\9f\82µ\82½\82ç\81A\95Ò\8fW\82ð\8fI\97¹\82µ\82Ä\81A\8c³\82Ì\95\8e\9a\97ñ\82É\96ß\82·
6193                 if Key = VK_ESCAPE then begin
6194                         if (TTreeView(Sender).Selected <> nil) then begin
6195                                 TTreeView(Sender).Selected.Text := FOrigenCaption;
6196                         end;
6197                         TTreeView(Sender).Selected.Focused := False;
6198                 end;
6199         end;
6200
6201 end;
6202
6203 procedure TGikoForm.FavoriteTreePopupMenuPopup(Sender: TObject);
6204 var
6205         i: Integer;
6206         LinkToolButton: TLinkToolButton;
6207 begin
6208
6209         if FavoriteTreePopupMenu.PopupComponent = FavoriteTreeView then begin
6210         
6211                 FClickNode := FavoriteTreeView.Selected;
6212
6213         end else if FavoriteTreePopupMenu.PopupComponent is TLinkToolButton then begin
6214
6215                 LinkToolButton := TLinkToolButton( FavoriteTreePopupMenu.PopupComponent );
6216                 for i := 0 to FavoriteTreeView.Items.Count - 1 do begin
6217                         if FavoriteTreeView.Items[i].Text = Favorite.FAVORITE_LINK_NAME then begin
6218                                 FClickNode := FavoriteTreeView.Items[i];
6219                                 Break;
6220                         end;
6221                 end;
6222                 for i := 0 to FClickNode.Count - 1 do begin
6223                         if FClickNode.Item[i].Data = LinkToolButton.Data then begin
6224                                 FClickNode := FClickNode.Item[i];
6225                                 Break;
6226                         end;
6227                 end;
6228
6229         end;
6230
6231         if FClickNode = nil then begin
6232                 FavoriteTreeBrowseFolderPopupMenu.Visible := False;
6233                 FavoriteTreeDeletePopupMenu.Visible := False;
6234                 FavoriteTreeRenamePopupMenu.Visible := False;
6235                 FavoriteTreeNewFolderPopupMenu.Visible := False;
6236                 FavoriteTreeURLCopyPopupMenu.Visible := False;
6237                 FavoriteTreeNameCopyPopupMenu.Visible := False;
6238                 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
6239                 FavoriteTreeReloadPopupMenu.Visible := False;
6240                 FavoriteTreeLogDeletePopupMenu.Visible := False;
6241                 FavoriteTreeItemNameCopyPopupMenu.Visible := False;
6242         end else if FClickNode.IsFirstNode then begin
6243                 FavoriteTreeBrowseFolderPopupMenu.Visible := True;
6244                 FavoriteTreeDeletePopupMenu.Visible := False;
6245                 FavoriteTreeRenamePopupMenu.Visible := False;
6246                 FavoriteTreeNewFolderPopupMenu.Visible := True;
6247                 FavoriteTreeURLCopyPopupMenu.Visible := False;
6248                 FavoriteTreeNameCopyPopupMenu.Visible := False;
6249                 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
6250                 FavoriteTreeReloadPopupMenu.Visible := False;
6251                 FavoriteTreeLogDeletePopupMenu.Visible := False;
6252                 FavoriteTreeItemNameCopyPopupMenu.Visible := True;
6253         end else if FClickNode.Text = Favorite.FAVORITE_LINK_NAME then begin
6254                 FavoriteTreeBrowseFolderPopupMenu.Visible := True;
6255                 FavoriteTreeDeletePopupMenu.Visible := True;
6256                 FavoriteTreeRenamePopupMenu.Visible := False;
6257                 FavoriteTreeNewFolderPopupMenu.Visible := True;
6258                 FavoriteTreeURLCopyPopupMenu.Visible := False;
6259                 FavoriteTreeNameCopyPopupMenu.Visible := False;
6260                 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
6261                 FavoriteTreeReloadPopupMenu.Visible := False;
6262                 FavoriteTreeLogDeletePopupMenu.Visible := False;
6263                 FavoriteTreeItemNameCopyPopupMenu.Visible := True;
6264         end else if TObject(FClickNode.Data) is TFavoriteFolder then begin
6265                 FavoriteTreeBrowseFolderPopupMenu.Visible := True;
6266                 FavoriteTreeDeletePopupMenu.Visible := True;
6267                 FavoriteTreeRenamePopupMenu.Visible := True;
6268                 FavoriteTreeNewFolderPopupMenu.Visible := True;
6269                 FavoriteTreeURLCopyPopupMenu.Visible := False;
6270                 FavoriteTreeNameCopyPopupMenu.Visible := True;
6271                 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
6272                 FavoriteTreeReloadPopupMenu.Visible := False;
6273                 FavoriteTreeLogDeletePopupMenu.Visible := False;
6274                 FavoriteTreeItemNameCopyPopupMenu.Visible := True;
6275         end else if TObject(FClickNode.Data) is TFavoriteThreadItem then begin
6276                 FavoriteTreeBrowseFolderPopupMenu.Visible := False;
6277                 FavoriteTreeDeletePopupMenu.Visible := True;
6278                 FavoriteTreeRenamePopupMenu.Visible := True;
6279                 FavoriteTreeNewFolderPopupMenu.Visible := True;
6280                 FavoriteTreeURLCopyPopupMenu.Visible := True;
6281                 FavoriteTreeNameCopyPopupMenu.Visible := True;
6282                 FavoriteTreeNameURLCopyPopupMenu.Visible := True;
6283                 FavoriteTreeReloadPopupMenu.Visible := True;
6284                 FavoriteTreeLogDeletePopupMenu.Visible := True;
6285                 FavoriteTreeItemNameCopyPopupMenu.Visible := True;
6286         end else if TObject(FClickNode.Data) is TFavoriteBoardItem then begin
6287                 FavoriteTreeBrowseFolderPopupMenu.Visible := False;
6288                 FavoriteTreeDeletePopupMenu.Visible := True;
6289                 FavoriteTreeRenamePopupMenu.Visible := True;
6290                 FavoriteTreeNewFolderPopupMenu.Visible := True;
6291                 FavoriteTreeURLCopyPopupMenu.Visible := True;
6292                 FavoriteTreeNameCopyPopupMenu.Visible := True;
6293                 FavoriteTreeNameURLCopyPopupMenu.Visible := True;
6294                 FavoriteTreeReloadPopupMenu.Visible := True;
6295                 FavoriteTreeLogDeletePopupMenu.Visible := False;
6296                 FavoriteTreeItemNameCopyPopupMenu.Visible := True;
6297         end else begin
6298                 FavoriteTreeBrowseFolderPopupMenu.Visible := False;
6299                 FavoriteTreeDeletePopupMenu.Visible := False;
6300                 FavoriteTreeRenamePopupMenu.Visible := False;
6301                 FavoriteTreeNewFolderPopupMenu.Visible := False;
6302                 FavoriteTreeURLCopyPopupMenu.Visible := False;
6303                 FavoriteTreeNameCopyPopupMenu.Visible := False;
6304                 FavoriteTreeNameURLCopyPopupMenu.Visible := False;
6305                 FavoriteTreeReloadPopupMenu.Visible := False;
6306                 FavoriteTreeLogDeletePopupMenu.Visible := False;
6307                 FavoriteTreeItemNameCopyPopupMenu.Visible := False;
6308         end;
6309
6310 end;
6311
6312 procedure TGikoForm.FavoriteBrowseFolder( node: TTreeNode );
6313 var
6314         i: Integer;
6315 begin
6316
6317         if not (TObject(node.Data) is TFavoriteFolder) then
6318                 exit;
6319
6320         for i := 0 to node.Count - 1 do
6321         begin
6322                 if TObject(node.Item[i].Data) is TFavoriteFolder then
6323                         FavoriteBrowseFolder( node.Item[i] )
6324                 else if TObject(node.Item[i].Data) is TFavoriteThreadItem then
6325                         FavoriteClick( node.Item[i], False );
6326         end;
6327
6328 end;
6329 function TGikoForm.TreeNodeDataFind(Node: TTreeNode; FindPointer: Pointer): TTreeNode;
6330 var
6331         Found: TTreeNode;
6332         i: Integer;
6333 begin
6334
6335         for i := 0 to Node.Count - 1 do begin
6336                 if Node.Item[i].Data = FindPointer then begin
6337                         Result := Node.Item[i];
6338                         Exit;
6339                 end else if Node.Item[i].Count > 0 then begin
6340                         Found := TreeNodeDataFind( Node.Item[i], FindPointer );
6341                         if Found <> nil then begin
6342                                 Result := Found;
6343                                 Exit;
6344                         end;
6345                 end;
6346         end;
6347
6348         Result := nil;
6349
6350 end;
6351
6352 procedure TGikoForm.LinkToolBarDragDrop(Sender, Source: TObject; X,
6353         Y: Integer);
6354 var
6355         i: Integer;
6356         SenderNode: TTreeNode;
6357 begin
6358
6359         SenderNode := nil;
6360         for i := 0 to FavoriteTreeView.Items.Count - 1 do begin
6361                 if FavoriteTreeView.Items[i].Text = Favorite.FAVORITE_LINK_NAME then begin
6362                         SenderNode := FavoriteTreeView.Items[i];
6363                         Break;
6364                 end;
6365         end;
6366         SenderNode.Selected := False;
6367         
6368         FavoriteDragDrop( SenderNode, Source );
6369
6370         SetLinkBar;
6371 end;
6372
6373 procedure TGikoForm.BrowserTabMouseUp(Sender: TObject;
6374         Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
6375 begin
6376         if FDragWFirst <> true then begin
6377                 FDragWFirst := false;
6378 {
6379         end else if (abs( X - FMouseDownPos.X ) < Mouse.DragThreshold)
6380         and (abs( Y - FMouseDownPos.Y ) < Mouse.DragThreshold) then begin
6381 (*}
6382         end else begin
6383 //*)
6384                 if GikoSys.Setting.ListOrientation = gloHorizontal then begin
6385                         if GikoSys.Setting.ListWidthState = glsMin then begin
6386                                 GikoDM.BrowserMaxAndFocusAction.Execute;
6387                         end;
6388                 end else begin
6389                         if GikoSys.Setting.ListHeightState = glsMin then begin
6390                                 GikoDM.BrowserMaxAndFocusAction.Execute;
6391                         end;
6392                 end;
6393         end;
6394 end;
6395
6396 procedure TGikoForm.LinkToolBarDragOver(Sender, Source: TObject; X,
6397         Y: Integer; State: TDragState; var Accept: Boolean);
6398 begin
6399
6400         FavoriteDragOver( Sender, Source, X, Y, State, Accept );
6401
6402 end;
6403
6404 procedure TGikoForm.FavoriteTreeViewEndDrag(Sender, Target: TObject; X,
6405         Y: Integer);
6406 begin
6407
6408         if FDropSpaceNode <> nil then begin
6409                 try
6410                         FDropSpaceNode.Delete;
6411                 finally
6412                         FDropSpaceNode := nil;
6413                 end;
6414                 //\8dX\90V\82µ\82½\82±\82Æ\82ð\8b³\82¦\82é
6415                 FavoriteDM.Modified := true;
6416                 SetLinkBar;
6417         end;
6418
6419 end;
6420
6421 procedure TGikoForm.ListCoolBarContextPopup(Sender: TObject;
6422         MousePos: TPoint; var Handled: Boolean);
6423 begin
6424
6425         FToolBarSettingSender := tssList;
6426         MousePos := ListCoolBar.ClientToScreen( MousePos );
6427         MainCoolBarPopupMenu.Popup( MousePos.X, MousePos.Y );
6428
6429 end;
6430
6431 procedure TGikoForm.MainCoolBarContextPopup(Sender: TObject;
6432         MousePos: TPoint; var Handled: Boolean);
6433 begin
6434
6435         FToolBarSettingSender := tssMain;
6436         MousePos := MainCoolBar.ClientToScreen( MousePos );
6437         MainCoolBarPopupMenu.Popup( MousePos.X, MousePos.Y );
6438
6439 end;
6440
6441 procedure TGikoForm.BrowserCoolBarContextPopup(Sender: TObject;
6442         MousePos: TPoint; var Handled: Boolean);
6443 begin
6444
6445         FToolBarSettingSender := tssBrowser;
6446         MousePos := BrowserCoolBar.ClientToScreen( MousePos );
6447         MainCoolBarPopupMenu.Popup( MousePos.X, MousePos.Y );
6448
6449 end;
6450 procedure TGikoForm.SetListViewBackGroundColor(value: TColor);
6451 begin
6452         if FListViewBackGroundColor <> value then begin
6453                 FListViewBackGroundColor := value;
6454                 ListView.Color := FListViewBackGroundColor;
6455         end;
6456 end;
6457 procedure TGikoForm.FavoriteTreeBrowseBoardPopupMenuClick(Sender: TObject);
6458 var
6459         threadItem      : TThreadItem;
6460         boardItem               : TBoard;
6461 begin
6462
6463         if FClickNode = nil then Exit;
6464
6465         if (TObject(FClickNode.Data) is TFavoriteThreadItem) then begin
6466
6467                 threadItem := TFavoriteThreadItem( FClickNode.Data ).Item;
6468                 if threadItem = nil then
6469                         Exit;
6470                 GikoSys.OpenBrowser( threadItem.ParentBoard.URL, gbtAuto );
6471
6472         end else if (TObject(FClickNode.Data) is TFavoriteBoardItem) then begin
6473
6474                 boardItem := TFavoriteBoardItem( FClickNode.Data ).Item;
6475                 if boardItem = nil then
6476                         Exit;
6477                 GikoSys.OpenBrowser( boardItem.URL, gbtAuto );
6478
6479         end;
6480
6481 end;
6482
6483 procedure TGikoForm.BrowserTabContextPopup(Sender: TObject;
6484         MousePos: TPoint; var Handled: Boolean);
6485 var
6486         idx : Integer;
6487 begin
6488                 idx := BrowserTab.IndexOfTabAt(MousePos.X, MousePos.Y);
6489                 if BrowserTab.TabIndex <> idx then begin
6490                 BrowserTab.TabIndex := idx;
6491                         BrowserTab.OnChange(nil);
6492                 end;
6493 end;
6494
6495 procedure TGikoForm.KonoresCopy(Number: Integer; ReplaceTag : Boolean);
6496 var
6497         ThreadItem: TThreadItem;
6498         tmp: string;
6499         FileName: string;
6500         Res: TResRec;
6501         Header: string;
6502         Body: string;
6503         boardPlugIn : TBoardPlugIn;
6504 begin
6505         if Number = 0 then Exit;
6506         ThreadItem := GetActiveContent;
6507
6508         if ThreadItem <> nil then begin
6509                 //if ThreadItem.IsBoardPlugInAvailable then begin
6510         if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
6511                         //===== \83v\83\89\83O\83C\83\93\82É\82æ\82é\95\\8e¦
6512                         //boardPlugIn           := ThreadItem.BoardPlugIn;
6513             boardPlugIn         := ThreadItem.ParentBoard.BoardPlugIn;
6514
6515                         // \83t\83H\83\93\83g\82â\83T\83C\83Y\82Ì\90Ý\92è
6516                         // \95\8e\9a\83R\81[\83h\82Í\83v\83\89\83O\83C\83\93\82É\94C\82¹\82é
6517                         //\82±\82±\82Å\82Q\82¿\82á\82ñ\82Ë\82é\82Ìdat\82Ì\8c`\8e®\82Å\82P\8ds\93Ç\82Ý\8d\9e\82ß\82ê\82Î¥¥¥\81B
6518                         tmp := boardPlugIn.GetDat( DWORD( threadItem ), Number );
6519                 end else begin
6520       FileName := ThreadItem.FilePath;
6521       tmp := GikoSys.ReadThreadFile(FileName, Number);
6522                 end;
6523                 if tmp <> '' then begin
6524                         THTMLCreate.DivideStrLine(tmp, @Res);
6525
6526                         Header := IntToStr(Number) + ' \81F' + Res.FName + ' \81F' + Res.FDateTime + #13#10;
6527                         if ReplaceTag then begin
6528                                 Header := CustomStringReplace(Header, '</b>', '',true);
6529                                 Header := CustomStringReplace(Header, '<b>', '',true);
6530                                 Header := CustomStringReplace(Header, '<br>', '',true);
6531                                 Header := DeleteFontTag(Header);
6532                         end;
6533                         //if ThreadItem.IsBoardPlugInAvailable then begin
6534             if ThreadItem.ParentBoard.IsBoardPlugInAvailable then begin
6535                                 Body := CustomStringReplace(Res.FBody, '<br>', #13#10,true);
6536                                 Body := CustomStringReplace(Body, '<br>', #13#10,true);
6537                         end else begin
6538                                 Body := CustomStringReplace(Res.FBody, ' <br> ', #13#10,true);
6539                                 Body := CustomStringReplace(Body, ' <br>', #13#10,true);
6540                                 Body := CustomStringReplace(Body, '<br> ', #13#10,true);
6541                                 Body := CustomStringReplace(Body, '<br>', #13#10,true);
6542
6543                         end;
6544                         Body := CustomStringReplace(Body, '</a>', '',true);
6545
6546                         Body := HTMLCreater.DeleteLink(Body);
6547                         if ReplaceTag then begin
6548                                 Body := CustomStringReplace(Body, '&lt;', '<');
6549                                 Body := CustomStringReplace(Body, '&gt;', '>');
6550                                 Body := CustomStringReplace(Body, '&quot;', '"');
6551                                 Body := CustomStringReplace(Body, '&amp;', '&');
6552                                 //Body := CustomStringReplace(Body, '&nbsp;', ' ');
6553                         end;
6554
6555                         Header := Header + Body;
6556
6557                         Clipboard.SetTextBuf( PChar(Header) );
6558                 end;
6559         end;
6560 end;
6561
6562
6563 procedure TGikoForm.BrowserTabPopupMenuPopup(Sender: TObject);
6564 begin
6565         AddRoundNameMenu(dummy1);
6566 end;
6567
6568 procedure TGikoForm.FavoritesURLReplace(oldURLs: TStringList; newURLs: TStringList);
6569 begin
6570         FavoriteDM.URLReplace(oldURLs, newURLs);
6571 end;
6572
6573 procedure TGikoForm.RoundListURLReplace(oldURLs: TStringList; newURLs: TStringList);
6574 begin
6575         RoundList.URLReplace(oldURLs, newURLs);
6576 end;
6577
6578 procedure TGikoForm.TabFileURLReplace(oldURLs: TStringList; newURLs: TStringList);
6579 const
6580         Filename = 'tab.sav';
6581         bFilename = '~tab.sav';
6582 var
6583         i, j: Integer;
6584         tempString: string;
6585         tmpURL: string;
6586         oldHost: string;
6587         oldBoardName: string;
6588         newHost: string;
6589         newBoardName: string;
6590         TabList: TStringList;
6591 begin
6592
6593         if oldURLs.Count <> newURLs.Count then begin
6594                 Exit;
6595         end;
6596         if FileExists(GikoSys.GetAppDir + 'tab.sav') then begin
6597                 TabList := TStringList.Create;
6598                 try
6599                         TabList.LoadFromFile(GikoSys.GetAppDir + Filename);
6600
6601                         //\82±\82±\82©\82ç\81AThread\82ÌURL\82Ì\95Ï\8dX
6602                         //\96Ê\93|\82¾\82¯\82Çthread\82Í\82»\82ê\82¼\82êURL\82ð\83`\83\83\83b\83N\82µ\82È\82ª\82ç\82â\82Á\82Ä\82©\82È\82«\82á\82¢\82¯\82È\82¢\81B
6603                         for i := 0 to oldURLs.Count - 1 do begin
6604                                         tmpURL                  := Copy(oldURLs[i], 1, Length(oldURLs[i]) -1);
6605                                         oldHost                 := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
6606                                         oldBoardName    := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
6607                                         tmpURL                  := Copy(newURLs[i], 1, Length(newURLs[i]) -1);
6608                                         newHost                 := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
6609                                         newBoardName    := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
6610
6611                                         for j := 0 to TabList.Count - 1 do begin
6612                                                         tempString := TabList[j];
6613                                                         if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin
6614                                                                 tempString := StringReplace(tempString, oldHost, newHost,[]);
6615                                                                 TabList[j] := tempString;
6616                                                         end;
6617                                         end;
6618                         end;
6619                         //\82±\82±\82Ü\82Å\81AThread\82ÌURL\82Ì\95Ï\8dX
6620
6621                         if FileExists( GikoSys.GetAppDir + Filename) then begin
6622                                 if FileExists( GikoSys.GetAppDir + bFilename) then
6623                                         DeleteFile(GikoSys.GetAppDir + bFilename);
6624
6625                                 //\83o\83b\83N\83A\83b\83v\82ð\8dì\82é\81B
6626                                 RenameFile(GikoSys.GetAppDir + Filename, GikoSys.GetAppDir + bFilename);
6627                         end;
6628
6629                         TabList.SaveToFile(GikoSys.GetAppDir + Filename);
6630                 finally
6631                         TabList.Free;
6632                 end;
6633         end;
6634
6635 end;
6636
6637 /// \8dÅ\8f¬\89»\82³\82ê\82é
6638 procedure TGikoForm.OnMinimize;
6639 begin
6640         if FActiveContent <> nil then begin
6641                 FIsMinimize := mtMinimizing;
6642                 FActiveContent.Thread.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
6643         end;
6644 end;
6645
6646 /// \8dÅ\8f¬\89»\82³\82ê\82½ (OnResized \82©\82ç\8cÄ\82Î\82ê\82é)
6647 procedure TGikoForm.OnMinimized;
6648 begin
6649         FIsMinimize := mtMinimized;
6650 end;
6651
6652
6653 procedure TGikoForm.BrowserTabResize(Sender: TObject);
6654 begin
6655         CoolBarResized( Sender, BrowserCoolBar );
6656 end;
6657
6658 // *************************************************************************
6659 // ExternalBoardPlugInMain
6660 // \83v\83\89\83O\83C\83\93\83\81\83j\83\85\81[\82Ì\8d\80\96Ú\82ª\8eÀ\8ds\82³\82ê\82½
6661 // *************************************************************************
6662 procedure TGikoForm.OnPlugInMenuItem( Sender : TObject );
6663 var
6664         item                            : TMenuItem;
6665         boardPlugIn     : TBoardPlugIn;
6666 begin
6667
6668         if not (Sender is TMenuItem) then
6669                 Exit;
6670
6671         item := TMenuItem( Sender );
6672         if not Assigned( Pointer( item.Tag ) ) then
6673                 Exit;
6674
6675         // \83v\83\89\83O\83C\83\93\82Ì\83\81\83j\83\85\81[\83n\83\93\83h\83\89\82ð\8cÄ\82Ñ\8fo\82·
6676         boardPlugIn := TBoardPlugIn( item.Tag );
6677         boardPlugIn.PlugInMenu( item.Handle );
6678
6679 end;
6680 // TreeView \82ª\83N\83\8a\83b\83N\82³\82ê\82½
6681 procedure TGikoForm.TreeClick( Node : TTreeNode );
6682 begin
6683
6684         if Node = nil then
6685                 Exit;
6686
6687         if FTreeType = gttHistory then begin
6688                 if Node <> nil then
6689                         if TObject( Node.Data ) is TFavoriteThreadItem then
6690                                 if GetActiveContent <> TFavoriteThreadItem( Node.Data ).Item then
6691                                         FavoriteClick( Node );
6692                 Exit;
6693         end;
6694     //\8c»\8dÝ\95\\8e¦\82µ\82Ä\82¢\82é\82Ì\82Æ\93¯\82\82È\82ç\8dÄ\95`\89æ\82µ\82È\82¢
6695         if ActiveList = Node.Data then
6696                 Exit;
6697
6698         ActiveListColumnSave;
6699
6700         if TObject(Node.Data) is TBBS then begin
6701                 SetActiveList(Node.data);
6702         end else if TObject(Node.Data) is TCategory then begin
6703                 SetActiveList(Node.data);
6704         end else if TObject(Node.Data) is TBoard then begin
6705                 if not TBoard(Node.Data).IsThreadDatRead then begin
6706                         Screen.Cursor := crHourGlass;
6707                         try
6708                 if not TBoard(Node.Data).IsThreadDatRead then
6709                                         GikoSys.ReadSubjectFile(Node.Data);
6710                         finally
6711                                 Screen.Cursor := crDefault;
6712                         end;
6713                 end;
6714                 Sort.SetSortDate(Now());
6715                 SetActiveList(Node.data);
6716         end;
6717
6718         if TObject( Node.Data ) is TBoard then begin // not TCategory
6719                 if GikoSys.Setting.ListOrientation = gloHorizontal then begin
6720                         if GikoSys.Setting.ListWidthState = glsMax then begin
6721                                 GikoDM.BrowserMinAction.Execute;
6722                                 if GikoForm.Visible then
6723                                         ListView.SetFocus;
6724                         end;
6725                 end else begin
6726                         if GikoSys.Setting.ListHeightState = glsMax then begin
6727                                 GikoDM.BrowserMinAction.Execute;
6728                                 if GikoForm.Visible then
6729                                         ListView.SetFocus;
6730                         end;
6731                 end;
6732         end;
6733
6734 end;
6735
6736 // TreeView \82ª\83_\83u\83\8b\83N\83\8a\83b\83N\82³\82ê\82½
6737 procedure TGikoForm.TreeDoubleClick( Node : TTreeNode );
6738 var
6739         Board                           : TBoard;
6740         ThreadItem      : TThreadItem;
6741         shiftDown       : Boolean;
6742 begin
6743
6744         if Node = nil then Exit;
6745
6746         shiftDown       := GetAsyncKeyState(VK_SHIFT) = Smallint($8001);
6747
6748         if FTreeType = gtt2ch then begin
6749                 if not (TObject(Node.Data) is TBoard) then Exit;
6750                 Board := TBoard(Node.Data);
6751                 DownloadList(Board, shiftDown);
6752         end else if FTreeType = gttHistory then begin
6753                 if not (TObject(Node.Data) is TFavoriteThreadItem) then Exit;
6754                 ThreadItem := TFavoriteThreadItem(Node.Data).Item;
6755                 DownloadContent(ThreadItem, shiftDown);
6756         end;
6757
6758 end;
6759 // *************************************************************************
6760 //! \83c\83\8a\81[\83r\83\85\81[\82ÌKeyDown\83C\83x\83\93\83g
6761 // *************************************************************************
6762 procedure TGikoForm.TreeViewKeyDown(Sender: TObject; var Key: Word;
6763         Shift: TShiftState);
6764 begin
6765         if Key = VK_BACK then begin
6766 //              UpFolderButtonClick(Sender);
6767         end else if Key = VK_SPACE then begin
6768                 TreeDoubleClick( TreeView.Selected );
6769         end else if Key = VK_RETURN then begin
6770                 TreeClick( TreeView.Selected );
6771                 TreeView.Selected.Expanded := not TreeView.Selected.Expanded;
6772         end;
6773 end;
6774 //! \82¨\8bC\82É\93ü\82è\82ÌMouseDown\83C\83x\83\93\83g
6775 procedure TGikoForm.FavoriteTreeViewMouseDown(Sender: TObject;
6776         Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
6777 var
6778         favItem                         : TTreeNode;
6779         favThreadItem   : TFavoriteThreadItem;
6780         rect: TRect;
6781 begin
6782         case Button of
6783         mbLeft:
6784                 begin
6785                         if not (ssAlt in Shift) and (FavoriteTreeView.Selected <> nil) and 
6786                                 (FavoriteTreeView.Selected = FavoriteTreeView.GetNodeAt(X, Y)) then begin
6787                                 //\83}\83E\83X\82ªnode\82Ì\8fã\82É\82¢\82é\82©
6788                                 rect := FavoriteTreeView.Selected.DisplayRect(true);
6789                                 // \83A\83C\83R\83\93\95ª\8d\82É\82¸\82ç\82·
6790                                 if ((rect.Left - FavoriteTreeView.Indent <= X) and (rect.Right >= X)) and
6791                                         ((rect.Bottom >= Y) and (rect.Top <= Y)) then begin
6792                                         if ssDouble in Shift then begin
6793                                                 FClickNode := FavoriteTreeView.Selected;
6794                                                 GikoDM.FavoriteTreeViewReloadActionExecute(Sender);
6795                                                 FClickNode := nil;
6796                                         end else begin
6797                                                 FavoriteClick(
6798                                                         TObject(FavoriteTreeView.Selected));
6799                                         end;
6800                                 end;
6801                         end;
6802                 end;
6803         mbMiddle:
6804                 begin
6805                         favItem := FavoriteTreeView.GetNodeAt( X, Y );
6806                         if favItem = nil then Exit;
6807
6808                         if TObject( favItem.Data ) is TFavoriteThreadItem then begin
6809                                 favThreadItem := TFavoriteThreadItem( favItem.Data );
6810                                 if favThreadItem.Item <> nil then
6811                                         InsertBrowserTab( favThreadItem.Item, False );
6812                         end;
6813                 end;
6814         end;
6815
6816 end;
6817
6818 procedure TGikoForm.MessagePanelResize(Sender: TObject);
6819 begin
6820
6821         if FIsIgnoreResize <> rtNone then
6822                 Exit;
6823
6824         if GikoSys.Setting.ListOrientation = gloVertical then begin
6825                 if GikoSys.Setting.ListHeightState = glsMin then begin
6826                         // \8dÅ\8f¬\95\\8e¦\82É\82·\82é
6827                         ViewPanel.Height := ThreadMainPanel.Height - BrowserCoolBar.Height - 7;
6828                 end;
6829         end;
6830
6831 end;
6832
6833 procedure TGikoForm.OnResized;
6834 var
6835         doc                                             : Variant;
6836 begin
6837
6838         FOldFormWidth := Width;
6839         FIsIgnoreResize := rtNone;
6840
6841         case FIsMinimize of
6842         mtMinimizing:
6843                 begin
6844                         // \8dÅ\8f¬\89»\92\86\82Å\82 \82é
6845                         PostMessage( Handle, USER_MINIMIZED, 0, 0 );
6846                 end;
6847
6848         mtMinimized:
6849                 begin
6850                         // \8dÅ\8f¬\89»\82Í\8aù\82É\8a®\97¹\82µ\82Ä\82¢\82é (\82Â\82Ü\82è\83^\83X\83N\83o\81[\82©\82ç\83E\83B\83\93\83h\83E\82ð\95\9c\8c³\92\86)
6851                         if FActiveContent <> nil then begin
6852                                 doc := Idispatch( olevariant(FActiveContent.Browser.ControlInterface).Document) as IHTMLDocument2;
6853                                 doc.Body.ScrollTop := FActiveContent.Thread.ScrollTop;
6854                         end;
6855                         FIsMinimize := mtNone;
6856                 end;
6857         end;
6858
6859 end;
6860 // *************************************************************************
6861 //! \82¨\8bC\82É\93ü\82è\83c\83\8a\81[\82Ì\83}\83E\83X\83A\83b\83v\83C\83x\83\93\83g
6862 // *************************************************************************
6863 function TGikoForm.WebBrowserClick(Sender: TObject): WordBool;
6864 var
6865         p : TPoint;
6866         e: IHTMLElement;
6867         AID: string;
6868         stlist : TStringList;
6869         i, count, rc : Integer;
6870         body : String;
6871     limited : boolean;
6872 begin
6873   result := true;
6874   try
6875         if (FActiveContent <> nil) and (FActiveContent.Browser <> nil) then
6876                 FActiveContent.Browser.SetFocus;
6877                 try
6878                         GetCursorPos(p);
6879                         p.x := p.x - FActiveContent.Browser.ClientOrigin.x;
6880                         p.y := p.y - FActiveContent.Browser.ClientOrigin.y;
6881                         e := IHTMLDocument2(FActiveContent.Browser.Document).elementFromPoint(p.x, p.y);
6882                         if (Assigned(e)) then begin
6883                                 if (e.className = 'date') or (e.id = 'date') then begin
6884                                         AID := e.innerText;
6885                                         if AnsiPos('id', AnsiLowerCase(AID)) > 0 then begin
6886                                                 AID := Copy(AID, AnsiPos('id', AnsiLowerCase(AID)) - 1, 11);
6887                         if AnsiPos(' be:', AnsiLowerCase(AID)) > 0 then begin
6888                                 AID := Copy(AID, 1, AnsiPos(' BE:', AnsiLowerCase(AID)) - 1)
6889                         end;
6890                                         end else begin
6891                                                 stlist := TStringList.Create;
6892                                                 try
6893                                                         stList.DelimitedText := AID;
6894                                                         AID := '';
6895                                                         for i := 0 to stList.Count - 1 do
6896                                                                 if Length(WideString(stList[i])) = 8 then begin
6897                                                                         if GikoSys.NotDateorTimeString(stList[i]) then begin
6898                                                                                 AID := stList[i];
6899                                                                                 break;
6900                                                                         end;
6901                                                                 end;
6902                                                 finally
6903                                                         stList.Free;
6904                                                 end;
6905                                         end;
6906                     count := GikoSys.GetSameIDResCount(AID, FActiveContent.Thread);
6907                     limited := false;
6908                     if count > 20 then begin
6909                         rc := GikoUtil.MsgBox(Handle,
6910                                 '20\8cÂ\88È\8fã\82 \82è\82Ü\82·\82ª\81A\82·\82×\82Ä\95\\8e¦\82µ\82Ü\82·\82©\81H',
6911                                 'ID\83|\83b\83v\83A\83b\83v\8cx\8d\90',
6912                                                                 MB_YESNO or MB_ICONQUESTION);
6913                         limited := rc <> ID_YES;
6914                     end;
6915                                         body := GikoSys.GetSameIDResAnchor(AID, FActiveContent.Thread, limited);
6916                                         FActiveContent.IDAnchorPopup(body);
6917                                 end;
6918                         end;
6919                 except
6920                 end;
6921   except
6922   end;
6923 end;
6924
6925 //\83X\83\8c\83b\83h\88ê\97\97\82ð\8dÅ\91å\89»\82µ\82Ä\83t\83H\81[\83J\83X\82ð\93\96\82Ä\82é
6926 procedure TGikoForm.SelectTimerTimer(Sender: TObject);
6927 begin
6928         SelectTimer.Interval := 0;
6929         if not (ListView.Selected = nil) then
6930                 if( FActiveContent = nil) or
6931                                 (GetActiveContent <> TThreadItem(ListView.Selected.Data) ) then begin
6932                         ListClick;
6933                 end;
6934 end;
6935
6936 function TGikoForm.GetTabURLs(AStringList: TStringList) : Boolean;
6937 var
6938   rec : TBrowserRecord;
6939   i, bound : Integer;
6940 begin
6941         bound := BrowserTab.Tabs.Count -1;
6942         if bound = -1 then begin
6943                 Result := False;
6944                 Exit; //for\82É\94ò\82Î\82È\82¢\82Å\91\80\8dì\82ð\94²\82¯\82é
6945         end;
6946
6947         for i := 0 to bound do begin
6948                 try
6949                         rec := TBrowserRecord( BrowserTab.Tabs.Objects[ i ] );
6950                         if( rec <> nil) and (rec.Thread <> nil) then
6951                                 AStringList.Add( rec.Thread.URL );
6952                 except
6953                 end;
6954         end;
6955         Result := True;
6956 end;
6957
6958 function TGikoForm.SaveTabURLs : Boolean;
6959 const
6960         Filename = 'tab.sav';
6961         bFilename = '~tab.sav';
6962 var
6963         SaveStringList: TStringList;
6964 begin
6965         Result := false;
6966
6967         SaveStringList := TStringList.Create;
6968         try
6969                 if GetTabURLs(SaveStringList) then begin
6970                         try
6971                                 if FileExists( GikoSys.GetAppDir + Filename) then begin
6972                                         if FileExists( GikoSys.GetAppDir + bFilename) then
6973                                                 DeleteFile(GikoSys.GetAppDir + bFilename);
6974
6975                                         //\83o\83b\83N\83A\83b\83v\82ð\8dì\82é\81B
6976                                         RenameFile(GikoSys.GetAppDir + Filename, GikoSys.GetAppDir + bFilename);
6977                                 end;
6978                         except
6979                         end;
6980                         SaveStringList.SaveToFile(GikoSys.GetAppDir + Filename);
6981                         Result := true;
6982                 end;
6983         finally
6984                 SaveStringList.Free;
6985         end;
6986 end;
6987
6988 function TGikoForm.LoadTabURLs : Boolean;
6989 const
6990         TABFILE = 'tab.sav';
6991 var
6992         i, bound    : Integer;
6993         item        : TThreadItem;
6994         URLs                            : TStringList;
6995         GikoTab                 : TGikoTabAppend;
6996         fileName                : string;
6997 begin
6998
6999         fileName := ExtractFilePath(Application.ExeName) + TABFILE;
7000         URLs := TStringList.Create();
7001         GikoTab := GikoSys.Setting.BrowserTabAppend;
7002         try
7003                 try
7004                         Result := True;
7005                         if FileExists(fileName) then begin
7006                                 URLs.LoadFromFile(fileName);
7007                                 bound    := URLs.Count - 1;
7008                                 if bound > -1 then begin
7009                                         GikoSys.Setting.BrowserTabAppend := gtpLast;//TGikoTabAppend(1);
7010                                         for i := 0 to bound do begin
7011                                                 item := BBSsFindThreadFromURL( URLs[ i ] );
7012                                                 if item <> nil then
7013                                                         InsertBrowserTab( item, false );
7014                                         end;
7015                                         //\8dÅ\8f\89\82Ì\82P\96\87\82É\90Ý\92è \83A\83h\83\8c\83X\82Ì\90Ý\92è\82Ì\82½\82ß\82Ì\83J\83\89\8cÄ\82Ñ
7016                                         if BrowserTab.Tabs.Count > 0 then begin
7017                         BrowserTab.OnChange(nil);
7018                                         end;
7019                                 end else
7020                                         Result := False;
7021                         end else
7022                                 Result := False;
7023                 except
7024                         on EFOpenError do begin
7025                                 ShowMessage('\83^\83u\83t\83@\83C\83\8b\82ª\8aJ\82¯\82Ü\82¹\82ñ');
7026                         end;
7027                 end;
7028         finally
7029                 GikoSys.Setting.BrowserTabAppend := GikoTab;
7030                 URLs.Free;
7031         end;
7032
7033 end;
7034
7035
7036 /// ListView \82Ì\83J\83\89\83\80\95\9d\82¨\82æ\82Ñ\88Ê\92u\82Ì\95Û\91
7037 procedure TGikoForm.ActiveListColumnSave;
7038 var
7039         ActivListObj    : TObject;
7040         i, id, idx              : Integer;
7041         BBSOrder                        : TGikoBBSColumnList;
7042         CategoryOrder   : TGikoCategoryColumnList;
7043         BoardOrder              : TGikoBoardColumnList;
7044 begin
7045
7046         ActivListObj := ActiveList;
7047         if ActivListObj is TBBS then begin
7048                 //===== \83J\83e\83S\83\8a\83\8a\83X\83g =====
7049                 BBSOrder := TGikoBBSColumnList.Create;
7050                 try
7051                         for i := 0 to ListView.Columns.Count - 1 do begin
7052                                 // \8f\87\8f\98\82Ì\8eæ\93¾
7053                                 idx := ListView.Column[ i ].Tag;
7054                                 id := Ord( GikoSys.Setting.BBSColumnOrder[ idx ] );
7055                                 BBSOrder.Add( TGikoBBSColumnID( id ) );
7056                                 // \95\9d\82Ì\95Û\91
7057                                 GikoSys.Setting.BBSColumnWidth[ id ] := ListView.Column[ i ].Width;
7058                         end;
7059                         for i := 0 to ListView.Columns.Count - 1 do
7060                                 // \8f\87\8f\98\82Ì\95Û\91
7061                                 GikoSys.Setting.BBSColumnOrder[ i ] := BBSOrder[ i ];
7062                 finally
7063                         BBSOrder.Free;
7064                 end;
7065         end else if ActivListObj is TCategory then begin
7066                 //===== \94Â\83\8a\83X\83g =====
7067                 CategoryOrder := TGikoCategoryColumnList.Create;
7068                 try
7069                         for i := 0 to ListView.Columns.Count - 1 do begin
7070                                 // \8f\87\8f\98\82Ì\8eæ\93¾
7071                                 idx := ListView.Column[ i ].Tag;
7072                                 id := Ord( GikoSys.Setting.CategoryColumnOrder[ idx ] );
7073                                 CategoryOrder.Add( TGikoCategoryColumnID( id ) );
7074                                 // \95\9d\82Ì\95Û\91
7075                                 GikoSys.Setting.CategoryColumnWidth[ id ] := ListView.Column[ i ].Width;
7076                         end;
7077                         for i := 0 to ListView.Columns.Count - 1 do
7078                                 // \8f\87\8f\98\82Ì\95Û\91
7079                                 GikoSys.Setting.CategoryColumnOrder[ i ] := CategoryOrder[ i ];
7080                 finally
7081                         CategoryOrder.Free;
7082                 end;
7083         end else if ActivListObj is TBoard then begin
7084                 //===== \83X\83\8c\83\8a\83X\83g =====
7085                 BoardOrder := TGikoBoardColumnList.Create;
7086                 try
7087                         for i := 0 to ListView.Columns.Count - 1 do begin
7088                                 // \8f\87\8f\98\82Ì\8eæ\93¾
7089                                 idx := ListView.Column[ i ].Tag;
7090                                 id := Ord( GikoSys.Setting.BoardColumnOrder[ idx ] );
7091                                 BoardOrder.Add( TGikoBoardColumnID( id ) );
7092                                 // \95\9d\82Ì\95Û\91
7093                                 GikoSys.Setting.BoardColumnWidth[ id ] := ListView.Column[ i ].Width;
7094                         end;
7095                         for i := 0 to ListView.Columns.Count - 1 do
7096                                 // \8f\87\8f\98\82Ì\95Û\91
7097                                 GikoSys.Setting.BoardColumnOrder[ i ] := BoardOrder[ i ];
7098                 finally
7099                         BoardOrder.Free;
7100                 end;
7101         end;
7102
7103 end;
7104
7105 procedure TGikoForm.ListViewColumnRightClick(Sender: TObject;
7106         Column: TListColumn; Point: TPoint);
7107 var
7108         i, j    : Integer;
7109         item    : TMenuItem;
7110 begin
7111
7112         // \83|\83b\83v\83A\83b\83v\83\81\83j\83\85\81[\82ð\83N\83\8a\83A
7113         for i := ListColumnPopupMenu.Items.Count - 1 downto 0 do
7114                 ListColumnPopupMenu.Items.Items[ i ].Free;
7115
7116         // \83\81\83j\83\85\81[\82Ì\8dì\90¬ (\83\81\83C\83\93\83J\83\89\83\80\82Í\95K\90{\82È\82Ì\82Å\83\81\83j\83\85\81[\82É\8aÜ\82ß\82È\82¢)
7117         if TObject( FActiveList ) is TBBS then begin
7118
7119                 //===== \83J\83e\83S\83\8a\83\8a\83X\83g =====
7120                 for i := 1 to Length( GikoBBSColumnCaption ) - 1 do begin
7121                         item := TMenuItem.Create( ListColumnPopupMenu );
7122                         item.Caption := GikoBBSColumnCaption[ i ];
7123                         item.Tag := i;
7124                         item.OnClick := ListColumnPopupMenuOnClick;
7125                         for j := GikoSys.Setting.BBSColumnOrder.Count - 1 downto 0 do begin
7126                                 if GikoSys.Setting.BBSColumnOrder[ j ] = TGikoBBSColumnID( i ) then begin
7127                                         item.Checked := True;
7128                                         Break;
7129                                 end;
7130                         end;
7131                         ListColumnPopupMenu.Items.Add( item );
7132                 end;
7133
7134         end else if TObject( FActiveList ) is TCategory then begin
7135
7136                 //===== \94Â\83\8a\83X\83g =====
7137                 for i := 1 to Length( GikoCategoryColumnCaption ) - 1 do begin
7138                         item := TMenuItem.Create( ListColumnPopupMenu );
7139                         item.Caption := GikoCategoryColumnCaption[ i ];
7140                         item.Tag := i;
7141                         item.OnClick := ListColumnPopupMenuOnClick;
7142                         for j := GikoSys.Setting.CategoryColumnOrder.Count - 1 downto 0 do begin
7143                                 if GikoSys.Setting.CategoryColumnOrder[ j ] = TGikoCategoryColumnID( i ) then begin
7144                                         item.Checked := True;
7145                                         Break;
7146                                 end;
7147                         end;
7148                         ListColumnPopupMenu.Items.Add( item );
7149                 end;
7150
7151         end else if TObject( FActiveList ) is TBoard then begin
7152
7153                 //===== \83X\83\8c\83\8a\83X\83g =====
7154                 for i := 1 to Length( GikoBoardColumnCaption ) - 1 do begin
7155                         item := TMenuItem.Create( ListColumnPopupMenu );
7156                         item.Caption := GikoBoardColumnCaption[ i ];
7157                         item.Tag := i;
7158                         item.OnClick := ListColumnPopupMenuOnClick;
7159                         for j := GikoSys.Setting.BoardColumnOrder.Count - 1 downto 0 do begin
7160                                 if GikoSys.Setting.BoardColumnOrder[ j ] = TGikoBoardColumnID( i ) then begin
7161                                         item.Checked := True;
7162                                         Break;
7163                                 end;
7164                         end;
7165                         ListColumnPopupMenu.Items.Add( item );
7166                 end;
7167
7168         end;
7169
7170         // \83\81\83j\83\85\81[\82Ì\95\\8e¦
7171         Point := ListView.ClientToScreen( Point );
7172         if ListColumnPopupMenu.Items.Count > 0 then
7173                 ListColumnPopupMenu.Popup( Point.X, Point.Y );
7174
7175 end;
7176
7177 /// ListColumnPopupMenu \83A\83C\83e\83\80\82Ì\83N\83\8a\83b\83N\83C\83x\83\93\83g
7178 procedure       TGikoForm.ListColumnPopupMenuOnClick( Sender : TObject );
7179 var
7180         i                                       : Integer;
7181         orderList       : TList;
7182         item                    : TMenuItem;
7183 begin
7184
7185         if not (Sender is TMenuItem) then
7186                 Exit;
7187
7188         ActiveListColumnSave;
7189         item := TMenuItem( Sender );
7190
7191         if TObject( FActiveList ) is TBBS then
7192                 orderList := GikoSys.Setting.BBSColumnOrder
7193         else if TObject( FActiveList ) is TCategory then
7194                 orderList := GikoSys.Setting.CategoryColumnOrder
7195         else if TObject( FActiveList ) is TBoard then
7196                 orderList := GikoSys.Setting.BoardColumnOrder
7197         else
7198                 Exit;
7199
7200         if item.Checked then begin
7201                 // \83J\83\89\83\80\82Ì\8dí\8f\9c
7202                 for i := orderList.Count - 1 downto 0 do begin
7203                         if Integer( orderList[ i ] ) = item.Tag then begin
7204                                 orderList.Delete( i );
7205                                 Break;
7206                         end;
7207                 end;
7208         end else begin
7209                 // \83J\83\89\83\80\82Ì\92Ç\89Á
7210                 orderList.Add( Pointer( item.Tag ) );
7211         end;
7212
7213         SetActiveList( FActiveList );
7214
7215 end;
7216
7217 procedure TGikoForm.OnGestureStart(Sender: TObject);
7218 begin
7219 //
7220 end;
7221
7222 procedure TGikoForm.OnGestureMove(Sender: TObject);
7223 var
7224         s: string;
7225         Action: TAction;
7226         ActStr: string;
7227         P : TPoint;
7228 begin
7229         //\83}\83E\83X\88Ê\92u\82Ì\8eæ\93¾
7230         GetCursorPos(P);
7231         //\83R\83\93\83|\81[\83l\83\93\83g\96¼\8eæ\93¾
7232         s := MouseGesture.GetGestureStr;
7233         ActStr := '';
7234         Action := GikoSys.Setting.Gestures.GetGestureAction(s);
7235         if Action <> nil then
7236                 ActStr := '\81i' + Action.Caption + '\81j';
7237         s := '\83W\83F\83X\83`\83\83\81[: ' + s + ActStr;
7238         StatusBar.Panels[1].Text := s;
7239 end;
7240
7241 procedure TGikoForm.OnGestureEnd(Sender: TObject);
7242 var
7243         s: string;
7244         Action: TAction;
7245 begin
7246         s := MouseGesture.GetGestureStr;
7247         Action := GikoSys.Setting.Gestures.GetGestureAction(s);
7248         if Action <> nil then
7249                 Action.Execute;
7250         StatusBar.Panels[1].Text := '';
7251 end;
7252
7253 procedure TGikoForm.ListViewCustomDrawItem(Sender: TCustomListView;
7254   Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
7255 var
7256         ThreadItem: TThreadItem;
7257 begin
7258         DefaultDraw := true;
7259         if TObject(Item.Data) is TThreadItem then begin
7260                 ThreadItem := TThreadItem(Item.Data);
7261                 if ( FUseOddResOddColor ) and ( ThreadItem.Count <> 0 ) and ( ThreadItem.AllResCount <> ThreadItem.Count) then begin
7262                         ListView.Canvas.Brush.Color := FOddColor;
7263                         //\91I\91ð\82³\82ê\82Ä\82¢\82é\82¯\82Ç\81A\83t\83H\81[\83J\83X\82ª\82È\82¢\82Æ\81A\83O\83\8c\83C\82É\82È\82é\82Ì\82Å\81A\91¾\8e\9a\82É\95Ï\8dX
7264                         if (GikoSys.Setting.UnFocusedBold) and
7265                          (Item.Selected) and (not ListView.Focused) then begin
7266                                 ListView.Canvas.Font.Style := [fsBold];
7267                         end;
7268                 end else begin
7269                         ListView.Canvas.Brush.Color := FListViewBackGroundColor;
7270                 end;
7271
7272                 if ThreadItem.UnRead then
7273                         ListView.Canvas.Font.Style := [fsBold];
7274         end;
7275
7276 end;
7277
7278 procedure TGikoForm.FormActivate(Sender: TObject);
7279 begin
7280         if GikoSys.Setting.GestureEnabled then begin
7281                 GikoSys.Setting.Gestures.ClearGesture;
7282                 GikoSys.Setting.Gestures.LoadGesture(
7283                         GikoSys.Setting.GetGestureFileName, GikoDM.GikoFormActionList );
7284                 MouseGesture.UnHook;
7285                 MouseGesture.OnGestureStart := OnGestureStart;
7286                 MouseGesture.OnGestureMove := OnGestureMove;
7287                 MouseGesture.OnGestureEnd := OnGestureEnd;
7288                 MouseGesture.SetHook(Handle);
7289         end else begin
7290                 //MouseGesture.UnHook;
7291                 MouseGesture.OnGestureStart := nil;
7292                 MouseGesture.OnGestureMove := nil;
7293                 MouseGesture.OnGestureEnd := nil;
7294         end;
7295 end;
7296
7297 procedure TGikoForm.BrowserPanelResize(Sender: TObject);
7298 begin
7299         if (FActiveContent <> nil) and (FActiveContent.Browser <> nil) then begin
7300                 MoveWindow(FActiveContent.Browser.Handle, 0, 0, BrowserPanel.ClientWidth, BrowserPanel.ClientHeight, false);
7301         end;
7302
7303 end;
7304 procedure TGikoForm.CoolBarResized(Sender: TObject; CoolBar: TCoolBar);
7305 var
7306         coolSet                         : TCoolSet;
7307         toolbar                         : TToolBar;
7308         band                                    : TCoolBand;
7309         affectedBand    : TCoolBand;
7310         i                                                       : Integer;
7311 begin
7312         if (FOldFormWidth = Width) and not IsIconic( Handle ) and (FIsIgnoreResize = rtNone) then begin
7313                 FIsIgnoreResize := rtResizing;
7314                 PostMessage( Handle, USER_RESIZED, 0, 0 );
7315                 band := nil;
7316                 // \95Ï\8dX\82³\82ê\82½\83N\81[\83\8b\83o\81[\82Ì\92l\82ð\95Û\91
7317                 if CoolBar = MainCoolBar then begin
7318                         for i := 0 to MAIN_COOLBAND_COUNT - 1 do begin
7319                                 CoolSet.FCoolID := CoolBar.Bands[i].ID;
7320                                 CoolSet.FCoolWidth := CoolBar.Bands[i].Width;
7321                                 CoolSet.FCoolBreak := CoolBar.Bands[i].Break;
7322                                 GikoSys.Setting.MainCoolSet[i] := CoolSet;
7323                         end;
7324                 end else if CoolBar = ListCoolBar then begin
7325                         for i := 0 to LIST_COOLBAND_COUNT - 1 do begin
7326                                 CoolSet.FCoolID := CoolBar.Bands[i].ID;
7327                                 CoolSet.FCoolWidth := CoolBar.Bands[i].Width;
7328                                 CoolSet.FCoolBreak := CoolBar.Bands[i].Break;
7329                                 GikoSys.Setting.ListCoolSet[i] := CoolSet;
7330                         end;
7331                 end else if CoolBar = BrowserCoolBar then begin
7332                         for i := 0 to BROWSER_COOLBAND_COUNT - 1 do begin
7333                                 CoolSet.FCoolID := CoolBar.Bands[i].ID;
7334                                 CoolSet.FCoolWidth := CoolBar.Bands[i].Width;
7335                                 CoolSet.FCoolBreak := CoolBar.Bands[i].Break;
7336                                 GikoSys.Setting.BrowserCoolSet[i] := CoolSet;
7337                         end;
7338                 end;
7339                 if not (Sender is TToolBar) or (CoolBar = nil) then
7340                         Exit;
7341                 toolbar := TToolBar( Sender );
7342                 // \95\9d\82Ì\95Ï\8dX\82³\82ê\82½\83o\83\93\83h\82ð\8c©\82Â\82¯\82é
7343                 affectedBand := nil;
7344                 for i := CoolBar.Bands.Count - 1 downto 0 do begin
7345                         if CoolBar.Bands[ i ].Control.Handle = toolbar.Handle then begin
7346                                 band    := CoolBar.Bands[ i ];
7347                                 if band.Break or (i = 0) then begin
7348                                         if i + 1 < CoolBar.Bands.Count then
7349                                                 if not CoolBar.Bands[ i + 1 ].Break then
7350                                                         affectedBand := CoolBar.Bands[ i + 1 ];
7351                                 end else begin
7352                                         if i > 0 then
7353                                                 affectedBand := CoolBar.Bands[ i - 1 ];
7354                                 end;
7355                                 Break;
7356                         end;
7357                 end;
7358                 // \83h\83\89\83b\83O\92\86\82Í band.Width \82ª\8dX\90V\82³\82ê\82È\82¢\82Ì\82Å\81A\93à\91¤\82Ì\83T\83C\83Y\82©\82ç\82Ð\82Ë\82è\8fo\82·
7359                 if CoolBar = MainCoolBar then begin
7360                         coolSet := GikoSys.Setting.MainCoolSet[ band.ID ];
7361                         coolSet.FCoolWidth := toolbar.Width + 25;
7362                         GikoSys.Setting.MainCoolSet[ band.ID ] := coolSet;
7363                         if affectedBand <> nil then begin
7364                                 coolSet := GikoSys.Setting.MainCoolSet[ affectedBand.ID ];
7365                                 coolSet.FCoolWidth := affectedBand.Control.Width + 25;
7366                                 GikoSys.Setting.MainCoolSet[ affectedBand.ID ] := coolSet;
7367                         end;
7368                 end else if CoolBar = ListCoolBar then begin
7369                         coolSet := GikoSys.Setting.ListCoolSet[ band.ID ];
7370                         coolSet.FCoolWidth := toolbar.Width + 25;
7371                         GikoSys.Setting.ListCoolSet[ band.ID ] := coolSet;
7372                         if affectedBand <> nil then begin
7373                                 coolSet := GikoSys.Setting.ListCoolSet[ affectedBand.ID ];
7374                                 coolSet.FCoolWidth := affectedBand.Control.Width + 25;
7375                                 GikoSys.Setting.ListCoolSet[ affectedBand.ID ] := coolSet;
7376                         end;
7377                 end else if CoolBar = BrowserCoolBar then begin
7378                         coolSet := GikoSys.Setting.BrowserCoolSet[ band.ID ];
7379                         coolSet.FCoolWidth := toolbar.Width + 25;
7380                         GikoSys.Setting.BrowserCoolSet[ band.ID ] := coolSet;
7381                         if affectedBand <> nil then begin
7382                                 coolSet := GikoSys.Setting.BrowserCoolSet[ affectedBand.ID ];
7383                                 coolSet.FCoolWidth := affectedBand.Control.Width + 25;
7384                                 GikoSys.Setting.BrowserCoolSet[ affectedBand.ID ] := coolSet;
7385                         end;
7386                 end;
7387         end;
7388 end;
7389
7390
7391 procedure TGikoForm.MenuToolBarResize(Sender: TObject);
7392 begin
7393         CoolBarResized( Sender, MainCoolBar );
7394 end;
7395
7396 procedure TGikoForm.ListToolBarResize(Sender: TObject);
7397 begin
7398         CoolBarResized( Sender, ListCoolBar );
7399 end;
7400
7401 procedure TGikoForm.BrowserToolBarResize(Sender: TObject);
7402 begin
7403         CoolBarResized( Sender, BrowserCoolBar );
7404 end;
7405
7406 //\82±\82Ì\83\8c\83X\82 \82Ú\81`\82ñ
7407 procedure TGikoForm.IndividualAbon(Atag, Atype : Integer);
7408 var
7409         ThreadItem      : TThreadItem;
7410         ReadList                : TStringList;
7411         wordCount               : TWordCount;
7412 begin
7413         ThreadItem      := GetActiveContent;
7414         ReadList                := TStringList.Create;
7415         wordCount               := TWordCount.Create;
7416         try
7417                 ThreadItem.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
7418 {$IFDEF SPAM_FILTER_ENABLED}
7419                 // \83X\83p\83\80\82É\90Ý\92è
7420                 ReadList.LoadFromFile( ThreadItem.GetThreadFileName );
7421                 GikoSys.SpamCountWord( ReadList[ ATag - 1 ], wordCount );
7422                 GikoSys.SpamForget( wordCount, False ); // \83n\83\80\82ð\89ð\8f\9c
7423                 GikoSys.SpamLearn( wordCount, True );           // \83X\83p\83\80\82É\90Ý\92è
7424 {$ENDIF}
7425                 // \82 \82Ú\81[\82ñ\82É\90Ý\92è
7426                 GikoSys.FAbon.AddIndividualAbon(Atag, Atype, ChangeFileExt(ThreadItem.GetThreadFileName, '.NG'));
7427         finally
7428                 wordCount.Free;
7429                 ReadList.Free;
7430         end;
7431         FActiveContent.Repaint := true;
7432         if ThreadItem <> nil then
7433                 InsertBrowserTab( ThreadItem, True );
7434 end;
7435
7436 //\93¯\88êID\82Ì\82 \82Ú\81`\82ñ
7437 procedure TGikoForm.IndividualAbonID(Atype : Integer);
7438 var
7439         ThreadItem : TThreadItem;
7440         i, No : Integer;
7441         body : TStringList;
7442         ReadList                : TStringList;
7443         wordCount               : TWordCount;
7444 begin
7445         No := KokoPopupMenu.Tag;
7446         if No = 0 then Exit;
7447         ThreadItem := GetActiveContent;
7448         if ThreadItem = nil then Exit;
7449         body := TStringList.Create;
7450         try
7451                 GikoSys.GetSameIDRes(No, ThreadItem, body);
7452
7453                 ReadList                := TStringList.Create;
7454                 wordCount               := TWordCount.Create;
7455                 try
7456                         ThreadItem.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
7457 {$IFDEF SPAM_FILTER_ENABLED}
7458                         // \83X\83p\83\80\82É\90Ý\92è
7459                         ReadList.LoadFromFile( ThreadItem.GetThreadFileName );
7460 {$ENDIF}
7461                         for i := 0 to body.Count - 1 do begin
7462 {$IFDEF SPAM_FILTER_ENABLED}
7463                                 GikoSys.SpamCountWord( ReadList[ i ], wordCount );
7464                                 GikoSys.SpamForget( wordCount, False ); // \83n\83\80\82ð\89ð\8f\9c
7465                                 GikoSys.SpamLearn( wordCount, True );           // \83X\83p\83\80\82É\90Ý\92è
7466 {$ENDIF}
7467                                 // \82 \82Ú\81[\82ñ\82É\90Ý\92è
7468                                 GikoSys.FAbon.AddIndividualAbon(StrToInt(body[i]), Atype, ChangeFileExt(ThreadItem.GetThreadFileName, '.NG'));
7469                         end;
7470                 finally
7471                         wordCount.Free;
7472                         ReadList.Free;
7473                 end;
7474                 FActiveContent.Repaint := true;
7475                 if ThreadItem <> nil then
7476                         InsertBrowserTab( ThreadItem, True );
7477         finally
7478                 body.Free;
7479         end;
7480
7481 end;
7482
7483 procedure TGikoForm.KokoPopupMenuPopup(Sender: TObject);
7484 var
7485         firstElement: IHTMLElement;
7486         document: IHTMLDocument2;
7487 begin
7488         document := FActiveContent.Browser.Document as IHTMLDocument2;
7489         if Assigned(document) then
7490                 firstElement := document.all.item('idSearch', 0) as IHTMLElement;
7491                 if Assigned(firstElement) then
7492                         if firstElement.style.visibility <> 'hidden' then
7493                                 firstElement.style.visibility := 'hidden';
7494
7495 end;
7496
7497 procedure TGikoForm.RepaintAllTabsBrowser();
7498 var
7499         i : Integer;
7500         ThreadItem: TThreadItem;
7501 begin
7502         for i := BrowserTab.Tabs.Count - 1 downto 0 do
7503                 TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
7504
7505         ThreadItem := GetActiveContent;
7506         if ThreadItem <> nil then
7507                 InsertBrowserTab( ThreadItem, True );
7508
7509 end;
7510
7511 //ListView\82Ì\91I\91ð\8fó\91Ô\82ð\89ð\8f\9c\82·\82é
7512 procedure TGikoForm.ListViewKeyUp(Sender: TObject; var Key: Word;
7513   Shift: TShiftState);
7514 begin
7515         //\83u\83\89\83E\83U\83^\83u\96³\82µ\82Å\81A\83L\81[\88Ú\93®\82Å\93Ç\82Ý\94ò\82Î\82µ\82ð\89Â\94\\82É\82·\82é\82½\82ß\82Ì
7516         //\96³\8cø\8e\9e\8aÔ\82ÌTimer\82Ì\8f\88\97\9d
7517         //\82Æ\82è\82 \82¦\82¸\81A\83^\83C\83}\81[\82ð\92â\8e~\82·\82é\81B
7518         SelectTimer.Interval := 0;
7519         if not (GikoSys.Setting.BrowserTabVisible) then begin
7520                 if (GetActiveList is TBoard) then begin
7521                         //Shift Alt Ctrl\82ª\98b\82³\82ê\82½\82Æ\82«\82Í\81A\95û\8cü\83L\81[\82ð\97£\82µ\82Ä\82¢\82Ä\82à\96³\8e\8b
7522                         if not ((ssShift in Shift) or (ssAlt in Shift) or (ssCtrl in Shift))  and
7523                                 (( Key = VK_LEFT) or (Key = VK_RIGHT) or
7524                                                 (Key = VK_UP) or (Key = VK_DOWN)) then
7525                                         SelectTimer.Interval := GikoSys.Setting.SelectInterval;
7526                 end;
7527         end;
7528 end;
7529 // *************************************************************************
7530 //! \82¨\8bC\82É\93ü\82è\82Ì\95Ò\8fW\8aJ\8en\83C\83x\83\93\83g
7531 // *************************************************************************
7532 procedure TGikoForm.FavoriteTreeViewEditing(Sender: TObject;
7533   Node: TTreeNode; var AllowEdit: Boolean);
7534 begin
7535         //\95Ò\8fW\91O\82Ì\95\8e\9a\97ñ\82ð\88ê\8e\9e\95Û\91\82·\82é
7536         FOrigenCaption := Node.Text;
7537 end;
7538 // *************************************************************************
7539 //! Application\82ÌMainForm\82ð\8eæ\93¾\82·\82é
7540 // *************************************************************************
7541 function TGikoForm.GetMainForm(): TComponent;
7542 begin
7543         Result := Application.MainForm;
7544 end;
7545 // *************************************************************************
7546 //! \8c»\8dÝ\82Ì\83J\81[\83\\83\8b\82ð\8eæ\93¾\82·\82é
7547 // *************************************************************************
7548 function TGikoForm.GetScreenCursor(): TCursor;
7549 begin
7550         Result := Screen.Cursor;
7551 end;
7552 // *************************************************************************
7553 //! \83J\81[\83\\83\8b\82ð\90Ý\92è\82·\82é
7554 // *************************************************************************
7555 procedure TGikoForm.SetScreenCursor(Cursor : TCursor);
7556 begin
7557         if (Screen.Cursor <> Cursor) then
7558                 Screen.Cursor := Cursor;
7559 end;
7560 // *************************************************************************
7561 //! \83X\83N\83\8a\81[\83\93\8fã\82ÉEditorForm\82ª\82¢\82é\82©
7562 // *************************************************************************
7563 function TGikoForm.EditorFormExists(): boolean;
7564 var
7565         i : Integer;
7566 begin
7567         Result := false;
7568         //\83X\83N\83\8a\81[\83\93\8fã\82Ì\91S\82Ä\82Ì\83t\83H\81[\83\80\82©\82ç\81AEditorForm\82ð\92T\82·
7569         for i := 0 to Screen.CustomFormCount - 1 do begin
7570                 if TObject(Screen.CustomForms[i]) is TEditorForm then begin
7571                         Result := true;
7572                         Break;
7573                 end;
7574         end;
7575 end;
7576 // *************************************************************************
7577 //! \83X\83N\83\8a\81[\83\93\8fã\82É\82¢\82é\82·\82×\82Ä\82ÌEditorForm\82©\82ç\96¼\91O\82Ì\97\9a\97ð\82ð\8dí\8f\9c\82·\82é
7578 // *************************************************************************
7579 procedure TGikoForm.AllEditroFormNameTextClearClear();
7580 var
7581         i : Integer;
7582 begin
7583         for i := 0 to Screen.CustomFormCount - 1 do begin
7584                 if TObject(Screen.CustomForms[i]) is TEditorForm then
7585                         TEditorForm(Screen.CustomForms[i]).NameComboBox.Items.Clear;
7586         end;
7587 end;
7588 // *************************************************************************
7589 //! \83X\83N\83\8a\81[\83\93\8fã\82É\82¢\82é\82·\82×\82Ä\82ÌEditorForm\82©\82ç\83\81\81[\83\8b\97\9a\97ð\82ð\8dí\8f\9c\82·\82é
7590 // *************************************************************************
7591 procedure TGikoForm.AllEditroFormMailTextClearClear();
7592 var
7593         i : Integer;
7594 begin
7595         for i := 0 to Screen.CustomFormCount - 1 do begin
7596                 if TObject(Screen.CustomForms[i]) is TEditorForm then
7597                         TEditorForm(Screen.CustomForms[i]).MailComboBox.Items.Clear;
7598         end;
7599 end;
7600 // *************************************************************************
7601 //! \83L\83\83\83r\83l\83b\83g\82ð\95Â\82\82é\81~\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\83C\83x\83\93\83g
7602 // *************************************************************************
7603 procedure TGikoForm.CabinetCloseSpeedButtonClick(Sender: TObject);
7604 begin
7605         //Action\82Å\90Ý\92è\82·\82é\82Æ\83L\83\83\83v\83V\83\87\83\93\82ª\8fÁ\82¹\82È\82¢\82Ì\82Å\81AOnClick\83C\83x\83\93\83g\82Å\82Ì
7606         //\8cÄ\82Ñ\8fo\82µ\82É\82µ\82½\81@by \82à\82\82ã
7607         if GikoDM.CabinetVisibleAction.Enabled then begin
7608                 GikoDM.CabinetVisibleAction.Execute;
7609         end;
7610 end;
7611 // *************************************************************************
7612 //! \82¨\8bC\82É\93ü\82è\83L\83\83\83r\83l\83b\83g\82Ì\90®\97\9d\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\83C\83x\83\93\83g
7613 // *************************************************************************
7614 procedure TGikoForm.FavoriteArrangeToolButtonClick(Sender: TObject);
7615 begin
7616         if GikoDM.FavoriteArrangeAction.Enabled then begin
7617                 GikoDM.FavoriteArrangeAction.Execute;
7618         end;
7619 end;
7620 // *************************************************************************
7621 //! \83M\83R\83i\83r\82Ì\83\81\83b\83Z\81[\83W\83n\83\93\83h\83\8a\83\93\83O    (\92\8d\88Ó\81j\8f\88\97\9d\97Ê\82É\92\8d\88Ó\81I
7622 // *************************************************************************
7623 procedure TGikoForm.GikoApplicationEventsMessage(var Msg: tagMSG;
7624   var Handled: Boolean);
7625 var
7626         wmMsg: TWMKey;
7627 begin
7628         //GikoForm\82ª\83A\83N\83e\83B\83u\82È\82Æ\82«\82¾\82¯\8eó\82¯\8eæ\82é \91¼\82Ì\83t\83H\81[\83\80\82Ì\82ð\89¡\8eæ\82è\82µ\82È\82¢\82½\82ß
7629         if Self.Active then begin
7630                 case Msg.message of
7631                         //\83L\81[\93ü\97Í\82·\82×\82Ä
7632                         WM_KEYFIRST..WM_KEYLAST :
7633                         begin
7634                                 //\83L\81[\83A\83b\83v\82Í\96³\8e\8b\82·\82é\81@KeyDown\82Æ\8d\87\82í\82¹\82Ä\82Q\89ñ\8cÄ\82Î\82ê\82é\82©\82ç
7635                                 if (Msg.message <> WM_KEYUP) and (Msg.message <> WM_CHAR) then begin
7636                                         wmMsg.Msg := Msg.message;
7637                                         wmMsg.CharCode := Word(Msg.wParam);
7638                                         wmMsg.KeyData := Msg.lParam;
7639                                         //\83t\83H\81[\83\80\82Ì\83V\83\87\81[\83g\83J\83b\83g\82Ì\8f\88\97\9d\82É\93]\91\97
7640                                         Self.OnShortCut(wmMsg, Handled);
7641                                 end;
7642                         end;
7643                 end;
7644         end;
7645 end;
7646 // *************************************************************************
7647 //! \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ª\83A\83N\83e\83B\83u\82Å\82È\82­\82È\82Á\82½\82Æ\82«\82Ì\83C\83x\83\93\83g
7648 // *************************************************************************
7649 procedure TGikoForm.GikoApplicationEventsDeactivate(Sender: TObject);
7650 begin
7651         Application.ProcessMessages;
7652         if not Application.Terminated then begin
7653                 if PreviewTimer.Enabled then
7654                         PreviewTimer.Enabled := False;
7655                 //\83t\83H\81[\83J\83X\82ª\91¼\82Ì\83A\83v\83\8a\82É\95Ï\82í\82Á\82½\82Æ\82«\82É\83q\83\93\83g\82ð\8fÁ\8b\8e
7656                 if FHint <> nil then begin
7657                         FHint.ReleaseHandle;
7658                         FHint.ClearAllRes;
7659                 end;
7660                 //\83v\83\8c\83r\83\85\81[\82ð\89B\82·
7661                 if FPreviewBrowser <> nil then
7662                         ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
7663         end;
7664
7665 end;
7666 // *************************************************************************
7667 //! \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ª\8f\88\97\9d\82³\82ê\82È\82¢\97á\8aO\82ð\8fE\82Á\82½\82Æ\82«\82Ì\83C\83x\83\93\83g
7668 // *************************************************************************
7669 procedure TGikoForm.GikoApplicationEventsException(Sender: TObject;
7670   E: Exception);
7671 var
7672         s : String;
7673 begin
7674         if (Sender <> nil) then begin
7675                 s := ' [' + Sender.ClassName + ']' + #13#10;
7676         end else begin
7677                 s := ' [ Sender is nil ] ' + #13#10;
7678         end;
7679         s := s + E.Message;
7680         MsgBox(Handle, s, '\8f\88\97\9d\82³\82ê\82È\82©\82Á\82½\97á\8aO', MB_OK or MB_ICONSTOP);
7681 end;
7682 // *************************************************************************
7683 //! \83_\83E\83\93\83\8d\81[\83h\83R\83\93\83g\83\8d\81[\83\8b\83X\83\8c\83b\83h\82Ì\90\90¬
7684 // *************************************************************************
7685 procedure TGikoForm.CreateControlThread();
7686 begin
7687         //\83_\83E\83\93\83\8d\81[\83h\83I\83u\83W\83F\83N\83g
7688         FControlThread := TThreadControl.Create(True);
7689         FControlThread.MaxThreadCount := 1;
7690         FControlThread.Resume;
7691         FControlThread.OnDownloadEnd := DownloadEnd;
7692         FControlThread.OnDownloadMsg := DownloadMsg;
7693         FControlThread.OnWork := Work;
7694         FControlThread.OnWorkBegin := WorkBegin;
7695         FControlThread.OnWorkEnd := WorkEnd;
7696 end;
7697 // *************************************************************************
7698 //! \83u\83\89\83E\83U\82Ì\90\90¬
7699 // *************************************************************************
7700 procedure TGikoForm.CreateBrowsers(count: Integer);
7701 var
7702         i: Integer;
7703         newBrowser: TWebBrowser;
7704 begin
7705         BrowserNullTab := TBrowserRecord.Create;
7706         BrowserNullTab.Browser := Browser;
7707         BrowserNullTab.Browser.Navigate(BLANK_HTML);
7708         FBrowsers := TList.Create;
7709         for i := 0 to count -1 do begin
7710                 FBrowsers.Add(TWebBrowser.Create(BrowserPanel));
7711                 newBrowser := FBrowsers[FBrowsers.Count - 1];
7712                 TOleControl(newBrowser).Parent := BrowserPanel;
7713                 TOleControl(newBrowser).Align := alNone;
7714                 TOleControl(newBrowser).Left    := 0;
7715                 TOleControl(newBrowser).Top     := 0;
7716                 newBrowser.RegisterAsDropTarget := False;
7717                 newBrowser.OnDocumentComplete   := BrowserDocumentComplete;
7718                 newBrowser.OnBeforeNavigate2    := BrowserBeforeNavigate2;
7719                 newBrowser.OnEnter                              := BrowserEnter;
7720                 newBrowser.OnNewWindow2                 := BrowserNewWindow2;
7721                 newBrowser.OnStatusTextChange   := BrowserStatusTextChange;
7722                 newBrowser.Navigate(BLANK_HTML);
7723                 ShowWindow(newBrowser.Handle, SW_HIDE);
7724         end;
7725         BrowserNullTab.Browser.BringToFront;
7726         ShowWindow(BrowserNullTab.Browser.Handle, SW_SHOW);
7727         //\8bN\93®\8e\9e\82É\83^\83u\8e©\93®\95\9c\8c³\82ð\93ü\82ê\82Ä\82¢\82é\82Æ\81A\8bó\83y\81[\83W\97p\82ÌBrowser\82Ì
7728         //\95`\89æ\82ª\8fI\82í\82Á\82Ä\82¢\82È\82­\82Ä\81A\83N\83\8a\83b\83N\83C\83x\83\93\83g\82Ì\90Ý\92è\93\99\82É\93Ë\93ü\82·\82é\82Ì\82Å
7729         //\82±\82±\82Å\8fI\82í\82ç\82¹\82Ä\82¨\82­
7730         while (Browser.ReadyState <> READYSTATE_COMPLETE) and
7731                 (Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
7732                 Application.ProcessMessages;
7733         end;
7734 end;
7735 // *************************************************************************
7736 //! \83c\81[\83\8b\83o\81[\82É\83X\83\8c\8di\8d\9e\82Ý\83R\83\93\83{\83{\83b\83N\83X\82ð\90Ý\92è\82·\82é
7737 // *************************************************************************
7738 procedure TGikoForm.SetSelectComboBox();
7739 const
7740         DUMMYCOMPNAME = 'SelectComboBoxDummy';
7741 var
7742         i: Integer;
7743         ToolButton: TToolButton;
7744 begin
7745         //ListToolBar\82É\82¢\82é\82©\82à\82µ\82ê\82È\82¢\8di\8d\9e\82ÝComboBox\82ð\94z\92u
7746         SelectComboBoxPanel.Visible := False;
7747         try
7748                 for i := ListToolBar.ControlCount - 1 downto 0 do
7749                 begin
7750                         if ListToolBar.Controls[ i ].Action = GikoDM.SelectItemAction then
7751                         begin
7752                                 SelectComboBoxPanel.Left := ListToolBar.Controls[ i ].Left;
7753                                 SelectComboBoxPanel.Width := GikoSys.Setting.SelectComboBoxWidth;
7754                                 SelectComboBoxPanel.Parent := ListToolBar;
7755                                 SelectComboBoxPanel.Visible := True;
7756
7757                                 SelectComboBox.Left := 0;
7758                                 SelectComboBox.Top  := 0;
7759                                 SelectComboBox.Height := SelectComboBoxPanel.ClientHeight;
7760                                 SelectComboBox.Width := SelectComboBoxPanel.Width -
7761                                                                                 SelectComboBoxSplitter.Width;
7762
7763                                 //\88ê\82Â\8c©\82¦\82È\82¢\83{\83^\83\93\82ð\93Ë\82Á\8d\9e\82Þ
7764                                 ToolButton := TToolButton(ListToolBar.FindComponent(DUMMYCOMPNAME));
7765                                 if ToolButton = nil then begin
7766                                         ToolButton := TToolButton.Create(ListToolBar);
7767                                         ToolButton.Name := DUMMYCOMPNAME;
7768                                 end;
7769                                 ToolButton.Style := tbsSeparator;
7770                                 ToolButton.Width := 0;
7771                                 ToolButton.Left  := ListToolBar.Controls[ i ].Left;
7772                                 ListToolBar.InsertControl(ToolButton);
7773                                 ToolButton.Visible := False;
7774
7775                                 // \83X\83\8c\83b\83h\8di\8d\9e\82Ì\97×\82É\83Z\83p\83\8c\81[\83^\82ª\82 \82é\8fê\8d\87\82Í\89B\82·
7776                                 if (i + 1) < ListToolBar.ControlCount then
7777                                         if ListToolBar.Controls[ i + 1 ] is TToolButton then
7778                                                 if TToolButton( ListToolBar.Controls[ i + 1 ] ).Style = tbsSeparator then
7779                                                         ListToolBar.Controls[ i + 1 ].Visible := False;
7780
7781
7782                                 // \83X\83\8c\83b\83h\8di\8d\9e\83{\83^\83\93\82ð\89B\82·
7783                                 ListToolBar.Controls[ i ].Visible := False;
7784
7785                                 break;
7786                         end;
7787                 end;
7788         except
7789         end;
7790 end;
7791 //! \83L\83\83\83r\83l\83b\83g\82Ì\83}\83E\83X\83_\83E\83\93\83C\83x\83\93\83g
7792 procedure TGikoForm.TreeViewMouseDown(Sender: TObject;
7793   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
7794 var
7795         rect : TRect;
7796 begin
7797         case Button of
7798         mbLeft:
7799                 begin
7800                         if (TreeView.Selected <> nil) and
7801                                 (TreeView.Selected = TreeView.GetNodeAt(X, Y)) then begin
7802                                 //\83}\83E\83X\82ªnode\82Ì\8fã\82É\82¢\82é\82©
7803                                 rect := TreeView.Selected.DisplayRect(true);
7804                                 // \83A\83C\83R\83\93\95ª\82¾\82¯\8d\82É\82¸\82ç\82·
7805                                 if ((rect.Left - TreeView.Indent <= X) and (rect.Right >= X)) and
7806                                         ((rect.Bottom >= Y) and (rect.Top <= Y)) then begin
7807                                         // \83N\83\8a\83b\83N\82Æ\83_\83u\83\8b\83N\83\8a\83b\83N\82ð\83R\83R\82Å\94»\92è
7808                                         if ssDouble in Shift then begin
7809                                                 TreeDoubleClick( TreeView.Selected );
7810                                         end else begin
7811                                                 TreeClick(TreeView.Selected);
7812                                         end;
7813                                 end;
7814                         end;
7815                 end;
7816         end;
7817 end;
7818 //! ActionList\82ÌGroupIndex\82Ì\95Û\91
7819 procedure TGikoForm.GetGroupIndex(ActionList: TActionList);
7820 var
7821         i: Integer;
7822 begin
7823         if ActionList <> nil then begin
7824                 SetLength(FActionListGroupIndexes, ActionList.ActionCount);
7825
7826                 for i := 0 to ActionList.ActionCount - 1 do begin
7827                         try
7828                                 FActionListGroupIndexes[i] :=
7829                                         TCustomAction(ActionList.Actions[i]).GroupIndex;
7830                                 TCustomAction(ActionList.Actions[i]).GroupIndex
7831                                         := 0;
7832                         except
7833                                 ;//Cast\82Å\82«\82È\82¢\82Æ\82«\91Î\8dô
7834                         end;
7835                 end;
7836
7837         end;
7838 end;
7839 //! ActionList\82ÌGroupIndex\82Ì\90Ý\92è
7840 procedure TGikoForm.SetGroupIndex(ActionList: TActionList);
7841 var
7842         i: Integer;
7843 begin
7844         if ActionList <> nil then begin
7845                 if Length( FActionListGroupIndexes ) = ActionList.ActionCount then begin
7846                         for i := 0 to ActionList.ActionCount - 1 do begin
7847                                 try
7848                                         TCustomAction(ActionList.Actions[i]).GroupIndex
7849                                                 := FActionListGroupIndexes[i];
7850                                 except
7851                                         ;//Cast\82Å\82«\82È\82¢\82Æ\82«\91Î\8dô
7852                                 end;
7853                         end;
7854                 end;
7855         end;
7856 end;
7857 //! \82±\82Ì\83\8c\83X\82ÌURL\8eæ\93¾
7858 procedure TGikoForm.GetResURLMenuClick(Sender: TObject);
7859 begin
7860 ;
7861 end;
7862 //! ListView\81i\83X\83\8c\83b\83h\88ê\97\97\81j\82ð\8dX\90V\82·\82é
7863 procedure TGikoForm.RefreshListView(Thread: TThreadItem);
7864 begin
7865         //Thread\82Ì\94Â\82Æ\95\\8e¦\82µ\82Ä\82¢\82é\94Â\82ª\93¯\82\82È\82ç\95`\89æ\82ð\8dX\90V\82·\82é
7866         if (FActiveList is TBoard) and (TBoard(ActiveList) = Thread.ParentBoard) then begin
7867                 ListView.Refresh;
7868         end;
7869 end;
7870
7871 initialization
7872                                 OleInitialize(nil);
7873 finalization
7874                                 OleUninitialize;
7875
7876 end.