OSDN Git Service

スレタイの[転載禁止]と「©2ch.net」を非表示にする機能を追加
[gikonavigoeson/gikonavi.git] / Giko.pas
index 901e585..401b11d 100644 (file)
--- a/Giko.pas
+++ b/Giko.pas
@@ -24,8 +24,7 @@ uses
 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);
@@ -85,6 +84,7 @@ type
                ToolMenu: TMenuItem;
                Find1: TMenuItem;
                RoundMenu: TMenuItem;
+               Search1: TMenuItem;
                MMSep04: TMenuItem;
                OptionMenu: TMenuItem;
                HelpMenu: TMenuItem;
@@ -422,6 +422,14 @@ type
     N83: TMenuItem;
     UpdateGikonaviAction1: TMenuItem;
     N84: TMenuItem;
+    N85: TMenuItem;
+    URL2: TMenuItem;
+    URLPATHINFO1: TMenuItem;
+    URLQUERYSTRING1: TMenuItem;
+    N86: TMenuItem;
+    K4: TMenuItem;
+    WikiFAQ1: TMenuItem;
+    ThrNGEdit: TMenuItem;
                                procedure FormCreate(Sender: TObject);
                procedure FormDestroy(Sender: TObject);
         procedure SaveSettingAll();
@@ -609,6 +617,10 @@ 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;
+        FCwSave: Word;  // 8087CW\92l\95Û\91
                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);
@@ -686,7 +698,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¬
@@ -699,6 +711,10 @@ type
         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();
+        //! \83X\83\8c\83^\83C\8eæ\93¾
+        function GetThreadTitle(OrgTitle: String): String;
        protected
                procedure CreateParams(var Params: TCreateParams); override;
                procedure WndProc(var Message: TMessage); override;
@@ -711,7 +727,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;
@@ -736,6 +752,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;
@@ -755,6 +774,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);
@@ -827,6 +849,8 @@ type
         procedure StoredTaskTray;
         //! \93¯ID\83\8c\83X\83A\83\93\83J\81[\95\\8e¦
         procedure ShowSameIDAncher(const AID: String);
+        //! \83X\83\8c\83^\83C\95\\8e¦\8dX\90V
+        procedure UpdateThreadTitle;
        published
                property EnabledCloseButton: Boolean read FEnabledCloseButton write SetEnabledCloseButton;
        end;
@@ -854,6 +878,7 @@ type
 
 var
        GikoForm: TGikoForm;
+    g_AppTerminated: Boolean = False;
 
 implementation
 
@@ -865,7 +890,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';
@@ -914,6 +939,12 @@ begin
        Writeln('============================================================');
 {$ENDIF}
 //try
+    // \83[\83\8d\8a\84\97á\8aO\82Ì\8c»\8dÝ\82Ì\90Ý\92è\82ð\95Û\91\82·\82é
+    FCwSave := Get8087CW;
+    if ( AnsiPos('9.0', GikoSys.GetIEVersion()) = 1 ) then begin
+        // IE 9\82Ì\8fê\8d\87\82¾\82¯\81A\96³\8cø\83r\83b\83g\82ð\97§\82Ä\82é
+        Set8087CW(FCwSave or $0004);
+    end;
        Sort.SetSortDate(Now());
 
        FTreeType := gttNone;
@@ -929,6 +960,8 @@ begin
     FResPopupBrowser := nil;
        CreateBrowsers(BROWSER_COUNT);
     FIconData.uID := 0;
+    FUpdateExePath := '';
+    FUpdateExeArgs := '';
 
        //\83\81\83j\83\85\81[\83t\83H\83\93\83g
        SetMenuFont;
@@ -1018,7 +1051,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;
 
@@ -1090,6 +1127,9 @@ begin
        ProgressBar.Height := StatusBar.Height - 2;
        ProgressBar.Position := 0;
 
+    // \83X\83\8c\83b\83h\96¼NG\83\8a\83X\83g
+    ThreadNgList := TThreadNgList.Create;
+
        // \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Æ)
        InitializeBoardPlugIns;
 
