Option Strict Off
Option Explicit On
Imports System.Windows.Forms
'------------------------------------ 2023/11/09 ------------------------------------
Public Class 四frmDlgSound

#Region "宣言"
    Private mNew実行中 As Boolean = True
    Private mMe_gmDlgID As Integer = 0
    Private mDlgLoading As Boolean = False
    Private mサウンドフォルダ前回使用 As String = ""
    Private mpサウンドファイル As String = ""
    Private mpサウンドファイルDEF As String = ""
    Private mpサウンドを鳴らす As Boolean
    '**************************************************************************************************************************************
    Private WithEvents イベントgAppEventMaker As 五clsEventMaker
    '**************************************************************************************************************************************
    Event 標準サウンド設定Dlgの初期化をしてください(ByRef wIsOK As Boolean, ByRef wMe_gmDlgID As Integer)
    Event 他のウインドウが表示あるいは非表示になりました(ByVal rMe_gmDlgID As Integer, ByVal r表示変更ウインドウID As Integer, ByVal r表示True消去False As Boolean, ByRef wRet_rMe_gmDlgIDウインドウを消去しなさい As Boolean)
#End Region

#Region "AppIniFileOp"
    Private Function zzAppIniFileOp(ByVal Load_0_QueryUnload_1_Resize_2_DoIniSave_3 As Long) As Boolean
        '読出し時に　INI ファイルが存在しない場合は　False　を返します。
        If gggAppIniFile Is Nothing Then Return False
        Return gggAppIniFile.aaAppIniFileOp_フォームサイズと位置だけ_共通処理(Load_0_QueryUnload_1_Resize_2_DoIniSave_3, Me, "95781")
    End Function
#End Region

#Region "フォームイベント"

    Public Sub New()
        mNew実行中 = True
        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()
        ' InitializeComponent() 呼び出しの後で初期化を追加します。
    End Sub
    Private Sub 四frmDlgSound_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        '---------------------------------------------------
        イベントgAppEventMaker = gAppEventMaker
        '---------------------------------------------------
        mNew実行中 = False
        mDlgLoading = True
        Dim wIsOK As Boolean
        RaiseEvent 標準サウンド設定Dlgの初期化をしてください(wIsOK, mMe_gmDlgID)
        If Not wIsOK Then GoTo EXIT_ON_ERROR
        With gmアプリ固有クラス
            mpサウンドファイル = .pサウンドファイル
            mpサウンドファイルDEF = .pサウンドファイルDEF
            mpサウンドを鳴らす = .pサウンドを鳴らす
            Call .pサウンドを鳴らすCheckBoxに設定(chk音を鳴らす)
            Call .pサウンドファイルを順次変更するCheckBoxに設定(chkサウンドファイルを順次変更する)
            Dim rwAry() As String = {""}, max As Integer
            max = CInt(.pサウンドファイルの配列_RW(gcoプロパGetARY, rwAry, ""))
            If max > 0 Then gggint = Ⅹリストボックスに_文配列からリストを入れる(lst音, rwAry, True)
        End With
        gggbol = zzEnabledSet()
        mDlgLoading = False
        '---------------------------------------------------
        gggbol = zzFileSetIn_lbl音(gmアプリ固有クラス.pサウンドファイル)
        mpサウンドファイル = lblあたり.Text
        '---------------------------------------------------
        If Not zzAppIniFileOp(0) Then gggint = ⅩFormMove(gcoフォームをスクリーン中心に移動, Me) 'INI ファイルが存在しない場合に、このフォームを画面のセンターに表示するコード。
        '---------------------------------------------------
        gggbol = ⅩForm_OwnerSet_IconSet_TextSet(Me, "サウンド設定", Me.Owner)
        gggbol = イベントgAppEventMaker.MakeEventフォームの表示消去(mMe_gmDlgID, True)
        lst音.AllowDrop = True
        Exit Sub
        '---------------------------------------------------
EXIT_ON_ERROR:
        Call ⅩMsgBox_OK_情報("四frmDlgSound_Load() 内でエラーが発生しました。")
        Me.Close()
    End Sub

    Private Sub mnu閉じる_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnu閉じる.Click
        Me.Close()
    End Sub

    Private Sub 四frmDlgSound_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If Me.Visible Then gggint = zzAppIniFileOp(2)
        gggint = zzAppIniFileOp(1)
        If イベントgAppEventMaker Is Nothing Then
            イベントgAppEventMaker = gAppEventMaker
        End If
        gggbol = イベントgAppEventMaker.MakeEventフォームの表示消去(mMe_gmDlgID, False)
    End Sub

    Private Sub 四frmDlgSound_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        'qqqqq("四frmDlgSound_FormClosed")
    End Sub

    Private Sub 四frmDlgSound_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
        qqqqq("四frmDlgSound_Disposed")
        Call gmアプリ固有クラス.mn3optサウンド設定Dlg_Load_1_Disposed_2(2, Nothing)
    End Sub

