OSDN Git Service

まちBBSの新URL(PATH_INFO)に対応
[gikonavigoeson/gikonavi.git] / GikoDataModule.pas
index cde121c..ce50fa2 100644 (file)
@@ -12,7 +12,7 @@ uses
        MSHTML_TLB,
 {$IFEND}
   ComCtrls, BrowserRecord, Graphics, Messages, Setting, Dialogs,
-  ActiveX;
+  ActiveX, GikoSystem, MoveHistoryItem, HistoryList;
 
 const
        CAPTION_NAME: string = '\83M\83R\83i\83r';
@@ -49,6 +49,7 @@ const
 
 
 type
+
   TGikoDM = class(TDataModule)
        GikoFormActionList: TActionList;
        OnlyAHundredResAction: TAction;
@@ -192,8 +193,6 @@ type
        TabsSaveAction: TAction;
        TabsOpenAction: TAction;
        BrowsBoradHeadAction: TAction;
-       TabAutoSaveAction: TAction;
-       TabAutoLoadAction: TAction;
        JumpToNumOfResAction: TAction;
        FavoriteTreeViewCollapseAction: TAction;
        RightTabCloseAction: TAction;
@@ -220,6 +219,28 @@ type
     ArchiveItemAction: TAction;
     LiveItemAction: TAction;
     FavoriteTreeViewItemNameCopyAction: TAction;
+    CloseAllEditorAction: TAction;
+    PrevMoveHistory: TAction;
+    NextMoveHistory: TAction;
+    ClickActiveElementAction: TAction;
+    VKDownAction: TAction;
+    VKUpAction: TAction;
+    VKRightAction: TAction;
+    VKLeftAction: TAction;
+    StoredTaskTrayAction: TAction;
+    AllImageLinkToClipbordAction: TAction;
+    NewImageLinkToClipBoardAction: TAction;
+    SetForcusForAddresBarAction: TAction;
+    NewBoardSearchAction: TAction;
+    NGWordEditFormAction: TAction;
+    ScrollPageDownAction: TAction;
+    ScrollPageUpAction: TAction;
+    AllLinkToClipboardAction: TAction;
+    NewLinkToClipboardAction: TAction;
+    AddIDtoNGWord0Action: TAction;
+    AddIDtoNGWord1Action: TAction;
+    ExtractSameIDAction: TAction;
+    ShowTabListAction: TAction;
        procedure EditNGActionExecute(Sender: TObject);
        procedure ReloadActionExecute(Sender: TObject);
        procedure GoFowardActionExecute(Sender: TObject);
@@ -307,8 +328,6 @@ type
        procedure SelectItemSaveForDatExecute(Sender: TObject);
        procedure TabsSaveActionExecute(Sender: TObject);
        procedure TabsOpenActionExecute(Sender: TObject);
-       procedure TabAutoSaveActionExecute(Sender: TObject);
-       procedure TabAutoLoadActionExecute(Sender: TObject);
        procedure BeLogInOutActionExecute(Sender: TObject);
        procedure BeLogInOutActionUpdate(Sender: TObject);
        procedure KokomadeActionExecute(Sender: TObject);
@@ -407,6 +426,33 @@ type
     procedure ArchiveItemActionExecute(Sender: TObject);
     procedure LiveItemActionExecute(Sender: TObject);
     procedure FavoriteTreeViewItemNameCopyActionExecute(Sender: TObject);
+    procedure CloseAllEditorActionExecute(Sender: TObject);
+    procedure CloseAllEditorActionUpdate(Sender: TObject);
+    procedure PrevMoveHistoryUpdate(Sender: TObject);
+    procedure PrevMoveHistoryExecute(Sender: TObject);
+    procedure NextMoveHistoryUpdate(Sender: TObject);
+    procedure NextMoveHistoryExecute(Sender: TObject);
+    procedure ClickActiveElementActionExecute(Sender: TObject);
+    procedure VKDownActionExecute(Sender: TObject);
+    procedure VKUpActionExecute(Sender: TObject);
+    procedure VKRightActionExecute(Sender: TObject);
+    procedure VKLeftActionExecute(Sender: TObject);
+    procedure StoredTaskTrayActionExecute(Sender: TObject);
+    procedure LeftTabSelectActionUpdate(Sender: TObject);
+    procedure RightmostTabSelectActionUpdate(Sender: TObject);
+    procedure NewImageLinkToClipBoardActionExecute(Sender: TObject);
+    procedure AllImageLinkToClipbordActionExecute(Sender: TObject);
+    procedure SetForcusForAddresBarActionExecute(Sender: TObject);
+    procedure NewBoardSearchActionExecute(Sender: TObject);
+    procedure ScrollPageDownActionExecute(Sender: TObject);
+    procedure ScrollPageUpActionExecute(Sender: TObject);
+    procedure AllLinkToClipboardActionExecute(Sender: TObject);
+    procedure NewLinkToClipboardActionExecute(Sender: TObject);
+    procedure AddIDtoNGWord0ActionExecute(Sender: TObject);
+    procedure AddIDtoNGWord1ActionExecute(Sender: TObject);
+    procedure ExtractSameIDActionExecute(Sender: TObject);
+    procedure ShowTabListActionExecute(Sender: TObject);
+    procedure BoardIEActionUpdate(Sender: TObject);
   private
        { Private \90é\8c¾ }
        procedure ClearResFilter;
@@ -420,9 +466,19 @@ type
        function GetSortProperties(List: TObject;var vSortOrder: Boolean): Boolean;
        procedure RecalcThreadSize(limit : Integer);
        procedure ClearSelectComboBox;
+    procedure ClearMailAllEditor();
+    procedure ClearNameTextAllEditor();
+    procedure MoveURLWithHistory(URL : String);
+    procedure BackToHistory(item: TMoveHistoryItem);
+    function GetActiveThreadLinks : IHTMLElementCollection;
+    procedure GetLinkURLs(links : IHTMLElementCollection;
+        URLs : TStringList; const Start: Integer; Exts : TStringList);
   public
        { Public \90é\8c¾ }
        procedure RepaintStatusBar;
+    function EditorFormExists(): boolean;
+    procedure GetTabURLs(AStringList: TStringList);
+    procedure OpenURLs(AStringList: TStringList);
   published
        { Published \90é\8c¾ }
        //! TAction\82ÅGetActiveContent\82ªnil\88È\8aO\82Å\97L\8cø\82É\82È\82é
@@ -441,18 +497,19 @@ implementation
 
 uses
        Windows, Math, Clipbrd,
-       Giko, GikoSystem, GikoUtil, BoardGroup,
+       Giko, GikoUtil, BoardGroup,
        FavoriteArrange, Favorite, MojuUtils,
        Editor, ListSelect, Search, Option, Round,
        KeySetting, Gesture, Kotehan, ToolBarSetting,
        ToolBarUtil, NewBoard, HTMLCreate, IndividualAbon,
        GikoBayesian, About, ShellAPI,
        RoundName, RoundData, Menus, ListViewUtils,
