unit _PopupMenus;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,Menus;

{$WARN UNIT_PLATFORM OFF}
{$WARN SYMBOL_PLATFORM OFF}

type
  TPopupMenus = class
  private
    { Private 宣言 }
    ParentForm:TForm;
    MuteMenu:TPopupMenu;
    FileMenu:TPopupMenu;
    VisualMenu:TPopupMenu;
    PlayModeMenu:TPopupMenu;
    MainMenu:TPopupMenu;
    NetworkMenu:TPopupMenu;
    PCMOutMenu:TPopupMenu;
    procedure MenuItem_ExecuteDCTTag(Sender: TObject);
    procedure PCMOutMenu_SelectDLL(Sender: TObject);
  public
    { Public 宣言 }
    constructor Create(_ParentForm:TForm);
    destructor Destroy; override;
    procedure MuteMenu_Popup;
    procedure FileMenu_Popup;
    procedure VisualMenu_Popup;
    procedure PlayModeMenu_Popup;
    procedure MainMenu_Popup;
    procedure NetworkMenu_Popup;
    procedure PCMOutMenu_Popup;
  end;

var
  PopupMenus:TPopupMenus;

implementation

uses MainWin,
     _m_Tools,_const,_MDXWin_const,_MDXWinINI,_KeyDef_const,_KeyDef,
     _SndDrv,_Vis_const,_MXDRVm_const,_PCMOut;

constructor TPopupMenus.Create(_ParentForm:TForm);
begin
  inherited Create;

  ParentForm:=_ParentForm;

  MuteMenu:=nil;
  FileMenu:=nil;
  VisualMenu:=nil;
  PlayModeMenu:=nil;
  MainMenu:=nil;
  NetworkMenu:=nil;
  PCMOutMenu:=nil;
end;

destructor TPopupMenus.Destroy;
  procedure FreeAndNil(var PopupMenu:TPopupMenu);
  begin
    if PopupMenu<>nil then begin
      PopupMenu.Free;
      PopupMenu:=nil;
    end;
  end;
begin
  inherited Destroy;

  ParentForm:=nil;

  FreeAndNil(MuteMenu);
  FreeAndNil(FileMenu);
  FreeAndNil(VisualMenu);
  FreeAndNil(PlayModeMenu);
  FreeAndNil(MainMenu);
  FreeAndNil(NetworkMenu);
  FreeAndNil(PCMOutMenu);
end;

procedure TPopupMenus.MenuItem_ExecuteDCTTag(Sender: TObject);
begin
  KeyDef.ExecuteCommand(TMenuItem(Sender).Tag);
end;

procedure TPopupMenus.PCMOutMenu_SelectDLL(Sender: TObject);
begin
  sdChangeRate(0,PCMOut_WinAMPOutput,TMenuItem(Sender).Caption);
end;

procedure TPopupMenus.MuteMenu_Popup;
var
  pos:TPoint;
  cnt:integer;
  ChMode:string;
  ChTrack:integer;
  msg:string;
  procedure AddItem(_Caption:string;_DCT:integer;_Checked:boolean);
  var
    Item:TMenuItem;
  begin
    Item:=TMenuItem.Create(MuteMenu);
    Item.Enabled:=True;
    Item.Caption:=_Caption;
    Item.Tag:=_DCT;
    Item.Checked:=_Checked;
    if _DCT<>DCT_nil then begin
      Item.OnClick:=MenuItem_ExecuteDCTTag;
    end;
    MuteMenu.Items.Add(Item);
  end;
begin
  if MuteMenu<>nil then begin
    MuteMenu.Free;
    MuteMenu:=nil;
  end;
  MuteMenu:=TPopupMenu.Create(ParentForm);
  MuteMenu.AutoHotkeys:=maManual;

  AddItem('全てミュート (&E)',DCT_MuteSetAll,False);
  AddItem('全てミュート解除 (&D)',DCT_MuteResetAll,False);
  AddItem('全チャネル反転 (&T)',DCT_MuteToggleAll,False);
  AddItem('-',DCT_nil,False);

  for cnt:=0 to 16-1 do begin
    ChMode:='';
    ChTrack:=0;
    sdGetChMode(cnt,ChMode,ChTrack);
    msg:='ch.'+inttostr(cnt)+' '+ChMode+'.'+inttostr(ChTrack)+' ';
    if cnt<8 then begin
      msg:=msg+'(&'+inttostr(cnt)+')';
      end else begin
      msg:=msg+'(&'+inttostr(cnt-8)+')';
    end;
    AddItem(msg,DCT_MuteCh01+cnt,not sdGetMute(cnt));
  end;

  GetCursorPos(pos);
  MuteMenu.Popup(pos.X,pos.Y);
