From: h677 Date: Sat, 11 Jul 2009 04:34:17 +0000 (+0000) Subject: ポップアップメニューのカスタマイズ化への道第一歩。 X-Git-Tag: v1_64_1_820~46 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=8e84ccc79de90eb1a3396ddc4245518a51f280b0;p=gikonavigoeson%2Fgikonavi.git ポップアップメニューのカスタマイズ化への道第一歩。 ブラウザタブを設定可能にした。 --- diff --git a/Encrypt/UBase64.pas b/Encrypt/UBase64.pas index 4337a7c..a33946d 100644 --- a/Encrypt/UBase64.pas +++ b/Encrypt/UBase64.pas @@ -12,6 +12,7 @@ procedure HogeBase64Decode(inputStream, outputStream: TStream); overload; function HogeBase64Encode(const inputStr: string): string; overload; function HogeBase64Decode(const inputStr: string): string; overload; +function HogeBase64Encode(inputArray: array of Byte): string; overload; implementation @@ -148,4 +149,19 @@ begin inputStream.Free; end; +function HogeBase64Encode(inputArray: array of Byte): string; overload; +var + inputStream: TMemoryStream; + outputStream: TStringStream; +begin + inputStream := TMemoryStream.Create; + inputStream.WriteBuffer(inputArray, Length(inputArray)); + inputStream.Position := 0; + outputStream:= TStringStream.Create(''); + HogeBase64Encode(inputStream, outputStream); + result := outputStream.DataString; + outputStream.Free; + inputStream.Free; +end; + end. diff --git a/Giko.pas b/Giko.pas index 666d167..94a8bee 100644 --- a/Giko.pas +++ b/Giko.pas @@ -692,7 +692,7 @@ type //! ‚à‚Á‚Æ‚àŒÃ‚¢Browser‚ÌŠJ•ú procedure ReleaseOldestBrowser; //! ƒAƒNƒeƒBƒu‚ȃ^ƒu‚Æ“¯‚¶”‚̊J‚¢‚Ä‚¢‚éƒXƒŒƒbƒh‚ðƒƒjƒ…[ƒAƒCƒeƒ€‚ɒljÁ - procedure AddMenuSameBoardThread; + procedure AddMenuSameBoardThread(MenuItem: TMenuItem); //! ƒAƒNƒeƒBƒu‚ȃ^ƒu‚Æ“¯‚¶”‚̊J‚¢‚Ä‚¢‚éƒXƒŒƒbƒhƒNƒŠƒbƒNƒCƒxƒ“ƒg procedure SameBoardThreadSubItemOnClick(Sender: TObject); //! ƒ|ƒbƒvƒAƒbƒvƒuƒ‰ƒEƒUì¬ @@ -879,7 +879,7 @@ uses About, Option, Round, Splash, Sort, ListSelect, Imm, NewBoard, MojuUtils, Clipbrd, GikoBayesian,Y_TextConverter, HTMLCreate, ListViewUtils, GikoDataModule, GikoMessage, - InputAssistDataModule, Types, ReplaceDataModule; + InputAssistDataModule, Types, ReplaceDataModule, PopupMenuUtil; const BLANK_HTML: string = 'about:blank'; @@ -1315,9 +1315,10 @@ begin GikoDM.RepaintStatusBar; StatusBarResize(Sender); - dummy1.Caption := ItemReservPMenu.Caption; - dummy1.Hint := ItemReservPMenu.Hint; - +// dummy1.Caption := ItemReservPMenu.Caption; +// dummy1.Hint := ItemReservPMenu.Hint; + // ƒuƒ‰ƒEƒUƒ|ƒbƒvƒAƒbƒvƒƒjƒ…[‚̏‰Šú‰» + PopupMenuUtil.ReadSetting(GikoDM.GikoFormActionList, BrowserTabPopupMenu); // ƒ}ƒEƒXƒWƒFƒXƒ`ƒƒ[ MouseGesture := TMouseGesture.Create; @@ -1351,6 +1352,7 @@ begin // D&D‚ðŽó‚¯Žæ‚é DragAcceptFiles(ListView.Handle, True); + // ‰Šú‰»‚ÉŽ¸”s‚µ‚½ƒ‚ƒWƒ…[ƒ‹ƒ`ƒFƒbƒN if (FavoriteDM.AbEnd) then begin GikoUtil.MsgBox(Self.Handle, @@ -4391,7 +4393,7 @@ procedure TGikoForm.SetSelectItemRound(RoundFlag: Boolean; RoundName: string; Pa var threadItem : TThreadItem; begin - if ParentName <> 'dummy1' then begin + if ParentName <> 'RoundItem' then begin SetSelectItemRound(RoundFlag, RoundName); end else begin threadItem := GetActiveContent; @@ -6497,17 +6499,24 @@ end; procedure TGikoForm.BrowserTabPopupMenuPopup(Sender: TObject); +var + i:Integer; begin - AddRoundNameMenu(dummy1); - AddMenuSameBoardThread; + for i := 0 to BrowserTabPopupMenu.Items.Count - 1 do begin + if (BrowserTabPopupMenu.Items[i].Name='RoundItem') then begin + AddRoundNameMenu(BrowserTabPopupMenu.Items[i]); + end else if (BrowserTabPopupMenu.Items[i].Name='BoardThreadItem') then begin + AddMenuSameBoardThread(BrowserTabPopupMenu.Items[i]) + end; + end; end; //! ƒAƒNƒeƒBƒu‚ȃ^ƒu‚Æ“¯‚¶”‚̊J‚¢‚Ä‚¢‚éƒXƒŒƒbƒh‚ðƒƒjƒ…[ƒAƒCƒeƒ€‚ɒljÁ -procedure TGikoForm.AddMenuSameBoardThread; +procedure TGikoForm.AddMenuSameBoardThread(MenuItem: TMenuItem); var i: Integer; Item: TMenuItem; begin - SameBoardThreadItem.Clear; + MenuItem.Clear; for i := 0 to BrowserTab.Tabs.Count - 1 do begin // “¯‚¶”‚©‚Ç‚¤‚© if (FActiveContent.Thread.ParentBoard = @@ -6517,23 +6526,23 @@ begin TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread then begin Item := TMenuItem.Create(Self); Item.Caption := TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.Title; + Item.Hint := TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.URL; Item.OnClick := SameBoardThreadSubItemOnClick; - SameBoardThreadItem.Add(Item); + MenuItem.Add(Item); end; end; end; // ‰½‚à–³‚¢‚È‚çŽg—p‚Å‚«‚È‚¢‚悤‚É‚·‚é - SameBoardThreadItem.Enabled := SameBoardThreadItem.Count > 0; + MenuItem.Enabled := MenuItem.Count > 0; end; //! ƒAƒNƒeƒBƒu‚ȃ^ƒu‚Æ“¯‚¶”‚̊J‚¢‚Ä‚¢‚éƒXƒŒƒbƒhƒNƒŠƒbƒNƒCƒxƒ“ƒg procedure TGikoForm.SameBoardThreadSubItemOnClick(Sender: TObject); var - i, j: Integer; + i: Integer; MenuItem: TMenuItem; begin if Sender is TMenuItem then begin try - j := 0; MenuItem := TMenuItem(Sender); for i := 0 to BrowserTab.Tabs.Count - 1 do begin // “¯‚¶”‚©‚Ç‚¤‚© @@ -6541,12 +6550,11 @@ begin TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread.ParentBoard) then begin if FActiveContent.Thread <> TBrowserRecord(BrowserTab.Tabs.Objects[i]).Thread then begin - if (SameBoardThreadItem.Items[j] = MenuItem) then begin - MoveToURL( TBrowserRecord(BrowserTab.Tabs.Objects[i]) - .Thread.URL); + if (MenuItem.Hint = TBrowserRecord(BrowserTab.Tabs.Objects[i]) + .Thread.URL) then begin + MoveToURL( MenuItem.Hint); Exit; end; - Inc(j); end; end; end; diff --git a/PopupMenuUtil.pas b/PopupMenuUtil.pas new file mode 100644 index 0000000..cd10212 --- /dev/null +++ b/PopupMenuUtil.pas @@ -0,0 +1,177 @@ +unit PopupMenuUtil; + +interface + +uses + Windows, Messages, SysUtils, Classes, Controls, + StdCtrls, ExtCtrls, ComCtrls, ActnList, Menus, + IniFiles, GikoSystem, MojuUtils, Giko; + + procedure ReadSetting(ActionList: TActionList; PopupMenu: TPopupMenu); + function GetActionItem(ActionList: TActionList; ActionName: string): TCustomAction; + function GetMenuItem(Section: string; PopupMenu: TPopupMenu; ActionList: TActionList; MenuName: string): TMenuItem; + function checkActionName(Section: string ; ActionName: string): Boolean; +const + //! Ý’èƒtƒ@ƒCƒ‹–¼ + INI_FILENAME: string = 'popupmenu.ini'; + //! ƒuƒ‰ƒEƒUƒ^ƒuƒZƒNƒVƒ‡ƒ“–¼ + BROWSER_TAB: string = 'BrowserTab'; + //! ƒZƒNƒVƒ‡ƒ“‚̈ꗗ + SECTIONS : array[0..0] of string =( 'BrowserTab' ) ; + + //! ƒuƒ‰ƒEƒUƒ^ƒuƒ|ƒbƒvƒAƒbƒv‚ɐݒè‰Â”\‚ȃƒjƒ…[–¼ + ACK_BROWSER: array[0..7] of string = ( + 'ItemReloadAction', + 'FavoriteAddAction', + 'BrowserTabCloseAction', + 'NotSelectTabCloseAction', + 'LeftTabCloseAction', + 'RightTabCloseAction', + 'ActiveLogDeleteAction', + 'AllTabCloseAction'); + +implementation +procedure ReadSetting(ActionList: TActionList; PopupMenu: TPopupMenu); +const + // “ÁŽêƒAƒNƒVƒ‡ƒ“–¼ + // „‰ñƒAƒCƒeƒ€ + ROUNDITEM = 'RoundItem'; + // “¯ˆê”ƒXƒŒƒbƒhˆê———p + SAMPETHREAD='SameBoardThreadItem'; +var + ini : TMemIniFile; + mkeys, skeys : TStringList; + i, j, idx: Integer; + value, subValue : String; + item, subItem : TMenuItem; +begin + if (FileExists(GikoSys.Setting.GetConfigDir + INI_FILENAME)) Then begin + ini := TMemIniFile.Create(GikoSys.Setting.GetConfigDir + INI_FILENAME); + mkeys := TStringList.Create; + mkeys.Sorted := true; + skeys := TStringList.Create; + skeys.Sorted := true; + try + for idx := 0 to Length(SECTIONS) - 1 do begin + ini.ReadSection(SECTIONS[idx], mkeys); + // main‘æˆêŠK‘w sub‘æ“ñŠK‘w‚Ì•ª—£ + for i := mkeys.Count - 1 downto 0 do begin + if (Pos('sub', mkeys[i]) = 1) then begin + skeys.Add(mkeys[i]); + mkeys.Delete(i); + end; + end; + // ‘æˆêŠK‘w‚̏ˆ— + PopupMenu.Items.Clear; + for i := 0 to mkeys.Count - 1 do begin + value := ini.ReadString(SECTIONS[idx], mkeys[i], '-'); + item := GetMenuItem(SECTIONS[idx], PopupMenu, ActionList, value); + if (item <> nil) then begin + PopupMenu.Items.Add(item); + // ƒAƒNƒVƒ‡ƒ“‚ªÝ’肳‚ê‚Ä‚¢‚é‚à‚Ì‚É‚Í‘æ“ñ‘w‚͂‚¯‚È‚¢ + if (item.Action = nil) then begin + // ‘æ“ñŠK‘w‚̏ˆ—(‚ ‚ê‚Î) + for j := 0 to skeys.Count - 1 do begin + if (Pos('sub.' + mkeys[i], skeys[j]) = 1) then begin + subValue := ini.ReadString(SECTIONS[idx], skeys[j], '-'); + subItem := GetMenuItem(SECTIONS[idx], PopupMenu, ActionList, subValue); + if (subItem <> nil) then begin + item.Add(subItem); + end; + end; + end; + end; + end; + end; + // ‚±‚̃ZƒNƒVƒ‡ƒ“‚̏ˆ—‚ªI‚í‚Á‚½‚̂ŃNƒŠƒA + mkeys.Clear; + skeys.Clear; + end; + finally + skeys.Free; + mkeys.Free; + ini.Free; + end; + end; +end; +//! ƒƒjƒ…[‚ð•Ô‚· +function GetMenuItem(Section: string; PopupMenu: TPopupMenu; ActionList: TActionList; MenuName: string): TMenuItem; +var + Action: TCustomAction; +begin + Result := nil; + // ƒ_ƒuƒ‹ƒNƒH[ƒg‚ÅŽn‚Ü‚é‚Æ‚«‚̓‰ƒxƒ‹ + if (Pos('"', MenuName)=1) then begin + Result := TMenuItem.Create(PopupMenu); + Result.Caption := Copy(MenuName, 2, Length(MenuName)); + end else if (MenuName = '-' ) then begin + // ‹æØ‚èü + Result := TMenuItem.Create(PopupMenu); + Result.Caption := '-'; + end else begin + if (BROWSER_TAB = Section) then begin + // ƒuƒ‰ƒEƒUƒ^ƒu‚Ì“ÁŽê‘Ήž + if (MenuName = 'RoundItem' ) then begin + try + // „‰ñƒƒjƒ…[—pƒ_ƒ~[ + Result := TMenuItem.Create(PopupMenu); + Result.Name := 'RoundItem'; + Result.Caption := GikoForm.ItemReservPMenu.Caption; + Result.Hint := GikoForm.ItemReservPMenu.Hint; + except + // Šù‚ÉŽg‚í‚ê‚Ä‚é‚Æ‚«‚̓Gƒ‰[‚É‚È‚é + Result.Free; + Result := nil; + end; + end else if (MenuName = 'BoardThreadItem' ) then begin + try + // “¯ˆê”ƒXƒŒƒbƒh•\Ž¦—pƒ_ƒ~[ + Result := TMenuItem.Create(PopupMenu); + Result.Name := 'BoardThreadItem'; + Result.Caption := '“¯”‚ŕ\Ž¦‚µ‚Ä‚¢‚éƒXƒŒƒbƒh'; + except + // Šù‚ÉŽg‚í‚ê‚Ä‚é‚Æ‚«‚̓Gƒ‰[‚É‚È‚é + Result.Free; + Result := nil; + end; + end; + end; + // ƒƒjƒ…[‚ªŒˆ‚܂炸‚ɁA‹–‰Â‚³‚ꂽƒAƒNƒVƒ‡ƒ“–¼‚È‚çAction‚©‚çì¬ + if (Result = nil) and (checkActionName(Section, MenuName)) then begin + Action := GetActionItem(ActionList, MenuName); + if Action <> nil then begin + Result := TMenuItem.Create(PopupMenu); + Result.Action := Action; + end; + end; + end; +end; +//ActionName‚ÌAction‚ð•Ô‚µ‚Ü‚· +function GetActionItem(ActionList: TActionList; ActionName: string): TCustomAction; +var + i: Integer; +begin + for i := 0 to ActionList.ActionCount - 1 do begin + if ActionList.Actions[i].Name = ActionName then begin + Result := TCustomAction(ActionList.Actions[i]); + Exit; + end; + end; + Result := nil; +end; + +function checkActionName(Section: string ; ActionName: string): Boolean; +var + i : Integer; +begin + Result := False; + if (BROWSER_TAB = Section) then begin + for i :=0 to Length(ACK_BROWSER) - 1 do begin + if (ACK_BROWSER[i] = ActionName) then begin + Result := True; + Break; + end; + end; + end; +end; +end. diff --git a/gikoNavi.dpr b/gikoNavi.dpr index be2121b..ae74676 100644 --- a/gikoNavi.dpr +++ b/gikoNavi.dpr @@ -81,7 +81,8 @@ uses NewBoardURL in 'NewBoardURL.pas' {NewBoardURLForm}, ExtPreviewDatamodule in 'ExtPreviewDatamodule.pas' {ExtPreviewDM: TDataModule}, UpdateCheck in 'UpdateCheck.pas' {UpdateCheckForm}, - SHA1Unit in 'SHA1Unit.pas'; + SHA1Unit in 'SHA1Unit.pas', + PopupMenuUtil in 'PopupMenuUtil.pas'; {$R *.RES} {$R gikoResource.res} diff --git a/gikoNavi.res b/gikoNavi.res index 5e5b436..a854c20 100644 Binary files a/gikoNavi.res and b/gikoNavi.res differ diff --git a/readme/defaultFiles.ini b/readme/defaultFiles.ini index ae26594..814a7f0 100644 --- a/readme/defaultFiles.ini +++ b/readme/defaultFiles.ini @@ -25,3 +25,7 @@ TO=config\replace.ini [extpreview] FROM=config\default\extpreview.default TO=config\extpreview.ini + +[popupmenu] +FROM=config\default\popupmenu.default +TO=config\popupmenu.ini diff --git a/res/default/popupmenu.default b/res/default/popupmenu.default new file mode 100644 index 0000000..72bd50c --- /dev/null +++ b/res/default/popupmenu.default @@ -0,0 +1,29 @@ +; ƒ|ƒbƒvƒAƒbƒvƒƒjƒ…[Ý’èƒtƒ@ƒCƒ‹ + +[BrowserTab] +;ƒuƒ‰ƒEƒUƒ^ƒuƒ|ƒbƒvƒAƒbƒvƒƒjƒ…[Ý’è +main.01=ItemReloadAction +main.02=- +main.03=FavoriteAddAction +main.04=RoundItem +main.05=- +main.06=BoardThreadItem +main.07=- +main.08=BrowserTabCloseAction +main.09=NotSelectTabCloseAction +main.10=LeftTabCloseAction +main.11=RightTabCloseAction +main.12=- +main.13=ActiveLogDeleteAction +main.14=- +main.15=AllTabCloseAction +;; ƒTƒuƒƒjƒ…[‚̍ì‚è•û +;; " ‚Å‚Í‚¶‚ß‚é‚Æ‘æˆêŠK‘w—p‚̃‰ƒxƒ‹‚ðì‚ê‚é +;; sub.ƒ‰ƒxƒ‹‚É‚µ‚½ƒL[.0X ‚ÌŒ`‚ŃTƒuƒƒjƒ…[‚ð—ñ‹“‚·‚é +;; ‰º‚́Aƒ^ƒu‘€ì‚ðƒTƒuƒƒjƒ…[‚ɒljÁ‚µ‚½—á +;main.16="ƒ^ƒu +;sub.main.16.01=BrowserTabCloseAction +;sub.main.16.02=NotSelectTabCloseAction +;sub.main.16.03=LeftTabCloseAction +;sub.main.16.04=RightTabCloseAction +;sub.main.16.05=AllTabCloseAction