-       ThreadControl, GikoMessage, InputAssist;
+       ThreadControl, GikoMessage, InputAssist,
+    DefaultFileManager, Forms, NewBoardURL;
 
 const
        MSG_ERROR : string = '\83G\83\89\81[';
-       
+
 {$R *.dfm}
 // *************************************************************************
 //! TAction\82ÅGetActiveContent\82ªnil\88È\8aO\82Å\97L\8cø\82É\82È\82é
@@ -549,24 +606,10 @@ end;
 //! \83A\83h\83\8c\83X\83o\81[\82É\95\\8e¦\82µ\82Ä\82¢\82é\83A\83h\83\8c\83X\82Ö\88Ú\93®\82·\82é
 // *************************************************************************
 procedure TGikoDM.MoveToActionExecute(Sender: TObject);
-var
-       URL: string;
-       idx: Integer;
 begin
        //\83A\83h\83\8c\83X\83R\83\93\83{\83{\83b\83N\83X\82©\82çURL\82ð\8eæ\93¾
-       URL := Trim(GikoForm.AddressComboBox.Text);
        //URL\82É\88Ú\93®
-       GikoForm.MoveToURL(URL);
-       //\88È\89º\81A\97\9a\97ð\82Ì\8f\88\97\9d
-       idx := GikoForm.AddressComboBox.Items.IndexOf(URL);
-       if idx = -1 then begin
-               GikoForm.AddressComboBox.Items.Insert(0, URL);
-               if GikoForm.AddressComboBox.Items.Count > GikoSys.Setting.AddressHistoryCount then
-                       GikoForm.AddressComboBox.Items.Delete(GikoForm.AddressComboBox.Items.Count - 1);
-       end else begin
-               GikoForm.AddressComboBox.Items.Delete(idx);
-               GikoForm.AddressComboBox.Items.Insert(0, URL);
-       end;
+    MoveURLWithHistory( Trim(GikoForm.AddressComboBox.Text) );
 end;
 // *************************************************************************
 //! \82¨\8bC\82É\93ü\82è\82Ì\92Ç\89Á\83_\83C\83A\83\8d\83O\82ð\8aJ\82­
@@ -1272,6 +1315,18 @@ begin
        end;
 end;
 // *************************************************************************
+//! \8d\82Ì\83^\83u\82ð\91I\91ð\82·\82é\82ÌUpdate\83C\83x\83\93\83g
+// *************************************************************************
+procedure TGikoDM.LeftTabSelectActionUpdate(Sender: TObject);
+begin
+    if ( not GikoSys.Setting.LoopBrowserTabs ) then begin
+        LeftmostTabSelectActionUpdate(Sender);
+    end else begin
+        TAction(Sender).Enabled := (GikoForm.BrowserTab.Tabs.Count > 1);
+    end;
+end;
+
+// *************************************************************************
 //! \83^\83u\82Ì\90\94\82ª\82P\88È\8fã\82Å\81A\83^\83u\82Ì\83C\83\93\83f\83b\83N\83X\82ª\82O\88È\8aO\82Å\97L\8cø\82É\82È\82éUpdate\83C\83x\83\93\83g
 // *************************************************************************
 procedure TGikoDM.LeftmostTabSelectActionUpdate(Sender: TObject);
@@ -1291,7 +1346,13 @@ begin
                end else if GikoForm.BrowserTab.TabIndex > 0 then begin
                        GikoForm.BrowserTab.TabIndex := GikoForm.BrowserTab.TabIndex - 1;
                        GikoForm.BrowserTab.OnChange(nil);
-               end;
+               end else begin
+            if (GikoSys.Setting.LoopBrowserTabs) and
+                (GikoForm.BrowserTab.TabIndex = 0) then begin
+                       GikoForm.BrowserTab.TabIndex := GikoForm.BrowserTab.Tabs.Count - 1;
+                       GikoForm.BrowserTab.OnChange(nil);
+            end;
+        end;
        end;
 end;
 // *************************************************************************
@@ -1306,17 +1367,27 @@ begin
                end else if GikoForm.BrowserTab.TabIndex < (GikoForm.BrowserTab.Tabs.Count - 1) then begin
                        GikoForm.BrowserTab.TabIndex := GikoForm.BrowserTab.TabIndex + 1;
                        GikoForm.BrowserTab.OnChange(nil);
-               end;
+               end else begin
+            if (GikoSys.Setting.LoopBrowserTabs) and
+                (GikoForm.BrowserTab.TabIndex = (GikoForm.BrowserTab.Tabs.Count - 1)) then begin
+                       GikoForm.BrowserTab.TabIndex := 0;
+                       GikoForm.BrowserTab.OnChange(nil);
+            end;
+        end;
        end;
 end;
 // *************************************************************************
-//! \83^\83u\82Ì\90\94\82ª\82P\88È\8fã\82Å\81A\83^\83u\82ª\89E\92[\88È\8aO\82Å\97L\8cø\82É\82È\82éUpdate\83C\83x\83\93\83g
+//! \89E\82Ì\83^\83u\82ð\91I\91ð\82·\82éUpdate\83C\83x\83\93\83g
 // *************************************************************************
 procedure TGikoDM.RightTabSelectActionUpdate(Sender: TObject);
 begin
-       TAction(Sender).Enabled := (GikoForm.BrowserTab.Tabs.Count > 0)
-                                                               and (GikoForm.BrowserTab.TabIndex <> GikoForm.BrowserTab.Tabs.Count - 1);
+    if ( not GikoSys.Setting.LoopBrowserTabs ) then begin
+        RightmostTabSelectActionUpdate(Sender);
+    end else begin
+        TAction(Sender).Enabled := (GikoForm.BrowserTab.Tabs.Count > 1);
+    end;
 end;
+
 // *************************************************************************
 //! \88ê\94Ô\89E\82Ì\83^\83u\82ð\91I\91ð\82·\82é
 // *************************************************************************
@@ -1328,6 +1399,15 @@ begin
        end;
 end;
 // *************************************************************************
+//! \88ê\94Ô\89E\82Ì\83^\83u\82ð\91I\91ð\82·\82é\82ÌUpdate\83C\83x\83\93\83g
+// *************************************************************************
+procedure TGikoDM.RightmostTabSelectActionUpdate(Sender: TObject);
+begin
+       TAction(Sender).Enabled := (GikoForm.BrowserTab.Tabs.Count > 0)
+                                                               and (GikoForm.BrowserTab.TabIndex <> GikoForm.BrowserTab.Tabs.Count - 1);
+
+end;
+// *************************************************************************
 //! \91I\91ð\82³\82ê\82Ä\82¢\82é\83X\83\8c\83b\83h\82ð\82¨\8bC\82É\93ü\82è\82É\92Ç\89Á
 // *************************************************************************
 procedure TGikoDM.ThreadFavoriteAddActionExecute(Sender: TObject);