end;

procedure TPopupMenus.FileMenu_Popup;
var
  pos:TPoint;
  ParentItem:TMenuItem;
  procedure AddItem(_Caption:string;_DCT:integer);
  var
    Item:TMenuItem;
  begin
    Item:=TMenuItem.Create(FileMenu);
    Item.Enabled:=True;
    Item.Caption:=_Caption;
    Item.Tag:=_DCT;
    if _DCT<>DCT_nil then begin
      Item.OnClick:=MenuItem_ExecuteDCTTag;
    end;
    FileMenu.Items.Add(Item);
  end;
  procedure AddItemParent(_Caption:string;_DCT:integer);
  var
    Item:TMenuItem;
  begin
    Item:=TMenuItem.Create(ParentItem);
    Item.Enabled:=True;
    Item.Caption:=_Caption;
    Item.Tag:=_DCT;
    if _DCT<>DCT_nil then begin
      Item.OnClick:=MenuItem_ExecuteDCTTag;
    end;
    ParentItem.Add(Item);
  end;
begin
  if FileMenu<>nil then begin
    FileMenu.Free;
    FileMenu:=nil;
  end;
  FileMenu:=TPopupMenu.Create(ParentForm);
  FileMenu.AutoHotkeys:=maManual;

  AddItem('ドライブメニューを開く (&D)',DCT_ShowDriveMenu);
  AddItem('Wave/MP3/Ogg変換リストに送る',DCT_ToWaveAndNext);
  AddItem('カーソル以下全てのファイルを送る',DCT_ToWaveAndAll);
  AddItem('-',DCT_nil);

  AddItem('ファイル名を指定して再生/移動 (&O)',DCT_SetFileDialog);
  AddItem('クリップボードから再生/移動 (&O)',DCT_SetFileClipboard);
  AddItem('-',DCT_nil);

  ParentItem:=TMenuItem.Create(FileMenu);
  ParentItem.Caption:='クリップボードに再生中の… (&P)';
  FileMenu.Items.Add(ParentItem);

  AddItemParent('ファイル名をコピー (&F)',DCT_CopyPlayFilename);
  AddItemParent('ファイル名＋タイトルをコピー (&A)',DCT_CopyPlayFilenameTitle);
  AddItemParent('タイトルをコピー (&T)',DCT_CopyPlayTitle);
  AddItemParent('URLをコピー (&U)',DCT_CopyPlayURL);
  AddItemParent('URL＋タイトルをコピー (&U)',DCT_CopyPlayURLTitle);
  AddItemParent('HTML形式でURLをコピー (&H)',DCT_CopyPlayHTMLURL);
  AddItemParent('HTML形式でURL＋タイトルをコピー (&H)',DCT_CopyPlayHTMLURLTitle);
  AddItemParent('HTML形式でタイトルをコピー (&H)',DCT_CopyPlayHTMLTitle);

  ParentItem:=TMenuItem.Create(FileMenu);
  ParentItem.Caption:='クリップボードにカーソル位置の… (&C)';
  FileMenu.Items.Add(ParentItem);

  AddItemParent('ファイル名をコピー (&F)',DCT_CopyCursorFilename);
  AddItemParent('ファイル名＋タイトルをコピー (&A)',DCT_CopyCursorFilenameTitle);
  AddItemParent('タイトルをコピー (&T)',DCT_CopyCursorTitle);
  AddItemParent('URLをコピー (&U)',DCT_CopyCursorURL);
  AddItemParent('URL＋タイトルをコピー (&U)',DCT_CopyCursorURLTitle);
  AddItemParent('HTML形式でURLをコピー (&H)',DCT_CopyCursorHTMLURL);
  AddItemParent('HTML形式でURL＋タイトルをコピー (&H)',DCT_CopyCursorHTMLURLTitle);
  AddItemParent('HTML形式でタイトルをコピー (&H)',DCT_CopyCursorHTMLTitle);

  ParentItem:=TMenuItem.Create(FileMenu);
  ParentItem.Caption:='mdxoプロトコル (&U)';
  FileMenu.Items.Add(ParentItem);

  AddItemParent('インストールして有効にする (&I)',DCT_mdxoInstall);
  AddItemParent('アンインストールして無効にする (&U)',DCT_mdxoUninstall);
  AddItemParent('mdxoプロトコルの解説ページを開く (&H)',DCT_mdxoReference);

  GetCursorPos(pos);
  FileMenu.Popup(pos.X,pos.Y);
