# 機能設計書 117-コンテキストメニュー表示

## 概要

右クリックコンテキストメニューをプログラム的に表示する機能（ShowContextMenu アクション）の設計書である。

### 本機能の処理概要

本機能は、キーバインドやコマンドパレットからコンテキストメニューを表示するアクションを提供する。通常はマウスの右クリックで表示されるコンテキストメニューを、キーボード操作でも呼び出せるようにする。テキスト選択の有無に応じて、SelectionContextMenu または通常の ContextMenu が表示される。

**業務上の目的・背景**：キーボードのみで操作するユーザーやアクセシビリティの観点から、マウスを使わずにコンテキストメニューにアクセスする手段が必要である。また、マークモードでキーボードのみのテキスト選択を行った後にコンテキストメニューを表示する場面でも使用される。

**機能の利用シーン**：キーボードショートカットでコンテキストメニューを表示したい場面、またはマウスが使えない環境でのターミナル操作時に使用される。

**主要な処理内容**：
1. アクティブなターミナルコントロールを取得する
2. TermControl の ShowContextMenu メソッドを呼び出す
3. テキスト選択の有無を確認する
4. 選択がある場合は SelectionContextMenu、ない場合は ContextMenu を表示する
5. カーソル位置または選択範囲の終端位置にメニューを表示する

**関連システム・外部連携**：TermControl のコンテキストメニュー表示機能を使用する。

**権限による制御**：特に権限による制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | TerminalPage（メイン画面） | 主画面 | _HandleShowContextMenuにより右クリックメニューを表示 |
| 6 | TermControl（ターミナル表示） | 主画面 | 右クリックでContextMenuまたはSelectionContextMenuを表示 |

## 機能種別

UI表示処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| （パラメータなし） | - | - | 本アクションはパラメータを取らない | - |

### 入力データソース

- アクティブターミナルコントロールの選択状態
- カーソル位置情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| コンテキストメニュー | MenuFlyout | 表示されるコンテキストメニュー |

### 出力先

TermControl 上にフライアウトとして表示。

## 処理フロー

### 処理シーケンス

```
1. _HandleShowContextMenu が呼び出される
   └─ アクティブなターミナルコントロールを取得
2. TermControl::ShowContextMenu を呼び出す
   └─ テキスト選択の有無を確認
3. カーソル位置を決定する
   └─ 選択がある場合は選択範囲の終端位置、ない場合はカーソル位置
4. コンテキストメニューを表示
   └─ 選択がある場合は SelectionContextMenu、ない場合は ContextMenu
5. Handled = true に設定
```

### フローチャート

```mermaid
flowchart TD
    A[_HandleShowContextMenu] --> B{アクティブコントロール取得成功?}
    B -->|No| C[Handled = true で終了]
    B -->|Yes| D[control.ShowContextMenu 呼び出し]
    D --> E{テキスト選択あり?}
    E -->|Yes| F[SelectionContextMenu を表示]
    E -->|No| G[ContextMenu を表示]
    F --> H[選択範囲の終端位置にメニュー表示]
    G --> I[カーソル位置にメニュー表示]
    H --> C
    I --> C
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-117-01 | メニュー切替 | テキスト選択がある場合は SelectionContextMenu、ない場合は ContextMenu を表示 | 常時 |
| BR-117-02 | 表示位置 | 選択がある場合は EndPos、ない場合は CursorPosition を基準にメニューを表示 | 常時 |
| BR-117-03 | 常にHandled | コントロールの有無に関わらず Handled = true に設定される | 常時 |

### 計算ロジック

特になし。

## データベース操作仕様

### 操作別データベース影響一覧

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | コントロール不在 | アクティブなターミナルコントロールが存在しない場合 | ShowContextMenu の呼び出しをスキップするが、Handled は true |

### リトライ仕様

リトライは行わない。

## トランザクション仕様

トランザクション管理は不要。

## パフォーマンス要件

コンテキストメニューは即座に表示される必要がある。

## セキュリティ考慮事項

- コンテキストメニューの項目はアプリケーション内で定義された操作のみ
- 外部との連携は行わない

## 備考

- SelectionContextMenu にはコピー、Web検索、色付け等の選択操作が含まれる
- ContextMenu には貼り付け等の一般操作が含まれる

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | AppActionHandlers.cpp | `src/cascadia/TerminalApp/AppActionHandlers.cpp` | **1592-1600行目**: _HandleShowContextMenu。アクティブコントロールの ShowContextMenu を呼び出す |

**主要処理フロー**:
1. **1595行目**: _GetActiveControl() でアクティブコントロール取得
2. **1597行目**: control.ShowContextMenu() 呼び出し
3. **1599行目**: Handled = true（コントロールの有無に関わらず）

#### Step 2: TermControl の ShowContextMenu を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TermControl.cpp | `src/cascadia/TerminalControl/TermControl.cpp` | **3932行目以降**: ShowContextMenu メソッド。選択状態に応じて SelectionContextMenu または ContextMenu を表示する |

**主要処理フロー**:
- **3934行目**: _core.HasSelection() で選択状態を確認
- **3935-3937行目**: 選択がある場合は EndPos、ない場合は CursorPosition を基準位置とする
- 対応するメニューを ShowAt で表示

### プログラム呼び出し階層図

```
TerminalPage::_HandleShowContextMenu (AppActionHandlers.cpp:1592)
    |
    +-- _GetActiveControl() (アクティブコントロール取得)
    |
    +-- TermControl::ShowContextMenu (TermControl.cpp:3932)
            |
            +-- _core.HasSelection() (選択状態確認)
            |
            +-- SelectionContextMenu.ShowAt / ContextMenu.ShowAt
```

### データフロー図

```
[入力]                          [処理]                              [出力]

キーバインド/         _HandleShowContextMenu        コンテキストメニュー
コマンドパレット ──>  で TermControl に委譲 ──────>  の表示
                           |
                           v
                    HasSelection() で
                    メニュー種別を判定
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| AppActionHandlers.cpp | `src/cascadia/TerminalApp/AppActionHandlers.cpp` | ソース | _HandleShowContextMenu ハンドラ |
| TermControl.cpp | `src/cascadia/TerminalControl/TermControl.cpp` | ソース | ShowContextMenu の実装 |
| TermControl.xaml | `src/cascadia/TerminalControl/TermControl.xaml` | XAML | ContextMenu と SelectionContextMenu の定義 |
