タブ式テキストエディタ(8) ファイルメニューの実装

 設定済みのメインメニューのうち、ファイルメニューを実装します。ただし、印刷関連だけ後回しにします。これがまた面倒なのです。
 それから、タブコントロールのタブを右クリックしたときに浮かび上がるポップアップメニューについても実装します。これも以前設定したものです。

メインメニューのファイルメニューの実装

 ファイルメニューの実装といっても、ほとんど前回つくった関数へ渡すだけです。すべてアクティブなページが対象です。
 ところで、タブページを閉じる時、テキスト部分にフォーカスがあると、なぜか閉じないことがあります。タブページを削除する前にタブコントロールにフォーカスを移してやるといいようです。

' ファイルメニュー : 新規作成
Private Sub mnNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles mnNew.Click
    PageFromFile(Nothing, Nothing)
End Sub

' ファイルメニュー : 開く
Private Sub mnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles mnOpen.Click
    Try
        PageFromFile("", Nothing)
    Catch ex As Exception
        MessageBox.Show(ex.Message, "I/Oエラー", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Sub

' ファイルメニュー : 閉じる
Private Sub mnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles mnClose.Click
    Dim page As TabPage = TC1.SelectedTab
    If (Not IsNothing(page)) AndAlso AllowUpdate(DirectCast(page, TextPage)) Then
        TC1.Select()
        TC1.TabPages.Remove(page)
    End If
End Sub

' ファイルメニュー : 上書き保存
Private Sub mnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles mnSave.Click
    Dim page As TextPage = DirectCast(TC1.SelectedTab, TextPage)
    PageToFile(page.EditBox.PathName, page)
End Sub

' ファイルメニュー : 名前をつけて保存
Private Sub mnSaveAs_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles mnSaveAs.Click
    Dim page As TextPage = DirectCast(TC1.SelectedTab, TextPage)
    PageToFile(Nothing, page)
End Sub     

' ファイルメニュー : プロパティ
Private Sub mnProperty_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
            Handles mnProperty.Click
    DirectCast(TC1.SelectedTab, TextPage).EditBox.ShowFileProperty()
End Sub

' ファイルメニュー : 終了
Private Sub mnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles mnExit.Click
    Me.Close()
End Sub 

 以下は"最近使ったファイル"をクリックした時の関数です。第6回に設定して中身が空のままになっていたものです。開く前にファイル名のチェックを行っています。

' mnFileName : 最近使ったファイルを開く
Private Sub mnFileName_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim nIndex As Integer = DirectCast(sender, MenuItem).Index
    If IO.File.Exists(m_recent(nIndex)) Then
        PageFromFile(m_recent(nIndex), Nothing)
    Else
        MessageBox.Show( _
            "ファイル [" & m_recent(nIndex) & "] は、見つかりませんでした。", _ 
            "読み込みエラー", _
            MessageBoxButtons.OK, _
            MessageBoxIcon.Error)
    End If
End Sub 

メニュー項目の使用状態を切り替える

 Selectイベントを使って、各メニュー項目の使用状態を切り替えます。主に、アクティブなタブページがないときに、メニューが使えないようにしています。

' ファイルメニュー : メニュー項目の保守
Private Sub mnFile_Select(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles mnFile.Select
    Dim p As TextPage = DirectCast(TC1.SelectedTab, TextPage)
    mnClose.Enabled = Not IsNothing(p)
    mnSaveAs.Enabled = Not IsNothing(p)
    mnPreview.Enabled = Not IsNothing(p)
    mnPrint.Enabled = Not IsNothing(p)
    mnRecent.Enabled = Not m_recent.Count.Equals(0)
    mnSave.Enabled = ((Not IsNothing(p)) AndAlso p.EditBox.Modified)
    mnProperty.Enabled = (Not IsNothing(p)) AndAlso (p.EditBox.PathName <> "")
End Sub 

クリックされたタブページを取得する

 タブウコントロール"TC1"に設定したコンテキストメニュー"PUP1"は、アクティブなページではなく、クリックしたページに対するファイルメニューの役割を果たします。そのため、クリックしたページを特定する必要があります。これはタブコントロールのマウスダウンイベントで処理します。それぞれのタブの部分は"GetTabRect"で位置を取得できますので、マウスの位置がどのタブの範囲にあるかを調べれば特定できます。

' 変数 : クリックされたページ
Private m_clickedpage As TabPage = Nothing

' タブコントロール : マウスダウンイベント
Private Sub TC1_MouseDown(ByVal sender As Object, ByVal e As _
            System.Windows.Forms.MouseEventArgs) Handles TC1.MouseDown
    ' マウス下のページの取得
    If TC1.TabPages.Count > 0 Then
        Dim i As Integer
        Dim r As Rectangle
        For i = 0 To TC1.TabPages.Count - 1
            r = TC1.GetTabRect(i)
            If (e.X >= r.Left _
                AndAlso e.X <= r.Right _
                AndAlso e.Y >= r.Top _
                AndAlso e.Y <= r.Bottom) Then
                m_clickedpage = TC1.TabPages(i)
            End If
        Next
    End If
End Sub

タブコントロールのポップアップメニューの実装

 クリックしたページ"m_clickedpage"には未保存の文書が存在することがありえますので、以前つくった"AllowUpdate"でチェックしています。

' コンテキストメニュー : 閉じる
Private Sub pupClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles pupClose.Click
    If Not IsNothing(m_clickedpage) Then
        If m_clickedpage Is TC1.SelectedTab Then
            mnClose.PerformClick()
        Else
            If AllowUpdate(DirectCast(m_clickedpage, TextPage)) Then
                Dim page As TabPage = TC1.SelectedTab
                TC1.Select()
                TC1.TabPages.Remove(m_clickedpage)
                TC1.SelectedTab = page
            End If
        End If
    End If
End Sub

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

' コンテキストメニュー : 開く (既存のページに)
Private Sub pupOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles pupOpen.Click
    Dim clickedpage As TextPage = DirectCast(m_clickedpage, TextPage)
    If AllowUpdate(clickedpage) Then
        PageFromFile("", clickedpage)
    End If
End Sub

' コンテキストメニュー : 保存
Private Sub pupSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles pupSave.Click
    Dim page As TextPage = DirectCast(m_clickedpage, TextPage)
    PageToFile(page.EditBox.PathName, page)
End Sub 
| ■HOME | ◆プログラムTop | ▲ページの先頭 | << 前の章 | 次の章 >> |