OSDN Git Service

This commit was manufactured by cvs2svn to create branch 'Bb62'.
[gikonavigoeson/gikonavi.git] / Giko.pas
index d65168e..c57e798 100644 (file)
--- a/Giko.pas
+++ b/Giko.pas
@@ -19,13 +19,12 @@ uses
        {HintWindow,} GikoCoolBar, GikoListView, Search, ExternalBoardManager,
        ExternalBoardPlugInMain, StdActns, Variants, ExtActns,IdTCPConnection,
        IdBaseComponent, IdTCPClient, AppEvnts, BrowserRecord, MoveHistoryItem,
-    ShellAPI,Preview, HistoryList, ResPopupBrowser;
+    ShellAPI,Preview, HistoryList, ResPopupBrowser, ExtPreviewDatamodule;
 
 const
        NGWORDNAME_PANEL = 3;
        THREADSIZE_PANEL = 2;
-    USER_RESPOPUPCLEAR         = WM_USER + 2005;       ///< wParam : TWebBrowser
-       
+    USER_POPUPCLEAR            = WM_USER + 2005;       ///< wParam : TWebBrowser
 type
 
        TToolBarSettingSenderType = (tssNone, tssMain, tssList, tssBrowser);
@@ -417,8 +416,19 @@ type
     IDNG1: TMenuItem;
     IDNG2: TMenuItem;
     ResPopupClearTimer: TTimer;
+    TaskTrayPopupMenu: TPopupMenu;
+    Exit1: TMenuItem;
+    N83: TMenuItem;
+    UpdateGikonaviAction1: TMenuItem;
+    N84: TMenuItem;
+    N85: TMenuItem;
+    URL2: TMenuItem;
+    URLPATHINFO1: TMenuItem;
+    URLQUERYSTRING1: TMenuItem;
+    N86: TMenuItem;
                                procedure FormCreate(Sender: TObject);
                procedure FormDestroy(Sender: TObject);
+        procedure SaveSettingAll();
                procedure BrowserStatusTextChange(Sender: TObject;
                        const Text: WideString);
                procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
@@ -603,6 +613,9 @@ type
                FPreviewBrowserRect: TRect;                     ///< \83v\83\8c\83r\83\85\81[\82Ì\95\\8e¦\88Ê\92u\82ð\8bL\89¯\82·\82é
                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ñ
         FResPopupBrowser: TResPopupBrowser;
+        FUpdateExePath: string;    ///\83M\83R\83i\83r\8dX\90V\83C\83\93\83X\83g\81[\83\89\83p\83X
+        FUpdateExeArgs: string;    ///\83M\83R\83i\83r\8dX\90V\83C\83\93\83X\83g\81[\83\89\88ø\90\94
+        FKokoPopupThreadItem: TThreadItem;
                procedure DownloadEnd(Sender: TObject; Item: TDownloadItem);
                procedure DownloadMsg(Sender: TObject; Item: TDownloadItem; Msg: string; Icon: TGikoMessageIcon);
                procedure WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer; Number: Integer; const AWorkTitle: string);
@@ -680,7 +693,7 @@ type
         //! \82à\82Á\82Æ\82à\8cÃ\82¢Browser\82Ì\8aJ\95ú
         procedure ReleaseOldestBrowser;
         //! \83A\83N\83e\83B\83u\82È\83^\83u\82Æ\93¯\82\94Â\82Ì\8aJ\82¢\82Ä\82¢\82é\83X\83\8c\83b\83h\82ð\83\81\83j\83\85\81[\83A\83C\83e\83\80\82É\92Ç\89Á
-        procedure AddMenuSameBoardThread;
+        procedure AddMenuSameBoardThread(MenuItem: TMenuItem);
         //!  \83A\83N\83e\83B\83u\82È\83^\83u\82Æ\93¯\82\94Â\82Ì\8aJ\82¢\82Ä\82¢\82é\83X\83\8c\83b\83h\83N\83\8a\83b\83N\83C\83x\83\93\83g
         procedure SameBoardThreadSubItemOnClick(Sender: TObject);
         //! \83|\83b\83v\83A\83b\83v\83u\83\89\83E\83U\8dì\90¬
@@ -689,6 +702,12 @@ type
         function isValidFile(FileName: String) : boolean;
         //! ListView\82ÌD&D\8eó\82¯\8eæ\82è
         procedure AcceptDropFiles(var Msg: TMsg);
+        //! \83X\83\8c\83b\83h\88ê\97\97\8dX\90V\8f\88\97\9d
+        procedure UpdateListView();
+        //! \83A\83C\83R\83\93\93Ç\82Ý\8d\9e\82Ý
+        procedure LoadIcon();
+        //! \83|\83b\83v\83A\83b\83v\83\81\83j\83\85\81[\93Ç\82Ý\8d\9e\82Ý
+        procedure LoadPopupMenu();
        protected
                procedure CreateParams(var Params: TCreateParams); override;
                procedure WndProc(var Message: TMessage); override;
@@ -701,7 +720,7 @@ type
                BrowserNullTab: TBrowserRecord;
                FControlThread: TThreadControl;
         FIconData : TNotifyIconData;
-               procedure MoveToURL(const inURL: string);
+               procedure MoveToURL(const inURL: string; KeyMask: Boolean = False);
                function InsertBrowserTab(ThreadItem: TThreadItem; ActiveTab: Boolean = True) : TBrowserRecord;
                procedure ReloadBBS;
                function GetHttpState: Boolean;
@@ -726,6 +745,9 @@ type
                property ScreenCursor : TCursor read GetScreenCursor write SetScreenCursor;
                property ActiveBBS : TBBS read FActiveBBS write FActiveBBS;
                property WorkCount: Integer read FWorkCount write FWorkCount;
+        property UpdateExePath: string read FUpdateExePath write FUpdateExePath;
+        property UpdateExeArgs: string read FUpdateExeArgs write FUpdateExeArgs;
+        
                procedure SetContent(inThread: TBrowserRecord);
                function GetActiveContent(popup :Boolean = false): TThreadItem;
                function GetActiveList: TObject;
@@ -745,6 +767,9 @@ type
                property ListViewBackGroundColor: TColor read FListViewBackGroundColor write SetListViewBackGroundColor;
                property UseOddResOddColor : Boolean read FUseOddResOddColor write FUseOddResOddColor;
                property OddColor : TColor read FOddColor write FOddColor;
+        //! \83\8c\83X\83\81\83j\83\85\81[\83A\83N\83e\83B\83u\83X\83\8c\83b\83h\83A\83C\83e\83\80
+        property KokoPopupThreadItem : TThreadItem read FKokoPopupThreadItem;
+
                function FindToolBarButton( bar : TToolBar; action : TAction ) : TToolButton;
                procedure OnPlugInMenuItem( Sender : TObject );
                procedure TabFileURLReplace(oldURLs: TStringList; newURLs: TStringList);
@@ -815,6 +840,8 @@ type
         procedure TaskTrayIconMessage(var Msg : TMsg); message WM_USER + 2010;
         //! \83^\83X\83N\83g\83\8c\83C\82É\83A\83C\83R\83\93\93o\98^\81\95\83t\83H\81[\83\80\89B\82µ
         procedure StoredTaskTray;
+        //! \93¯ID\83\8c\83X\83A\83\93\83J\81[\95\\8e¦
+        procedure ShowSameIDAncher(const AID: String);
        published
                property EnabledCloseButton: Boolean read FEnabledCloseButton write SetEnabledCloseButton;
        end;
@@ -853,7 +880,7 @@ uses
        About, Option, Round, Splash, Sort, ListSelect, Imm,
        NewBoard, MojuUtils, Clipbrd, GikoBayesian,Y_TextConverter,
        HTMLCreate, ListViewUtils, GikoDataModule, GikoMessage,
-  InputAssistDataModule, Types, ReplaceDataModule;
+  InputAssistDataModule, Types, ReplaceDataModule, PopupMenuUtil;
 
 const
        BLANK_HTML: string = 'about:blank';
@@ -903,7 +930,7 @@ begin
 {$ENDIF}
 //try
        Sort.SetSortDate(Now());
-       
+
        FTreeType := gttNone;
        // \8bN\93®\8e\9e\82É\95Û\91\82³\82ê\82Ä\82µ\82Ü\82¤\91Î\8dô
        FStartUp := true;
@@ -917,6 +944,8 @@ begin
     FResPopupBrowser := nil;
        CreateBrowsers(BROWSER_COUNT);
     FIconData.uID := 0;
+    FUpdateExePath := '';
+    FUpdateExeArgs := '';
 
        //\83\81\83j\83\85\81[\83t\83H\83\93\83g
        SetMenuFont;
@@ -924,6 +953,9 @@ begin
        //\8eè\82Ì\83J\81[\83\\83\8b
        Screen.Cursors[5] := LoadCursor(HInstance, 'GIKOHAND');
 
+    // \83A\83C\83R\83\93\82Ì\93Ç\82Ý\8eæ\82è
+    LoadIcon;
+
        //\83A\83h\83\8c\83X\97\9a\97ð\93Ç\82Ý\8d\9e\82Ý
        AddressHistoryDM.ReadHistory(AddressComboBox.Items, GikoSys.Setting.MaxRecordCount);
 
@@ -1003,7 +1035,11 @@ begin
                case FResRangeMenuSelect of
                Ord( grrKoko ): GikoDM.OnlyKokoResAction.Checked        := True;
                Ord( grrNew ):  GikoDM.OnlyNewResAction.Checked := True;
-               100:                    GikoDM.OnlyAHundredResAction.Checked            := True;
+               10..65535:
+            begin
+                GikoDM.OnlyAHundredResAction.Checked           := True;
+                GikoSys.ResRange := GikoSys.Setting.ResRangeExCount;
+            end;
                end;
        end;
 
@@ -1280,9 +1316,10 @@ begin
        GikoDM.RepaintStatusBar;
        StatusBarResize(Sender);
 
-       dummy1.Caption  := ItemReservPMenu.Caption;
-       dummy1.Hint     := ItemReservPMenu.Hint;
-
+//     dummy1.Caption  := ItemReservPMenu.Caption;
+//     dummy1.Hint     := ItemReservPMenu.Hint;
+    // \83u\83\89\83E\83U\83|\83b\83v\83A\83b\83v\83\81\83j\83\85\81[\82Ì\8f\89\8aú\89»
+    PopupMenuUtil.ReadSetting(GikoDM.GikoFormActionList, BrowserTabPopupMenu);
     // \83}\83E\83X\83W\83F\83X\83`\83\83\81[
     MouseGesture := TMouseGesture.Create;
 
@@ -1298,7 +1335,8 @@ begin
        if GikoSys.Setting.AutoLogin then
                GikoDM.LoginAction.Execute;
 
-       GikoSys.Setting.BeLogin := GikoSys.Setting.BeAutoLogin;
+    if GikoSys.Setting.BeAutoLogin then
+        GikoDM.BeLogInOutAction.Execute;
 
        //\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è
        FavoriteAddToolButton.Caption := '\92Ç\89Á...';
