OSDN Git Service

1.55.0.697
[gikonavigoeson/gikonavi.git] / Giko.pas
index f3ffdcd..38f6653 100644 (file)
--- a/Giko.pas
+++ b/Giko.pas
@@ -18,14 +18,15 @@ uses
        Editor, RoundData, GikoPanel, Favorite, HTMLDocumentEvent,
        HintWindow, GikoCoolBar, GikoListView, Search, ExternalBoardManager,
        ExternalBoardPlugInMain, StdActns, Variants, ExtActns,IdTCPConnection,
-       IdBaseComponent, IdTCPClient, AppEvnts, BrowserRecord;
+       IdBaseComponent, IdTCPClient, AppEvnts, BrowserRecord, MoveHistoryItem,
+    ShellAPI,Preview, HistoryList;
 
 const
        NGWORDNAME_PANEL = 3;
        THREADSIZE_PANEL = 2;
        
 type
-       TGikoTreeType = (gttNone, gtt2ch, gttHistory, gttFavorite);
+
        TToolBarSettingSenderType = (tssNone, tssMain, tssList, tssBrowser);
        TMinimizeType = (mtNone, mtMinimizing, mtMinimized);
        TResizeType = (rtNone, rtResizing);
@@ -283,7 +284,7 @@ type
                SelectItemNameCopyAction1: TMenuItem;
                B6: TMenuItem;
                T9: TMenuItem;
-               C2: TMenuItem;
+    NameCopyPMenu: TMenuItem;
                SelectComboBox: TComboBox;
                MainCoolBarPopupMenu: TPopupMenu;
                StdToolBarVisiblePMenu: TMenuItem;
@@ -409,6 +410,13 @@ type
     DAT3: TMenuItem;
     N76: TMenuItem;
     FavoriteTreeItemNameCopyPopupMenu: TMenuItem;
+    N77: TMenuItem;
+    N78: TMenuItem;
+    SaveThreadFile: TMenuItem;
+    N79: TMenuItem;
+    HTML1: TMenuItem;
+    DAT4: TMenuItem;
+    N80: TMenuItem;
                                procedure FormCreate(Sender: TObject);
                procedure FormDestroy(Sender: TObject);
                procedure BrowserStatusTextChange(Sender: TObject;
@@ -508,12 +516,6 @@ type
                        State: TDragState; var Accept: Boolean);
                procedure FavoriteTreeViewEndDrag(Sender, Target: TObject; X,
                        Y: Integer);
-               procedure ListCoolBarContextPopup(Sender: TObject; MousePos: TPoint;
-                       var Handled: Boolean);
-               procedure MainCoolBarContextPopup(Sender: TObject; MousePos: TPoint;
-                       var Handled: Boolean);
-               procedure BrowserCoolBarContextPopup(Sender: TObject; MousePos: TPoint;
-                       var Handled: Boolean);
                procedure FavoriteTreeBrowseBoardPopupMenuClick(Sender: TObject);
     procedure BrowserTabContextPopup(Sender: TObject; MousePos: TPoint;
       var Handled: Boolean);
@@ -549,13 +551,15 @@ type
     procedure TreeViewMouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
     procedure GetResURLMenuClick(Sender: TObject);
+    procedure MainCoolBarContextPopup(Sender: TObject; MousePos: TPoint;
+      var Handled: Boolean);
        private
                { Private \90é\8c¾ }
                FEnabledCloseButton: Boolean;
                FClickNode: TTreeNode;
                FHttpState: Boolean;
                FHint: TResPopup;
-               FPreviewBrowser: TWebBrowser;
+               FPreviewBrowser: TPreviewBrowser;
                FPreviewURL: string;
                FBrowserSizeHeight: Integer;
                FBrowserSizeWidth: Integer;
@@ -566,7 +570,7 @@ type
                FActiveList: TObject;
                FActiveContent: TBrowserRecord; //
                FActiveBBS : TBBS;
-               FHistoryList: TList;                                    //\83q\83X\83g\83\8a\83\8a\83X\83g
+               FHistoryList: THistoryList;                                     //\83q\83X\83g\83\8a\83\8a\83X\83g
                FTreeType: TGikoTreeType;
                FWorkCount: Integer;
                FNameCookie: string;
@@ -598,6 +602,7 @@ type
                FOrigenCaption: String;                         //\82¨\8bC\82É\93ü\82è\83c\83\8a\81[\82Ì\83A\83C\83e\83\80\95Ò\8fW\8e\9e\82Ì\95Ò\8fW\91O\82Ì\95\8e\9a\97ñ
                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ñ
+
                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);
@@ -647,8 +652,6 @@ type
                procedure TreeDoubleClick( Node : TTreeNode );
                /// \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
                procedure SetBBSMenu;
-               /// \83^\83u\8eæ\93¾
-               procedure GetTabURLs(AStringList: TStringList);
                /// ListColumnPopupMenu \83A\83C\83e\83\80\82Ì\83N\83\8a\83b\83N\83C\83x\83\93\83g
                procedure       ListColumnPopupMenuOnClick( Sender : TObject );
                //! \8di\82è\8d\9e\82Ý\95\8e\9a\97ñ\90Ý\92è
@@ -671,6 +674,12 @@ type
                procedure RefreshListView(Thread: TThreadItem);
                //! \83X\83\8c\83b\83h\88ê\97\97\82Ì\95\\8e¦\94Í\88Í\90Ý\92è\83`\83F\83b\83N\83N\83\8a\83A
                procedure ClearThreadRengeAction;
+        //! \83^\83X\83N\83g\83\8c\83C\82Ì\83A\83C\83R\83\93\8dí\8f\9c\81\95\83t\83H\81[\83\80\95\\8e¦
+        procedure UnStoredTaskTray;
+        //! \83\8c\83X\83G\83f\83B\83^\82Ì\95\\8e¦\94ñ\95\\8e¦
+        procedure ShowEditors(nCmdShow: Integer);
+        //! \82à\82Á\82Æ\82à\8cÃ\82¢Browser\82Ì\8aJ\95ú
+        procedure ReleaseOldestBrowser;
        protected
                procedure CreateParams(var Params: TCreateParams); override;
                procedure WndProc(var Message: TMessage); override;
@@ -683,6 +692,7 @@ type
                LastRoundTime: TDateTime;
                BrowserNullTab: TBrowserRecord;
                FControlThread: TThreadControl;
+        FIconData : TNotifyIconData;
                procedure MoveToURL(const inURL: string);
                function InsertBrowserTab(ThreadItem: TThreadItem; ActiveTab: Boolean = True) : TBrowserRecord;
                procedure ReloadBBS;
@@ -715,14 +725,9 @@ type
                procedure SetListViewType(AViewType: TGikoViewType); overload;
                procedure SetListViewType(AViewType: TGikoViewType; SelectText: string; KubetsuChk: Boolean); overload;
                procedure PlaySound(SoundEventName: string);
-               function AddHistory( FavItem: TFavoriteThreadItem ): Boolean;
-               procedure ClearHistory;
-               procedure       SaveHistory;
-               procedure       LoadHistory;
                procedure ShowBBSTree( inBBS : TBBS );
                procedure ShowBBSTreeOld( inBBS : TBBS );
                procedure ShowHistoryTree;
-               procedure SetHistoryTreeNode;
                procedure AddMessageList(ACaption: string; AObject: TObject; Icon: TGikoMessageIcon);
                procedure SetBrowserTabState;
                procedure SetToolBarPopup;
@@ -775,18 +780,8 @@ type
                procedure OnGestureEnd(Sender: TObject);
                /// \83o\83\93\83h\95\9d\82ð\8dÄ\8cv\8eZ\81E\8dÄ\90Ý\92è\82·\82é
                procedure ResetBandInfo( bar : TGikoCoolBar; band : TToolBar );