@@ -1507,6 +1587,11 @@ end;
 ////////////////////////////////\83X\83\8c\83b\83h\82Ü\82Å\82¨\82µ\82Ü\82¢/////////////////////
 procedure TGikoDM.DataModuleCreate(Sender: TObject);
 begin
+    // GikoDM\82æ\82è\82à\91\81\82­\8f\89\8aú\89»\82³\82ê\82é\95K\97v\82ª\82 \82é\83t\83@\83C\83\8b\82ª\82¢\82é\82Æ\82±\82¯\82é\81I\81I
+    // \8f\89\8aú\89»\8f\87\94Ô\82É\92\8d\88Ó\82·\82é\82±\82Æ\81I\81I
+    //\8f\89\89ñ\8bN\93®\8e\9e\82Ì\8f\89\8aú\89»\83t\83@\83C\83\8b\90Ý\92è
+    TDefaultFileManager.CopyDefaultFiles(
+        GikoSys.GetAppDir + 'defaultFiles.ini');
 end;
 // *************************************************************************
 //! \83\8d\83O\8c\9f\8dõ\83_\83C\83A\83\8d\83O\82ð\95\\8e¦\82·\82é
@@ -1909,7 +1994,7 @@ var
        Dlg: TNewBoardDialog;
        Msg: string;
 begin
-       if GikoForm.EditorFormExists then begin
+       if (EditorFormExists) then begin
                Msg := '\83\8c\83X\83G\83f\83B\83^\82ð\91S\82Ä\95Â\82\82Ä\82­\82¾\82³\82¢';
                MsgBox(GikoForm.Handle, Msg, MSG_ERROR, MB_OK or MB_ICONSTOP);
                Exit;
@@ -1964,9 +2049,8 @@ begin
                        GikoForm.DeleteHistory(ThreadItem);
                        GikoForm.DeleteTab(ThreadItem);
                        ThreadItem.DeleteLogFile;
-
-                       GikoForm.TreeView.Refresh;      // UnRead \82Ì\95\\8e¦\82ð\8dX\90V
                end;
+        GikoForm.TreeView.Refresh;     // UnRead \82Ì\95\\8e¦\82ð\8dX\90V
                GikoForm.ListView.Refresh;
        finally
                List.Free;
@@ -2008,7 +2092,7 @@ begin
                if MsgBox(GikoForm.Handle, DEL_MSG, DEL_TITLE, MB_YESNO or MB_ICONWARNING or MB_DEFBUTTON2) <> ID_YES then
                        Exit;
        GikoSys.Setting.NameList.Clear;
-       GikoForm.AllEditroFormNameTextClearClear;
+       ClearNameTextAllEditor
 end;
 // *************************************************************************
 //! \83\8c\83X\83G\83f\83B\83^\82Ì\83\81\81[\83\8b\97\9a\97ð\82ð\8fÁ\8b\8e\82·\82é
@@ -2022,7 +2106,7 @@ begin
                if MsgBox(GikoForm.Handle, DEL_MSG, DEL_TITLE, MB_YESNO or MB_ICONWARNING or MB_DEFBUTTON2) <> ID_YES then
                        Exit;
        GikoSys.Setting.MailList.Clear;
-       GikoForm.AllEditroFormMailTextClearClear;
+       ClearMailAllEditor;
 end;
 // *************************************************************************
 //! \83M\83R\83i\83r\82ð\8fI\97¹\82·\82é
@@ -2127,34 +2211,110 @@ end;
 //! \83^\83u\82Ì\8f\87\94Ô\82ð\95Û\91
 // *************************************************************************
 procedure TGikoDM.TabsSaveActionExecute(Sender: TObject);
+const
+       Filename = 'tab.sav';
+       bFilename = '~tab.sav';
+var
+       SaveStringList: TStringList;
 begin
-    GikoForm.SaveTabURLs;
+       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;
 // *************************************************************************
-//! \83^\83u\82Ì\8f\87\94Ô\82ð\95\9c\8c³
+//! \83u\83\89\83E\83U\83^\83u\82É\90Ý\92è\82³\82ê\82Ä\82¢\82é\83X\83\8c\83b\83h\82ÌURL\8eæ\93¾
 // *************************************************************************
-procedure TGikoDM.TabsOpenActionExecute(Sender: TObject);
-begin
-    GikoForm.LoadTabURLs;
-    // TabsOpenAction.Tag\82Í\81C\94Â\88ê\97\97\8dX\90V\82©\82ç\8cÄ\82Î\82ê\82½\82Æ\82«\82Í1\82É\82È\82Á\82Ä\82¢\82é
-    if (GikoForm.BrowserTab.Tabs.Count = 0)
-        and (TabsOpenAction.Tag = 0) then  begin
-            ShowMessage('\95\\8e¦\82·\82é\83^\83u\82ª\82 \82è\82Ü\82¹\82ñ\81B');
+procedure TGikoDM.GetTabURLs(AStringList: TStringList);
+var
+  rec : TBrowserRecord;
+  i : Integer;
+begin
+    for i := 0 to GikoForm.BrowserTab.Tabs.Count -1 do begin
+        try
+            rec := TBrowserRecord( GikoForm.BrowserTab.Tabs.Objects[ i ] );
+            if( rec <> nil) and (rec.Thread <> nil) then
+                AStringList.Add( rec.Thread.URL );
+        except
+        end;
     end;
 end;
 // *************************************************************************
-//! \83^\83u\82Ì\8f\87\94Ô\82ð\8e©\93®\95Û\91
+//! \8ew\92è\82³\82ê\82½URL\82ð\8aJ\82«\81C\90æ\93ª\82Ì\83^\83u\82É\83t\83H\81[\83J\83X\82·\82é
 // *************************************************************************
-procedure TGikoDM.TabAutoSaveActionExecute(Sender: TObject);
-begin
-       GikoForm.SaveTabURLs;
+procedure TGikoDM.OpenURLs(AStringList: TStringList);
+var
+    GikoTab                    : TGikoTabAppend;
+    i, bound : Integer;
+       item        : TThreadItem;
+begin
+    if (AStringList <> nil) then begin
+        GikoTab := GikoSys.Setting.BrowserTabAppend;
+        try
+            bound    := AStringList.Count - 1;
+            if bound > -1 then begin
+                GikoSys.Setting.BrowserTabAppend := gtaLast;
+                for i := 0 to bound do begin
+                    item := BBSsFindThreadFromURL( AStringList[ i ] );
+                    if item <> nil then
+                        GikoForm.InsertBrowserTab( item, false );
+                end;
+                //\8dÅ\8f\89\82Ì\82P\96\87\82É\90Ý\92è
+                if (GikoSys.Setting.URLDisplay) and
+                    (GikoForm.BrowserTab.Tabs.Count > 0) then begin
+                                       GikoForm.AddressComboBox.Text :=
+                        TBrowserRecord(GikoForm.BrowserTab.Tabs.Objects[0]).Thread.URL;
+                end;
+            end;
+        finally
+            GikoSys.Setting.BrowserTabAppend := GikoTab;
+        end;
+    end;
 end;
 // *************************************************************************