#End Region

#Region "コントロール　イベント"

    Private Sub lst音_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lst音.DragOver
        gggbol = ⅩOLEDragDropファイルイベント_Drag_Is_指定EXT_IN(e, "WAV")
    End Sub
    Private Sub lst音_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lst音.DragDrop
        Dim wFolders_0_Ubound() As String = {""}, wFiles() As String = {""} : Dim wDrpX_inControl, wDrpY_inControl As Integer
        If ⅩOLEDragDropファイルイベント(3, lst音, e, wFolders_0_Ubound, wFiles, wDrpX_inControl, wDrpY_inControl) Then
            'Dim a As Integer
            'qqqqq("wFolders_0_Ubound") : For a = 0 To UBound(wFolders_0_Ubound) : qqqqq(wFolders_0_Ubound(a)) : Next
            'qqqqq("wFiles_0_Ubound") : For a = 0 To UBound(wFiles) : qqqqq(wFiles(a)) : Next
            Dim ff As String = zzAdd_Wav_Files_Into_lst音(wFiles)
        End If
    End Sub

    Private Sub lblあたり_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lblあたり.DoubleClick
        Dim a As Integer = lst音.FindString(lblあたり.Text)
        If a >= 0 Then lst音.SelectedIndex = a
        Call zzテスト演奏_COM(lblあたり.Text)
    End Sub

    Private Sub lst音_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles lst音.SelectedIndexChanged
        If mNew実行中 Then Return
        If mDlgLoading Then Return
        gggbol = zzEnabledSet()
    End Sub

    Private Sub lst音_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lst音.DoubleClick
        If mDlgLoading Then Return
        If lst音.SelectedItem Is Nothing Then Return
        Call btnテスト演奏_Click(Nothing, Nothing)
    End Sub

    Private Function zzAdd_Wav_Files_Into_lst音(ByVal rFullNames() As String) As String
        Dim a As Integer : Dim ff As String = "", Retff As String = "" : Dim c As Integer = 0
        For a = 0 To UBound(rFullNames)
            If c >= 100 Then
                Call ⅩMsgBox_OK_情報("一度に追加できるファイル数は、１００枚までです。")
                Exit For
            End If
            ff = rFullNames(a)
            If Ⅹファイルは存在(ff) Then
                Dim ext As String = LCase(Ⅹファイル拡張子(ff, True))
                If ext = ".wav" Then
                    If lst音.FindString(ff) = ListBox.NoMatches Then
                        lst音.Items.Add(ff)
                        Retff = ff
                        c = c + 1
                    End If
                End If
            End If
        Next
        If Retff <> "" Then
            lst音.SelectedIndex = lst音.FindString(Retff)
            mサウンドフォルダ前回使用 = Ⅹフルパス名からフォルダパス名あるいは親フォルダパス名を得る(Retff)
            gggbol = zzSaveData()
            gggbol = zzEnabledSet()
            Return Retff
        Else
            Call ⅩMsgBox_OK_情報("追加できる  .WAV  ファイルはありません")
        End If
        Return ""
    End Function
    Private Sub btn音_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn音.Click
        '新規にファイルを開く
        Dim FD As New 五clsFileDlgPathMenu : Dim wPath As String = "" : Dim wFullNames() As String = {""}
        If FD.ファイルダイアログ表示してファイルを選択(2, "複数の　サウンドファイルを選択", "サウンドファイル (*.wav)|*.wav", mサウンドフォルダ前回使用, wPath, wFullNames) Then
            Dim ff As String = zzAdd_Wav_Files_Into_lst音(wFullNames)
        End If
    End Sub

    Private Sub btnテスト演奏_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnテスト演奏.Click
        If mDlgLoading Then Return
        If lst音.SelectedItem Is Nothing Then Return
        Call zzテスト演奏_COM(lst音.SelectedItem.ToString)
    End Sub

    Private Sub btnあたり音設定_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnあたり音設定.Click
        gggbol = zzあたり音設定_ハズレ音設定_COM(lblあたり)
    End Sub
    Private Function zzあたり音設定_ハズレ音設定_COM(ByVal lbl As Label) As Boolean
        If mDlgLoading Then Return False
        If lst音.SelectedItem Is Nothing Then Return False
        Dim ff As String = lst音.SelectedItem.ToString
        If Ⅹファイルは存在(ff) Then
            lbl.Text = ff
            gmアプリ固有クラス.pサウンドファイル = lblあたり.Text
        Else
            Call ⅩMsgBox_OK_注意(ff & vbCrLf & "このファイルは、現在のシステムには存在しません")
        End If
        Return zzEnabledSet()
    End Function

    Private Sub btnリスト削除_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnリスト削除.Click
        If mDlgLoading Then Return
        If lst音.SelectedItem Is Nothing Then Return
        Try
            If Not zz現在使用されている(lst音.SelectedItem.ToString) Then
                Dim a As Integer
                a = lst音.SelectedIndex()
                lst音.Items.RemoveAt(a)
                a = Math.Min(lst音.Items.Count - 1, a)
                lst音.SelectedIndex = a
            End If
            gggbol = zzSaveData()
            gggbol = zzEnabledSet()
        Catch
        End Try
    End Sub

    Private Sub chk音を鳴らす_CheckStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chk音を鳴らす.CheckStateChanged
        If mNew実行中 Then Return
        If mDlgLoading = True Then Return
        Call gmアプリ固有クラス.pサウンドを鳴らすCheckBoxから読出し(chk音を鳴らす)
        gggbol = zzEnabledSet()
    End Sub

    Private Sub chkサウンドファイルを順次変更する_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkサウンドファイルを順次変更する.CheckedChanged
        If mNew実行中 Then Return
        If mDlgLoading = True Then Return
        Call gmアプリ固有クラス.pサウンドファイルを順次変更するCheckBoxから読出し(chkサウンドファイルを順次変更する)
        gggbol = zzEnabledSet()
    End Sub

