タブ式テキストエディタ(14) ツールバーメニューの実装

 ツールバーメニューは、各ボタンにメインメニューのクリックメソッドを結びつけるだけです。しかし面倒なのは、ボタンの使用状態の切り替えです。メインメニューなら"Select"イベントで調整可能ですが、ツールバーボタンの場合は該当するすべてのイベントにいちいち記述しなければなりません。
素材へ : ツールバーアイコン

ツールバーのボタンクリックイベント

 ボタンオブジェクトは"e.Button"で取得できますので、これを使って処理を振り分けています。"if...else..."文を使っていますが、"Select...Case..."の方がすっきりまとまりそうです。ただし、速さは若干"if...else..."分の方が早いようです。

' ツールバーのボタンクリックイベント
Private Sub TB1_ButtonClick(ByVal sender As System.Object, _
            ByVal e As  System.Windows.Forms.ToolBarButtonClickEventArgs) _
            Handles TB1.ButtonClick
    If e.Button Is tbNew Then : mnNew.PerformClick()
    ElseIf e.Button Is tbOpen Then : mnOpen.PerformClick()
    ElseIf e.Button Is tbClose Then : mnClose.PerformClick()
    ElseIf e.Button Is tbSave Then : mnSave.PerformClick()
    ElseIf e.Button Is tbUndo Then : mnUndo.PerformClick()
    ElseIf e.Button Is tbCut Then : mnCut.PerformClick()
    ElseIf e.Button Is tbCopy Then : mnCopy.PerformClick()
    ElseIf e.Button Is tbPaste Then : mnPaste.PerformClick()
    ElseIf e.Button Is tbFont Then : mnFont.PerformClick()
    ElseIf e.Button Is tbWordwrap Then : mnWordwrap.PerformClick()
    End If
End Sub

ボタンメニューの更新

 ボタンの使用状態の可・不可を切り替えるコードです。ここはメインメニューの更新とほぼ同じです。引数に対象となるページを入れて使いますが、ページがないことを想定して変数"bPage"をつくっています。

' UpdateButtonMenus : ボタンメニューの更新
Private Sub UpdateButtonMenus(ByVal page As TextPage)
    Dim bPage As Boolean = Not IsNothing(page)
    mnEdit.Enabled = bPage
    tbClose.Enabled = bPage
    tbSave.Enabled = bPage
    tbUndo.Enabled = (bPage AndAlso page.EditBox.CanUndo)
    tbCut.Enabled = (bPage AndAlso Not page.EditBox.SelectedText.Equals(""))
    tbCopy.Enabled = (bPage AndAlso Not page.EditBox.SelectedText.Equals(""))
    tbPaste.Enabled = (bPage _
                    AndAlso (Clipboard.GetDataObject.GetDataPresent(DataFormats.Text) _
                    OrElse Clipboard.GetDataObject.GetDataPresent(DataFormats.Rtf)))
End Sub

関数へボタンメニュー更新コードを挿入

 "UpdateButtonMenus"関数をボタンメニューの使用状態の切り替えに影響しそうな関数に挿入します。実際に挿入したのは以下の各関数です。

' Load : ロード
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    ...
    UpdateButtonMenus(Nothing)
    ...
End Sub

' タブコントロール : ページの選択イベント
Private Sub TC1_SelectedIndexChanged(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles TC1.SelectedIndexChanged
        If TC1.TabPages.Count > 0 Then
            ...
            UpdateButtonMenus(page)
        End If
End Sub

' タブコントロール : ページの追加イベント
Private Sub TC1_ControlAdded(ByVal sender As Object, _
            ByVal e As ControlEventArgs) Handles TC1.ControlAdded
    If TC1.TabPages.Count = 1 Then
        ...
        UpdateButtonMenus(page)
    End If
End Sub

' タブコントロール : ページの削除イベント
Private Sub TC1_ControlRemoved(ByVal sender As Object, _
           ByVal e As ControlEventArgs) Handles TC1.ControlRemoved
    If TC1.TabPages.Count = 1 Then
        ...
        UpdateButtonMenus(Nothing)
    End If
End Sub

' タブページ : テキスト状態の変更イベント 
Private Sub TextPage_TextStateChanged(ByVal sender As Object, ByVal e As EventArgs)
    ...
    UpdateButtonMenus(DirectCast(ctrEdit.Parent, TextPage))
End Sub

' コンテキストメニュー : 新規作成(既存のページ)
Private Sub pupNew_Click(ByVal sender As Object, ByVal e As EventArgs) _
            Handles pupNew.Click
    If AllowUpdate(clickedpage) Then
        ...
        UpdateButtonMenus(clickedpage)
    End If
End Sub

' コンテキストメニュー : 開く (既存のページに)
Private Sub pupOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles pupOpen.Click
    If AllowUpdate(clickedpage) Then
        ...
        UpdateButtonMenus(clickedpage)
    End If
End Sub
| ■HOME | ◆プログラムTop | ▲ページの先頭 | << 前の章 | 次の章 >> |