-//! \83^\83u\82Ì\8f\87\94Ô\82ð\8e©\93®\95\9c\8c³
+//! \83^\83u\82Ì\8f\87\94Ô\82ð\95\9c\8c³
 // *************************************************************************
-procedure TGikoDM.TabAutoLoadActionExecute(Sender: TObject);
+procedure TGikoDM.TabsOpenActionExecute(Sender: TObject);
+const
+       TABFILE = 'tab.sav';
+var
+       URLs                            : TStringList;
+       fileName                : string;
 begin
-       GikoForm.LoadTabURLs;
+    URLs := TStringList.Create();
+       try
+               fileName := GikoSys.GetAppDir + TABFILE;
+               if FileExists(fileName) then begin
+                   try
+                               URLs.LoadFromFile(fileName);
+                if (URLs.Count = 0) then 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
+                    SysUtils.DeleteFile(fileName);
+                end else begin
+                    OpenURLs(URLs);
+                end;
+               except
+                       on EFOpenError do ShowMessage('\83^\83u\83t\83@\83C\83\8b\82ª\8aJ\82¯\82Ü\82¹\82ñ');
+            end;
+        end;
+       finally
+        URLs.Free;
+       end;
+
+    if (GikoForm.BrowserTab.Tabs.Count = 0) and
+        (TabsOpenAction.Tag <> 1) then  begin
+        ShowMessage('\95\\8e¦\82·\82é\83^\83u\82ª\82 \82è\82Ü\82¹\82ñ\81B');
+    end;
 end;
 // *************************************************************************
 //! Be2ch\82É\83\8d\83O\83C\83\93/\83\8d\83O\83A\83E\83g\82·\82é
@@ -2185,12 +2345,13 @@ var
        ThreadItem: TThreadItem;
 begin
        No := GikoForm.KokoPopupMenu.Tag;
-       if No = 0 then Exit;
-       ThreadItem := GikoForm.GetActiveContent;
-       if ThreadItem = nil then Exit;
+       if No = 0
+        then Exit;
+       ThreadItem := GikoForm.GetActiveContent(True);
+       if not Assigned(ThreadItem) then
+        Exit;
        ThreadItem.Kokomade := No;
-       GikoForm.ActiveContent.Thread.ScrollTop :=
-               OleVariant(IHTMLDocument2(GikoForm.ActiveContent.Browser.Document)).Body.ScrollTop;
+       GikoForm.ActiveContent.Thread.ScrollTop := GikoForm.ActiveContent.Browser.OleObject.Document.Body.ScrollTop;
        GikoForm.ActiveContent.Repaint := true;
        GikoForm.InsertBrowserTab(GikoForm.ActiveContent.Thread, true);
        //INFO 2005/11/19 \88ê\92U\89B\95Á\81A\95K\97v\82È\82çGikoForm\82Ì\95û\82É\83\81\83\\83b\83h\82ð\92Ç\89Á\82·\82é
@@ -2203,11 +2364,10 @@ procedure TGikoDM.ZenbuActionExecute(Sender: TObject);
 var
        ThreadItem: TThreadItem;
 begin
-       ThreadItem := GikoForm.GetActiveContent;
+       ThreadItem := GikoForm.GetActiveContent(True);
        if ThreadItem = nil then Exit;
        ThreadItem.Kokomade := -1;
-       GikoForm.ActiveContent.Thread.ScrollTop :=
-               OleVariant(IHTMLDocument2(GikoForm.ActiveContent.Browser.Document)).Body.ScrollTop;
+       GikoForm.ActiveContent.Thread.ScrollTop := GikoForm.ActiveContent.Browser.OleObject.Document.Body.ScrollTop;
        GikoForm.ActiveContent.Repaint := true;
        GikoForm.InsertBrowserTab(GikoForm.ActiveContent.Thread, true);
        //INFO 2005/11/19 \88ê\92U\89B\95Á\81A\95K\97v\82È\82çGikoForm\82Ì\95û\82É\83\81\83\\83b\83h\82ð\92Ç\89Á\82·\82é
@@ -2224,7 +2384,7 @@ var
 begin
        Number := GikoForm.KokoPopupMenu.Tag;
        if Number = 0 then Exit;
-       Item := GikoForm.GetActiveContent;
+       Item := GikoForm.GetActiveContent(True);
        if Item = nil then Exit;
 
        Editor := TEditorForm.Create(GikoForm);
@@ -2244,27 +2404,22 @@ end;
 //! \91I\91ð\82µ\82½\83\8c\83X\82ð\83R\83s\81[\82·\82é
 // *************************************************************************
 procedure TGikoDM.SameIDResAnchorActionExecute(Sender: TObject);
+const
+    LIMIT = 20;
 var
        ThreadItem : TThreadItem;
-       No, count, rc : Integer;
-       body : string;
-       limited: boolean;
+       No : Integer;
+       AID: string;
 begin
        No := GikoForm.KokoPopupMenu.Tag;
        if No = 0 then Exit;
-       ThreadItem := GikoForm.GetActiveContent;
+       ThreadItem := GikoForm.GetActiveContent(True);
        if ThreadItem = nil then Exit;
