# 機能設計書 33-全選択

## 概要

本ドキュメントは、Windows Terminal における「全選択」機能（SelectAll アクション）の設計を記述する。ターミナルバッファ内のすべてのテキストを選択状態にする機能である。

### 本機能の処理概要

**業務上の目的・背景**：ターミナル上に表示されたすべてのテキスト（スクロールバックバッファを含む）を一括で選択し、コピーやその他の操作の対象とする機能である。大量のコマンド出力やログを一度に取得する際に利用される。

**機能の利用シーン**：ユーザーが Ctrl+Shift+A やキーバインドを押下したとき、またはコンテキストメニューから「すべて選択」を選択したときに実行される。ターミナル出力の全体を他のアプリケーションにコピーする場合などに利用される。

**主要な処理内容**：
1. _HandleSelectAll でアクションを受信
2. アクティブな TermControl の SelectAll を呼び出し
3. ControlCore 経由で Terminal::SelectAll を実行
4. バッファの先頭から可視ビューポートの末尾までを選択範囲として設定
5. 選択UIを更新

**関連システム・外部連携**：なし

**権限による制御**：なし

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | TermControl（ターミナル表示） | 主画面 | SelectAll によりバッファ内全テキストを選択 |
| 1 | TerminalPage（メイン画面） | 主画面 | _HandleSelectAll でアクションを処理 |

## 機能種別

テキスト操作 / 選択操作

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| (なし) | - | - | SelectAll アクションはパラメータを持たない | - |

### 入力データソース

- ターミナルのテキストバッファ（アクティブバッファ）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (なし) | - | ターミナルの選択状態が更新される（UI上の視覚的フィードバック） |

### 出力先

- TermControl の選択状態（選択ハイライト表示）

## 処理フロー

### 処理シーケンス

```
1. _HandleSelectAll が sender と ActionEventArgs を受信
   └─ _senderOrActiveControl で TermControl を取得
2. TermControl.SelectAll を呼び出し
   └─ ControlCore.SelectAll に委譲
3. ControlCore.SelectAll
   └─ LockForWriting でターミナルロックを取得
   └─ Terminal::SelectAll を呼び出し
   └─ _updateSelectionUI で選択UIを更新
4. Terminal::SelectAll
   └─ バッファの Origin（先頭）を start に設定
   └─ ビューポートの BottomInclusive の RightInclusive を end に設定
   └─ SelectionInfo を作成し、active = true で設定
   └─ _selectionMode を Keyboard に設定
   └─ _ScrollToPoint で選択開始位置にスクロール
```

### フローチャート

```mermaid
flowchart TD
    A[SelectAll アクション受信] --> B[_senderOrActiveControl で TermControl 取得]
    B --> C{TermControl 取得成功?}
    C -->|No| Z[何もしない]
    C -->|Yes| D[TermControl.SelectAll]
    D --> E[ControlCore.SelectAll]
    E --> F[LockForWriting でロック取得]
    F --> G[Terminal::SelectAll]
    G --> H[バッファ先頭からビューポート末尾まで選択]
    H --> I[_updateSelectionUI で選択UI更新]
    I --> J[handled = true]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-33-01 | 選択範囲 | バッファの先頭（Origin）からミュータブルビューポートの右下端までが選択範囲となる | 常に適用 |
| BR-33-02 | 選択モード | 全選択後の選択モードは Keyboard に設定される | 常に適用 |
| BR-33-03 | ブロック選択無効 | 全選択はブロック選択（矩形選択）を無効にする | 常に適用 |

### 計算ロジック

なし

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

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

本機能はデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | コントロール未取得 | アクティブな TermControl がない場合 | 何もしない |

### リトライ仕様

リトライは行わない。

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

Terminal::SelectAll の実行中は LockForWriting でロックを保持する。

## パフォーマンス要件

バッファサイズに依存せず即座に選択状態を設定すること。

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

特になし。

## 備考

- 全選択はスクロールバックバッファの先頭から現在のビューポート末尾までを選択する
- 全選択後にコピー操作を行うことで、ターミナルバッファ全体のテキストを取得できる
- _selectionIsTargetingUrl は false に設定される

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | AppActionHandlers.cpp | `src/cascadia/TerminalApp/AppActionHandlers.cpp` | _HandleSelectAll がアクションのエントリーポイント |

**主要処理フロー**:
1. **1271-1279行目**: _senderOrActiveControl で TermControl を取得し、control.SelectAll() を呼び出す

#### Step 2: TermControl / ControlCore 層

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TermControl.cpp | `src/cascadia/TerminalControl/TermControl.cpp` | SelectAll で ControlCore に委譲 |
| 2-2 | ControlCore.cpp | `src/cascadia/TerminalControl/ControlCore.cpp` | SelectAll でロック取得と Terminal 呼び出し |

**主要処理フロー**:
- **2568-2571行目**（TermControl.cpp）: _core.SelectAll() を呼び出す
- **1374-1379行目**（ControlCore.cpp）: LockForWriting 後に _terminal->SelectAll() を呼び、_updateSelectionUI() で UI 更新

#### Step 3: Terminal コア層

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | TerminalSelection.cpp | `src/cascadia/TerminalCore/TerminalSelection.cpp` | Terminal::SelectAll の実装 |

**主要処理フロー**:
- **801-816行目**: バッファの Origin を start、ビューポート BottomInclusive の RightInclusive を end に設定。SelectionInfo を作成して active = true、blockSelection = false で設定。_selectionMode を Keyboard に設定。

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

```
TerminalPage::_HandleSelectAll (AppActionHandlers.cpp:1271)
    |
    +-- TermControl::SelectAll (TermControl.cpp:2568)
           |
           +-- ControlCore::SelectAll (ControlCore.cpp:1374)
                  |
                  +-- Terminal::SelectAll (TerminalSelection.cpp:801)
                  +-- _updateSelectionUI
```

### データフロー図

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

(なし)            --> _HandleSelectAll              --> TermControl取得
                      |
                      v
テキストバッファ  --> Terminal::SelectAll            --> SelectionInfo
  (バッファ全体)      |                                  (start=Origin,
                      |                                   end=BottomRight,
                      v                                   active=true)
                  _updateSelectionUI               --> 選択ハイライト表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| AppActionHandlers.cpp | `src/cascadia/TerminalApp/AppActionHandlers.cpp` | ソース | _HandleSelectAll アクションハンドラ |
| TermControl.cpp | `src/cascadia/TerminalControl/TermControl.cpp` | ソース | SelectAll の委譲 |
| TermControl.h | `src/cascadia/TerminalControl/TermControl.h` | ヘッダ | SelectAll 宣言 |
| ControlCore.cpp | `src/cascadia/TerminalControl/ControlCore.cpp` | ソース | SelectAll のロックと Terminal 呼び出し |
| TerminalSelection.cpp | `src/cascadia/TerminalCore/TerminalSelection.cpp` | ソース | Terminal::SelectAll の実装 |
| Terminal.hpp | `src/cascadia/TerminalCore/Terminal.hpp` | ヘッダ | SelectAll メソッド宣言 |