@@ -1316,10 +1354,16 @@ begin
     // D&D\82ð\8eó\82¯\8eæ\82é
     DragAcceptFiles(ListView.Handle, True);
 
+
     // \8f\89\8aú\89»\82É\8e¸\94s\82µ\82½\83\82\83W\83\85\81[\83\8b\83`\83F\83b\83N
     if (FavoriteDM.AbEnd) then begin
-        GikoUtil.MsgBox(Self.Handle, '\82¨\8bC\82É\93ü\82è\82Ì\8f\89\8aú\89»\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B\83M\83R\83i\83r\82ð\8fI\97¹\82µ\82Ü\82·\81B',
+        GikoUtil.MsgBox(Self.Handle,
+            '\82¨\8bC\82É\93ü\82è\82Ì\8f\89\8aú\89»\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B\83M\83R\83i\83r\82ð\8fI\97¹\82µ\82Ü\82·\81B'#13#10 +
+            '\83M\83R\83i\83r\83t\83H\83\8b\83_\82ð\8aJ\82«\82Ü\82·\81Aconfig/' + Favorite.FAVORITE_FILE_NAME +
+            ' \82ð config/~' + Favorite.FAVORITE_FILE_NAME + '(\91O\89ñ\8bN\93®\8e\9e\82Ì\82¨\8bC\82É\93ü\82è)\82Å'#13#10 +
+             '\92u\82«\8a·\82¦\82é\8e\96\82Å\92¼\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B',
             '\8f\89\8aú\89»\88Ù\8fí');
+        GikoDM.GikoFolderOpenAction.Execute;
         Self.Close;
     end;
 
@@ -1446,8 +1490,8 @@ var
        item        : TThreadItem;
 begin
        if FStartUp then begin
+       FStartUp := false;
                ShowWindow(Application.Handle, SW_HIDE);
-
                //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½
                //\83c\81[\83\8b\83o\81[\95\\8e¦
                GikoDM.StdToolBarVisibleAction.Checked := GikoSys.Setting.StdToolBarVisible;
@@ -1472,31 +1516,30 @@ begin
 //             ResetBandInfo( ListCoolBar, ListToolBar );
                FIsIgnoreResize := rtNone;
 
+        //ActionList\82ÌGroupIndex\82ð\8c³\82É\96ß\82·
+               SetGroupIndex(GikoDM.GikoFormActionList);
+
                //FormCrete\82©\82ç\88Ú\93®\81B
                if GikoSys.Setting.TabAutoLoadSave then begin
             GikoDM.TabsOpenAction.Tag := 1;
                        GikoDM.TabsOpenAction.Execute;
             GikoDM.TabsOpenAction.Tag := 0;
             if (GikoSys.Setting.LastCloseTabURL <> '') then begin
-                PostMessage( Handle, USER_DOCUMENTCOMPLETE, Integer( FActiveContent.Browser ), 0 );
                 if ( FActiveContent <> nil) and (FActiveContent.Browser <> nil) then begin
                        while (FActiveContent.Browser.ReadyState <> READYSTATE_COMPLETE) and
                                (FActiveContent.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
-                               Application.ProcessMessages;
+                        // \83\81\83b\83Z\81[\83W\82ð\8eó\82¯\8eæ\82ç\82È\82¢\82æ\82¤\82É\83X\83\8a\81[\83v\82É\95Ï\8dX
+                        Sleep(1);
                     end;
                        end;
                 item := BBSsFindThreadFromURL( GikoSys.Setting.LastCloseTabURL );
+                GikoSys.Setting.LastCloseTabURL := '';
                 if (item <> nil) and (item.IsLogFile) then begin
                     OpenThreadItem(item, item.URL);
                 end;
-                GikoSys.Setting.LastCloseTabURL := '';
+                //ShowWindow(Self.Handle, SW_SHOW);
             end;
                end;
-
-        //ActionList\82ÌGroupIndex\82ð\8c³\82É\96ß\82·
-               SetGroupIndex(GikoDM.GikoFormActionList);
-
-               FStartUp := false;
        end;
 end;
 
@@ -1536,33 +1579,29 @@ begin
 
        Application.UnhookMainWindow(Hook);
     //\83A\83v\83\8a\83P\81[\83V\83\87\83\93\8fI\97¹\82Ì\91O\82É\83_\83E\83\93\83\8d\81[\83h\83X\83\8c\83b\83h\82É\90³\8fí\8fI\97¹\82ð\91£\82·
+    FControlThread.DownloadAbort;
     FControlThread.Terminate;
+
+    //OnDestory\82¾\82Æ\8dÄ\8bN\93®\82ð\82©\82¯\82½\82Æ\82«\82È\82Ç\82É\95Û\91\82³\82ê\82È\82¢\82Ì\82ÅOnCloseQuery\82Å\90Ý\92è\95Û\91
+    SaveSettingAll();
+    
        Application.Terminate;
 end;
 
-procedure TGikoForm.FormDestroy(Sender: TObject);
+procedure TGikoForm.SaveSettingAll();
 var
-       i                               : Integer;
        wp                      : TWindowPlacement;
-       tmpBool : Boolean;
+    WindowPlacement: TWindowPlacement;
 begin
-       // \83}\83E\83X\83W\83F\83X\83`\83\83\81[\8aJ\95ú
-       try
-        if GikoSys.Setting.GestureEnabled then begin
-               MouseGesture.OnGestureStart := nil;
-                   MouseGesture.OnGestureMove := nil;
-                   MouseGesture.OnGestureEnd := nil;
-        end;
-        MouseGesture.Clear;
-               MouseGesture.UnHook;
-        MouseGesture.Free;
-       except
-       end;
        try
                ActiveListColumnSave;
        except
        end;
+
        try
+        WindowPlacement.length := SizeOf(TWindowPlacement);
+        GetWindowPlacement(Self.Handle, @WindowPlacement);
+
                //\8dÅ\91å\89»\81E\83E\83B\83\93\83h\83E\88Ê\92u\95Û\91
                wp.length := sizeof(wp);
                GetWindowPlacement(Handle, @wp);
@@ -1570,8 +1609,8 @@ begin
                GikoSys.Setting.WindowLeft := wp.rcNormalPosition.Left;
                GikoSys.Setting.WindowHeight := wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top;
                GikoSys.Setting.WindowWidth := wp.rcNormalPosition.Right - wp.rcNormalPosition.Left;
-               GikoSys.Setting.WindowMax := WindowState = wsMaximized;
-
+               GikoSys.Setting.WindowMax := (WindowState = wsMaximized) or
+                                        (WindowPlacement.flags = WPF_RESTORETOMAXIMIZED);
                GikoSys.Setting.ListStyle := ListView.ViewStyle;
                GikoSys.Setting.CabinetVisible := GikoDM.CabinetVisibleAction.Checked;
                GikoSys.Setting.CabinetWidth := CabinetPanel.Width;
@@ -1591,21 +1630,13 @@ begin
                        GikoSys.Setting.ResRange := FResRangeMenuSelect;
        except
        end;
-       if WindowState <> wsNormal then
-               WindowState := wsNormal;
-       SaveCoolBarSettings;
-       try
-               GikoSys.Setting.WriteWindowSettingFile;
-               GikoSys.Setting.WriteNameMailSettingFile;
-       except
-       end;
-       // \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è
-       // \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¢
-
-               // \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
-       // CoolBar \95Û\91
-       //if (GikoForm.WindowState <> wsMinimized) and (GikoForm.WindowState <> wsMaximized) then
-
+    //\8d¡\82Ìwinodw\82Ì\83X\83^\83C\83\8b\82ÅCoolBar\82Ì\88Ê\92u\81A\83E\83B\83\93\83h\83E\82Ì\88Ê\92u\82ð\95Û\91
+    SaveCoolBarSettings;
+    GikoSys.Setting.WriteWindowSettingFile;
+    // \96¼\91O\82Æ\83\81\81[\83\8b\82Ì\95Û\91\82È\82Ì\82Å\83G\83f\83B\83^\82ª\95Â\82\82½\8cã\82È\82ç\82¢\82Â\82Å\82à\82¢\82¢
+    GikoSys.Setting.WriteNameMailSettingFile;
+    // \96`\8c¯\82Ì\8f\91\82Ì\95Û\91
+    GikoSys.Setting.WriteBoukenSettingFile;
        //\93ü\97Í\83A\83V\83X\83g\8b@\8d\\82Ì\90Ý\92è\82Ì\95Û\91
        InputAssistDM.SaveToFile(GikoSys.GetInputAssistFileName);
 
@@ -1616,10 +1647,71 @@ begin
         if not (FavoriteDM.AbEnd) then begin
                FavoriteDM.WriteFavorite;
         end;
+       except
+       end;
+
+       //\83A\83h\83\8c\83X\97\9a\97ð\95Û\91
+       try
+               //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
+               AddressHistoryDM.WriteHistory(AddressComboBox.Items, GikoSys.Setting.MaxRecordCount);
+       except
+       end;
+
+       //\83q\83X\83g\83\8a\83\8a\83X\83g\95Û\91
+       try
+               FHistoryList.SaveToFile(GikoSys.GetConfigDir + 'History.xml');
+       except
+       end;
+
+       //\8f\84\89ñ\83\8a\83X\83g\95Û\91
+       try
+               RoundList.SaveRoundFile;
+       except
+       end;
+
+    // \83^\83X\83N\83g\83\8c\83C\82Ì\83A\83C\83R\83\93\8dí\8f\9c
+    if (FIconData.uID <> 0) then begin
+        Shell_NotifyIcon(NIM_DELETE, @FIconData);
+    end;
+
+end;
+
+procedure TGikoForm.FormDestroy(Sender: TObject);
+var
+       i                               : Integer;
+       tmpBool : Boolean;
+begin
+    //\88ê\8e\9e\93I\82É\92Ê\8fí\83X\83^\83C\83\8b\82É\96ß\82µ\82ÄCoolBar\82Ì\88Ê\92u\81A\83E\83B\83\93\83h\83E\82Ì\88Ê\92u\82ð\95Û\91
+    //\81¦\92\8d\88Ó\81FOnDestroy\82Å\8eg\82¤\82±\82Æ\82µ\82©\8dl\97\82³\82ê\82Ä\82¢\82È\82¢
+    //        \91¼\82Å\82â\82é\82Æ\8dÄ\95`\89æ\82ª\94­\90\82·\82é
+       if WindowState <> wsNormal then begin
+               WindowState := wsNormal;
+        try
+               SaveCoolBarSettings;
+                   GikoSys.Setting.WriteWindowSettingFile;
+       except
+           end;
+    end;
+
+       // \83}\83E\83X\83W\83F\83X\83`\83\83\81[\8aJ\95ú
+       try
+        if GikoSys.Setting.GestureEnabled then begin
+               MouseGesture.OnGestureStart := nil;
+                   MouseGesture.OnGestureMove := nil;
+                   MouseGesture.OnGestureEnd := nil;
+        end;
+        MouseGesture.Clear;
+               MouseGesture.UnHook;
+        MouseGesture.Free;
+       except
+       end;
+
+       //\82¨\8bC\82É\93ü\82è\94j\8aü
+       try
                FavoriteDM.Clear;
        except
        end;
-       //LockWindowUpdate(Self.Handle);
+
        try
                //\83^\83u\83N\83\8d\81[\83Y
                tmpBool := GikoSys.Setting.ShowDialogForAllTabClose;
@@ -1628,8 +1720,14 @@ begin
                GikoSys.Setting.ShowDialogForAllTabClose := tmpBool;
        except
        end;
+
        try
                for i := FBrowsers.Count - 1 downto 0 do begin
+            GikoSys.ShowRefCount('browser' + IntToStr(i), TWebBrowser(FBrowsers[i]).ControlInterface);
+            GikoSys.ShowRefCount('document' + IntToStr(i), TWebBrowser(FBrowsers[i]).ControlInterface.Document);
+               end;
+
+               for i := FBrowsers.Count - 1 downto 0 do begin
                        TWebBrowser(FBrowsers[i]).Free;
                end;
                FBrowsers.Clear;
@@ -1637,6 +1735,7 @@ begin
        finally
                FBrowsers.Free;
        end;
+
        try
                if BrowserNullTab <> nil then begin
                        BrowserNullTab.Browser := nil;  {*BrowserNullTab\82ÌBrowser\82Í\90Ý\8cv\8e\9e\82É\93\\82è\95t\82¯\82Ä\82é\93z
@@ -1655,18 +1754,6 @@ begin
        except
        end;
 
-       //\83A\83h\83\8c\83X\97\9a\97ð\95Û\91
-       try
-               //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
-               AddressHistoryDM.WriteHistory(AddressComboBox.Items, GikoSys.Setting.MaxRecordCount);
-       except
-       end;
-
-       //\83q\83X\83g\83\8a\83\8a\83X\83g\95Û\91
-       try
-               FHistoryList.SaveToFile(GikoSys.GetConfigDir + 'History.xml');
-       except
-       end;
        try
                try
                        FHistoryList.Clear;
@@ -1676,11 +1763,7 @@ begin
                FHistoryList.Free;
        end;
 
-       //\8f\84\89ñ\83\8a\83X\83g\95Û\91¶&\94j\8aü
-       try
-               RoundList.SaveRoundFile;
-       except
-       end;
+
        try
                try
                        RoundList.Clear;
@@ -1692,7 +1775,7 @@ begin
 
        try
         try
-            FControlThread.DownloadAbort;
+            //FControlThread.DownloadAbort;
             FControlThread.Terminate;
             FControlThread.WaitFor;
         except
@@ -1721,6 +1804,7 @@ begin
                                BBSs[ i ].Free;
                        BBSs[ i ] := nil;
                end;
+        DestorySpecialBBS(BoardGroup.SpecialBBS);
        except
        end;
 
@@ -1743,7 +1827,12 @@ begin
                end;
        except
        end;
-       //LockWindowUpdate(0);
+
+    // Update\82ª\82¢\82ê\82Î\8eÀ\8ds\82·\82é
+    if FileExists(FUpdateExePath) then begin
+        // \83A\83b\83v\83f\81[\83g\8eÀ\8ds
+        GikoSys.CreateProcess(FUpdateExePath, FUpdateExeArgs);
+    end;
 end;
 
 // \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
@@ -1909,31 +1998,41 @@ var
        e: IHTMLElement;
        Ext: string;
        PathRec: TPathRec;
-  Text2: string;
+    Text2: string;
     cResPopup: TResPopupBrowser;
+    senderBrowser :TWebBrowser;
+    doc: IHTMLDocument2;
 begin
-       // \83M\83R\83i\83r\82Í\83\8c\83X\83A\83\93\83J\81[\82ª about:blank.. \82Å\8en\82Ü\82é\82±\82Æ\82ð\8aú\91Ò\82µ\82Ä\82¢\82é\82ª
-  // IE 7 \82Å\82Í about:blank.. \82Å\82Í\82È\82­ about:.. \82É\82È\82é\82Ì\82Å\81A\92u\8a·\82·\82é(\93\8a\82°\82â\82è)
-       if Pos('about:..', Text) = 1 then
-       Text2 := 'about:blank..' + Copy( Text, Length('about:..')+1, Length(Text) )
-  else
-       Text2 := Text;
+    // \83M\83R\83i\83r\82Í\83\8c\83X\83A\83\93\83J\81[\82ª about:blank.. \82Å\8en\82Ü\82é\82±\82Æ\82ð\8aú\91Ò\82µ\82Ä\82¢\82é\82ª
+    // IE 7 \82Å\82Í about:blank.. \82Å\82Í\82È\82­ about:.. \82É\82È\82é\82Ì\82Å\81A\92u\8a·\82·\82é(\93\8a\82°\82â\82è)
+    if Pos('about:..', Text) = 1 then
+        Text2 := 'about:blank..' + Copy( Text, Length('about:..')+1, Length(Text) )
+    else
+        Text2 := Text;
+
        if not( TObject(Sender) is TWebBrowser )then
                Exit;
+
+    senderBrowser := TWebBrowser(Sender);
+    doc := senderBrowser.ControlInterface.Document as IHTMLDocument2;
+
        try
                try
-                       if (TWebBrowser(Sender) <> nil) and (not TWebBrowser(Sender).Busy) and (Assigned(TWebBrowser(Sender).Document)) then begin
-                               if LowerCase(OleVariant(IHTMLDocument2(TWebBrowser(Sender).Document)).charset) <> 'shift_jis' then begin
-                                       OleVariant(IHTMLDocument2(TWebBrowser(Sender).Document)).charset := 'shift_jis';
+                       if ((not senderBrowser.Busy) and Assigned(doc)) then begin
+                               if LowerCase(doc.charset) <> 'shift_jis' then begin
+                                       doc.charset := 'shift_jis';
                                end;
                        end;
                except
                end;
        finally
        end;
+
        if PreviewTimer.Enabled then
                PreviewTimer.Enabled := False;
+
        Application.CancelHint;
+
        try
                if GetActiveContent <> nil then
                        ActiveFileName := ChangeFileExt(ExtractFileName(GetActiveContent.FileName), '')
@@ -1943,6 +2042,7 @@ begin
                FActiveContent := nil;
                Exit;
        end;
+
     // \91O\89ñ\82Æ\93¯\82\8fê\8d\87\8fI\97¹
     if (StatusBar.Panels[1].Text = Text2) then begin
         if Text2 = '' then begin
@@ -1992,11 +2092,15 @@ begin
 
 //file:///C:/Borland/Projects/gikoNavi/test/read.cgi/qa/990576336/10
 //file:///C:/Borland/Projects/gikoNavi/test/read.cgi/qa/990576336/10-15
-
+    // \91¼\82Ì\83A\83v\83\8a\82Å\8f\88\97\9d\82·\82éURL\82©\8am\94F
+    if (ExtPreviewDM.PreviewURL(Text2)) then begin
+        Exit;
+    end;
        s := '';
        Ext := AnsiLowerCase(ExtractFileExt(Text2));
        if (Pos('http://', Text2) = 1) and (GikoSys.Setting.PreviewVisible) and
-                       ((Ext = '.jpg') or (Ext = '.jpeg') or (Ext = '.gif') or (Ext = '.png')) then begin
+                       ((Ext = '.jpg') or (Ext = '.jpeg') or (Ext = '.gif') or (Ext = '.png')) or
+        (Pos('http://www.nicovideo.jp/watch/', Text2) = 1)  then begin
                if FPreviewBrowser = nil then begin
                        FPreviewBrowser := TPreviewBrowser.Create(Self);
                        ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
@@ -2011,9 +2115,9 @@ begin
                        s := StringReplace(Text2, 'mailto:', '', [rfIgnoreCase]);
                        //\83M\83R\83i\83r\83X\83\8c \83p\81[\83g3\82Ì466\8e\81\82É\8a´\8eÓ
                        GetCursorPos(p);
-                       p.x := p.x - TWebBrowser(Sender).ClientOrigin.x;
-                       p.y := p.y - TWebBrowser(Sender).ClientOrigin.y;
-                       e := IHTMLDocument2(TWebBrowser(Sender).Document).elementFromPoint(p.x, p.y);
+                       p.x := p.x - senderBrowser.ClientOrigin.x;
+                       p.y := p.y - senderBrowser.ClientOrigin.y;
+                       e := doc.elementFromPoint(p.x, p.y);
                        if (Assigned(e)) then begin
                 CreateResPopupBrowser;
 
@@ -2026,7 +2130,7 @@ begin
                 end;
 
                 cResPopup := FResPopupBrowser.CreateNewBrowser;
-                               tmp2 := ZenToHan(e.Get_outerText);
+                               tmp2 := Trim(ZenToHan(e.Get_outerText));
                                if (GikoSys.IsNumeric(tmp2)) then begin
                                        //\82\93\82Í\83\8c\83X\94Ô\8d\86\82Á\82Û\82¢\82Á\82·\81B
                                        wkIntSt := StrToInt64(tmp2);
@@ -2283,9 +2387,10 @@ begin
 {$IFDEF DEBUG}
        Writeln(URL);
 {$ENDIF}
+    FKokoPopupThreadItem := nil;
        if Pos(kMenuName, URL) <> 0 then begin
                sNo := Copy( URL, Pos( kMenuName, URL ) + Length( kMenuName ), Length( URL ) );
-               
+
                if not GikoSys.IsNumeric(sNo) then Exit;
 
                Cancel := True;
@@ -2293,10 +2398,27 @@ begin
         KokoPopupMenu.PopupComponent := nil;
         if (Sender is TComponent) then
             KokoPopupMenu.PopupComponent := TComponent(Sender);
+        // \8cë\94\9a\91Î\8dô \83N\83\8a\83b\83N\82µ\82½\83u\83\89\83E\83U\82Æ\88Ù\82È\82é\82Æ\82«\82É\8fÁ\82·\8f\88\97\9d\82ð\92Ç\89Á
+        if not (Sender is TResPopupBrowser) then begin
+            if (FResPopupBrowser <> nil) and (FResPopupBrowser.CurrentBrowser.Visible = True) then begin
+                FResPopupBrowser.Clear;
+            end;
+        end else begin
+            if (Sender <> FResPopupBrowser.CurrentBrowser) then begin
+                TResPopupBrowser(Sender).ChildClear;
+            end;
+        end;
+        FKokoPopupThreadItem := GetActiveContent(true);
                KokoPopupMenu.Tag := StrToInt(sNo);
                KokoPopupMenu.Popup(p.x, p.y);
        end else if Pos('mailto', LowerCase(URL)) <> 0 then begin
                Cancel := not GikoSys.Setting.OpenMailer;
+
+        //@\82Æ.\82ð\8aÜ\82Ü\82È\82¢URL\82Í\83\81\81[\83\8b\83A\83h\83\8c\83X\82Æ\82Ý\82È\82³\82È\82¢
+        //\8eå\82Éage\81Asage\91Î\8dô
+        if (Pos('@', URL) = 0) or (Pos('.', URL) = 0) then begin
+            Cancel := True;
+        end;
        end;
 
 end;
@@ -2533,26 +2655,15 @@ begin
 
                                //\8f\84\89ñ\82 \82è\82Ì\8fê\8d\87\81\95\82P\82O\82O\82O\92´\82Í\8f\84\89ñ\8dí\8f\9c
                                if (Item.ThreadItem.Round) and (Item.ThreadItem.Count > 1000) then begin
-                                       Item.ThreadItem.Round := False;
-                                       //Item.ThreadItem.RoundName := '';
-                                       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);
+                    // 2ch\88È\8aO\82Í\81A1000\82ª\8dÅ\8d\82\82©\95s\96¾\82È\82Ì\82Å\81A2ch\8cÀ\92è\82É\82·\82é
+                    if (Item.ThreadItem.ParentBoard.Is2ch) then begin
+                                       Item.ThreadItem.Round := False;
+                                       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);
+                    end;
                                end;
                                TreeView.Refresh;
                                //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
-                               if (ActiveList <> nil) and (ActiveList is TBoard) then begin
-                                       TBoard(ActiveList).LogThreadCount := TBoard(ActiveList).GetLogThreadCount;
-                                       TBoard(ActiveList).NewThreadCount := TBoard(ActiveList).GetNewThreadCount;
-                                       TBoard(ActiveList).UserThreadCount:= TBoard(ActiveList).GetUserThreadCount;
-                    //ListView\82Ì\83A\83C\83e\83\80\82Ì\8cÂ\90\94\82à\8dX\90V
-                                       case GikoForm.ViewType of
-                                               gvtAll: ListView.Items.Count := TBoard(ActiveList).Count;
-                                               gvtLog: ListView.Items.Count := TBoard(ActiveList).LogThreadCount;
-                                               gvtNew: ListView.Items.Count := TBoard(ActiveList).NewThreadCount;
-                                               gvtArch: ListView.Items.Count := TBoard(ActiveList).ArchiveThreadCount;
-                                               gvtLive: ListView.Items.Count := TBoard(ActiveList).LiveThreadCount;
-                                               gvtUser: ListView.Items.Count := TBoard(ActiveList).UserThreadCount;
-                                       end;
-                               end;
+                UpdateListView();
                                RefreshListView(Item.ThreadItem);
                        end;
 
@@ -2801,7 +2912,7 @@ var
        BBSID: string;
        FileName: string;
        sTitle: string;
-       doc: Variant;
+       doc: OleVariant;
        s: string;
        idx: Integer;
        ThreadItem: TThreadItem;
@@ -2815,14 +2926,14 @@ begin
         (FActiveContent <> nil) and
                (FActiveContent.Thread <> Thread.Thread) and
                (FActiveContent.Browser <> nil) and
-               (Assigned(FActiveContent.Browser.Document)) then begin
-               try
-               try
-                       FActiveContent.Thread.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document).Body).ScrollTop;
-               except
-                       on E: Exception do
-                               MsgBox(Handle, E.Message, 'SetContent[<-ScrollTop]', 0);
-               end;
+               (Assigned(FActiveContent.Browser.ControlInterface.Document)) then begin
+        try
+            try
+                FActiveContent.Thread.ScrollTop := FActiveContent.Browser.OleObject.Document.Body.ScrollTop;
+            except
+            on E: Exception do
+                MsgBox(Handle, E.Message, 'SetContent[<-ScrollTop]', 0);
+        end;
                finally
                end;
        end;