-       count := GikoSys.GetSameIDResCount(No, GikoForm.ActiveContent.Thread);
-       limited := false;
-       if count > 20 then begin
-               rc := GikoUtil.MsgBox(GikoForm.Handle,
-                               '20\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;
-       end;
-       body := GikoSys.GetSameIDResAnchor(No, ThreadItem, limited);
-       GikoForm.ActiveContent.IDAnchorPopup(body);
+
+    AID := GikoSys.GetResID(No, ThreadItem);
+    if not IsNoValidID(AID) then begin
+        GikoForm.ShowSameIDAncher(AID);
+    end;
 end;
 // *************************************************************************
 //! \82±\82Ì\83\8c\83X\82 \82Ú\81`\82ñ\81@\81i\92Ê\8fí\81j
@@ -2293,9 +2448,8 @@ var
 begin
        IndividualForm := TIndividualAbonForm.Create(GikoForm);
        try
-               ThreadItem := GikoForm.GetActiveContent;
-               ThreadItem.ScrollTop :=
-                       OleVariant(IHTMLDocument2(GikoForm.ActiveContent.Browser.Document)).Body.ScrollTop;
+               ThreadItem := GikoForm.GetActiveContent(True);
+               ThreadItem.ScrollTop := GikoForm.ActiveContent.Browser.OleObject.Document.Body.ScrollTop;
                if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
                        if IndividualForm.SetThreadLogFileName(ThreadItem.GetThreadFileName) then begin
                                ReadList                := TStringList.Create;
@@ -2341,9 +2495,8 @@ var
 begin
        IndividualForm := TIndividualAbonForm.Create(GikoForm);
        try
-               ThreadItem := GikoForm.GetActiveContent;
-               ThreadItem.ScrollTop :=
-                       OleVariant(IHTMLDocument2(GikoForm.ActiveContent.Browser.Document)).Body.ScrollTop;
+               ThreadItem := GikoForm.GetActiveContent(True);
+               ThreadItem.ScrollTop := GikoForm.ActiveContent.Browser.OleObject.Document.Body.ScrollTop;
                if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin
                        if IndividualForm.SetThreadLogFileName(ThreadItem.GetThreadFileName) then begin
                                if (IndividualForm.ShowModal = mrOK) then begin
@@ -2487,7 +2640,8 @@ end;
 // *************************************************************************
 procedure TGikoDM.UpFolderActionUpdate(Sender: TObject);
 begin
-       UpFolderAction.Enabled := not (GikoForm.GetActiveList is TBBS);
+       UpFolderAction.Enabled := not (GikoForm.GetActiveList is TBBS) and
+        (GikoForm.GetActiveList <> BoardGroup.SpecialBBS.Items[0].Items[0]);
 end;
 // *************************************************************************
 //! \95\\8e¦\81@\95\\8e¦\83\8a\83X\83g\82Ì\83\82\81[\83h\95Ï\8dX
@@ -2760,7 +2914,9 @@ begin
        try
                GikoForm.SelectListItem(List);
                for i := 0 to List.Count - 1 do begin
-                       if TObject(List[i]) is TBoard then
+            if TObject(List[i]) is TCategory then
+                s := s + TCategory(List[i]).Title + #13#10
+                       else if TObject(List[i]) is TBoard then
                                s := s + TBoard(List[i]).Title + #13#10
                        else if TObject(List[i]) is TThreadItem then
                                s := s + TThreadItem(List[i]).Title + #13#10;
@@ -2776,7 +2932,8 @@ end;
 // *************************************************************************
 procedure TGikoDM.SelectItemNameCopyActionUpdate(Sender: TObject);
 begin
-       if ((GikoForm.GetActiveList is TBoard) or
+       if ((GikoForm.GetActiveList is TBBS) or
+        (GikoForm.GetActiveList is TBoard) or
                (GikoForm.GetActiveList is TCategory))and (GikoForm.ListView.SelCount > 0) then
                TAction(Sender).Enabled := True
        else
@@ -2847,9 +3004,10 @@ procedure TGikoDM.SelectListReloadActionUpdate(Sender: TObject);
 begin
        if (GikoForm.GetActiveList is TCategory) and (GikoForm.ListView.SelCount > 0) then
                TAction(Sender).Enabled := True
-       else if GikoForm.GetActiveList is TBoard then
-               TAction(Sender).Enabled := True
-       else
+       else if GikoForm.GetActiveList is TBoard then begin
+               TAction(Sender).Enabled :=
+            (GikoForm.GetActiveList <> BoardGroup.SpecialBBS.Items[0].Items[0]);
+       end else
                TAction(Sender).Enabled := False;
 end;
 // *************************************************************************
@@ -3602,7 +3760,7 @@ end;
 // *************************************************************************
 procedure TGikoDM.SetFocusForBrowserActionExecute(Sender: TObject);
 begin
-       GikoForm.ActiveContent.Browser.SetFocus;
+    GikoForm.ActiveContent.Browser.SetFocus;
 end;
 // *************************************************************************
 //! \83u\83\89\83E\83U\82É\83t\83H\81[\83J\83X\82ð\93\96\82Ä\82éUpdate\83C\83x\83\93\83g
@@ -3820,7 +3978,9 @@ begin
        GikoForm.ProgressBar.Position := 0;
        ShowMessage('\8cv\8eZ\8fI\97¹\82µ\82Ü\82µ\82½\81B');
 end;
+// *************************************************************************
 //! \93ü\97Í\83A\83V\83X\83g\82Ì\90Ý\92è\83t\83H\81[\83\80\82ð\8cÄ\82Ñ\8fo\82·
+// *************************************************************************
 procedure TGikoDM.SetInputAssistActionExecute(Sender: TObject);
 var
        form : TInputAssistForm;
@@ -3833,38 +3993,13 @@ begin
                form.Release;
        end;
 end;
-// WebBrowser\82Ì\8c\9f\8dõ\83_\83C\83A\83\8d\83O\82ð\8cÄ\82Ñ\8fo\82·
-procedure OpenFindDialog(Browser: TWebbrowser);
-const
-       CGID_WebBrowser: TGUID = '{ED016940-BD5B-11cf-BA4E-00C04FD70816}';
-       HTMLID_FIND = 1;
-var
-       CmdTarget : IOleCommandTarget;
-       vaIn, vaOut: OleVariant;
-       PtrGUID: PGUID;
-begin
-       if Browser.Document <> nil then begin
-               New(PtrGUID);
-               PtrGUID^ := CGID_WebBrowser;
-               try
-                       Browser.Document.QueryInterface(IOleCommandTarget, CmdTarget);
-                       if CmdTarget <> nil then begin
-                               try
-                                       CmdTarget.Exec(PtrGUID, HTMLID_FIND, 0, vaIn, vaOut);
-                               finally
-                                       CmdTarget._Release;
-                               end;
-                       end;
-               except
-               end;
-               Dispose(PtrGUID);
-       end;
-end;
+// *************************************************************************
 //! \8c»\8dÝ\95\\8e¦\82µ\82Ä\82¢\82é\83X\83\8c\83b\83h\82Ì\8c\9f\8dõ\83_\83C\83A\83\8d\83O\82ð\95\\8e¦\82·\82é
+// *************************************************************************
 procedure TGikoDM.OpenFindDialogActionExecute(Sender: TObject);
 begin
        if( GikoForm.ActiveContent <> nil) and (GikoForm.ActiveContent.Browser <> nil) then begin
-       OpenFindDialog(GikoForm.ActiveContent.Browser);
+        GikoForm.ActiveContent.OpenFindDialog;
        end;
 end;
 
@@ -3880,5 +4015,480 @@ begin
                        GikoForm.ClickNode.Text + #13#10;
 end;
 
+// *************************************************************************
+//! \95\\8e¦\82³\82ê\82Ä\82¢\82é\82·\82×\82Ä\82Ì\83\8c\83X\83G\83f\83B\83^\82ð\95Â\82\82é
+// *************************************************************************
+procedure TGikoDM.CloseAllEditorActionExecute(Sender: TObject);
+var
+    i : Integer;
+begin
+    if ( EditorFormExists ) then begin
+       //\83X\83N\83\8a\81[\83\93\8fã\82Ì\91S\82Ä\82Ì\83t\83H\81[\83\80\82©\82ç\81AEditorForm\82ð\95Â\82\82é
+           for i := Screen.CustomFormCount - 1 downto 0 do begin
+               if TObject(Screen.CustomForms[i]) is TEditorForm then begin
+                TEditorForm(Screen.CustomForms[i]).Close;
+               end;
+           end;
+    end;
+end;
+// *************************************************************************
+//! \83X\83N\83\8a\81[\83\93\8fã\82É\83\8c\83X\83G\83f\83B\83^\82ª\82¢\82½\8fê\8d\87\81C\97L\8cø\82É\82È\82é
+// *************************************************************************
+procedure TGikoDM.CloseAllEditorActionUpdate(Sender: TObject);
+begin
+    if (Sender is TAction) then begin
+        TAction(Sender).Enabled := EditorFormExists;
+    end;
+end;
+// *************************************************************************
+//! \83X\83N\83\8a\81[\83\93\8fã\82ÉEditorForm\82ª\82¢\82é\82©
+// *************************************************************************
+function TGikoDM.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 := Screen.CustomFormCount - 1 downto 0 do begin
+               if (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 TGikoDM.ClearNameTextAllEditor();
+var
+       i : Integer;
+begin
+       for i := 0 to Screen.CustomFormCount - 1 do begin
+               if (Screen.CustomForms[i] is TEditorForm) then begin
+                       TEditorForm(Screen.CustomForms[i]).NameComboBox.Items.Clear;
+        end;
+       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 TGikoDM.ClearMailAllEditor();
+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;
+
+// *************************************************************************
+//! \83\8a\83\93\83N\97\9a\97ð\82ð\96ß\82é\82Ì\8dX\90V\8f\88\97\9d
+// *************************************************************************
+procedure TGikoDM.PrevMoveHistoryUpdate(Sender: TObject);
+begin
+      PrevMoveHistory.Enabled :=
+          (MoveHisotryManager.HisotryIndex > 0)
+end;
+// *************************************************************************
+//! \83\8a\83\93\83N\97\9a\97ð\82ð\96ß\82é
+// *************************************************************************
+procedure TGikoDM.PrevMoveHistoryExecute(Sender: TObject);
+begin
+    if ( GikoForm.BrowserTab.TabIndex >= 0 ) then begin
+        BackToHistory(MoveHisotryManager.getPrevItem
+            (TBrowserRecord(GikoForm.BrowserTab.Tabs
+                    .Objects[GikoForm.BrowserTab.TabIndex])));
+    end else begin
+        BackToHistory(MoveHisotryManager.getPrevItem( nil ) );
+    end;
+end;
+//! \83\8a\83\93\83N\97\9a\97ð\8f\88\97\9d
+procedure TGikoDM.BackToHistory(item: TMoveHistoryItem);
+var
+    browser : TWebBrowser;
+    doc : IHTMLDocument2;
+begin
+    if ( item <> nil ) then begin
+        if ( GikoForm.GetActiveContent = item.ThreadItem ) then begin
+            browser := TBrowserRecord(GikoForm.BrowserTab.Tabs
+                .Objects[GikoForm.BrowserTab.TabIndex]).Browser;
+            if (browser <> nil) then begin
+                try
+                    doc := browser.ControlInterface.Document as IHTMLDocument2;
+                    (doc.body as IHTMLElement2).ScrollTop := item.ScrollTop;
+                except
+                end;
+            end;
+        end else begin
+            //URL\82É\88Ú\93®
+            MoveURLWithHistory(item.ThreadItem.URL);
+        end;
+    end;
+end;
+//! \97\9a\97ð\8f\88\97\9d\82Â\82«URL\88Ú\93®
+procedure TGikoDM.MoveURLWithHistory(URL : String);
+var
+    idx : Integer;
+begin
+    //URL\82É\88Ú\93®
+    GikoForm.MoveToURL(URL);
+    //\88È\89º\81A\97\9a\97ð\82Ì\8f\88\97\9d
+    idx := GikoForm.AddressComboBox.Items.IndexOf(URL);
+    if idx = -1 then begin
+        GikoForm.AddressComboBox.Items.Insert(0, URL);
+        if GikoForm.AddressComboBox.Items.Count > GikoSys.Setting.AddressHistoryCount then
+            GikoForm.AddressComboBox.Items.Delete(GikoForm.AddressComboBox.Items.Count - 1);
+    end else begin
+        GikoForm.AddressComboBox.Items.Delete(idx);
+        GikoForm.AddressComboBox.Items.Insert(0, URL);
+    end;
+end;
+// *************************************************************************
+//! \83\8a\83\93\83N\97\9a\97ð\82ð\90i\82Þ\82Ì\8dX\90V\8f\88\97\9d
+// *************************************************************************
+procedure TGikoDM.NextMoveHistoryUpdate(Sender: TObject);
+begin
+    NextMoveHistory.Enabled :=
+          (MoveHisotryManager.HisotryIndex < MoveHisotryManager.Count - 1);
+end;
+// *************************************************************************
+//! \83\8a\83\93\83N\97\9a\97ð\82ð\90i\82Þ
+// *************************************************************************
+procedure TGikoDM.NextMoveHistoryExecute(Sender: TObject);
+begin
+    BackToHistory(MoveHisotryManager.getNextItem);
+end;
+// *************************************************************************
+//! \83A\83N\83e\83B\83u\97v\91f\82Ì\83N\83\8a\83b\83N
+// *************************************************************************
+procedure TGikoDM.ClickActiveElementActionExecute(Sender: TObject);
+var
+    browser : TWebBrowser;
+    elem : IHTMLElement;
+    doc : IHTMLDocument2;
+begin
+    if (GikoForm.GetActiveContent <> nil) then begin
+        if (GikoForm.BrowserTab.Tabs.Count > 0) and
+            (GikoForm.BrowserTab.TabIndex >= 0) then begin
+            browser := TBrowserRecord(GikoForm.BrowserTab.Tabs
+                .Objects[GikoForm.BrowserTab.TabIndex]).Browser;
+            if (browser <> nil) then begin
+                try
+                    doc := browser.ControlInterface.Document as IHTMLDocument2;
+                    if Assigned(doc) then begin
+                        elem := doc.activeElement;
+                        if Assigned(elem) then begin
+                            elem.click;
+                        end;
+                    end;
+                except
+                end;
+            end;
+
+        end;
+    end;
+end;
+//! \81«\83L\81[\82Ì\83G\83~\83\85\83\8c\81[\83g\83A\83N\83V\83\87\83\93
+procedure TGikoDM.VKDownActionExecute(Sender: TObject);
+begin
+    keybd_event(VK_DOWN, 0, KEYEVENTF_EXTENDEDKEY, 0);
+    keybd_event(VK_DOWN, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
+end;
+//! \81ª\83L\81[\82Ì\83G\83~\83\85\83\8c\81[\83g\83A\83N\83V\83\87\83\93
+procedure TGikoDM.VKUpActionExecute(Sender: TObject);
+begin
+    keybd_event(VK_UP, 0, KEYEVENTF_EXTENDEDKEY, 0);
+    keybd_event(VK_UP, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
+end;
+//! \81¨\83L\81[\82Ì\83G\83~\83\85\83\8c\81[\83g\83A\83N\83V\83\87\83\93
+procedure TGikoDM.VKRightActionExecute(Sender: TObject);
+begin
+    keybd_event(VK_RIGHT, 0, KEYEVENTF_EXTENDEDKEY, 0);
+    keybd_event(VK_RIGHT, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
+end;
+//! \81©\83L\81[\82Ì\83G\83~\83\85\83\8c\81[\83g\83A\83N\83V\83\87\83\93
+procedure TGikoDM.VKLeftActionExecute(Sender: TObject);
+begin
+    keybd_event(VK_LEFT, 0, KEYEVENTF_EXTENDEDKEY, 0);
+    keybd_event(VK_LEFT, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
+end;
+//! \83^\83X\83N\83g\83\8c\83C\82É\8ai\94[\82·\82é
+procedure TGikoDM.StoredTaskTrayActionExecute(Sender: TObject);
+begin
+    GikoForm.StoredTaskTray;
+    StoredTaskTrayAction.Tag := -1;
+end;
+
+{
+\breif  \83\8a\83\93\83N\83C\83\81\81[\83W\8eæ\93¾
+\83C\83\81\81[\83W\82Í\81C*.jpg, *.jpeg, *.gif, *.png
+}
+procedure TGikoDM.AllImageLinkToClipbordActionExecute(Sender: TObject);
+var
+    links : IHTMLElementCollection;
+    urls, exts : TStringList;
+begin
+    links := GetActiveThreadLinks;
+    if (links <> nil) then begin
+        urls := TStringList.Create;
+        exts := TStringList.Create;
+        try
+            exts.CaseSensitive := False;
+            exts.Sorted := True;
+            exts.Delimiter := ';';
+            exts.DelimitedText := '.gif;.jpg;.jpeg;.png';
+            GetLinkURLs(links, urls, 0, exts);
+            Clipboard.SetTextBuf(urls.GetText);
+        finally
+            exts.Free;
+            urls.Free;
+        end;
+    end;
+end;
+
+{
+\breif  \90V\92\85\83\8c\83X\82Ì\83\8a\83\93\83N\83C\83\81\81[\83W\8eæ\93¾
+\83C\83\81\81[\83W\82Í\81C*.jpg, *.jpeg, *.gif, *.png
+}
+procedure TGikoDM.NewImageLinkToClipBoardActionExecute(Sender: TObject);
+var
+    links : IHTMLElementCollection;
+    urls, exts : TStringList;
+    ThreadItem : TThreadItem;
+begin
+    ThreadItem := GikoForm.GetActiveContent;
+    links := GetActiveThreadLinks;
+    if (ThreadItem <> nil) and (links <> nil) then begin
+        urls := TStringList.Create;
+        exts := TStringList.Create;
+        try
+            exts.CaseSensitive := False;
+            exts.Sorted := True;
+            exts.Delimiter := ';';
+            exts.DelimitedText := '.gif;.jpg;.jpeg;.png';
+
+            GetLinkURLs(links, urls,
+                (ThreadItem.Count - ThreadItem.NewResCount + 1), exts );
+            Clipboard.SetTextBuf(urls.GetText);
+        finally
+            exts.Free;
+            urls.Free;
+        end;
+    end;
+end;
+{
+\breif  \83\8a\83\93\83NURL\8eæ\93¾
+\91Î\8fÛ\8ag\92£\8eq\82Í\81A\8fÚ\8d×\90Ý\92è\82Å\90Ý\92è\82³\82ê\82Ä\82¢\82é
+}
+procedure TGikoDM.AllLinkToClipboardActionExecute(Sender: TObject);
+var
+    links : IHTMLElementCollection;
+    urls, exts : TStringList;
+begin
+    links := GetActiveThreadLinks;
+    if (links <> nil) then begin
+        urls := TStringList.Create;
+        exts := TStringList.Create;
+        try
+            exts.CaseSensitive := False;
+            exts.Sorted := True;
+            exts.Delimiter := ';';
+            exts.DelimitedText :=
+                MojuUtils.CustomStringReplace(GikoSys.Setting.ExtList, '*', '');
+            GetLinkURLs(links, urls, 0, exts);
+            Clipboard.SetTextBuf(urls.GetText);
+        finally
+            exts.Free;
+            urls.Free;
+        end;
+    end;
+end;
+{
+\breif  \90V\92\85\83\8c\83X\83\8a\83\93\83NURL\8eæ\93¾
+\91Î\8fÛ\8ag\92£\8eq\82Í\81A\8fÚ\8d×\90Ý\92è\82Å\90Ý\92è\82³\82ê\82Ä\82¢\82é
+}
+procedure TGikoDM.NewLinkToClipboardActionExecute(Sender: TObject);
+var
+    links : IHTMLElementCollection;
+    urls, exts : TStringList;
+    ThreadItem : TThreadItem;
+begin
+    ThreadItem := GikoForm.GetActiveContent;
+    links := GetActiveThreadLinks;
+    if (ThreadItem <> nil) and (links <> nil) then begin
+        urls := TStringList.Create;
+        exts := TStringList.Create;
+        try
+            exts.CaseSensitive := False;
+            exts.Sorted := True;
+            exts.Delimiter := ';';
+            exts.DelimitedText :=
+                MojuUtils.CustomStringReplace(GikoSys.Setting.ExtList, '*', '');
+            GetLinkURLs(links, urls,
+                (ThreadItem.Count - ThreadItem.NewResCount + 1), exts );
+            Clipboard.SetTextBuf(urls.GetText);
+        finally
+            exts.Free;
+            urls.Free;
+        end;
+    end;
+end;
+
+{
+\brief  \8c»\8dÝ\95\\8e¦\82µ\82Ä\82¢\82é\83X\83\8c\83b\83h\82Ì\82·\82×\82Ä\82Ì\83\8a\83\93\83N\82ð\8eæ\93¾\82·\82é\81B
+\return IHTMLElementCollection  \83\8a\83\93\83N\82Ì\83R\83\8c\83N\83V\83\87\83\93
+}
+function TGikoDM.GetActiveThreadLinks : IHTMLElementCollection;
+var
+    browser : TWebBrowser;
+    doc : IHTMLDocument2;
+begin
+    Result := nil;
+    if (GikoForm.GetActiveContent <> nil) then begin
+        if (GikoForm.BrowserTab.Tabs.Count > 0) and
+            (GikoForm.BrowserTab.TabIndex >= 0) then begin
+            browser := TBrowserRecord(GikoForm.BrowserTab.Tabs
+                .Objects[GikoForm.BrowserTab.TabIndex]).Browser;
+            if (browser <> nil) then begin
+                try
+                    doc := browser.ControlInterface.Document as IHTMLDocument2;
+                    if Assigned(doc) then begin
+                        Result := doc.links;
+                    end;
+                except
+                    Result := nil;
+                end;
+            end;
+
+        end;
+    end;
+end;
+{
+\brief  \83\8a\83\93\83N\82ÌURL\82ð\8eæ\93¾\82·\82é
+\param  links   \8eæ\93¾\82·\82é\83\8a\83\93\83N\82Ì\91S\91Ì\82Ì\83R\83\8c\83N\83V\83\87\83\93
+\param  URLs    \8eæ\93¾\82µ\82½URL\82Ì\95Û\91\90æ
+\param  Start   \90Ý\92è\82µ\82½\83\8c\83X\94Ô\8d\86\88È\8d~\82ð\8eæ\93¾( > 0)
+\param  Exts    \8eæ\93¾\82·\82é\83\8a\83\93\83N\82Ì\8ag\92£\8eq
+}
+procedure TGikoDM.GetLinkURLs(links : IHTMLElementCollection;
+        URLs : TStringList; const Start: Integer; Exts : TStringList);
+var
+    index ,i, j : Integer;
+    item : IHTMLElement;
+    url, ext : string;
+begin
+    if (links <> nil) then begin
+        index := 0;
+        for i := 0 to links.length - 1 do begin
+            item := links.item(i, 0) as IHTMLElement;
+            if (item <> nil) then begin
+                url := item.getAttribute('href', 0);
+                // \83\8c\83X\82Ì\94Ô\8d\86\82ð\8dX\90V
+                if (Pos('menu:', url) > 0) then begin
+                    index := StrToInt64Def(
+                        Copy(url, 5, Length(url)), index + 1
+                    );
+                end else begin
+                    // \8aJ\8en\83\8c\83X\94Ô\8d\86\88È\8d~\82©\83`\83F\83b\83N
+                    if (index >= Start) then begin
+                        ext := ExtractFileExt( AnsiLowerCase(url) );
+                        // \8ag\92£\8eq\82ð\83`\83F\83b\83N
+                        if Exts.Find(ext, j) then begin
+                            urls.Add(url)
+                        end;
+                    end;
+                end;
+            end;
+        end;
+    end;
+end;
+{
+\brief  \83A\83h\83\8c\83X\83o\81[\82É\83t\83H\81[\83J\83X\82ð\93\96\82Ä\82é
+\param  Sender   \83C\83x\83\93\83g\82Ì\94­\90\8c³
+}
+procedure TGikoDM.SetForcusForAddresBarActionExecute(Sender: TObject);
+begin
+    if ( GikoForm.AddressToolBar.Visible ) then begin
+        GikoForm.AddressComboBox.SetFocus;
+    end
+end;
+{
+\brief  \88Ú\93]\82µ\82½\94Â\82ÌURL\82ð\8eæ\93¾\82·\82é\83_\83C\83A\83O\83\89\83\80\82ð\95\\8e¦\82·\82é
+}
+procedure TGikoDM.NewBoardSearchActionExecute(Sender: TObject);
+var
+    form : TNewBoardURLForm;
+       Msg: string;
+begin
+       if (EditorFormExists) then begin
+               Msg := '\83\8c\83X\83G\83f\83B\83^\82ð\91S\82Ä\95Â\82\82Ä\82­\82¾\82³\82¢';
+               MsgBox(GikoForm.Handle, Msg, MSG_ERROR, MB_OK or MB_ICONSTOP);
+               Exit;
+       end;
+    form := TNewBoardURLForm.Create(Self);
+    try
+        form.ShowModal;
+    finally
+        form.Release;
+    end;
+end;
+//! \83u\83\89\83E\83U\82ð1\83y\81[\83W\95ª\83X\83N\83\8d\81[\83\8b\82³\82¹\82é
+procedure TGikoDM.ScrollPageDownActionExecute(Sender: TObject);
+begin
+    GikoForm.BrowserMovement(GikoForm.BrowserPanel.Height);
+end;
+//! \83u\83\89\83E\83U\82ð1\83y\81[\83W\95ª\83X\83N\83\8d\81[\83\8b\82³\82¹\82é
+procedure TGikoDM.ScrollPageUpActionExecute(Sender: TObject);
+begin
+    GikoForm.BrowserMovement(-GikoForm.BrowserPanel.Height);
+end;
+
+
+//! \82±\82Ì\83\8c\83X\82ÌID\82ðNG\83\8f\81[\83h\82É\92Ç\89Á\82·\82é\81i\93§\96¾)
+procedure TGikoDM.AddIDtoNGWord0ActionExecute(Sender: TObject);
+begin
+    GikoForm.AddIDtoNGWord(true);
+end;
+//! \82±\82Ì\83\8c\83X\82ÌID\82ðNG\83\8f\81[\83h\82É\92Ç\89Á\82·\82é
+procedure TGikoDM.AddIDtoNGWord1ActionExecute(Sender: TObject);
+begin
+    GikoForm.AddIDtoNGWord(false);
+end;
+//! \83N\83\8a\83b\83v\83{\81[\83h\82Ì\95\8e\9a\97ñ\82ðID\82Æ\82µ\82Ä\93¯\88êID\83\8c\83X\83A\83\93\83J\81[\95\\8e¦
+procedure TGikoDM.ExtractSameIDActionExecute(Sender: TObject);
+var
+    ID: String;
+begin
+    ID := Trim(Clipboard.AsText);
+    if (Length(ID) > 0) then begin
+        if not IsNoValidID(ID) then begin
+            GikoForm.ShowSameIDAncher(ID);
+        end;
+    end;
+end;
+//! \83^\83u\82Ì\83X\83\8c\83b\83h\88ê\97\97\82ð\95\\8e¦\82·\82é
+procedure TGikoDM.ShowTabListActionExecute(Sender: TObject);
+var
+    i, j : Integer;
+    sBoard : TSpecialBoard;
+begin
+    sBoard := TSpecialBoard(SpecialBBS.Items[0].Items[0]);
+    sBoard.Clear;
+       for i := GikoForm.BrowserTab.Tabs.Count - 1 downto 0 do begin
+        sBoard.Add(
+               TBrowserRecord(GikoForm.BrowserTab.Tabs.Objects[i]).Thread);
+       end;
+    GikoForm.SelectTreeNode(sBoard , True );
+end;
+//! TBoard\82©\82Â\93Á\8eê\97p\93r\94Â\82Å\82È\82¢
+procedure TGikoDM.BoardIEActionUpdate(Sender: TObject);
+begin
+    TAction(Sender).Enabled :=
+        (GikoForm.GetActiveList is TBoard) and
+        (GikoForm.GetActiveList <> BoardGroup.SpecialBBS.Items[0].Items[0]);
+end;
+
 end.