#End Region

#Region "メニューイベント"

    Private Sub mnuすべて元に戻す_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuすべて元に戻す.Click
        chk音を鳴らす.Checked = mpサウンドを鳴らす
        Dim ff As String = mpサウンドファイル
        gggbol = zzFileSetIn_lbl音(ff)
        gmアプリ固有クラス.pサウンドファイル = ff
    End Sub

    Private Sub mnu規定値にリセット_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnu規定値にリセット.Click
        chk音を鳴らす.Checked = gmアプリ固有クラス.pサウンドを鳴らすDEF
        Dim ff As String = gmアプリ固有クラス.pサウンドファイルDEF
        gggbol = zzFileSetIn_lbl音(ff)
        gmアプリ固有クラス.pサウンドファイル = ff
    End Sub

#End Region

#Region "ローカルヘルパー"

    Private Function zzSaveData() As Boolean
        Dim rwAry() As String = {""}, max As Integer
        With gmアプリ固有クラス
            Call .pサウンドを鳴らすCheckBoxから読出し(chk音を鳴らす)
            Call .pサウンドファイルを順次変更するCheckBoxから読出し(chkサウンドファイルを順次変更する)
            .pサウンドファイル = lblあたり.Text
            max = Ⅹリストボックスから_文配列にリストを入れる(lst音, rwAry)
            If max > 0 Then max = CInt(.pサウンドファイルの配列_RW(gcoプロパLetARY, rwAry, ""))
        End With
        Return True
    End Function

    Private Function zzテスト演奏_COM(ByVal ff As String) As Boolean
        If mNew実行中 Then Return False
        If mDlgLoading Then Return False
        If lst音.SelectedItem Is Nothing Then Return False
        Try
            Dim b As Boolean = False
            mnuすべて元に戻す.Enabled = b
            mnu規定値にリセット.Enabled = b
            btnテスト演奏.Enabled = b : btn音.Enabled = b : btnリスト削除.Enabled = b : lst音.Enabled = b : Me.Cursor = Cursors.WaitCursor
            chk音を鳴らす.Enabled = b : btnあたり音設定.Enabled = b
            Me.Refresh()
            If Ⅹファイルは存在(ff) Then
                My.Computer.Audio.Play(ff, AudioPlayMode.WaitToComplete)
            Else
                MsgBox(ff + gggCR2 + "このファイルは存在しません")
            End If
            b = True
            btnテスト演奏.Enabled = b : btn音.Enabled = b : btnリスト削除.Enabled = b : lst音.Enabled = b : Me.Cursor = Cursors.Default
            chk音を鳴らす.Enabled = b : btnあたり音設定.Enabled = b
        Catch
        End Try
        Return zzEnabledSet()
    End Function

    Private Function zz現在使用されている(ByVal ff As String) As Boolean
        Dim fff As String = UCase(ff)
        Return ((UCase(lblあたり.Text) = fff))
    End Function

    Private Function zzFileSetIn_lbl音(ByVal ff As String) As Boolean
        If mDlgLoading Then
            Return False
        End If
        If ff <> "" Then
            If lblあたり.Text <> "" Then gggbol = zzAddList_Into_lst音_もしなければ(lblあたり.Text, False)
            lblあたり.Text = ff
            gggbol = zzAddList_Into_lst音_もしなければ(lblあたり.Text, True)
            lst音.SelectedIndex = lst音.FindString(lblあたり.Text)
            lblあたり.Refresh()
            lst音.Refresh()
            gggbol = zzEnabledSet()
            Return True
        End If
        Return False
    End Function

    Private Function zzAddList_Into_lst音_もしなければ(ByVal ff As String, ByVal DoSetIndex As Boolean) As Boolean
        If Ⅹファイルは存在(ff) Then
            If -1 = lst音.FindString(ff) Then lst音.Items.Add(ff)
            If DoSetIndex Then lst音.SelectedIndex = lst音.FindString(ff)
            Return True
        End If
        Return False
    End Function

    Private Function zzEnabledSet() As Boolean
        If mNew実行中 Then Return False
        mnuすべて元に戻す.Enabled = (mpサウンドファイル <> lblあたり.Text) Or (mpサウンドを鳴らす <> chk音を鳴らす.Checked)
        mnu規定値にリセット.Enabled = (gmアプリ固有クラス.pサウンドファイルDEF <> lblあたり.Text) Or (gmアプリ固有クラス.pサウンドを鳴らすDEF <> chk音を鳴らす.Checked)
        '-------------------------------------------------------
        If lst音.SelectedItem IsNot Nothing Then
            Dim fff As String = UCase(lst音.SelectedItem.ToString)
            Dim eee As Boolean = Not zz現在使用されている(fff)
            btnリスト削除.Enabled = eee And (fff <> UCase(mpサウンドファイルDEF))
            btnあたり音設定.Enabled = eee
            btnテスト演奏.Enabled = True
        Else
            btnリスト削除.Enabled = False
            btnあたり音設定.Enabled = False
            btnテスト演奏.Enabled = False
        End If
        '-------------------------------------------------------
        chkサウンドファイルを順次変更する.Enabled = (chk音を鳴らす.Enabled And chk音を鳴らす.Checked)
        Return True
    End Function