-               //\83X\83N\83\8a\81[\83\93\8fã\82ÉEditorForm\82ª\82¢\82é\82©
-               function EditorFormExists(): boolean;
-               //\83X\83N\83\8a\81[\83\93\8fã\82É\82¢\82é\82·\82×\82Ä\82ÌEditorForm\82©\82ç\96¼\91O\97\9a\97ð\82ð\8dí\8f\9c\82·\82é
-               procedure AllEditroFormNameTextClearClear();
-               //\83X\83N\83\8a\81[\83\93\8fã\82É\82¢\82é\82·\82×\82Ä\82ÌEditorForm\82©\82ç\83\81\81[\83\8b\97\9a\97ð\82ð\8dí\8f\9c\82·\82é
-               procedure AllEditroFormMailTextClearClear();
                //ListView\82Å\91I\91ð\82³\82ê\82Ä\82¢\82é\83A\83C\83e\83\80\82ð\8eæ\93¾\82·\82é
                procedure SelectListItem(List: TList);
-               /// \83^\83u\95Û\91
-               procedure SaveTabURLs;
-               /// \83^\83u\93Ç\82Ý\8fo\82µ
-               procedure LoadTabURLs;
                //\8ew\92è\82µ\82½\83\8c\83X\82ð\83R\83s\81[\82·\82é
                procedure KonoresCopy(Number: Integer; ReplaceTag : Boolean);
                //
@@ -804,6 +799,10 @@ type
                //! \83c\81[\83\8b\83o\81[\82É\83X\83\8c\8di\8d\9e\82Ý\83R\83\93\83{\83{\83b\83N\83X\82ð\90Ý\92è\82·\82é
                procedure SetSelectComboBox();
 
+        //! \83^\83X\83N\83g\83\8c\83C\82É\8ai\94[\82µ\82½\83A\83C\83R\83\93\82ð\83N\83\8a\83b\83N\82µ\82½\82Æ\82«\82Ì\8f\88\97\9d
+        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;
        published
                property EnabledCloseButton: Boolean read FEnabledCloseButton write SetEnabledCloseButton;
        end;
@@ -836,13 +835,13 @@ implementation
 
 uses
        GikoUtil, IndividualAbon, Math, Kotehan, KeySetting,
-       YofUtils, ShellAPI, ToolBarUtil, ToolBarSetting,
+       YofUtils, ToolBarUtil, ToolBarSetting,
        GikoXMLDoc, RoundName, IniFiles, FavoriteAdd,
-       FavoriteArrange, AddressHistory, Preview, Gesture,
+       FavoriteArrange, AddressHistory, Gesture,
        About, Option, Round, Splash, Sort, ListSelect, Imm,
        NewBoard, MojuUtils, Clipbrd, GikoBayesian,Y_TextConverter,
        HTMLCreate, ListViewUtils, GikoDataModule, GikoMessage,
-  InputAssistDataModule;
+  InputAssistDataModule, Types, ReplaceDataModule;
 
 const
        BLANK_HTML: string = 'about:blank';
@@ -851,14 +850,13 @@ const
        DandD_THRESHOLD = 5;    //D&D\82Ìè\87\92l\81ipixcel)
        //\83v\83\8c\83r\83\85\81[\83t\83@\83C\83\8b\96¼
        HTML_FILE_NAME  = 'temp_preview.html';
-       ITEM_ICON_THREADLOG1            = 6;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82 \82è\81j
-       ITEM_ICON_THREADLOG2            = 7;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82 \82è\81j
        //\83\81\83b\83Z\81[\83WID
        USER_TREECLICK                                  = WM_USER + 2000;
        USER_RESIZED            = WM_USER + 2001;
        USER_MINIMIZED                                  = WM_USER + 2002;
        USER_SETLINKBAR                                 = WM_USER + 2003;
        USER_DOCUMENTCOMPLETE           = WM_USER + 2004;       ///< wParam : TWebBrowser
+    USER_TASKTRAY               = WM_USER + 2010;
 {$R *.DFM}
 
 procedure TGikoForm.CreateParams(var Params: TCreateParams);
@@ -905,7 +903,8 @@ begin
        GetGroupIndex(GikoDM.GikoFormActionList);
        FSearchDialog := nil;
        CreateBrowsers(BROWSER_COUNT);
-
+    FIconData.uID := 0;
+    
        //\83\81\83j\83\85\81[\83t\83H\83\93\83g
        SetMenuFont;
 
@@ -1135,10 +1134,11 @@ begin
 
 
        // \83q\83X\83g\83\8a\83\8a\83X\83g(LoadHistory \82æ\82è\82à\90æ\82É\8ds\82¤\82±\82Æ)
-       FHistoryList := TList.Create;
+       FHistoryList := THistoryList.Create;
 
        // \97\9a\97ð\93Ç\82Ý\8d\9e\82Ý
-       LoadHistory;
+       FHistoryList.LoadFromFile(GikoSys.GetConfigDir + 'History.xml',
+        TreeView, FTreeType);
 
        //\82¨\8bC\82É\93ü\82è\93Ç\82Ý\8d\9e\82Ý
        FavoriteDM.SetFavTreeView(FavoriteTreeView);
@@ -1303,6 +1303,9 @@ begin
 
        //\93ü\97Í\83A\83V\83X\83g\8b@\8d\\82Ì\8f\89\8aú\89»
        InputAssistDM.Init(GikoSys.GetInputAssistFileName);
+
+    //\92u\8a·\90Ý\92è\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý
+    ReplaceDM.LoadFromFile(GikoSys.GetReplaceFileName);
 end;
 
 // CoolBar \82Ì\90Ý\92è\82ð\95Ï\90\94\82É\95Û\91
@@ -1452,7 +1455,9 @@ begin
 
                //FormCrete\82©\82ç\88Ú\93®\81B
                if GikoSys.Setting.TabAutoLoadSave then begin
-                       GikoDM.TabAutoLoadAction.Execute;
+            GikoDM.TabsOpenAction.Tag := 1;
+                       GikoDM.TabsOpenAction.Execute;
+            GikoDM.TabsOpenAction.Tag := 0;
                end;
 
         //ActionList\82ÌGroupIndex\82ð\8c³\82É\96ß\82·
@@ -1474,7 +1479,7 @@ begin
        end;
 
        if GikoSys.Setting.TabAutoLoadSave then begin
-               GikoDM.TabAutoSaveAction.Execute;
+               GikoDM.TabsSaveAction.Execute;
        end;
 
        if (SearchDialog <> nil) then begin
@@ -1487,11 +1492,10 @@ begin
                        SearchDialog := nil;
                end;
        end;
-       {    //2ch\8c¾\8cȩ̂²ÙFree
-               if GikoSys.Setting.Gengo <> nil then begin
-                               GikoSys.Setting.Gengo.Free;
-        end;
-       }
+
+       //\83X\83N\83\8a\81[\83\93\8fã\82Ì\91S\82Ä\82Ì\83t\83H\81[\83\80\82©\82ç\81AEditorForm\82ð\95Â\82\82é
+    GikoDM.CloseAllEditorAction.Execute;
+
        Application.UnhookMainWindow(Hook);
        Application.Terminate;
 end;
@@ -1611,12 +1615,12 @@ begin
 
        //\83q\83X\83g\83\8a\83\8a\83X\83g\95Û\91
        try
-               SaveHistory;
+               FHistoryList.SaveToFile(GikoSys.GetConfigDir + 'History.xml');
        except
        end;
        try
                try
-                       ClearHistory;
+                       FHistoryList.Clear;
                except
                end;
        finally
@@ -1646,6 +1650,12 @@ begin
        finally
                FControlThread.Free;
        end;
+    // \83v\83\89\83O\83C\83\93\82É\82æ\82Á\82Ä\92Ç\89Á\82³\82ê\82½\83\81\83j\83\85\81[\82ð\8aJ\95ú\82·\82é
+    for i := GikoForm.PlugInMenu.Count - 1 downto 0 do begin
+               GikoForm.PlugInMenu.items[i].Free;
+       end;
+    GikoForm.PlugInMenu.Clear;
+
 
        // TBBS \82Í\95Û\8e\9d\82µ\82Ä\82¢\82é TCategory, TBoard, TThreadItem \82·\82×\82Ä\82ð\8aJ\95ú\82·\82é
        // TBoard, TThreadItem \82Ì\83f\83X\83g\83\89\83N\83^\82Í\83v\83\89\83O\83C\83\93\82É\94j\8aü\82ð\93`\82¦\82é\82Ì\82Å
