OSDN Git Service

まちBBSの新URL(PATH_INFO)に対応
[gikonavigoeson/gikonavi.git] / GikoDataModule.pas
index 8d83cdf..ce50fa2 100644 (file)
@@ -12,7 +12,7 @@ uses
        MSHTML_TLB,
 {$IFEND}
   ComCtrls, BrowserRecord, Graphics, Messages, Setting, Dialogs,
-  ActiveX, MoveHistoryItem, HistoryList;
+  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;
@@ -231,6 +232,15 @@ type
     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);
@@ -434,6 +444,15 @@ type
     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;
@@ -452,8 +471,8 @@ type
     procedure MoveURLWithHistory(URL : String);
     procedure BackToHistory(item: TMoveHistoryItem);
     function GetActiveThreadLinks : IHTMLElementCollection;
-    procedure GetImageLinkURLs(links : IHTMLElementCollection;
-        URLs : TStringList; const Start: Integer);
+    procedure GetLinkURLs(links : IHTMLElementCollection;
+        URLs : TStringList; const Start: Integer; Exts : TStringList);
   public
        { Public \90é\8c¾ }
        procedure RepaintStatusBar;
@@ -478,7 +497,7 @@ implementation
 
 uses
        Windows, Math, Clipbrd,
-       Giko, GikoSystem, GikoUtil, BoardGroup,
+       Giko, GikoUtil, BoardGroup,
        FavoriteArrange, Favorite, MojuUtils,
        Editor, ListSelect, Search, Option, Round,
        KeySetting, Gesture, Kotehan, ToolBarSetting,
@@ -2030,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;
@@ -2245,15 +2263,17 @@ begin
         try
             bound    := AStringList.Count - 1;
             if bound > -1 then begin
-                GikoSys.Setting.BrowserTabAppend := gtpLast;
+                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è \83A\83h\83\8c\83X\82Ì\90Ý\92è\82Ì\82½\82ß\82Ì\83J\83\89\8cÄ\82Ñ
-                if GikoForm.BrowserTab.Tabs.Count > 0 then begin
-                    GikoForm.BrowserTab.OnChange(nil);
+                //\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
@@ -2273,7 +2293,7 @@ var
 begin
     URLs := TStringList.Create();
        try
-               fileName := ExtractFilePath(Application.ExeName) + TABFILE;
+               fileName := GikoSys.GetAppDir + TABFILE;
                if FileExists(fileName) then begin
                    try
                                URLs.LoadFromFile(fileName);
@@ -2325,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é
@@ -2343,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é
@@ -2364,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);
@@ -2384,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
@@ -2433,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;
@@ -2481,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
@@ -2627,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
@@ -2900,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;
@@ -2916,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
@@ -2987,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;
 // *************************************************************************
@@ -4090,7 +4108,7 @@ end;
 procedure TGikoDM.BackToHistory(item: TMoveHistoryItem);
 var
     browser : TWebBrowser;
-    doc : OleVariant;
+    doc : IHTMLDocument2;
 begin
     if ( item <> nil ) then begin
         if ( GikoForm.GetActiveContent = item.ThreadItem ) then begin
@@ -4098,8 +4116,8 @@ begin
                 .Objects[GikoForm.BrowserTab.TabIndex]).Browser;
             if (browser <> nil) then begin
                 try
-                    doc := Idispatch( olevariant(browser.ControlInterface).Document) as IHTMLDocument2;
-                    doc.Body.ScrollTop := item.ScrollTop;
+                    doc := browser.ControlInterface.Document as IHTMLDocument2;
+                    (doc.body as IHTMLElement2).ScrollTop := item.ScrollTop;
                 except
                 end;
             end;
@@ -4149,6 +4167,7 @@ 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
@@ -4157,8 +4176,13 @@ begin
                 .Objects[GikoForm.BrowserTab.TabIndex]).Browser;
             if (browser <> nil) then begin
                 try
-                    elem := IHTMLDocument2(browser.Document).activeElement;
-                    elem.click;
+                    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;
@@ -4204,15 +4228,21 @@ end;
 procedure TGikoDM.AllImageLinkToClipbordActionExecute(Sender: TObject);
 var
     links : IHTMLElementCollection;
-    urls : TStringList;
+    urls, exts : TStringList;
 begin
     links := GetActiveThreadLinks;
     if (links <> nil) then begin
         urls := TStringList.Create;
+        exts := TStringList.Create;
         try
-            GetImageLinkURLs(links, urls, 0);
+            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;
@@ -4225,22 +4255,87 @@ end;
 procedure TGikoDM.NewImageLinkToClipBoardActionExecute(Sender: TObject);
 var
     links : IHTMLElementCollection;
-    urls : TStringList;
+    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
-            GetImageLinkURLs(links, urls,
-                (ThreadItem.Count - ThreadItem.NewResCount + 1) );
+            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
@@ -4248,6 +4343,7 @@ end;
 function TGikoDM.GetActiveThreadLinks : IHTMLElementCollection;
 var
     browser : TWebBrowser;
+    doc : IHTMLDocument2;
 begin
     Result := nil;
     if (GikoForm.GetActiveContent <> nil) then begin
@@ -4257,7 +4353,10 @@ begin
                 .Objects[GikoForm.BrowserTab.TabIndex]).Browser;
             if (browser <> nil) then begin
                 try
-                    Result := IHTMLDocument2(browser.Document).links;
+                    doc := browser.ControlInterface.Document as IHTMLDocument2;
+                    if Assigned(doc) then begin
+                        Result := doc.links;
+                    end;
                 except
                     Result := nil;
                 end;
@@ -4267,15 +4366,16 @@ begin
     end;
 end;
 {
-\brief  \83C\83\81\81[\83W\82Ö\82Ì\83\8a\83\93\83N\82ÌURL\82ð\8eæ\93¾\82·\82é
+\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.GetImageLinkURLs(links : IHTMLElementCollection;
-        URLs : TStringList; const Start: Integer);
+procedure TGikoDM.GetLinkURLs(links : IHTMLElementCollection;
+        URLs : TStringList; const Start: Integer; Exts : TStringList);
 var
-    index ,i : Integer;
+    index ,i, j : Integer;
     item : IHTMLElement;
     url, ext : string;
 begin
@@ -4294,9 +4394,8 @@ 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) );
-                        // jpg,jpeg,gif,png\82ð\83`\83F\83b\83N
-                        if (ext = '.jpg') or (ext = '.jpeg') or
-                            (ext = '.gif') or (ext = '.png') then begin
+                        // \8ag\92£\8eq\82ð\83`\83F\83b\83N
+                        if Exts.Find(ext, j) then begin
                             urls.Add(url)
                         end;
                     end;
@@ -4335,6 +4434,61 @@ begin
         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.