@@ -2874,7 +2985,7 @@ begin
                                ShowWindow(FActiveContent.Browser.Handle, SW_HIDE);
                end;
                ShowWindow(Thread.Browser.Handle, SW_SHOW);
-               if (not Assigned(Thread.Browser.Document)) then begin
+               if (not Assigned(Thread.Browser.ControlInterface.Document)) then begin
                        Thread.Browser.Navigate('about:blank');
                end;
                while (Thread.Browser.ReadyState <> READYSTATE_COMPLETE) and
@@ -2912,7 +3023,7 @@ begin
                        try
                                Thread.Browser.BringToFront;
                                s := '<HTML><BODY><CENTER>\82±\82Ì\83X\83\8c\83b\83h\82Í\8eæ\93¾\82µ\82Ä\82¢\82Ü\82¹\82ñ</CENTER></BODY></HTML>';
-                               doc := Idispatch( olevariant(Thread.Browser.ControlInterface).Document) as IHTMLDocument2;
+                               doc := Thread.Browser.OleObject.Document;
                                doc.open;
                                doc.charset := 'Shift_JIS';
                                doc.Write(s);
@@ -3044,6 +3155,9 @@ begin
                BBSs[i].SelectText := SelectText;
                BBSs[i].KubetsuChk := KubetsuChk;
        end;