end;

procedure TPopupMenus.VisualMenu_Popup;
var
  pos:TPoint;
  procedure AddItem(_Caption:string;_DCT:integer;_Checked:boolean);
  var
    Item:TMenuItem;
  begin
    Item:=TMenuItem.Create(VisualMenu);
    Item.Enabled:=True;
    Item.Checked:=_Checked;
    Item.Caption:=_Caption;
    Item.Tag:=_DCT;
    if _DCT<>DCT_nil then begin
      Item.OnClick:=MenuItem_ExecuteDCTTag;
    end;
    VisualMenu.Items.Add(Item);
  end;
begin
  if VisualMenu<>nil then begin
    VisualMenu.Free;
    VisualMenu:=nil;
  end;
  VisualMenu:=TPopupMenu.Create(ParentForm);
  VisualMenu.AutoHotkeys:=maManual;

  AddItem('エフェクト設定 (&S)',DCT_SetupVisualEffect,False);
  AddItem('-',DCT_nil,False);

  AddItem('キーボード (&0)',DCT_SetVisMode_Keyboard,VisINI.VisualMode=VisualModeKeyboard);
  AddItem('ソナー(レーダー) (&1)',DCT_SetVisMode_Sonar,VisINI.VisualMode=VisualModeSonar);
  AddItem('MDXDis (&2)',DCT_SetVisMode_MDXDis,VisINI.VisualMode=VisualModeMDXDis);
  AddItem('ワイヤー (&3)',DCT_SetVisMode_Wire,VisINI.VisualMode=VisualModeWire);
  AddItem('ウェーブ (&4)',DCT_SetVisMode_Wave,VisINI.VisualMode=VisualModeWave);
  AddItem('フライ (&5)',DCT_SetVisMode_Fly,VisINI.VisualMode=VisualModeFly);
  AddItem('プール (&6)',DCT_SetVisMode_Pool,VisINI.VisualMode=VisualModePool);
  AddItem('ボックス (&7)',DCT_SetVisMode_Box,VisINI.VisualMode=VisualModeBox);
  AddItem('レイン (&8)',DCT_SetVisMode_Rain,VisINI.VisualMode=VisualModeRain);
  AddItem('-',DCT_nil,False);

  AddItem('フィル->ページコピー (&P)',DCT_SetVisMode_FillCopy,VisINI.Effect3DDDBlurMode=DDBlurModeCopy);
  AddItem('フィル->アルファブラー (&A)',DCT_SetVisMode_FillReduction,VisINI.Effect3DDDBlurMode=DDBlurModeReduction);
  AddItem('フィル->シェードブラー (&S)',DCT_SetVisMode_FillShade,VisINI.Effect3DDDBlurMode=DDBlurModeShade);

  GetCursorPos(pos);
  VisualMenu.Popup(pos.X,pos.Y);
end;

procedure TPopupMenus.PlayModeMenu_Popup;
var
  pos:TPoint;
  procedure AddItem(_Caption:string;_DCT:integer;_Checked:boolean);
  var
    Item:TMenuItem;
  begin
    Item:=TMenuItem.Create(PlayModeMenu);
    Item.Enabled:=True;
    Item.Checked:=_Checked;
    Item.Caption:=_Caption;
    Item.Tag:=_DCT;
    if _DCT<>DCT_nil then begin
      Item.OnClick:=MenuItem_ExecuteDCTTag;
    end;
    PlayModeMenu.Items.Add(Item);
  end;