@@ -1295,9 +1335,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;
 
@@ -1313,7 +1354,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Á...';
@@ -1331,10 +1373,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;
 
@@ -1459,10 +1507,16 @@ end;
 procedure TGikoForm.FormShow(Sender: TObject);
 var
        item        : TThreadItem;
+    MonCnt: Integer;
+    MonOk: Boolean;
+    MonR: Integer;
+    MonB: Integer;
+    Right: Integer;
+    Bottom: Integer;
 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;
@@ -1487,6 +1541,9 @@ 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;
@@ -1494,26 +1551,56 @@ begin
             GikoDM.TabsOpenAction.Tag := 0;
             if (GikoSys.Setting.LastCloseTabURL <> '') then begin
                 if ( FActiveContent <> nil) and (FActiveContent.Browser <> nil) then begin
-                       PostMessage( Handle, USER_DOCUMENTCOMPLETE, Integer( FActiveContent.Browser ), 0 );
-                   end;
-                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);
+//===== \83}\83\8b\83`\83\82\83j\83^\8aÂ\8b«\82ÅFormCreate\82Å\82Í\83t\83H\81[\83\80\88Ê\92u\82ª\90³\82µ\82­\94½\89f\82³\82ê\82È\82¢\8fê\8d\87
+//===== \82ª\82 \82é\82½\82ßFormShow\8f\89\89ñ\82Å\8dÀ\95W\90Ý\92è\82ð\8ds\82¤
+        Top := GikoSys.Setting.WindowTop;
+        Left := GikoSys.Setting.WindowLeft;
+        Height := GikoSys.Setting.WindowHeight;
+        Width := GikoSys.Setting.WindowWidth;
+
+        //\83E\83B\83\93\83h\83E\82ª\89æ\96Ê\8aO\82È\82ç\89æ\96Ê\93à\82É\88Ú\93®\82·\82é
+        Right := Left + Width;
+        Bottom := Top + Height;
+        MonOk := False;
+        MonCnt := 0;
+        while (MonCnt < Screen.MonitorCount) do begin
+            MonR := Screen.Monitors[MonCnt].Left + Screen.Monitors[MonCnt].Width;
+            MonB := Screen.Monitors[MonCnt].Top  + Screen.Monitors[MonCnt].Height;
+
+            if ((Left  >= Screen.Monitors[MonCnt].Left) and (Left   <  MonR) and
+                (Top   >= Screen.Monitors[MonCnt].Top)  and (Top    <  MonB) and
+                (Right  > Screen.Monitors[MonCnt].Left) and (Right  <= MonR) and
+                (Bottom > Screen.Monitors[MonCnt].Top)  and (Bottom <= MonB)) then begin
+                MonOk := True;
+                Break;
+            end;
 
-               FStartUp := false;
+            MonCnt := MonCnt + 1;
+        end;
+
+        if (MonOk = False) then begin
+            Left := 0;
+            Top := 0;
+        end;
+
+        if GikoSys.Setting.WindowMax then
+            WindowState := wsMaximized;
+//==========================================================================
        end;
 end;
 
@@ -1528,6 +1615,8 @@ begin
                        Exit;
        end;
 
+    g_AppTerminated := True;
+
     GikoSys.Setting.LastCloseTabURL := '';
        if GikoSys.Setting.TabAutoLoadSave then begin
                GikoDM.TabsSaveAction.Execute;
@@ -1553,11 +1642,12 @@ 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;
 
@@ -1567,6 +1657,11 @@ var
     WindowPlacement: TWindowPlacement;
 begin
        try
+               GikoDM.SaveThreadSearchSetting;
+       except
+       end;
+
+       try
                ActiveListColumnSave;
        except
        end;
@@ -1603,24 +1698,13 @@ begin
                        GikoSys.Setting.ResRange := FResRangeMenuSelect;
        except
        end;