+    BoardGroup.SpecialBBS.SelectText := SelectText;
+    BoardGroup.SpecialBBS.KubetsuChk := KubetsuChk;
+    
        ViewType := AViewType;
        if ActiveList is TBoard then begin
                Board := TBoard(ActiveList);
@@ -3643,29 +3757,32 @@ begin
 end;
 procedure TGikoForm.DeleteTab(index, selectIndex: Integer);
 var
-    doc: Variant;
+    browserRec : TBrowserRecord;
+    doc: OleVariant;
     j: Integer;
 begin
+    browserRec := TBrowserRecord(BrowserTab.Tabs.Objects[index]);
     try
-        if TBrowserRecord(BrowserTab.Tabs.Objects[index]).Browser <> nil then begin
-            doc := TBrowserRecord(BrowserTab.Tabs.Objects[index]).Browser.Document;
-            TBrowserRecord(BrowserTab.Tabs.Objects[index]).Thread.ScrollTop := doc.Body.ScrollTop;
+        if browserRec.Browser <> nil then begin
+            doc := browserRec.Browser.OleObject.Document;
+            browserRec.Thread.ScrollTop := doc.Body.ScrollTop;
         end;
     except
-        TBrowserRecord(BrowserTab.Tabs.Objects[index]).Thread.ScrollTop := 0;
+        browserRec.Thread.ScrollTop := 0;
     end;
-    if(FActiveContent = TBrowserRecord(BrowserTab.Tabs.Objects[index])) then
+
+    if(FActiveContent = browserRec) then
         FActiveContent := nil;
-    if TBrowserRecord(BrowserTab.Tabs.Objects[index]).Browser <> nil then begin
-        j := FBrowsers.IndexOf(TBrowserRecord(BrowserTab.Tabs.Objects[index]).Browser);
+    if browserRec.Browser <> nil then begin
+        j := FBrowsers.IndexOf(browserRec.Browser);
         if j <> -1 then
             FBrowsers.Move(j, BROWSER_COUNT - 1);
     end;
+
     BrowserTab.Tabs.BeginUpdate;
     try
-        GikoSys.Setting.LastCloseTabURL :=
-            TBrowserRecord(BrowserTab.Tabs.Objects[index]).Thread.URL;
-        TBrowserRecord(BrowserTab.Tabs.Objects[index]).Free;
+        GikoSys.Setting.LastCloseTabURL := browserRec.Thread.URL;
+        browserRec.Free;
         if ( BrowserTab.Tabs.Count - 1 = index ) and
             ( BrowserTab.TabRect(index).Left
                 <= BrowserTab.DisplayRect.Left ) then begin
@@ -3686,6 +3803,7 @@ begin
     if BrowserTab.Tabs.Count = 0 then begin
         BrowserNullTab.Thread := nil;
     end;
+
     if(BrowserTab.TabIndex <> -1) and
         ( TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser = nil) then begin
         // \88ê\94Ô\8cÃ\82¢\83u\83\89\83E\83U\82ð\8aJ\95ú\82·\82é
@@ -3753,6 +3871,7 @@ begin
                TreeSelectFavoriteAddPupupMenu.Visible := False;
                TreeSelectLogDeleteSeparator.Visible := False;
                TreeSelectLogDeletePopupMenu.Visible := False;
+        SearchBoardName.Visible := False;
        end else if TObject(FClickNode.Data) is TBoard then begin
                TreeSelectThreadPupupMenu.Visible := False;
                TreeSelectBoardPupupMenu.Visible := True;
@@ -3763,6 +3882,7 @@ begin
                TreeSelectFavoriteAddPupupMenu.Visible := True;
                TreeSelectLogDeleteSeparator.Visible := False;
                TreeSelectLogDeletePopupMenu.Visible := False;
+        SearchBoardName.Visible := True;
        end else if TObject(FClickNode.Data) is TFavoriteBoardItem then begin
                TreeSelectThreadPupupMenu.Visible := False;
                TreeSelectBoardPupupMenu.Visible := True;
@@ -3773,6 +3893,7 @@ begin
                TreeSelectFavoriteAddPupupMenu.Visible := True;
                TreeSelectLogDeleteSeparator.Visible := False;
                TreeSelectLogDeletePopupMenu.Visible := False;
+        SearchBoardName.Visible := False;
        end else if (TObject(FClickNode.Data) is TThreadItem) then begin
                TreeSelectThreadPupupMenu.Visible := True;
                TreeSelectBoardPupupMenu.Visible := False;
@@ -3783,6 +3904,7 @@ begin
                TreeSelectFavoriteAddPupupMenu.Visible := True;
                TreeSelectLogDeleteSeparator.Visible := True;
                TreeSelectLogDeletePopupMenu.Visible := True;
+        SearchBoardName.Visible := False;
        end else if (TObject(FClickNode.Data) is TFavoriteThreadItem) then begin
                TreeSelectThreadPupupMenu.Visible := True;
                TreeSelectBoardPupupMenu.Visible := False;
@@ -3793,6 +3915,7 @@ begin
                TreeSelectFavoriteAddPupupMenu.Visible := True;
                TreeSelectLogDeleteSeparator.Visible := True;
                TreeSelectLogDeletePopupMenu.Visible := True;
+        SearchBoardName.Visible := False;
        end else if (TObject(FClickNode.Data) is TCategory) then begin
                TreeSelectThreadPupupMenu.Visible := False;
                TreeSelectBoardPupupMenu.Visible := False;
@@ -3803,6 +3926,7 @@ begin
                TreeSelectFavoriteAddPupupMenu.Visible := False;
                TreeSelectLogDeleteSeparator.Visible := False;
                TreeSelectLogDeletePopupMenu.Visible := False;
+        SearchBoardName.Visible := True;
        end else if FClickNode.IsFirstNode then begin
                TreeSelectThreadPupupMenu.Visible := False;
                TreeSelectBoardPupupMenu.Visible := False;
@@ -3813,6 +3937,7 @@ begin
                TreeSelectFavoriteAddPupupMenu.Visible := False;
                TreeSelectLogDeleteSeparator.Visible := False;
                TreeSelectLogDeletePopupMenu.Visible := False;