@@ -1756,8 +1766,8 @@ begin
 
        //\97\9a\97ð\82Ì\95Û\91\82Æ\94j\8aü
        try
-               SaveHistory;
-               ClearHistory;
+               FHistoryList.SaveToFile(GikoSys.GetConfigDir + 'History.xml');
+               FHistoryList.Clear;
        except
        end;
 
@@ -1808,7 +1818,8 @@ begin
        ShowBBSTree( BBSs[ 0 ] );
 
        // \97\9a\97ð\93Ç\82Ý\8d\9e\82Ý
-       LoadHistory;
+    FHistoryList.LoadFromFile(GikoSys.GetConfigDir + 'History.xml',
+        TreeView, FTreeType);
 
        //\82¨\8bC\82É\93ü\82è\93Ç\82Ý\8d\9e\82Ý
        FavoriteDM.ReadFavorite;
@@ -1820,8 +1831,6 @@ begin
        RoundList.LoadRoundThreadFile;
 
        LockWindowUpdate(0);
-       //
-       GikoDM.TabsOpenAction.Execute;
 end;
 
 {!
@@ -1881,7 +1890,13 @@ begin
                FActiveContent := nil;
                Exit;
        end;
-
+    // \91O\89ñ\82Æ\93¯\82\8fê\8d\87\8fI\97¹
+    if (StatusBar.Panels[1].Text = Text2) then begin
+        {$IFDEF DEBUG}
+        Writeln('Status Text is not changed!');
+        {$ENDIF}
+        Exit;
+    end;
        StatusBar.Panels[1].Text := Text2;
 
        if FHint <> nil then begin
@@ -1895,6 +1910,8 @@ begin
                if not GikoForm.Active then
                        Exit;
 
+
+
 //file:///C:/Borland/Projects/gikoNavi/test/read.cgi/qa/990576336/10
 //file:///C:/Borland/Projects/gikoNavi/test/read.cgi/qa/990576336/10-15
 
@@ -2506,6 +2523,19 @@ begin
        end;
 end;
 
+//! \82à\82Á\82Æ\82à\8cÃ\82¢Browser\82Ì\8aJ\95ú
+procedure TGikoForm.ReleaseOldestBrowser;
+var
+    i: Integer;
+begin
+    for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
+        if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser =
+                TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
+            ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[i]));
+            break;
+        end;
+    end;
+end;
 
 function TGikoForm.InsertBrowserTab(
        ThreadItem      : TThreadItem;
@@ -2515,6 +2545,7 @@ var
        i, j, idx               : Integer;
        favItem                 : TFavoriteThreadItem;
        newBrowser      : TBrowserRecord;
+    ins : Integer;
 begin
 
        Result := nil;
@@ -2530,7 +2561,7 @@ begin
                                FBrowsers.Move(BROWSER_COUNT - 1, 0);
                end;
                favItem := TFavoriteThreadItem.Create(ThreadItem.URL, ThreadItem.Title );
-               if not AddHistory( favItem ) then
+               if not FHistoryList.AddHistory( favItem, TreeView, FTreeType ) then
                        favItem.Free;
 
                for i := 0 to BrowserTab.Tabs.Count - 1 do begin
@@ -2538,12 +2569,8 @@ begin
                                if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread = ThreadItem then begin
                                        Result := TBrowserRecord( BrowserTab.Tabs.Objects[i] );
                                        if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser = nil then begin
-                                               for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
-                                                       if TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
-                                                               ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
-                                                               break;
-                                                       end;
-                                               end;
+                        //\88ê\94Ô\8cÃ\82¢\83u\83\89\83E\83U\82ð\8aJ\95ú\82·\82é
+                        ReleaseOldestBrowser;
                                                TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
                                                TBrowserRecord(BrowserTab.Tabs.Objects[i]).Repaint := true;
                                                FBrowsers.Move(BROWSER_COUNT - 1, 0);
@@ -2558,21 +2585,15 @@ begin
                        end;
                end;
                idx := BrowserTab.TabIndex;
-               if GikoSys.Setting.BrowserTabAppend = gtaFirst then begin
-                       newBrowser := TBrowserRecord.Create;
-                       for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
-                               if TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
-                                       ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
-                                       break;
-                               end;
-                       end;
-                       newBrowser.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
-                       FBrowsers.Move(BROWSER_COUNT - 1, 0);
-                       //newBrowser.Browser.Navigate(BLANK_HTML);
-                       newBrowser.thread := ThreadItem;
-                       newBrowser.Repaint := true;
-//                     newBrowser.OnlyHundred := GikoSys.OnlyAHundredRes;
+        newBrowser := TBrowserRecord.Create;
+        // \88ê\94Ô\8cÃ\82¢\83u\83\89\83E\83U\82ð\8aJ\95ú\82·\82é
+        ReleaseOldestBrowser;
+        newBrowser.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
+        FBrowsers.Move(BROWSER_COUNT - 1, 0);
+        newBrowser.thread := ThreadItem;
+        newBrowser.Repaint := true;
 
+               if GikoSys.Setting.BrowserTabAppend = gtaFirst then begin
                        BrowserTab.Tabs.InsertObject(0, GikoSys.GetShortName(ThreadItem.Title, 20), newBrowser);
                        if (not GikoSys.Setting.BrowserTabVisible) and (BrowserTab.Tabs.Count > 1) then begin
                                DeleteTab( TBrowserRecord( BrowserTab.Tabs.Objects[ 1 ] ) );
@@ -2582,22 +2603,7 @@ begin
                        if ActiveTab then begin
                                BrowserTab.TabIndex := 0;
                        end;
-
-               end else begin
-                       newBrowser := TBrowserRecord.Create;
-                       for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
-                               if TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
-                                       ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
-                                       break;
-                               end;
-                       end;
-                       newBrowser.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
-                       FBrowsers.Move(BROWSER_COUNT - 1, 0);
-                       //newBrowser.Browser.Navigate(BLANK_HTML);
-                       newBrowser.thread := ThreadItem;
-//                     newBrowser.OnlyHundred := GikoSys.OnlyAHundredRes;
-                       newBrowser.Repaint := true;
-
+               end else if GikoSys.Setting.BrowserTabAppend = gtaLast then begin
                        i := BrowserTab.Tabs.AddObject(GikoSys.GetShortName(ThreadItem.Title, 20), newBrowser);
                        if (not GikoSys.Setting.BrowserTabVisible) and (BrowserTab.Tabs.Count > 1) then begin
                                DeleteTab( TBrowserRecord( BrowserTab.Tabs.Objects[ 0 ] ) );
@@ -2610,7 +2616,40 @@ begin
                                else
                                        BrowserTab.TabIndex := i;
                        end;
-               end;
+               end else begin
+            // \83^\83u\88Ê\92u\82ð\8eæ\93¾
+            ins := -1;
+            for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
+            if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser =
+                    TWebBrowser(FBrowsers[1]) then begin
+                    ins := i;
+                    break;
+                end;
+            end;
+            if GikoSys.Setting.BrowserTabAppend = gtaRight then begin
+                Inc(ins);
+                   end;
+            // \83^\83u\82ª\96³\82¢\82Æ\82«\82È\82Ç\91Î\8dô
+            if (ins < 0) then begin
+                ins := 0;
+            end;
+                       BrowserTab.Tabs.InsertObject(ins, GikoSys.GetShortName(ThreadItem.Title, 20), newBrowser);
+                       if (not GikoSys.Setting.BrowserTabVisible) and (BrowserTab.Tabs.Count > 1) then begin
+                if GikoSys.Setting.BrowserTabAppend = gtaRight then begin
+                               DeleteTab( TBrowserRecord( BrowserTab.Tabs.Objects[ 0 ] ) );
+                end else begin
+                    DeleteTab( TBrowserRecord( BrowserTab.Tabs.Objects[ 1 ] ) );
+                end;
+                       end;
+                       //end;
+                       BrowserTab.Repaint;
+                       if ActiveTab then begin
+                               if (not GikoSys.Setting.BrowserTabVisible) and (BrowserTab.Tabs.Count > 0) then
+                                       BrowserTab.TabIndex := 0
+                               else
+                                       BrowserTab.TabIndex := ins;
+                       end;
+        end;
                Result := newBrowser;
                if(ActiveTab) or (idx = -1) then begin
                        BrowserTab.OnChange(nil);
@@ -2641,7 +2680,6 @@ var
        sTitle: string;
        doc: Variant;
        s: string;
-       i: Integer;
        idx: Integer;
        ThreadItem: TThreadItem;
        Thread: TBrowserRecord;
@@ -2678,12 +2716,8 @@ begin
        end     else if Thread.Browser = nil then begin
                if FActiveContent.Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then
                        FBrowsers.Move(BROWSER_COUNT - 1, 0);
-               for i := BrowserTab.Tabs.Count - 1 downto 0 do begin
-                       if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
-                               ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[i]));
-                               break;
-                       end;
-               end;
+        // \88ê\94Ô\8cÃ\82¢\83u\83\89\83E\83U\82ð\8aJ\95ú\82·\82é
+        ReleaseOldestBrowser;
                Thread.Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
                FBrowsers.Move(BROWSER_COUNT - 1, 0);
        end;