-
-    //\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\81AOnCloseQuery\82Å\8eg\82¤\82±\82Æ\82µ\82©\8dl\97\82³\82ê\82Ä\82¢\82È\82¢
-       if WindowState <> wsNormal then begin
-               WindowState := wsNormal;
-    end;
-
-    try
-       SaveCoolBarSettings;
-    except
-    end;
-
-       try
-               GikoSys.Setting.WriteWindowSettingFile;
-               GikoSys.Setting.WriteNameMailSettingFile;
-       except
-       end;
-
+    //\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);
 
@@ -1652,6 +1736,12 @@ begin
                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);
@@ -1659,9 +1749,16 @@ var
        i                               : Integer;
        tmpBool : Boolean;
 begin
-    // \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);
+    //\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ú
@@ -1746,7 +1843,7 @@ begin
 
        try
         try
-            FControlThread.DownloadAbort;
+            //FControlThread.DownloadAbort;
             FControlThread.Terminate;
             FControlThread.WaitFor;
         except
@@ -1779,6 +1876,8 @@ begin
        except
        end;
 
+    ThreadNgList.Free;
+
        try
                if FEvent <> nil then
                        FEvent.Free;
@@ -1798,6 +1897,14 @@ begin
                end;
        except
        end;
+
+    // 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;
+    // \83[\83\8d\8a\84\97á\8aO\82ð\8c³\82É\96ß\82·
+    Set8087CW(FCwSave);
 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
@@ -2029,7 +2136,7 @@ begin
 
     if FResPopupBrowser <> nil then begin
         if not(Sender is TResPopupBrowser) then begin
-            if (FResPopupBrowser.Visible) then begin
+            if ((doc <> nil) and (FResPopupBrowser.Visible)) then begin
                 if ResPopupClearTimer.Interval > 0 then begin
                     ResPopupClearTimer.Enabled := True;
                     ResPopupClearTimer.Tag := 0;
@@ -2063,8 +2170,10 @@ begin
     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