+        SearchBoardName.Visible := True;
        end else begin
                TreeSelectThreadPupupMenu.Visible := False;
                TreeSelectBoardPupupMenu.Visible := False;
@@ -3823,6 +3948,7 @@ begin
                TreeSelectFavoriteAddPupupMenu.Visible := False;
                TreeSelectLogDeleteSeparator.Visible := False;
                TreeSelectLogDeletePopupMenu.Visible := False;
+        SearchBoardName.Visible := False;
        end;
 end;
 
@@ -3838,90 +3964,103 @@ var
     BNum, BRes: string;
     threadItem: TThreadItem;
     aElement : IHTMLElement;
+    senderBrowser : TWebBrowser;
+    doc : IHTMLDocument2;
 begin
 {$IFDEF DEBUG}
        Writeln(IntToStr(Integer(ppDisp)));
 {$ENDIF}
        Cancel := True;
-    aElement := IHTMLDocument2(TWebBrowser(Sender).Document).activeElement;
-       if ( aElement <> nil) then begin
-               Text := aElement.Get_outerText;
-               Html := aElement.Get_outerHTML;
-               if(AnsiPos('>>', Text) = 1) or (AnsiPos('>', Text) = 1)
-                       or (AnsiPos('\81\84\81\84', Text) = 1) or (AnsiPos('\81\84', Text) = 1) then begin
-                       if GikoSys.Setting.ResAnchorJamp then begin
-
-                               Text := ZenToHan(Trim(Text));
-
-                               if(AnsiPos('>>', Text) = 1) then begin
-                                       //Text := Copy(Text, 3, Length(Text) - 2);
-                                       Delete(Text, 1, 2);
-                               end else begin
-                                       //Text := Copy(Text, 2, Length(Text) - 1);
-                                       Delete(Text, 1, 1);
-                               end;
 
-                               if AnsiPos('-', Text) <> 0 then begin
-                                       wkIntSt := StrToIntDef(Copy(Text, 1, AnsiPos('-', Text) - 1), 0);
-                                       Text := Copy(Text, AnsiPos('-', Text) + 1, Length(Text));
-                                       wkIntTo := StrToIntDef(Text, 0);
-                                       if wkIntTo < wkIntSt then
-                                               wkIntSt := wkIntTo;
-                               end else begin
-                                       wkIntSt := StrToIntDef(Text, 0);
-                               end;
+       if not( TObject(Sender) is TWebBrowser )then
+               Exit;
 
-                               if wkIntSt <> 0 then begin
-                       FActiveContent.IDAnchorPopup('');
-                    MoveHisotryManager.pushItem(FActiveContent);
-                    if (Sender is TResPopupBrowser) then begin
-                        TResPopupBrowser(Sender).ChildClear;
-                        OpenThreadItem(
-                            GetActiveContent(true),
-                            GetActiveContent(true).URL + '&st=' +
-                                 IntToStr(wkIntSt) + '&to=' + IntToStr(wkIntSt));
-                    end else begin
-                                       BrowserMovement(IntToStr(wkIntSt));
-                    end;
-                end;
+    senderBrowser := TWebBrowser(Sender);
+    doc := senderBrowser.ControlInterface.Document as IHTMLDocument2;
+       if not Assigned(doc) then
+               Exit;
+
+       aElement := doc.activeElement;
+       if not Assigned(aElement) then
+               Exit;
+
+       Text := aElement.Get_outerText;
+       Html := aElement.Get_outerHTML;
+
+       if(AnsiPos('>>', Text) = 1) or (AnsiPos('>', Text) = 1)
+               or (AnsiPos('\81\84\81\84', Text) = 1) or (AnsiPos('\81\84', Text) = 1) then begin
+               if GikoSys.Setting.ResAnchorJamp then begin
+
+                       Text := ZenToHan(Trim(Text));
+
+                       if(AnsiPos('>>', Text) = 1) then begin
+                               //Text := Copy(Text, 3, Length(Text) - 2);
+                               Delete(Text, 1, 2);
+                       end else begin
+                               //Text := Copy(Text, 2, Length(Text) - 1);
+                               Delete(Text, 1, 1);
                        end;
-               end else begin
-            ////'http://be.2ch.net/test/p.php?i='+id+'&u=d:'+bas+num
-
-                       URL := GikoSys.GetHRefText(Html);
-                       URL := GikoSys.HTMLDecode(URL);
-            if AnsiPos('BE:', URL) = 1 then begin
-                               BNum := Copy(URL, 4, AnsiPos('/', URL) - 4);
-                               BRes := Copy(URL, AnsiPos('/', URL) + 1,  Length(URL));
-                threadItem := FActiveContent.Thread;
-                if threadItem = nil then Exit;
-                URL := BE_PHP_URL + BNum + '&u=d'
-                       + CustomStringReplace(threadItem.URL, 'l50', '') + BRes;
-            end;
 
-                       if( AnsiPos('http://', URL) = 1) or (AnsiPos('https://', URL) = 1) or
-                               ( AnsiPos('ftp://', URL) = 1) then begin
-                               //\83A\83h\83\8c\83X\83o\81[\82Ì\97\9a\97ð
-                               if GikoSys.Setting.LinkAddAddressBar then begin
-                                       idx := AddressComboBox.Items.IndexOf(URL);
-                                       if idx = -1 then begin
-                                               AddressComboBox.Items.Insert(0, URL);
-                                               if AddressComboBox.Items.Count > GikoSys.Setting.AddressHistoryCount then
-                                                       AddressComboBox.Items.Delete(AddressComboBox.Items.Count - 1);
-                                       end else begin
-                                               AddressComboBox.Items.Delete(idx);
-                                               AddressComboBox.Items.Insert(0, URL);
-                                       end;
-                               end;
+                       if AnsiPos('-', Text) <> 0 then begin
+                               wkIntSt := StrToIntDef(Copy(Text, 1, AnsiPos('-', Text) - 1), 0);
+                               Text := Copy(Text, AnsiPos('-', Text) + 1, Length(Text));
+                               wkIntTo := StrToIntDef(Text, 0);
+                               if wkIntTo < wkIntSt then
+                                       wkIntSt := wkIntTo;
+                       end else begin
+                               wkIntSt := StrToIntDef(Text, 0);
+                       end;
+
+                       if wkIntSt <> 0 then begin
+               FActiveContent.IDAnchorPopup('');
+                MoveHisotryManager.pushItem(FActiveContent);
                 if (Sender is TResPopupBrowser) then begin
-                    TResPopupBrowser(Sender).ChildClear
+                    TResPopupBrowser(Sender).ChildClear;
+                    OpenThreadItem(
+                        GetActiveContent(true),
+                        GetActiveContent(true).URL + '&st=' +
+                             IntToStr(wkIntSt) + '&to=' + IntToStr(wkIntSt));
+                end else begin
+                                       BrowserMovement(IntToStr(wkIntSt));
                 end;
+            end;
+               end;
+       end else begin
+        ////'http://be.2ch.net/test/p.php?i='+id+'&u=d:'+bas+num
+
+               URL := GikoSys.GetHRefText(Html);
+               URL := GikoSys.HTMLDecode(URL);
+        if AnsiPos('BE:', URL) = 1 then begin
+                       BNum := Copy(URL, 4, AnsiPos('/', URL) - 4);
+                       BRes := Copy(URL, AnsiPos('/', URL) + 1,  Length(URL));
+            threadItem := FActiveContent.Thread;
+            if threadItem = nil then Exit;
+            URL := BE_PHP_URL + BNum + '&u=d'
+               + CustomStringReplace(threadItem.URL, 'l50', '') + BRes;
+        end;
 
-                MoveHisotryManager.pushItem(FActiveContent);
-                               MoveToURL( URL );
+               if( AnsiPos('http://', URL) = 1) or (AnsiPos('https://', URL) = 1) or
+                       ( AnsiPos('ftp://', URL) = 1) then begin
+                       //\83A\83h\83\8c\83X\83o\81[\82Ì\97\9a\97ð
+                       if GikoSys.Setting.LinkAddAddressBar then begin
+                               idx := AddressComboBox.Items.IndexOf(URL);
+                               if idx = -1 then begin
+                                       AddressComboBox.Items.Insert(0, URL);
+                                       if AddressComboBox.Items.Count > GikoSys.Setting.AddressHistoryCount then
+                                               AddressComboBox.Items.Delete(AddressComboBox.Items.Count - 1);
+                               end else begin
+                                       AddressComboBox.Items.Delete(idx);
+                                       AddressComboBox.Items.Insert(0, URL);
+                               end;
                        end;
+            if (Sender is TResPopupBrowser) then begin
+                TResPopupBrowser(Sender).ChildClear
+            end;
+
+            MoveHisotryManager.pushItem(FActiveContent);
+                       MoveToURL( URL );
                end;
-    end;
+       end;
 
 end;
 
@@ -4156,10 +4295,9 @@ end;
 procedure TGikoForm.BrowserDocumentComplete(Sender: TObject;
        const pDisp: IDispatch; var URL: OleVariant);
 var
-       FDispHtmlDocument: DispHTMLDocument;
        BrowserRecord :TBrowserRecord;
        i :Integer;
-       doc                                     : Variant;
+       doc     : IHTMLDocument2;
        threadItem      : TThreadItem;
 begin
        if TObject(Sender) is TWebBrowser then begin
@@ -4174,17 +4312,15 @@ begin
                        if BrowserRecord <> nil then begin
                                if BrowserRecord.Event <> nil then
                                        BrowserRecord.Event.Free;
-                               FDispHtmlDocument := Idispatch(OleVariant(BrowserRecord.Browser.ControlInterface).Document) as DispHTMLDocument;
-                               BrowserRecord.Event := THTMLDocumentEventSink.Create(Self, FDispHtmlDocument, HTMLDocumentEvents2);
+                               BrowserRecord.Event := THTMLDocumentEventSink.Create(Self, BrowserRecord.Browser.ControlInterface.Document, HTMLDocumentEvents2);
                                BrowserRecord.Event.OnContextMenu := OnDocumentContextMenu;
                                BrowserRecord.Event.OnClick := WebBrowserClick;  //\92Ç\89Á\82µ\82½OnClick\83C\83x\83\93\83g
                        end;
                end else begin
                        if GetActiveContent <> nil then begin
-                               FDispHtmlDocument := Idispatch(OleVariant(Browser.ControlInterface).Document) as DispHTMLDocument;
                                if FEvent <> nil then
                                        FEvent.Free;
-                               FEvent := THTMLDocumentEventSink.Create(Self, FDispHtmlDocument, HTMLDocumentEvents2);
+                               FEvent := THTMLDocumentEventSink.Create(Self, Browser.ControlInterface.Document, HTMLDocumentEvents2);
                                FEvent.OnContextMenu := OnDocumentContextMenu;
                                FEvent.OnClick := WebBrowserClick;  //\92Ç\89Á\82µ\82½OnClick\83C\83x\83\93\83g
                        end else begin