#End Region

#Region "イベント from gAppEventMaker"

    Private Sub イベントgAppEventMaker_サウンドファイルの実行を開始します(ByVal rサウンドファイル As String) Handles イベントgAppEventMaker.サウンドファイルの実行を開始します
        If Me.Visible = False Then Return
        mDlgLoading = True
        lst音.SelectedIndex = lst音.FindString(rサウンドファイル) ' Ⅹリストボックスから_文のリストを探して_インデックスを返す(lst音, rサウンドファイル, True)
        mDlgLoading = False
    End Sub

    Private Sub イベントgAppEventMaker_スイスイとユラユラ開始と停止() Handles イベントgAppEventMaker.スイスイとユラユラ開始と停止
        If ppスイスイフラフラ_いずれかあるいは両方_を実行中 And Me.Visible Then Call mnu閉じる_Click(Nothing, Nothing)
    End Sub

    Private Sub イベントgAppEventMaker_フォームの表示と消去(ByVal rフォーム名ID As Integer, ByVal r表示True消去False As Boolean) Handles イベントgAppEventMaker.フォームの表示と消去
        Dim wRet_rMe_gmDlgIDウインドウを消去しなさい As Boolean
        RaiseEvent 他のウインドウが表示あるいは非表示になりました(mMe_gmDlgID, rフォーム名ID, r表示True消去False, wRet_rMe_gmDlgIDウインドウを消去しなさい)
        If wRet_rMe_gmDlgIDウインドウを消去しなさい Then Call mnu閉じる_Click(Nothing, Nothing)
    End Sub

#End Region

End Class