@@ -3010,209 +3044,10 @@ begin
        end;
 end;
 
-function TGikoForm.AddHistory( favItem : TFavoriteThreadItem ): Boolean;
-var
-       i: Integer;
-       Item: TFavoriteThreadItem;
-       Node: TTreeNode;
-begin
-//     Result := False;
-//     if (GetActiveContent = ThreadItem) and
-//                     (ThreadItem.Count <= ThreadItem.Kokomade) then
-//             Exit;
-//     if GetActiveContent = ThreadItem then
-//             Exit;
-
-       Result := True;
-       if FTreeType = gttHistory then
-       TreeView.Selected := nil;
-
-       for i := 0 to FHistoryList.Count - 1 do begin
-               if TObject(FHistoryList[i]) is TFavoriteThreadItem then begin
-                       Item := TFavoriteThreadItem(FHistoryList[i]);
-                       if Item.URL = favItem.URL then begin
-//                             SetContent(ThreadItem);
-                               FHistoryList.Move(i, 0);
-                               if FTreeType = gttHistory then
-                                       if TreeView.Items.GetFirstNode <> TreeView.Items[ i ] then
-                                               TreeView.Items[ i ].MoveTo( TreeView.Items.GetFirstNode, naInsert );
-                                                               Result := false;
-                               Exit;
-                       end;
-               end;
-       end;
-
-       if FHistoryList.Count > 0 then
-               FHistoryList.Insert( 0, favItem )
-       else
-               FHistoryList.Add( favItem );
-//     SetContent(ThreadItem);
-//     while GikoSys.Setting.AddressHistoryCount < FHistoryList.Count do begin
-       while GikoSys.Setting.MaxRecordCount < FHistoryList.Count do begin
-               i := FHistoryList.Count - 1;
-               TObject( FHistoryList.Items[ i ] ).Free;
-               FHistoryList.Delete( i );
-       end;
-
-       if FTreeType = gttHistory then begin
-               Node := TreeView.Items.Add( nil, favItem.Title );
-               Node.MoveTo( TreeView.Items.GetFirstNode, naInsert );
-               {
-               if favItem.NewArrival then begin
-                       Node.ImageIndex := ITEM_ICON_THREADNEW1;
-                       Node.SelectedIndex := ITEM_ICON_THREADNEW2;
-               end else begin
-                       Node.ImageIndex := ITEM_ICON_THREADLOG1;
-                       Node.SelectedIndex := ITEM_ICON_THREADLOG2;
-               end;
-               }
-               // \95\89\89×\82ð\82©\82¯\82½\82­\82È\82¢\82Ì\82Å NewArrival \82Ì\83`\83F\83b\83N\82ð\8ds\82í\82È\82¢
-               // \81¦favItem.Item \83v\83\8d\83p\83e\83B\82Í dat \82Ì\93Ç\82Ý\8d\9e\82Ý\82ð\95K\97v\82Æ\82·\82é
-               Node.ImageIndex := ITEM_ICON_THREADLOG1;
-               Node.SelectedIndex := ITEM_ICON_THREADLOG2;
-               Node.Data := favItem;
-               //while GikoSys.Setting.AddressHistoryCount < TreeView.Items.Count do begin
-               while GikoSys.Setting.MaxRecordCount < TreeView.Items.Count do begin
-                       i := TreeView.Items.Count - 1;
-                       TreeView.Items.Item[ i ].Delete;
-               end;
-       end;
-end;
-
+//\97\9a\97ð\82©\82ç\8dí\8f\9c
 procedure TGikoForm.DeleteHistory( threadItem: TThreadItem );
-var
-       i: Integer;
-       node: TTreeNode;
-begin
-       // \83L\83\83\83r\83l\83b\83g\82É\97\9a\97ð\82ª\95\\8e¦\82³\82ê\82Ä\82¢\82½\82ç\81A
-       // \83L\83\83\83r\83l\83b\83g\93à\82Ì\83A\83C\83e\83\80\82à\8dí\8f\9c\82·\82é\81B
-       if (FTreeType = gttHistory) then begin
-               node := TreeView.Items.GetFirstNode;
-               while (node <> nil) do begin
-                       if ( TFavoriteThreadItem(node.Data).Item  = threadItem ) then begin
-                               TreeView.Items.Delete(node);
-                               TreeView.Refresh;
-                               node := nil;
-                       end else begin
-                               node := node.GetNext;
-                       end;
-               end;
-       end;
-       for i := 0 to FHistoryList.Count - 1 do begin
-               if threadItem = TFavoriteThreadItem( FHistoryList.Items[i] ).Item then begin
-                       TFavoriteThreadItem( FHistoryList.Items[ i ] ).Free;
-                       FHistoryList.Delete(i);
-                       FHistoryList.Capacity := FHistoryList.Count;
-                       Break;
-               end;
-       end;
-end;
-
-procedure TGikoForm.ClearHistory;
-var
-       i : Integer;
 begin