@@ -4222,8 +4358,8 @@ begin
                                RefreshListView(threadItem);
                        end else if threadItem.ScrollTop <> 0 then begin
                                try
-                                       doc := Idispatch( OleVariant( BrowserRecord.Browser.ControlInterface ).Document ) as IHTMLDocument2;
-                                       doc.Body.ScrollTop := threadItem.ScrollTop;
+                                       doc := BrowserRecord.Browser.ControlInterface.Document as IHTMLDocument2;
+                                       (doc.body as IHTMLElement2).ScrollTop := threadItem.ScrollTop;
                                except
                                        on E: Exception do
                                                MsgBox(Handle, E.Message, 'SetContent[ScrollTop<-]', 0);
@@ -4268,7 +4404,7 @@ procedure TGikoForm.SetSelectItemRound(RoundFlag: Boolean; RoundName: string; Pa
 var
        threadItem : TThreadItem;
 begin
-       if ParentName <> 'dummy1' then begin
+       if ParentName <> 'RoundItem' then begin
                SetSelectItemRound(RoundFlag, RoundName);
        end else begin
                threadItem := GetActiveContent;
@@ -4548,7 +4684,7 @@ var
        stRes, edRes : Int64;
        browserRec : TBrowserRecord;
        threadNumber : String;
-       doc : Variant;
+       doc : IHTMLDocument2;
 begin
        stRes := 0;
        edRes := 0;
@@ -4576,15 +4712,16 @@ begin
                        browserRec.Move(IntToStr(stRes));
                        Thread.JumpAddress := 0;
                        try
-                               doc := Idispatch( OleVariant( browserRec.Browser.ControlInterface ).Document ) as IHTMLDocument2;
-                               Thread.ScrollTop := doc.Body.ScrollTop;
+                doc := browserRec.Browser.ControlInterface.Document as IHTMLDocument2;
+                if Assigned(doc) then
+                               Thread.ScrollTop := (doc.body as IHTMLElement2).ScrollTop;
                        except
                        end;
                end;
        end;
 end;
 
-procedure TGikoForm.MoveToURL(const inURL: string);
+procedure TGikoForm.MoveToURL(const inURL: string; KeyMask: Boolean = False);
 var
        protocol, host, path, document, port, bookmark : string;
        URL, protocol2, host2, path2, document2, port2, bookmark2 : string;
@@ -4601,17 +4738,18 @@ begin
 
        GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
        GikoSys.Parse2chURL( inURL, path, document, BBSID, BBSKey );
-
-
-       shiftDown       := GetAsyncKeyState(VK_SHIFT) = Smallint($8001);
-       ctrlDown        := GetAsyncKeyState(VK_CONTROL) = Smallint($8001);
-       if shiftDown then begin
-               GikoSys.OpenBrowser(inURL, gbtUserApp);
-               Exit;
-       end else if ctrlDown then begin
-               GikoSys.OpenBrowser(inURL, gbtIE);
-               Exit;
-       end;
+    // \83A\83N\83V\83\87\83\93\82©\82ç\8cÄ\82Î\82ê\82é\82Æshift/ctrl\82Í\82¨\82µ\82Á\82Ï\82Ì\8fê\8d\87\82ª\82Ù\82Æ\82ñ\82Ç\82È\82Ì\82Å\83}\83X\83N\82·\82é
+    if not KeyMask then begin
+        shiftDown      := GetAsyncKeyState(VK_SHIFT) = Smallint($8001);
+        ctrlDown       := GetAsyncKeyState(VK_CONTROL) = Smallint($8001);
+        if shiftDown then begin
+            GikoSys.OpenBrowser(inURL, gbtUserApp);
+            Exit;
+        end else if ctrlDown then begin
+            GikoSys.OpenBrowser(inURL, gbtIE);
+            Exit;
+        end;
+    end;
 
        //===== \83v\83\89\83O\83C\83\93
        try
@@ -4778,8 +4916,8 @@ end;
 
 procedure TGikoForm.WndProc(var Message: TMessage);
 var
-       senderBrowser   : TWebBrowser;
-       url                                             : OleVariant;
+       senderBrowser : TWebBrowser;
+       url : OleVariant;
 begin
        try
                case Message.Msg of
@@ -4810,12 +4948,16 @@ begin
                                senderBrowser := TWebBrowser( Message.WParam );
                                BrowserDocumentComplete( senderBrowser, senderBrowser.Parent, url );
                        end;
-        USER_RESPOPUPCLEAR:
+        USER_POPUPCLEAR:
             if (TObject(Message.WParam) is TResPopupBrowser) then begin
                 try
                                TResPopupBrowser( Message.WParam ).Clear;
                 except
                 end;
+                       end else if (TObject(Message.WParam) is TPreviewBrowser) then begin
+                if FPreviewBrowser <> nil then begin
+                       ShowWindow(FPreviewBrowser.Handle, SW_HIDE);
+                end;
                        end;
                end;
 
@@ -4910,9 +5052,13 @@ begin
        if PreviewTimer.Enabled then
                PreviewTimer.Enabled := False;
 
-       if (FResPopupBrowser <> nil) and (IsWindowVisible(FResPopupBrowser.Handle)) then begin
-        FResPopupBrowser.Clear;
-       end;
+    //Window\8aO\82É\88Ú\93®\82µ\82½\82Æ\82«\82Í\8fÁ\82¦\82é\82æ\82¤\82É\82·\82é\82½\82ß\95\9c\8a\88
+    if (FResPopupBrowser <> nil) and (IsWindowVisible(FResPopupBrowser.Handle)) then begin
+        // \89E\83N\83\8a\83b\83N\82Ì\8e\9e\82Í\8fÁ\82³\82È\82¢\82æ\82¤\82É\8fð\8c\8f\92Ç\89Á
+        if (Message.MouseMsg <> WM_RBUTTONUP) then begin
+            FResPopupBrowser.Clear;
+        end;
+    end;
 
        if (FPreviewBrowser <> nil)
                and (IsWindowVisible(FPreviewBrowser.Handle)) then begin
@@ -4939,7 +5085,7 @@ end;
 
 function TGikoForm.OnDocumentContextMenu(Sender: TObject): WordBool;
 var
-       Doc: IHtmlDocument2;
+       doc: IHtmlDocument2;
        Range: IHTMLTxtRange;
        s: string;
        Num: Integer;
@@ -4947,26 +5093,31 @@ var
 begin
        Result := False;
        FactiveContent.IDAnchorPopup('');
-       Doc := FactiveContent.Browser.Document as IHtmlDocument2;
-       if Assigned(Doc) then begin
-               Range := Doc.selection.createRange as IHTMLTxtRange;
-               s := CustomStringReplace(Range.text, '\81@', ' ');//\91S\8ap\8bó\94\92\82ð\94¼\8ap\8bó\94\92\82É
-               s := ZenToHan(Trim(s));
-               if GikoSys.IsNumeric(s) then begin
-                       Num := StrToInt64Def(s, -1);
-                       ThreadItem := GetActiveContent(true);
-                       if (ThreadItem <> nil) and (Num <= ThreadItem.Count)
-                and (Num > 0)then begin
-                CreateResPopupBrowser;
-                FResPopupBrowser.CreateNewBrowser.PopupType := gptThread;
-                               HTMLCreater.SetResPopupText(FResPopupBrowser.CreateNewBrowser, ThreadItem, Num, Num, False, False);
-                FResPopupBrowser.Popup;
-                               Result := False;
-                       end else
-                               Result := True;
-               end else begin
+
+       doc := FactiveContent.Browser.ControlInterface.Document as IHtmlDocument2;
+       if not Assigned(doc) then
+        Exit;
+
+       Range := doc.selection.createRange as IHTMLTxtRange;
+       if not Assigned(Range) then
+        Exit;
+
+       s := CustomStringReplace(Range.text, '\81@', ' ');//\91S\8ap\8bó\94\92\82ð\94¼\8ap\8bó\94\92\82É
+       s := ZenToHan(Trim(s));
+       if GikoSys.IsNumeric(s) then begin
+               Num := StrToInt64Def(s, -1);
+               ThreadItem := GetActiveContent(true);
+               if (ThreadItem <> nil) and (Num <= ThreadItem.Count)
+           and (Num > 0)then begin
+           CreateResPopupBrowser;
+           FResPopupBrowser.CreateNewBrowser.PopupType := gptThread;
+                       HTMLCreater.SetResPopupText(FResPopupBrowser.CreateNewBrowser, ThreadItem, Num, Num, False, False);
+            FResPopupBrowser.Popup;
+               Result := False;
+               end else
                        Result := True;
-               end;
+    end else begin
+               Result := True;
        end;
 end;
 
@@ -5663,7 +5814,7 @@ procedure TGikoForm.SelectComboBoxKeyDown(Sender: TObject; var Key: Word;
        Shift: TShiftState);
 var
   IMC: HIMC;
-  Len: integer;
+  Len, idx: integer;
   Str: string;
   tmp: string;
 begin
@@ -5689,6 +5840,20 @@ begin
                                SetSelectWord(Str);
                        end;
                end;
+    end else if (Key = Windows.VK_DELETE) and (ssCtrl in Shift) then begin
+        // Ctrl + DEL \82Å\8dí\8f\9c\82·\82é
+        Str := SelectComboBox.Text;
+        idx := GikoSys.Setting.SelectTextList.IndexOf( Str );
+        if idx <> -1 then begin
+            GikoSys.Setting.SelectTextList.Delete( idx );
+        end;
+        idx := SelectComboBox.Items.IndexOf( Str );
+               if idx <> -1 then begin
+            SelectComboBox.Items.Delete( idx );
+        end;
+        SelectComboBox.Text := '';
+        // \8di\8d\9e\82Ý\82ð\89ð\8f\9c\82·\82é\82½\82ß\82É\95Ï\8dX\83C\83x\83\93\83g\82ð\8cÄ\82Ñ\8fo\82·
+        SelectComboBox.OnChange(Sender);
        end else if Length( SelectComboBox.Text ) = 0 then
        begin
                {* SelectComboBox.Text\82ª\8bó\82Å\82à\81A\93ü\97Í\93r\92\86\82ÅEsc\82µ\82½\82Æ\82©
@@ -6345,17 +6510,24 @@ end;
 
 
 procedure TGikoForm.BrowserTabPopupMenuPopup(Sender: TObject);
+var
+    i:Integer;
 begin
-       AddRoundNameMenu(dummy1);
-    AddMenuSameBoardThread;
+    for i := 0  to BrowserTabPopupMenu.Items.Count - 1 do begin
+        if (BrowserTabPopupMenu.Items[i].Name='RoundItem') then begin
+            AddRoundNameMenu(BrowserTabPopupMenu.Items[i]);
+        end else if (BrowserTabPopupMenu.Items[i].Name='BoardThreadItem') then begin
+            AddMenuSameBoardThread(BrowserTabPopupMenu.Items[i])
+        end;
+    end;
 end;
 //! \83A\83N\83e\83B\83u\82È\83^\83u\82Æ\93¯\82\94Â\82Ì\8aJ\82¢\82Ä\82¢\82é\83X\83\8c\83b\83h\82ð\83\81\83j\83\85\81[\83A\83C\83e\83\80\82É\92Ç\89Á
-procedure TGikoForm.AddMenuSameBoardThread;
+procedure TGikoForm.AddMenuSameBoardThread(MenuItem: TMenuItem);
 var
        i: Integer;
        Item: TMenuItem;
 begin
-    SameBoardThreadItem.Clear;
+    MenuItem.Clear;
     for i := 0 to BrowserTab.Tabs.Count - 1 do begin
         // \93¯\82\94Â\82©\82Ç\82¤\82©
         if (FActiveContent.Thread.ParentBoard =
@@ -6365,23 +6537,23 @@ begin
                 TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread then begin
                 Item := TMenuItem.Create(Self);
                 Item.Caption := TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.Title;
+                Item.Hint    := TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.URL;
                 Item.OnClick := SameBoardThreadSubItemOnClick;
-                SameBoardThreadItem.Add(Item);
+                MenuItem.Add(Item);
             end;
         end;
     end;
     // \89½\82à\96³\82¢\82È\82ç\8eg\97p\82Å\82«\82È\82¢\82æ\82¤\82É\82·\82é
-    SameBoardThreadItem.Enabled := SameBoardThreadItem.Count > 0;
+    MenuItem.Enabled := MenuItem.Count > 0;
 end;
 //!  \83A\83N\83e\83B\83u\82È\83^\83u\82Æ\93¯\82\94Â\82Ì\8aJ\82¢\82Ä\82¢\82é\83X\83\8c\83b\83h\83N\83\8a\83b\83N\83C\83x\83\93\83g
 procedure TGikoForm.SameBoardThreadSubItemOnClick(Sender: TObject);
 var
-       i, j: Integer;
+       i: Integer;
        MenuItem: TMenuItem;
 begin
        if Sender is TMenuItem then begin
         try
-            j := 0;
             MenuItem := TMenuItem(Sender);
             for i := 0 to BrowserTab.Tabs.Count - 1 do begin
                 // \93¯\82\94Â\82©\82Ç\82¤\82©
@@ -6389,12 +6561,11 @@ begin
                     TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ParentBoard) then begin
                     if FActiveContent.Thread <>
                         TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread then begin
-                        if (SameBoardThreadItem.Items[j] = MenuItem) then begin
-                            MoveToURL( TBrowserRecord(BrowserTab.Tabs.Objects[i])
-                                .Thread.URL);
+                        if (MenuItem.Hint = TBrowserRecord(BrowserTab.Tabs.Objects[i])
+                                .Thread.URL) then begin
+                            MoveToURL( MenuItem.Hint);
                             Exit;
                         end;
-                        Inc(j);
                     end;
                 end;
             end;
@@ -6473,10 +6644,15 @@ end;
 
 /// \8dÅ\8f¬\89»\82³\82ê\82é
 procedure TGikoForm.OnMinimize;
+var
+    doc: IHTMLDocument2;
 begin
        if FActiveContent <> nil then begin
                FIsMinimize := mtMinimizing;
-               FActiveContent.Thread.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
+        doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+        if Assigned(doc) then begin
+               FActiveContent.Thread.ScrollTop := (doc.body as IHTMLElement2).ScrollTop;
+        end;
        end;
 end;
 
@@ -6672,9 +6848,8 @@ end;
 
 procedure TGikoForm.OnResized;
 var
-       doc                                             : Variant;
+       doc : IHTMLDocument2;
 begin
-
        FOldFormWidth := Width;
        FIsIgnoreResize := rtNone;
 
@@ -6689,8 +6864,8 @@ begin
                begin
                        // \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)
                        if FActiveContent <> nil then begin
-                               doc := Idispatch( olevariant(FActiveContent.Browser.ControlInterface).Document) as IHTMLDocument2;
-                               doc.Body.ScrollTop := FActiveContent.Thread.ScrollTop;
+                               doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+                               (doc.body as IHTMLElement2).ScrollTop := FActiveContent.Thread.ScrollTop;
                        end;
                        FIsMinimize := mtNone;
                end;
@@ -6701,74 +6876,70 @@ end;
 //! \83X\83\8c\83b\83h\83u\83\89\83E\83U\83N\83\8a\83b\83N\83C\83x\83\93\83g
 // *************************************************************************
 function TGikoForm.WebBrowserClick(Sender: TObject): WordBool;
-const
-    LIMIT = 20;
 var
-       p : TPoint;
        e: IHTMLElement;
-       AID: string;
-       stlist : TStringList;
-       i, count: Integer;
-       body : String;
-    limited : Integer;
+    doc : IHTMLDocument2;
     FOleInPlaceActiveObject: IOleInPlaceActiveObject;
+       p : TPoint;
+       AID: string;
 begin
-  result := true;
-  try
-       if (FActiveContent <> nil) and (FActiveContent.Browser <> nil) then
-        FOleInPlaceActiveObject := FActiveContent.Browser.ControlInterface as IOleInPlaceActiveObject;
-        FOleInPlaceActiveObject.OnFrameWindowActivate(True);
-               try
-                       GetCursorPos(p);
-                       p.x := p.x - FActiveContent.Browser.ClientOrigin.x;
-                       p.y := p.y - FActiveContent.Browser.ClientOrigin.y;
-                       e := IHTMLDocument2(FActiveContent.Browser.Document).elementFromPoint(p.x, p.y);
-                       if (Assigned(e)) then begin
-                               if (e.className = 'date') or (e.id = 'date') then begin
-                                       AID := e.innerText;
-                                       if AnsiPos('id', AnsiLowerCase(AID)) > 0 then begin
-                                               AID := Copy(AID, AnsiPos('id', AnsiLowerCase(AID)) - 1, 11);
-                       if AnsiPos(' be:', AnsiLowerCase(AID)) > 0 then begin
-                               AID := Copy(AID, 1, AnsiPos(' BE:', AnsiLowerCase(AID)) - 1)
-                        end;
-                                       end else begin
-                                               stlist := TStringList.Create;
-                                               try
-                                                       stList.DelimitedText := AID;
-                                                       AID := '';
-                                                       for i := 0 to stList.Count - 1 do
-                                                               if Length(WideString(stList[i])) = 8 then begin
-                                                                       if GikoSys.NotDateorTimeString(stList[i]) then begin
-                                                                               AID := stList[i];
-                                                                               break;
-                                                                       end;
-                                                               end;
-                                               finally
-                                                       stList.Free;
-                                               end;
-                                       end;
-                    count := GikoSys.GetSameIDResCount(AID, FActiveContent.Thread);
-                    limited := LIMIT;
-                    if not (GikoSys.Setting.LimitResCountMessage) then begin
-                        limited := -1;
-                    end else if (count > LIMIT) then begin
-                        if (GikoUtil.MsgBox(Handle,
-                                IntToStr(LIMIT) + '\8cÂ\88È\8fã\82 \82è\82Ü\82·\82ª\81A\82·\82×\82Ä\95\\8e¦\82µ\82Ü\82·\82©\81H',
-                                'ID\83|\83b\83v\83A\83b\83v\8cx\8d\90',
-                                                               MB_YESNO or MB_ICONQUESTION) = ID_YES) then begin
-                            limited := -1;
-                        end
-                    end;
-                                       body := GikoSys.GetSameIDResAnchor(AID, FActiveContent.Thread, limited);
-                                       FActiveContent.IDAnchorPopup(body);
-                               end;
-                       end;
-               except
+       result := true;
+    if not Assigned(FActiveContent) then
+        Exit;
+    if not Assigned(FActiveContent.Browser) then
+        Exit;
+
+       try
+               FOleInPlaceActiveObject := FActiveContent.Browser.ControlInterface as IOleInPlaceActiveObject;
+               FOleInPlaceActiveObject.OnFrameWindowActivate(True);
+               GetCursorPos(p);
+
+               p.x := p.x - FActiveContent.Browser.ClientOrigin.x;
+               p.y := p.y - FActiveContent.Browser.ClientOrigin.y;
+
+               doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+               if not Assigned(doc) then
+                       Exit;
+
+               e := doc.elementFromPoint(p.x, p.y);
+               if not Assigned(e) then
+                       Exit;
+
+               if (e.className = 'date') or (e.id = 'date') then begin
+                       AID := GikoSys.ExtructResID(e.innerText);
+            ShowSameIDAncher(AID);
                end;
-  except
-  end;
+       except
+       end;
 end;
+procedure TGikoForm.ShowSameIDAncher(const AID: String);
+const
+    LIMIT = 20;
+var
+       numbers : TStringList;
+    limited : Integer;
+begin
+    numbers := TStringList.Create;
+    try
 
+        GikoSys.GetSameIDRes(AID, FActiveContent.Thread, numbers);
+        limited := LIMIT;
+        if not (GikoSys.Setting.LimitResCountMessage) then begin
+            limited := -1;
+        end else if (numbers.Count > LIMIT) then begin
+            if (GikoUtil.MsgBox(Handle,
+                    IntToStr(LIMIT) + '\8cÂ\88È\8fã\82 \82è\82Ü\82·\82ª\81A\82·\82×\82Ä\95\\8e¦\82µ\82Ü\82·\82©\81H',
+                    'ID\83|\83b\83v\83A\83b\83v\8cx\8d\90',
+                    MB_YESNO or MB_ICONQUESTION) = ID_YES) then begin
+                limited := -1;
+            end
+        end;
+        FActiveContent.IDAnchorPopup(
+            GikoSys.CreateResAnchor(numbers, FActiveContent.Thread, limited));
+    finally
+        numbers.Free;
+    end;
+end;
 //\83X\83\8c\83b\83h\88ê\97\97\82ð\8dÅ\91å\89»\82µ\82Ä\83t\83H\81[\83J\83X\82ð\93\96\82Ä\82é
 procedure TGikoForm.SelectTimerTimer(Sender: TObject);
 begin
@@ -7155,15 +7326,22 @@ end;
 //\82±\82Ì\83\8c\83X\82 \82Ú\81`\82ñ
 procedure TGikoForm.IndividualAbon(Atag, Atype : Integer);
 var
-       ThreadItem      : TThreadItem;
-       ReadList                : TStringList;
-       wordCount               : TWordCount;
+    doc : IHTMLDocument2;
+       ThreadItem : TThreadItem;
+       ReadList : TStringList;
+       wordCount : TWordCount;
 begin
-       ThreadItem      := GetActiveContent(True);
-       ReadList                := TStringList.Create;
-       wordCount               := TWordCount.Create;
+    if not Assigned(FActiveContent) then
+        Exit;
+    doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+    if not Assigned(doc) then
+        Exit;
+
+       ThreadItem := GetActiveContent(True);
+       ReadList := TStringList.Create;
+       wordCount := TWordCount.Create;
        try
-               ThreadItem.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
+               ThreadItem.ScrollTop := (doc.body as IHTMLElement2).ScrollTop;
 {$IFDEF SPAM_FILTER_ENABLED}
                // \83X\83p\83\80\82É\90Ý\92è
                ReadList.LoadFromFile( ThreadItem.GetThreadFileName );
@@ -7184,6 +7362,7 @@ end;
 //\93¯\88êID\82ðNG\83\8f\81[\83h\82É\93o\98^
 procedure TGikoForm.AddIDtoNGWord(invisible : boolean);
 var
+    doc : IHTMLDocument2;
        ThreadItem : TThreadItem;
        No : Integer;
 {$IFDEF SPAM_FILTER_ENABLED}
@@ -7195,7 +7374,7 @@ var
 begin
        No := KokoPopupMenu.Tag;
        if No = 0 then Exit;
-       ThreadItem := GetActiveContent(True);
+       ThreadItem := GikoForm.KokoPopupThreadItem;
        if ThreadItem = nil then Exit;
 
     id := GikoSys.GetResID(No, ThreadItem);
@@ -7233,7 +7412,11 @@ begin
     end;
 {$ENDIF}
     if (FActiveContent.Repaint) then begin
-        ThreadItem.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
+        doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+
+        if not Assigned(doc) then
+            Exit;
+        ThreadItem.ScrollTop := (doc.body as IHTMLElement2).ScrollTop;
         if ThreadItem <> nil then
             InsertBrowserTab( ThreadItem, True );
     end;
@@ -7250,7 +7433,7 @@ var
 begin
        No := KokoPopupMenu.Tag;
        if No = 0 then Exit;
-       ThreadItem := GetActiveContent(True);
+       ThreadItem := GikoForm.KokoPopupThreadItem;
        if ThreadItem = nil then Exit;
        body := TStringList.Create;
        try
@@ -7259,7 +7442,7 @@ begin
                ReadList                := TStringList.Create;
                wordCount               := TWordCount.Create;
                try
-                       ThreadItem.ScrollTop := OleVariant(IHTMLDocument2(FActiveContent.Browser.Document)).Body.ScrollTop;
+                       ThreadItem.ScrollTop := FActiveContent.Browser.OleObject.Document.Body.ScrollTop;
 {$IFDEF SPAM_FILTER_ENABLED}
                        // \83X\83p\83\80\82É\90Ý\92è
                        ReadList.LoadFromFile( ThreadItem.GetThreadFileName );
@@ -7289,14 +7472,17 @@ end;
 procedure TGikoForm.KokoPopupMenuPopup(Sender: TObject);
 var
        firstElement: IHTMLElement;
-       document: IHTMLDocument2;
+       doc: IHTMLDocument2;
 begin
-       document := FActiveContent.Browser.Document as IHTMLDocument2;
-       if Assigned(document) then
-               firstElement := document.all.item('idSearch', 0) as IHTMLElement;
-               if Assigned(firstElement) then
-                       if firstElement.style.visibility <> 'hidden' then
-                               firstElement.style.visibility := 'hidden';
+    try
+       doc := FActiveContent.Browser.ControlInterface.Document as IHTMLDocument2;
+           if Assigned(doc) then
+                   firstElement := doc.all.item('idSearch', 0) as IHTMLElement;
+               if Assigned(firstElement) then
+                       if firstElement.style.visibility <> 'hidden' then
+                               firstElement.style.visibility := 'hidden';
+    except
+    end;
 end;
 
 procedure TGikoForm.RepaintAllTabsBrowser();
@@ -7479,6 +7665,7 @@ begin
        BrowserNullTab.Browser.Navigate(BLANK_HTML);
 
        FBrowsers := TList.Create;
+
        for i := 0 to count -1 do begin
                FBrowsers.Add(TWebBrowser.Create(BrowserPanel));
                newBrowser := FBrowsers[FBrowsers.Count - 1];
@@ -7494,6 +7681,8 @@ begin
                newBrowser.OnStatusTextChange   := BrowserStatusTextChange;
                newBrowser.Navigate(BLANK_HTML);
                ShowWindow(newBrowser.Handle, SW_HIDE);
+        GikoSys.ShowRefCount('Browser' + IntToStr(i), newBrowser.ControlInterface);
+        GikoSys.ShowRefCount('Document' + IntToStr(i), newBrowser.ControlInterface.Document);
        end;
        BrowserNullTab.Browser.BringToFront;
        ShowWindow(BrowserNullTab.Browser.Handle, SW_SHOW);
@@ -7667,10 +7856,17 @@ begin
 end;
 
 procedure TGikoForm.TaskTrayIconMessage(var Msg: TMsg);
+var
+    p: TPoint;
 begin
     //  \8d\83N\83\8a\83b\83N\82È\82ç\95\9c\8c³\82·\82é
     if  (Msg.wParam = WM_LBUTTONUP) then  begin
         UnStoredTaskTray;
+    end else if (Msg.wParam=WM_RBUTTONUP) then begin
+        // \89E\83N\83\8a\83b\83N\82È\82ç\8fI\97¹\82·\82é
+        GetCursorPos ( p );
+        SetForegroundWindow ( Self.Handle );
+        TaskTrayPopupMenu.Popup ( p.X, p.Y );
     end;
 end;
 //! \83^\83X\83N\83g\83\8c\83C\82É\83A\83C\83R\83\93\93o\98^\81\95\83t\83H\81[\83\80\89B\82µ
@@ -7743,7 +7939,6 @@ var
     Board: TBoard;
     LogFolder: String;
     datList: TStringList;
-    p: TPoint;
 begin
     // \95\\8e¦\82µ\82Ä\82¢\82é\82Ì\94Â\82Ì\82Æ\82«\88È\8aO\82Í\8b\91\94Û
     if GetActiveList is TBoard then begin
@@ -7780,10 +7975,12 @@ begin
                 if (datList.Count > 0) then begin
                     GikoSys.AddOutofIndexDat(Board, datList, False);
                     ShowMessage(IntToStr(datList.Count) + '\8cÂ\82Ìdat\83t\83@\83C\83\8b\82ª\83R\83s\81[\82³\82ê\82Ü\82µ\82½\81B' );
-                       if GikoForm.TreeView.Visible then
+                       if GikoForm.TreeView.Visible then begin
                                GikoForm.TreeView.Refresh;
-                           if GikoForm.ListView.Visible then
-                               GikoForm.ListView.Refresh;
+                    end;
+                           if GikoForm.ListView.Visible then begin
+                               UpdateListView();
+                    end;
                 end else begin
                     ShowMessage('\88ê\82Â\82à\83R\83s\81[\82³\82ê\82Ü\82¹\82ñ\82Å\82µ\82½\81B' );
                 end;
@@ -7796,7 +7993,25 @@ begin
         ShowMessage('\94Â\82ð\95\\8e¦\82µ\82Ä\82­\82¾\82³\82¢\81B');
     end;
 end;
-
+procedure TGikoForm.UpdateListView();
+begin
+    //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
+    if (ActiveList <> nil) and (ActiveList is TBoard) then begin
+        TBoard(ActiveList).LogThreadCount := TBoard(ActiveList).GetLogThreadCount;
+        TBoard(ActiveList).NewThreadCount := TBoard(ActiveList).GetNewThreadCount;
+        TBoard(ActiveList).UserThreadCount:= TBoard(ActiveList).GetUserThreadCount;
+        //ListView\82Ì\83A\83C\83e\83\80\82Ì\8cÂ\90\94\82à\8dX\90V
+        case GikoForm.ViewType of
+            gvtAll: ListView.Items.Count := TBoard(ActiveList).Count;
+            gvtLog: ListView.Items.Count := TBoard(ActiveList).LogThreadCount;
+            gvtNew: ListView.Items.Count := TBoard(ActiveList).NewThreadCount;
+            gvtArch: ListView.Items.Count := TBoard(ActiveList).ArchiveThreadCount;
+            gvtLive: ListView.Items.Count := TBoard(ActiveList).LiveThreadCount;
+            gvtUser: ListView.Items.Count := TBoard(ActiveList).UserThreadCount;
+        end;
+    end;
+    ListView.Refresh;
+end;
 //! \83t\83@\83C\83\8b\83`\83F\83b\83N
 function TGikoForm.isValidFile(FileName: String) : boolean;
 var
@@ -7813,7 +8028,7 @@ begin
     end else begin
         // \83\8d\83O\83t\83@\83C\83\8b\82Ì\8ag\92£\8eq\82ð\82Í\82¸\82µ\82½\82à\82Ì\82ª\83X\83\8c\8dì\90¬\93ú\8e\9e
         try
-            dt := GikoSys.GetCreateDateFromName(FileName);
+            dt := GikoSys.GetCreateDateFromName(ExtractFileName(FileName));
             if ((UnixToDateTime(ZERO_DATE) + OffsetFromUTC) = dt) then begin
                 Result := False;
                 GikoUtil.MsgBox(Handle, ExtractFileName(FileName) + '\82Ì\83t\83@\83C\83\8b\96¼\82ª\95s\90³\82Å\82·\81B', '\83G\83\89\81[', MB_ICONSTOP or MB_OK);
@@ -7834,6 +8049,59 @@ begin
         FResPopupBrowser.CurrentBrowser.ChildClear;
     end;
 end;
+//! \83A\83C\83R\83\93\93Ç\82Ý\8d\9e\82Ý
+procedure TGikoForm.LoadIcon();
+const
+    ICONI6 = 'icon16.bmp';
+    ICON32 = 'icon32.bmp';
+    ICONSTAT  = 'state_icon.bmp';
+    ICONMES = 'message_icon.bmp';
+    ICONADD = 'address_icon.bmp';
+    ICONITEM = 'item_icon.bmp';
+    ICONTOOL = 'hottoolbar_icon.bmp';
+begin
+    if FileExists(GikoSys.Setting.GetAppDir + ICONI6) then begin
+        ItemIcon16.Clear;
+        ItemIcon16.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONI6, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICON32) then begin
+        ItemIcon32.Clear;
+        ItemIcon32.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICON32, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICONSTAT) then begin
+        StateIconImageList.Clear;
+        StateIconImageList.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONSTAT, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICONMES) then begin
+        MessageImageList.Clear;
+        MessageImageList.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONMES, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICONADD) then begin
+        AddressImageList.Clear;
+        AddressImageList.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONADD, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICONITEM) then begin
+        ItemImageList.Clear;
+        ItemImageList.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONITEM, clPurple);
+    end;
+    if FileExists(GikoSys.Setting.GetAppDir + ICONTOOL) then begin
+        HotToobarImageList.Clear;
+        HotToobarImageList.FileLoad(rtBitmap,
+            GikoSys.Setting.GetAppDir + ICONTOOL, clPurple);
+    end;
+end;
+//! \83|\83b\83v\83A\83b\83v\83\81\83j\83\85\81[\93Ç\82Ý\8d\9e\82Ý
+procedure TGikoForm.LoadPopupMenu();
+begin
+
+
+end;
 
 initialization
                                OleInitialize(nil);