+//     if (Pos('http://', Text2) = 1) and (GikoSys.Setting.PreviewVisible) and
+       if ((Pos('http://', Text2) = 1) or (Pos('https://', Text2) = 1)) and (GikoSys.Setting.PreviewVisible) and
+                       ((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);
@@ -2351,9 +2460,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;
@@ -2361,6 +2471,17 @@ 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
@@ -2951,7 +3072,7 @@ begin
                if (Thread <> nil) and (ThreadItem <>nil) then begin
                        BrowserBoardNameLabel.Caption := ThreadPTitle;
                        ItemIcon16.GetBitmap(4, ItemBoardImage.Picture.Bitmap);
-                       BrowserNameLabel.Caption := ThreadTitle;
+            BrowserNameLabel.Caption := GetThreadTitle(ThreadTitle);
                        ItemImage.Picture := nil;
                        if ThreadIsLog then
                                if ThreadNewArraical then
@@ -2984,7 +3105,7 @@ begin
                                
                        end;
                end else begin
-                       Self.Caption := GikoDataModule.CAPTION_NAME + ' - [' + ThreadTitle + ']';
+                       Self.Caption := GikoDataModule.CAPTION_NAME + ' - [' + GetThreadTitle(ThreadTitle) + ']';
                        //\83X\83e\81[\83^\83X\83o\81[\82É\95\\8e¦\82µ\82Ä\82¢\82é\83X\83\8c\82Ì\97e\97Ê\82ð\95\\8e¦
                        StatusBar.Panels[THREADSIZE_PANEL].Text := Format('%6.2f kB', [ThreadItem.Size / 1024]);
                        StatusBar.Panels[THREADSIZE_PANEL].Width :=
@@ -3047,7 +3168,7 @@ begin
                if (FActiveContent <> nil) and (FActiveContent.Thread <> nil)
                        and (FActiveContent.Thread.IsLogFile) then begin
                        try
-                               Self.Caption := GikoDataModule.CAPTION_NAME + ' - [' + FActiveContent.Thread.Title + ']'
+                               Self.Caption := GikoDataModule.CAPTION_NAME + ' - [' + GetThreadTitle(FActiveContent.Thread.Title) + ']'
                        except
                                on E: Exception do begin
                                        //\83X\83\8c\88ê\97\97DL\8cã\82È\82Ç\82ÉFActiveContent\82Ì\8e\9d\82ÂThread\82ª
@@ -3823,6 +3944,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;
@@ -3833,6 +3955,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;
@@ -3843,6 +3966,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;
@@ -3853,6 +3977,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;
@@ -3863,6 +3988,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;
@@ -3873,6 +3999,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;
@@ -3883,6 +4010,7 @@ begin
                TreeSelectFavoriteAddPupupMenu.Visible := False;
                TreeSelectLogDeleteSeparator.Visible := False;
                TreeSelectLogDeletePopupMenu.Visible := False;
+        SearchBoardName.Visible := True;
        end else begin
                TreeSelectThreadPupupMenu.Visible := False;
                TreeSelectBoardPupupMenu.Visible := False;
@@ -3893,6 +4021,7 @@ begin
                TreeSelectFavoriteAddPupupMenu.Visible := False;
                TreeSelectLogDeleteSeparator.Visible := False;
                TreeSelectLogDeletePopupMenu.Visible := False;
+        SearchBoardName.Visible := False;
        end;
 end;
 
@@ -4348,7 +4477,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;
@@ -4665,7 +4794,7 @@ begin
        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;
@@ -4682,17 +4811,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
@@ -4891,12 +5021,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;
 
@@ -5223,8 +5357,7 @@ begin
        SenderNode.Selected := False;
        FavoriteDragDrop( SenderNode, Source );
 
-       SetLinkBar;
-
+       PostMessage( Handle, USER_SETLINKBAR, 0, 0 );
 end;
 
 procedure TGikoForm.LinkToolButtonOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
@@ -6449,17 +6582,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 =
@@ -6469,23 +6609,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©
@@ -6493,12 +6633,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;
@@ -7307,7 +7446,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);
@@ -7366,7 +7505,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
@@ -8030,6 +8169,59 @@ begin
     end;
 end;
 
+//! \83X\83\8c\83^\83C\95\\8e¦\8dX\90V
+procedure TGikoForm.UpdateThreadTitle;
+var
+       i: Integer;
+    DspTitle: String;
+begin
+    BrowserTab.Tabs.BeginUpdate;
+    for i := 0 to BrowserTab.Tabs.Count - 1 do begin
+        BrowserTab.Tabs.Strings[i] :=
+            GikoSys.GetShortName(TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.Title, 20);
+    end;
+    BrowserTab.Tabs.EndUpdate;
+
+    if (FActiveContent <> nil) and (FActiveContent.Thread <> nil) then begin
+        DspTitle := GetThreadTitle(FActiveContent.Thread.Title);
+        BrowserNameLabel.Caption := DspTitle;
+        Self.Caption := GikoDataModule.CAPTION_NAME + ' - [' + DspTitle + ']';
+    end;
+end;
+
+//! \83X\83\8c\83^\83C\8eæ\93¾
+function TGikoForm.GetThreadTitle(OrgTitle: String): String;
+var
+    Idx: Integer;
+    ResTitle: String;
+begin
+    if (GikoSys.Setting.ThreadTitleTrim = False) then begin
+        Result := OrgTitle;
+    end else begin
+        ResTitle := OrgTitle;
+        while (True) do begin
+            Idx := Pos('[\93]\8dÚ\8bÖ\8e~]', ResTitle);
+            if (Idx < 1) then
+                Break;
+            Delete(ResTitle, Idx, 10);
+        end;
+        while (True) do begin
+            Idx := Pos('&copy;2ch.net', ResTitle);
+            if (Idx < 1) then
+                Break;
+            Delete(ResTitle, Idx, 13);
+        end;
+        Result := Trim(ResTitle);
+    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);
 finalization