begin
  if PlayModeMenu<>nil then begin
    PlayModeMenu.Free;
    PlayModeMenu:=nil;
  end;
  PlayModeMenu:=TPopupMenu.Create(ParentForm);
  PlayModeMenu.AutoHotkeys:=maManual;

  AddItem('単曲リピート (&0)',DCT_SetPlayMode_Single,MainINI.PlayMode=PlayMode_Single);
  AddItem('全曲 (&1)',DCT_SetPlayMode_ALL,MainINI.PlayMode=PlayMode_ALL);
  AddItem('全曲リピート (&2)',DCT_SetPlayMode_ALLRepeat,MainINI.PlayMode=PlayMode_ALLRepeat);
  AddItem('ランダム (&3)',DCT_SetPlayMode_Random,MainINI.PlayMode=PlayMode_Random);
  AddItem('リピートしない (&4)',DCT_SetPlayMode_None,MainINI.PlayMode=PlayMode_None);

  GetCursorPos(pos);
  PlayModeMenu.Popup(pos.X,pos.Y);
end;

procedure TPopupMenus.MainMenu_Popup;
var
  pos:TPoint;
  ParentItem:TMenuItem;
  procedure AddItem(_Caption:string;_DCT:integer);
  var
    Item:TMenuItem;
  begin
    Item:=TMenuItem.Create(MainMenu);
    Item.Enabled:=True;
    Item.Caption:=_Caption;
    Item.Tag:=_DCT;
    if _DCT<>DCT_nil then begin
      Item.OnClick:=MenuItem_ExecuteDCTTag;
    end;
    MainMenu.Items.Add(Item);
  end;
  procedure AddItemParent(_Caption:string;_DCT:integer;_Checked:boolean);
  var
    Item:TMenuItem;
  begin
    Item:=TMenuItem.Create(ParentItem);
    Item.Enabled:=True;
    Item.Checked:=_Checked;
    Item.Caption:=_Caption;
    Item.Tag:=_DCT;
    if _DCT<>DCT_nil then begin
      Item.OnClick:=MenuItem_ExecuteDCTTag;
    end;
    ParentItem.Add(Item);
  end;
begin
  if MainMenu<>nil then begin
    MainMenu.Free;
    MainMenu:=nil;
  end;
  MainMenu:=TPopupMenu.Create(ParentForm);
  MainMenu.AutoHotkeys:=maManual;

  AddItem('オンラインヘルプ (&H)',DCT_ShowHelp);
  AddItem('キーカスタマイズ (&K)',DCT_KeyCustomize);
  AddItem('-',DCT_nil);

  AddItem('全般セットアップ (&S)',DCT_SetupMain);
  AddItem('DSPプラグイン設定 (&D)',DCT_SetupDSPPlugin);
  AddItem('ネットワーク設定 (&N)',DCT_SetupNetwork);
  AddItem('ビジュアルエフェクト設定 (&V)',DCT_ShowVisualMenu);
  AddItem('-',DCT_nil);

  AddItem('プレイモードメニュー (&P)',DCT_ShowPlayModeMenu);
  AddItem('ウェーブファイル作成 (&W)',DCT_OpenFileOutputWindow);
  AddItem('カタログファイルの最適化 (&C)',DCT_OpenCatalogCompressWindow);
  AddItem('タイトル表示 (&T)',DCT_ShowTitle);
  AddItem('-',DCT_nil);

  AddItem('スキンファイル再読込 (&R)',DCT_ReloadSKI);
  AddItem('スキンファイル選択 (&S)',DCT_SelectSKI);
  AddItem('-',DCT_nil);

  AddItem('コンパクトモード切替 (&C)',DCT_ToggleCompactMode);

  ParentItem:=TMenuItem.Create(MainMenu);
  ParentItem.Caption:='コンパクト設定 (&S)';
  MainMenu.Items.Add(ParentItem);

  AddItemParent('ファイルリストを表示する (&F)',DCT_SetupCompactShowFile,MainINI.CompactWindowFlortEnabled);
  AddItemParent('メインウィンドウに近付くと吸着する (&D)',DCT_SetupCompactWithMain,MainINI.CompactWindowFlortDockMain);
  AddItem('-',DCT_nil);

  AddItem('最小化（アイコン化）切り替え (&I)',DCT_Minimized);
  AddItem('-',DCT_nil);

  AddItem('閉じる (&X)',DCT_MainClose);

  GetCursorPos(pos);
  MainMenu.Popup(pos.X,pos.Y);