-       //FHistoryList.Clear;
-
-       try
-               for i := FHistoryList.Count - 1 downto 0 do begin
-                       if TObject(FHistoryList[ i ]) is TFavoriteThreadItem then
-               TFavoriteThreadItem(FHistoryList[ i ]).Free
-            else if TObject(FHistoryList[ i ]) is TFavoriteBoardItem then
-                TFavoriteBoardItem(FHistoryList[ i ]).Free;
-
-                       //FHistoryList.Delete(i);
-        end;
-       except
-       end;
-
-       FHistoryList.Clear;
-    FHistoryList.Capacity := FHistoryList.Count;
-
-end;
-
-procedure TGikoForm.SaveHistory;
-var
-       i, bound        : Integer;
-       saveList        : TstringList;
-begin
-
-       saveList := TStringList.Create;
-       try
-               FHistoryList.Pack;
-        FHistoryList.Capacity := FHistoryList.Count;
-               saveList.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');
-               saveList.Add('<address>');
-               bound := FHistoryList.Count - 1;
-               for i := bound downto 0 do begin
-                       // title \82Í\8d¡\82Ì\82Æ\82±\82ë\8eg\82Á\82Ä\82¢\82È\82¢
-                       saveList.Add(
-                               '<history url="' + HtmlEncode( TFavoriteThreadItem( FHistoryList[ i ] ).URL ) + '"' +
-                               ' title="' + HtmlEncode( MojuUtils.Sanitize(TFavoriteThreadItem( FHistoryList[ i ] ).Title )) + '"/>');
-               end;
-               saveList.Add('</address>');
-               saveList.SaveToFile( GikoSys.GetConfigDir + 'History.xml' );
-       finally
-               saveList.Free;
-       end;
-
-end;
-
-procedure TGikoForm.LoadHistory;
-var
-       i, bound                : Integer;
-       fileName                : string;
-       XMLDoc                  : IXMLDocument;
-       XMLNode                 : IXMLNode;
-       HistoryNode     : IXMLNode;
-       s                                               : string;
-       favItem                 : TFavoriteThreadItem;
-{$IFDEF DEBUG}
-       st, rt : Cardinal;
-{$ENDIF}
-begin
-{$IFDEF DEBUG}
-       st := GetTickCount;
-{$ENDIF}
-
-       fileName := GikoSys.GetConfigDir + 'History.xml';
-
-       if FileExists( fileName ) then begin
-               try
-                       XMLDoc := IXMLDocument.Create;
-                       //XMLDoc := LoadXMLDocument(FileName);
-                       LoadXMLDocument(FileName, XMLDoc);
-                       try
-                               XMLNode := XMLDoc.DocumentElement;
-
-                               if XMLNode.NodeName = 'address' then begin
-                                       bound := XMLNode.ChildNodes.Count - 1;
-                                       for i := 0 to bound do begin
-                                               HistoryNode := XMLNode.ChildNodes[i];
-                                               if HistoryNode.NodeName = 'history' then begin
-                                                       //if FReadCount >= sl.Count then begin
-                                                               s := Trim(HistoryNode.Attributes['url']);
-                                                               if s <> '' then begin
-                                                                       favItem := TFavoriteThreadItem.Create(
-                                                                               s, MojuUtils.UnSanitize(HistoryNode.Attributes[ 'title' ]) );
-                                                                       if not AddHistory( favItem ) then
-                                                                               favItem.Free;
-                                                               end;
-                                                       //end;
-                                               end;
-                                       end;
-                               end;
-                       finally
-                               XMLDoc.Free;
-                       end;
-               except
-               end;
-       end;
-{$IFDEF DEBUG}
-       rt := GetTickCount - st;
-       Writeln('Runtime(Load Histroy) : ' + IntToStr(rt) + ' ms');
-{$ENDIF}
-
+    FHistoryList.DeleteHistory( threadItem, TreeView, TreeType );
 end;
 
 procedure TGikoForm.ShowBBSTreeOld(
@@ -3374,43 +3209,11 @@ begin
                FTreeType := gttHistory;
                HistoryToolBar.Show;
                FavoriteToolBar.Hide;
-               SetHistoryTreeNode;
+        FHistoryList.SetTreeNode( TreeView );
                CabinetSelectToolButton.Caption := '\97\9a\97ð\83\8a\83X\83g';
        end;
 end;
 
-procedure TGikoForm.SetHistoryTreeNode;
-var
-       i: Integer;
-       Node: TTreeNode;
-       Item: TFavoriteThreadItem;
-begin
-       TreeView.Items.BeginUpdate;
-       try
-               TreeView.Items.Clear;
-               for i := 0 to FHistoryList.Count - 1 do begin
-                       Item := TFavoriteThreadItem(FHistoryList[i]);
-                       Node := TreeView.Items.Add(nil, Item.Title);
-                       {
-                       if Item.Item.NewArrival then begin
-                               Node.ImageIndex := ITEM_ICON_THREADNEW1;
-                               Node.SelectedIndex := ITEM_ICON_THREADNEW2;
-                       end else begin
-                               Node.ImageIndex := ITEM_ICON_THREADLOG1;
-                               Node.SelectedIndex := ITEM_ICON_THREADLOG2;
-                       end;
-                       }
-                       // \95\89\89×\82ð\82©\82¯\82½\82­\82È\82¢\82Ì\82Å NewArrival \82Ì\83`\83F\83b\83N\82ð\8ds\82í\82È\82¢
-                       // \81¦Item.Item \83v\83\8d\83p\83e\83B\82Í dat \82Ì\93Ç\82Ý\8d\9e\82Ý\82ð\95K\97v\82Æ\82·\82é
-                       Node.ImageIndex := ITEM_ICON_THREADLOG1;
-                       Node.SelectedIndex := ITEM_ICON_THREADLOG2;
-                       Node.Data := Item;
-               end;
-       finally
-               TreeView.Items.EndUpdate;
-       end;
-end;
-
 procedure TGikoForm.SelectTreeNode(Item: TObject; CallEvent: Boolean);
 var
        ChangeEvent: TTVChangedEvent;
@@ -3741,14 +3544,9 @@ begin
     end;
     if(BrowserTab.TabIndex <> -1) and
         ( TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser = nil) then begin
-        for j := BrowserTab.Tabs.Count - 1 downto 0 do begin
-            if(TBrowserRecord(BrowserTab.Tabs.Objects[j]).Browser
-                 = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) )then
-            begin
-                ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[j]));
-                break;
-            end;
-        end;
+        // \88ê\94Ô\8cÃ\82¢\83u\83\89\83E\83U\82ð\8aJ\95ú\82·\82é
+        ReleaseOldestBrowser;
+
         TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Browser
              :=  TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
         TBrowserRecord(BrowserTab.Tabs.Objects[BrowserTab.TabIndex]).Repaint := true;
@@ -3793,7 +3591,7 @@ begin
        LPMSep06.Visible := bCategory or bBoard;
        BoardFavoriteAddMenu.Visible := bCategory;
        ThreadFavoriteAddMenu.Visible := bBoard;
-
+    SaveThreadFile.Visible := bBoard;
        AddRoundNameMenu(ItemReservPMenu);
        AddRoundNameMenu(ListReservPMenu);
 end;
@@ -3895,15 +3693,17 @@ var
        wkIntTo: Integer;
     BNum, BRes: string;
     threadItem: TThreadItem;
+    aElement : IHTMLElement;
 begin
-
        Cancel := True;
-       if (IHTMLDocument2(TWebBrowser(Sender).Document).activeElement <> nil) then begin
-               Text := IHTMLDocument2(TWebBrowser(Sender).Document).activeElement.Get_outerText;
-               Html := IHTMLDocument2(TWebBrowser(Sender).Document).activeElement.Get_outerHTML;
+    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
@@ -3926,6 +3726,7 @@ begin
 
                                if wkIntSt <> 0 then begin
                                        FActiveContent.IDAnchorPopup('');
+                    MoveHisotryManager.pushItem(FActiveContent);
                                        BrowserMovement(IntToStr(wkIntSt));
                                end;
 
@@ -3959,6 +3760,7 @@ begin
                                                AddressComboBox.Items.Insert(0, URL);
                                        end;
                                end;
+                MoveHisotryManager.pushItem(FActiveContent);
                                MoveToURL( URL );
                        end;
                end;
@@ -4016,7 +3818,7 @@ end;
 
 procedure TGikoForm.BrowserTabChange(Sender: TObject);
 var
-       i, j: Integer;
+       j: Integer;
        idx: Integer;
 begin
        BrowserTab.Tabs.BeginUpdate;
@@ -4039,12 +3841,9 @@ begin
                                                (FActiveContent.Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1])) then
                                                FBrowsers.Move(BROWSER_COUNT - 1, 0);
 
-                                       for i := 0 to BrowserTab.Tabs.Count - 1 do begin
-                                               if TBrowserRecord(BrowserTab.Tabs.Objects[i]).Browser = TWebBrowser(FBrowsers[BROWSER_COUNT - 1]) then begin
-                                                       ReleaseBrowser(TBrowserRecord(BrowserTab.Tabs.Objects[i]));
-                                                       break;
-                                               end;
-                                       end;
+                    // \88ê\94Ô\8cÃ\82¢\83u\83\89\83E\83U\82ð\8aJ\95ú\82·\82é
+                    ReleaseOldestBrowser;
+
                                        TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Browser := TWebBrowser(FBrowsers[BROWSER_COUNT - 1]);
                                        TBrowserRecord(BrowserTab.Tabs.Objects[idx]).Repaint := true;
                                        FBrowsers.Move(BROWSER_COUNT - 1, 0);
@@ -4157,6 +3956,7 @@ procedure TGikoForm.BrowserTabDragDrop(Sender, Source: TObject; X,
 var
        idx: Integer;
 begin
+    FDragWFirst := False;
        idx := BrowserTab.IndexOfTabAt(X, Y);
        if idx <> -1 then
                BrowserTab.Tabs.Move(BrowserTab.TabIndex, idx);
@@ -4171,14 +3971,11 @@ begin
 
        TabIdx := BrowserTab.IndexOfTabAt(x, y);
 
-       if ( ssLeft in Shift ) and ( BrowserTab.Style = tsTabs ) then begin
-               if FDragWFirst = false then begin
-                       FDragWFirst := true;
-               end else begin
+       if ( ssLeft in Shift ) then begin
+        if (FDragWFirst) then begin
                        BrowserTab.EndDrag(false);
                        BrowserTab.BeginDrag(false, DandD_THRESHOLD);
-                       FDragWFirst := false;
-               end;
+        end;
        end else begin
                BrowserTab.EndDrag(false);
                FDragWFirst := false;
@@ -4834,14 +4631,21 @@ begin
                        if not (ssAlt in KeyDataToShiftState(TWMChar(Message).KeyData)) then
                                Exit;
                WM_SYSCOMMAND:
-                       if Message.WParam = SC_MINIMIZE then
+                       if Message.WParam = SC_MINIMIZE then begin
                                OnMinimize;
+                PostMessage(Handle, USER_MINIMIZED, 0, 0);
+            end;
                USER_TREECLICK:
                        TreeClick( TreeView.Selected );
                USER_RESIZED:
                        OnResized;
                USER_MINIMIZED:
-                       OnMinimized;
+            begin
+                if (GikoSys.Setting.StoredTaskTray) then begin
+                    StoredTaskTray;
+                end;
+                OnMinimized;
+            end;
                USER_SETLINKBAR:
                        SetLinkBar;
                USER_DOCUMENTCOMPLETE:
@@ -4905,128 +4709,35 @@ procedure TGikoForm.PreviewTimerTimer(Sender: TObject);
 var
        p: TPoint;
        ARect: TRect;
-       sl: TStringList;
-       html: string;
-       HtmlFileName: string;
-
-       NavURL: OleVariant;
-       Flags: OleVariant;
-       TargetFrameName: OleVariant;
-       PostData: OleVariant;
-       Headers: OleVariant;
-       WindowHeight: Integer;
-       WindowWidth: Integer;
-
-//     Style: Longint;
-       Referer: string;
-       Protocol, Host, Path, Document, Port, Bookmark: string;
 begin
        PreviewTimer.Enabled := False;
 
        GetCursorpos(p);
 
-       case GikoSys.Setting.PreviewSize of
-               gpsXSmall: begin
-                       WindowWidth := 128;
-                       WindowHeight := 96;
-               end;
-               gpsSmall: begin
-                       WindowWidth := 256;
-                       WindowHeight := 192;
-               end;
-               gpsLarge: begin
-                       WindowWidth := 512;
-                       WindowHeight := 384;
-               end;
-               gpsXLarge: begin
-                       WindowWidth := 640;
-                       WindowHeight := 480;
-               end;
-               else begin      //gpsMedium
-                       WindowWidth := 384;
-                       WindowHeight := 288;
-               end;
-       end;
-
-       ARect := Rect(0, 0, WindowWidth, WindowHeight);
-
-       case GikoSys.Setting.PopupPosition of
-               gppRightTop:            OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y - (ARect.Bottom - ARect.Top) -     15);
-               gppRight:                       OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y - ((ARect.Bottom - ARect.Top) div 2));
-               gppRightBottom: OffsetRect(ARect, p.x - (ARect.Right - ARect.Left) - 15, p.y + 15);
-               gppTop:                                 OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y - (ARect.Bottom - ARect.Top) -  15);
-               gppCenter:                      OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y - ((ARect.Bottom - ARect.Top) div 2));
-               gppBottom:                      OffsetRect(ARect, p.x - ((ARect.Right - ARect.Left) div 2), p.y + 15);
-               gppLeftTop:                     OffsetRect(ARect, p.x + 15, p.y - (ARect.Bottom - ARect.Top) -  15);
-               gppLeft:                                OffsetRect(ARect, p.x + 15, p.y - ((ARect.Bottom - ARect.Top) div 2));
-               gppLeftBottom:  OffsetRect(ARect, p.x + 15, p.y + 15);          //\83M\83R\83i\83r\83X\83\8c \83p\81[\83g\82P\82Ì453\8e\81\82É\8a´\8eÓ
-       end;
-
-       html := '<html><head>'#13#10
-                               + '<SCRIPT>'#13#10
-                               + 'function init() {'#13#10
-                               + '     if ((document.body.clientHeight >= Image1.height) && (document.body.clientWidth >= Image1.width)) {'#13#10
-                               + '     } else {'#13#10
-                               + '             var dh, ih;'#13#10
-                               + '             dh = document.body.clientWidth / document.body.clientHeight;'#13#10
-                               + '             ih = Image1.width / Image1.height;'#13#10
-                               + '             if (document.body.clientWidth < document.body.clientHeight) {'#13#10
-                               + '                     if (ih > dh)'#13#10
-                               + '                             Image1.width = document.body.clientWidth;'#13#10
-                               + '                     else'#13#10
-                               + '                             Image1.height = document.body.clientHeight;'#13#10
-                               + '             } else {'#13#10
-                               + '                     if (ih < dh)'#13#10
-                               + '                             Image1.height = document.body.clientHeight;'#13#10
-                               + '                     else'#13#10
-                               + '                             Image1.width = document.body.clientWidth;'#13#10
-                               + '             }'#13#10
-                               + '     }'#13#10
-                               + '     Message.style.display = "none";'#13#10
-                               + '}'#13#10
-                               + '</SCRIPT>'#13#10
-                               + '</head>'#13#10
-                               + '<body topmargin="0" leftmargin="0" style="border-width: 1px; overflow:hidden; border-style: solid;" onLoad="init()">'#13#10
-                               + '<div align="center" id="Message">\83v\83\8c\83r\83\85\81[\8dì\90¬\92\86</div>'#13#10
-                               + '<div align="center"><img name="Image1" border="0" src="%ImageURL%"></div>'#13#10
-                               + '</body></html>';
-       sl := TStringList.Create;
-       try
-               try
-                       HtmlFileName := GikoSys.GetAppDir + HTML_FILE_NAME;
-                       sl.Text := AnsiReplaceStr(html, '%ImageURL%', FPreviewURL);
-                       sl.SaveToFile(HtmlFileName);
-               finally
-                       sl.Free;
-               end;
-       except
-       end;
+    ARect := FPreviewBrowser.GetWindowRect(p);
+
+    FPreviewBrowser.PreviewImage(FPreviewURL);
+
+       if ARect.Bottom > Screen.DesktopHeight then begin
+        OffsetRect(ARect, 0, -(ARect.Bottom - Screen.DesktopHeight));
+    end;
+       if (ARect.Right > Screen.DesktopWidth) then begin
+        OffsetRect(ARect, -(ARect.Right - Screen.DesktopWidth), 0);
+    end;
+       if (ARect.Left < Screen.DesktopLeft) then begin
+        OffsetRect(ARect, +(Screen.DesktopLeft - ARect.Left), 0);
+    end;
+       if (ARect.Top < Screen.DesktopTop) then begin
+        OffsetRect(ARect, 0, (Screen.DesktopTop - ARect.Top));
+    end;
+
+       SetWindowPos(FPreviewBrowser.Handle, HWND_TOPMOST,
+        ARect.Left, ARect.Top,
+        (ARect.Right - ARect.Left), (ARect.Bottom - ARect.Top),
+        SWP_NOACTIVATE or SWP_HIDEWINDOW);
 
-       NavURL := HtmlFileName;
-       Flags := 0;
-       TargetFrameName := '';
-       PostData := '';
-
-       GikoSys.ParseURI(FPreviewURL, Protocol, Host, Path, Document, Port, Bookmark);
-       Referer := Protocol + '://' + Host;
-       if Port <> '' then
-               Referer := Referer + ':' + Port;
-       Referer := Referer + Path;
-       Headers := 'Referer: ' + Referer;
-       FPreviewBrowser.Navigate(NavURL, Flags, TargetFrameName, PostData, Headers);
-       if ARect.Top + WindowHeight > Screen.DesktopHeight then
-               ARect.Top := Screen.DesktopHeight - WindowHeight;
-       if ARect.Left + WindowWidth > Screen.DesktopWidth then
-               ARect.Left := Screen.DesktopWidth - WindowWidth;
-       if ARect.Left < Screen.DesktopLeft then ARect.Left := Screen.DesktopLeft;
-       if ARect.Bottom < Screen.DesktopTop then ARect.Bottom := Screen.DesktopTop;
-
-       SetWindowPos(FPreviewBrowser.Handle, HWND_TOPMOST, ARect.Left, ARect.Top, WindowWidth, WindowHeight, SWP_NOACTIVATE or SWP_HIDEWINDOW);
        ShowWindow(FPreviewBrowser.Handle, SW_SHOWNOACTIVATE);
        FPreviewBrowserRect := ARect;