end;

procedure TPopupMenus.NetworkMenu_Popup;
var
  pos:TPoint;
  procedure AddItem(_Caption:string;_DCT:integer);
  var
    Item:TMenuItem;
  begin
    Item:=TMenuItem.Create(NetworkMenu);
    Item.Enabled:=True;
    Item.Caption:=_Caption;
    Item.Tag:=_DCT;
    if _DCT<>DCT_nil then begin
      Item.OnClick:=MenuItem_ExecuteDCTTag;
    end;
    NetworkMenu.Items.Add(Item);
  end;
  procedure AddItemChecked(_Caption:string;_DCT:integer;_Checked:boolean);
  var
    Item:TMenuItem;
  begin
    Item:=TMenuItem.Create(NetworkMenu);
    Item.Enabled:=True;
    Item.Checked:=_Checked;
    Item.Caption:=_Caption;
    Item.Tag:=_DCT;
    if _DCT<>DCT_nil then begin
      Item.OnClick:=MenuItem_ExecuteDCTTag;
    end;
    NetworkMenu.Items.Add(Item);
  end;
begin
  if NetworkMenu<>nil then begin
    NetworkMenu.Free;
    NetworkMenu:=nil;
  end;
  NetworkMenu:=TPopupMenu.Create(ParentForm);
  NetworkMenu.AutoHotkeys:=maManual;

  AddItem('オンラインアップデート (&O)',DCT_Network_StartOnlineUpdate);
  AddItemChecked('オンラインアップデートの自動更新通知 (&A)',DCT_Network_ToggleAutoOnlineUpdate,MainINI.MDXOnlineAutoUpdate);
  AddItem('ミラーサーバ選択 (&M)',DCT_Network_SelectMirrorServer);
  AddItem('掲示板を開く (&B)',DCT_Network_OpenBBS);
  AddItem('スキンアップロード掲示板を開く (&B)',DCT_Network_OpenSkinUploadBBS);
  AddItem('-',DCT_nil);

  AddItem('データ検索 (&F)',DCT_Network_OpenDataFindWindow);
  AddItem('ランキング (&R)',DCT_Network_OpenRankingWindow);
  AddItem('投票 (&V)',DCT_Network_OpenVoteWindow);

  GetCursorPos(pos);
  NetworkMenu.Popup(pos.X,pos.Y);
end;

procedure TPopupMenus.PCMOutMenu_Popup;
var
  pos:TPoint;
  ParentItem:TMenuItem;
  i:integer;
  cnt:integer;
  NewItem:TMenuItem;
  procedure AddItem(_Caption:string;_DCT:integer;_Checked:boolean);
  var
    Item:TMenuItem;
  begin
    Item:=TMenuItem.Create(PCMOutMenu);
    Item.Enabled:=True;
    Item.Checked:=_Checked;
    Item.Caption:=_Caption;
    Item.Tag:=_DCT;
    if _DCT<>DCT_nil then begin
      Item.OnClick:=MenuItem_ExecuteDCTTag;
    end;
    PCMOutMenu.Items.Add(Item);
  end;
  procedure AddItemParent(_Caption:string;_DCT:integer;_Checked:boolean);
  var
    Item:TMenuItem;
  begin
    Item:=TMenuItem.Create(ParentItem);
    Item.Enabled:=True;
    Item.Checked:=_Checked;
    Item.Caption:=_Caption;
    Item.Tag:=_DCT;
    if _DCT<>DCT_nil then begin
      Item.OnClick:=MenuItem_ExecuteDCTTag;
    end;
    ParentItem.Add(Item);
  end;