-//     Style := GetWindowLong(FPreviewBrowser.Handle, GWL_EXSTYLE);
-//     SetWindowLong(FPreviewBrowser.Handle, GWL_EXSTYLE, Style xor WS_EX_APPWINDOW);
-
 end;
 
 procedure TGikoForm.WMSetCursor(var Message: TWMSetCursor);
@@ -5146,7 +4857,6 @@ begin
                if (GetKeyState( VK_SHIFT ) and $80000000) = 0 then
                        if MsgBox(Handle, DEL_MSG, DEL_TITLE, MB_YESNO or MB_ICONWARNING or MB_DEFBUTTON2) <> ID_YES then
                                Exit;
-               ClearHistory;
                FHistoryList.Clear;
                TreeView.Items.Clear;
        end;
@@ -6357,24 +6067,18 @@ end;
 procedure TGikoForm.BrowserTabMouseUp(Sender: TObject;
        Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 begin
-       if FDragWFirst <> true then begin
+       if FDragWFirst = true then
                FDragWFirst := false;
-{
-       end else if (abs( X - FMouseDownPos.X ) < Mouse.DragThreshold)
-       and (abs( Y - FMouseDownPos.Y ) < Mouse.DragThreshold) then begin
-(*}
-       end else begin
-//*)
-               if GikoSys.Setting.ListOrientation = gloHorizontal then begin
-                       if GikoSys.Setting.ListWidthState = glsMin then begin
-                               GikoDM.BrowserMaxAndFocusAction.Execute;
-                       end;
-               end else begin
-                       if GikoSys.Setting.ListHeightState = glsMin then begin
-                               GikoDM.BrowserMaxAndFocusAction.Execute;
-                       end;
-               end;
-       end;
+
+    if GikoSys.Setting.ListOrientation = gloHorizontal then begin
+        if GikoSys.Setting.ListWidthState = glsMin then begin
+            GikoDM.BrowserMaxAndFocusAction.Execute;
+        end;
+    end else begin
+        if GikoSys.Setting.ListHeightState = glsMin then begin
+            GikoDM.BrowserMaxAndFocusAction.Execute;
+        end;
+    end;
 end;
 
 procedure TGikoForm.LinkToolBarDragOver(Sender, Source: TObject; X,
@@ -6402,35 +6106,6 @@ begin
 
 end;
 
-procedure TGikoForm.ListCoolBarContextPopup(Sender: TObject;
-       MousePos: TPoint; var Handled: Boolean);
-begin
-
-       FToolBarSettingSender := tssList;
-       MousePos := ListCoolBar.ClientToScreen( MousePos );
-       MainCoolBarPopupMenu.Popup( MousePos.X, MousePos.Y );
-
-end;
-
-procedure TGikoForm.MainCoolBarContextPopup(Sender: TObject;
-       MousePos: TPoint; var Handled: Boolean);
-begin
-
-       FToolBarSettingSender := tssMain;
-       MousePos := MainCoolBar.ClientToScreen( MousePos );
-       MainCoolBarPopupMenu.Popup( MousePos.X, MousePos.Y );
-
-end;
-
-procedure TGikoForm.BrowserCoolBarContextPopup(Sender: TObject;
-       MousePos: TPoint; var Handled: Boolean);
-begin
-
-       FToolBarSettingSender := tssBrowser;
-       MousePos := BrowserCoolBar.ClientToScreen( MousePos );
-       MainCoolBarPopupMenu.Popup( MousePos.X, MousePos.Y );
-
-end;
 procedure TGikoForm.SetListViewBackGroundColor(value: TColor);
 begin
        if FListViewBackGroundColor <> value then begin
@@ -6845,14 +6520,16 @@ end;
 //! \82¨\8bC\82É\93ü\82è\83c\83\8a\81[\82Ì\83}\83E\83X\83A\83b\83v\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, rc : Integer;
+       i, count: Integer;
        body : String;
-    limited : boolean;
+    limited : Integer;
 begin
   result := true;
   try
@@ -6888,13 +6565,14 @@ begin
                                                end;
                                        end;
                     count := GikoSys.GetSameIDResCount(AID, FActiveContent.Thread);
-                    limited := false;
-                    if count > 20 then begin
-                        rc := GikoUtil.MsgBox(Handle,
-                                '20\8cÂ\88È\8fã\82 \82è\82Ü\82·\82ª\81A\82·\82×\82Ä\95\\8e¦\82µ\82Ü\82·\82©\81H',
+                    limited := LIMIT;
+                    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);
-                        limited := rc <> ID_YES;
+                                                               MB_YESNO or MB_ICONQUESTION) = ID_YES) then begin
+                            limited := -1;
+                        end
                     end;
                                        body := GikoSys.GetSameIDResAnchor(AID, FActiveContent.Thread, limited);
                                        FActiveContent.IDAnchorPopup(body);
@@ -6917,89 +6595,6 @@ begin
                end;
 end;
 
-procedure TGikoForm.GetTabURLs(AStringList: TStringList);
-var
-  rec : TBrowserRecord;
-  i : Integer;
-begin
-    for i := 0 to BrowserTab.Tabs.Count -1 do begin
-        try
-            rec := TBrowserRecord( BrowserTab.Tabs.Objects[ i ] );
-            if( rec <> nil) and (rec.Thread <> nil) then
-                AStringList.Add( rec.Thread.URL );
-        except
-        end;
-    end;
-end;
-
-procedure TGikoForm.SaveTabURLs;
-const
-       Filename = 'tab.sav';
-       bFilename = '~tab.sav';
-var
-       SaveStringList: TStringList;
-begin
-       SaveStringList := TStringList.Create;
-       try
-               GetTabURLs(SaveStringList);
-        try
-            if FileExists( GikoSys.GetAppDir + Filename) then begin
-                CopyFile(PChar(GikoSys.GetAppDir + Filename),
-                    PChar(GikoSys.GetAppDir + bFilename), False);
-            end;
-        except
-        end;
-        SaveStringList.SaveToFile(GikoSys.GetAppDir + Filename);
-       finally
-               SaveStringList.Free;
-       end;
-end;
-
-procedure TGikoForm.LoadTabURLs;
-const
-       TABFILE = 'tab.sav';
-var
-       i, bound    : Integer;
-       item        : TThreadItem;
-       URLs                            : TStringList;
-       GikoTab                 : TGikoTabAppend;
-       fileName                : string;
-begin
-       GikoTab := GikoSys.Setting.BrowserTabAppend;
-    URLs := TStringList.Create();
-       try
-               fileName := ExtractFilePath(Application.ExeName) + TABFILE;
-               if FileExists(fileName) then begin
-                   try
-                               URLs.LoadFromFile(fileName);
-                               bound    := URLs.Count - 1;
-                               if bound > -1 then begin
-                                       GikoSys.Setting.BrowserTabAppend := gtpLast;
-                                       for i := 0 to bound do begin
-                                               item := BBSsFindThreadFromURL( URLs[ i ] );
-                                               if item <> nil then
-                                                       InsertBrowserTab( item, false );
-                                       end;
-                                       //\8dÅ\8f\89\82Ì\82P\96\87\82É\90Ý\92è \83A\83h\83\8c\83X\82Ì\90Ý\92è\82Ì\82½\82ß\82Ì\83J\83\89\8cÄ\82Ñ
-                                       if BrowserTab.Tabs.Count > 0 then begin
-                       BrowserTab.OnChange(nil);
-                                       end;
-                               end else begin
-                    // \8bó\82Ì\83t\83@\83C\83\8b\82Ì\8fê\8d\87\81C\83o\83b\83N\83A\83b\83v\82ð\8dí\8f\9c\82µ\82È\82¢\82½\82ß\82É\8dí\8f\9c
-                    DeleteFile(fileName);
-                end;
-               except
-                       on EFOpenError do ShowMessage('\83^\83u\83t\83@\83C\83\8b\82ª\8aJ\82¯\82Ü\82¹\82ñ');
-            end;
-        end;
-       finally
-        URLs.Free;
-               GikoSys.Setting.BrowserTabAppend := GikoTab;
-       end;
-
-end;
-
-
 /// ListView \82Ì\83J\83\89\83\80\95\9d\82¨\82æ\82Ñ\88Ê\92u\82Ì\95Û\91
 procedure TGikoForm.ActiveListColumnSave;
 var
@@ -7211,6 +6806,7 @@ var
        Action: TAction;
 begin
        s := MouseGesture.GetGestureStr;
+    MouseGesture.Clear;
        Action := GikoSys.Setting.Gestures.GetGestureAction(s);
        if Action <> nil then
                Action.Execute;
@@ -7525,46 +7121,6 @@ begin
                Screen.Cursor := Cursor;
 end;
 // *************************************************************************
-//! \83X\83N\83\8a\81[\83\93\8fã\82ÉEditorForm\82ª\82¢\82é\82©
-// *************************************************************************
-function TGikoForm.EditorFormExists(): boolean;
-var
-       i : Integer;
-begin
-       Result := false;
-       //\83X\83N\83\8a\81[\83\93\8fã\82Ì\91S\82Ä\82Ì\83t\83H\81[\83\80\82©\82ç\81AEditorForm\82ð\92T\82·
-       for i := 0 to Screen.CustomFormCount - 1 do begin
-               if TObject(Screen.CustomForms[i]) is TEditorForm then begin
-                       Result := true;
-                       Break;
-               end;
-       end;
-end;
-// *************************************************************************
-//! \83X\83N\83\8a\81[\83\93\8fã\82É\82¢\82é\82·\82×\82Ä\82ÌEditorForm\82©\82ç\96¼\91O\82Ì\97\9a\97ð\82ð\8dí\8f\9c\82·\82é
-// *************************************************************************
-procedure TGikoForm.AllEditroFormNameTextClearClear();
-var
-       i : Integer;
-begin
-       for i := 0 to Screen.CustomFormCount - 1 do begin
-               if TObject(Screen.CustomForms[i]) is TEditorForm then
-                       TEditorForm(Screen.CustomForms[i]).NameComboBox.Items.Clear;
-       end;
-end;
-// *************************************************************************
-//! \83X\83N\83\8a\81[\83\93\8fã\82É\82¢\82é\82·\82×\82Ä\82ÌEditorForm\82©\82ç\83\81\81[\83\8b\97\9a\97ð\82ð\8dí\8f\9c\82·\82é
-// *************************************************************************
-procedure TGikoForm.AllEditroFormMailTextClearClear();
-var
-       i : Integer;
-begin
-       for i := 0 to Screen.CustomFormCount - 1 do begin
-               if TObject(Screen.CustomForms[i]) is TEditorForm then
-                       TEditorForm(Screen.CustomForms[i]).MailComboBox.Items.Clear;
-       end;
-end;
-// *************************************************************************
 //! \83L\83\83\83r\83l\83b\83g\82ð\95Â\82\82é\81~\83{\83^\83\93\82Ì\83N\83\8a\83b\83N\83C\83x\83\93\83g
 // *************************************************************************
 procedure TGikoForm.CabinetCloseSpeedButtonClick(Sender: TObject);
@@ -7599,7 +7155,9 @@ begin
                        WM_KEYFIRST..WM_KEYLAST :
                        begin
                                //\83L\81[\83A\83b\83v\82Í\96³\8e\8b\82·\82é\81@KeyDown\82Æ\8d\87\82í\82¹\82Ä\82Q\89ñ\8cÄ\82Î\82ê\82é\82©\82ç
-                               if (Msg.message <> WM_KEYUP) and (Msg.message <> WM_CHAR) then begin
+                               if (Msg.message <> WM_KEYUP)
+                    and (Msg.message <> WM_CHAR)
+                    and (Msg.message <> WM_SYSKEYUP) then begin
                                        wmMsg.Msg := Msg.message;
                                        wmMsg.CharCode := Word(Msg.wParam);
                                        wmMsg.KeyData := Msg.lParam;
@@ -7835,6 +7393,93 @@ begin
        end;
 end;
 
+procedure TGikoForm.MainCoolBarContextPopup(Sender: TObject;
+  MousePos: TPoint; var Handled: Boolean);
+var
+    pos : TPoint;
+    coolBar: TGikoCoolBar;
+begin
+    Handled := False;
+    if (Sender <> nil) and (Sender is TGikoCoolBar) then begin
+        coolBar := TGikoCoolBar(Sender);
+        if (coolBar = MainCoolBar) then begin
+            FToolBarSettingSender := tssMain;
+        end else if (coolBar = ListCoolBar) then begin
+            FToolBarSettingSender := tssList;
+        end else if (coolBar = BrowserCoolBar) then begin
+            FToolBarSettingSender := tssBrowser;
+        end else begin
+            FToolBarSettingSender := tssNone;
+        end;
+        pos := coolBar.ClientToScreen( MousePos );
+        MainCoolBarPopupMenu.Popup( pos.X, pos.Y );
+        Handled := True;
+    end;
+end;
+
+procedure TGikoForm.TaskTrayIconMessage(var Msg: TMsg);
+begin
+    //  \8d\83N\83\8a\83b\83N\82È\82ç\95\9c\8c³\82·\82é
+    if  (Msg.wParam = WM_LBUTTONUP) then  begin
+        UnStoredTaskTray;
+    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µ
+procedure TGikoForm.StoredTaskTray;
+begin
+    try
+        if (FIconData.uID = 0) then begin
+            FIconData.cbSize  :=  SizeOf(TNotifyIconData);
+            FIconData.uID     :=  Self.Handle;
+            FIconData.Wnd     :=  Handle;
+            FIconData.uFlags  :=  NIF_MESSAGE or NIF_ICON or NIF_TIP;
+            FIconData.uCallbackMessage  :=  USER_TASKTRAY;
+            FIconData.hIcon   :=  Application.Icon.Handle;  {\83A\83C\83R\83\93\8ew\92è}
+            FIconData.szTip   :=  '\83M\83R\83i\83r';      {\83q\83\93\83g\95\8e\9a\97ñ}
+            Shell_NotifyIcon(NIM_ADD, @FIconData);
+            ShowEditors(SW_HIDE);
+            ShowWindow(Self.Handle, SW_HIDE);
+        end;
+    except
+    end;
+end;
+//! \83^\83X\83N\83g\83\8c\83C\82Ì\83A\83C\83R\83\93\8dí\8f\9c\81\95\83t\83H\81[\83\80\95\\8e¦
+procedure TGikoForm.UnStoredTaskTray;
+begin
+    try
+        try
+            Shell_NotifyIcon(NIM_DELETE, @FIconData);
+            SetForegroundWindow(Application.Handle);
+        except
+        end;
+    finally
+        FIconData.uID := 0;
+        // Action\82©\82ç\8ai\94[\82µ\82½\82Æ\82«\82ÍTag\82Ì\92l\82Í0\88È\8aO
+        if (GikoDM.StoredTaskTrayAction.Tag = 0) then begin
+            ShowWindow(Self.Handle, SW_RESTORE);
+        end else begin
+            ShowWindow(Self.Handle, SW_SHOW);
+        end;
+        ShowEditors(SW_SHOW);
+        GikoDM.StoredTaskTrayAction.Tag := 0;
+    end;
+end;
+{
+\brief \83\8c\83X\83G\83f\83B\83^\82Ì\95\\8e¦\94ñ\95\\8e¦
+\param nCmdShow Windows.ShowWindow\82É\91\97\82é\83p\83\89\83\81\81[\83^\82Æ\93¯\82
+}
+procedure TGikoForm.ShowEditors(nCmdShow: Integer);
+var
+    i : Integer;
+begin
+    // \83\8c\83X\83G\83f\83B\83^\82ð\92T\82·
+    for i := 0 to Screen.CustomFormCount - 1 do begin
+        if TObject(Screen.CustomForms[i]) is TEditorForm then
+            ShowWindow(Screen.CustomForms[i].Handle, nCmdShow);
+
+    end;
+end;
+
 initialization
                                OleInitialize(nil);
 finalization