begin
  if PCMOutMenu<>nil then begin
    PCMOutMenu.Free;
    PCMOutMenu:=nil;
  end;
  PCMOutMenu:=TPopupMenu.Create(ParentForm);
  PCMOutMenu.AutoHotkeys:=maManual;

  i:=Main.NowDSoundRate;
  AddItem('rate 22050Hz',DCT_SoundRate22050Hz,i=22050);
  AddItem('rate 44100Hz',DCT_SoundRate44100Hz,i=44100);
  AddItem('rate 48000Hz',DCT_SoundRate48000Hz,i=48000);
  AddItem('rate 96000Hz',DCT_SoundRate96000Hz,i=96000);
  AddItem('rate 192000Hz',DCT_SoundRate192000Hz,i=192000);
  AddItem('rate 数値指定',DCT_SoundRateDialog,False);
  AddItem('-',DCT_nil,False);

  AddItem('Enhancerプラグイン有効',DCT_SoundWADP_Enabled,MainINI.WADSPEnabled=True);
  AddItem('Enhancerプラグイン無効',DCT_SoundWADP_Disabled,MainINI.WADSPEnabled=False);
  AddItem('Enhancerプラグイン設定初期化',DCT_SoundWADP_RegInit,False);
  AddItem('-',DCT_nil,False);

  AddItem('MXDRVm.dll 私作ドライバ',DCT_SoundMXDRV_SelectMoonlight,MXDRVgINI.Enabled=False);
  AddItem('MXDRVg.dll GORRY様作ドライバ',DCT_SoundMXDRV_SelectGORRY,MXDRVgINI.Enabled=True);
  AddItem('MXDRV設定ウィンドウを開く',DCT_SoundMXDRV_Config,False);
  AddItem('-',DCT_nil,False);

  ParentItem:=TMenuItem.Create(PCMOutMenu);
  ParentItem.Caption:='周波数変換アルゴリズム';
  PCMOutMenu.Items.Add(ParentItem);

  i:=MainINI.UseSRCMode;
  AddItemParent('最近傍補完 (CPU軽/音質低)',DCT_SoundSRC_Nearest,i=SRCMode_Nearest);
  AddItemParent('線形補完 (CPU中/音質中)',DCT_SoundSRC_Liner,i=SRCMode_Liner);
  AddItemParent('スプライン補完 (CPU重/音質高)',DCT_SoundSRC_Spline,i=SRCMode_Spline);
  AddItem('-',DCT_nil,False);

  i:=Main.NowUseDSound;
  AddItem('output Null',DCT_SoundOutNull,i=PCMOut_Null);
  AddItem('output WindowsSoundSystem',DCT_SoundOutWSS,i=PCMOut_WindowsSound);
  AddItem('output DirectSound',DCT_SoundOutDS,i=PCMOut_DirectSound);
  AddItem('output ASIO2',DCT_SoundOutASIO2,i=PCMOut_ASIO);
  AddItem('output ASIO2 Setting',DCT_SoundOutASIO2Set,False);
  AddItem('output WinAMPOutput',DCT_SoundOutWA,i=PCMOut_WinAMPOutput);

  ParentItem:=TMenuItem.Create(PCMOutMenu);
  ParentItem.Caption:='output WinAMPOutput Setting';
  PCMOutMenu.Items.Add(ParentItem);

  AddItemParent('Configure',DCT_SoundOutWASet,False);
  AddItemParent('About',DCT_SoundOutWAAbout,False);
  AddItemParent('-',DCT_nil,False);

  for cnt:=0 to PCMOut.WAOUT_GetModulesCount-1 do begin
    NewItem:=TMenuItem.Create(ParentItem);
    NewItem.Enabled:=True;
    NewItem.Caption:=PCMOut.WAOUT_GetModuleDLLName(cnt);
    NewItem.Tag:=-1;
    if AnsiLowerCase(PCMOut.WAOUT_GetModuleDLLName(cnt))=AnsiLowerCase(Main.NowWAO_DLLName) then begin
      NewItem.Checked:=True;
      end else begin
      NewItem.Checked:=False;
    end;
    NewItem.OnClick:=PCMOutMenu_SelectDLL;
    ParentItem.Add(NewItem);
  end;

  GetCursorPos(pos);
  PCMOutMenu.Popup(pos.X,pos.Y);
end;

end.
