# 画面設計書 18-LargePasteDialog（大量貼り付け確認）

## 概要

本ドキュメントは、Windows Terminal の LargePasteDialog（大量貼り付け確認）画面の設計仕様を記述する。LargePasteDialog は、クリップボードのテキストが一定サイズ（5KiB）を超える場合に、貼り付け操作の確認を求めるダイアログである。

### 本画面の処理概要

LargePasteDialog は、ユーザーがターミナルに大量のテキストを貼り付けようとした際に表示される確認ダイアログである。意図しない大量テキストの貼り付け（例えばショートカットキーの誤操作）を防止する。

**業務上の目的・背景**：大量のテキストをターミナルに貼り付けると、シェルの処理に時間がかかったり、予期しないコマンドが大量に実行される可能性がある。特に、ユーザーが意図せず貼り付けショートカット（Ctrl+V）を押した場合、クリップボードに残っている大量のデータが送信されてしまうリスクがある。LargePasteDialog はこのような誤操作を防止するためのセーフティネットである。

**画面へのアクセス方法**：TerminalPage の貼り付け処理（`_PasteFromClipboardHandler`）において、クリップボードテキストが5KiB（5120バイト）を超え、`WarnAboutLargePaste` 設定が有効で、かつ複数行警告の条件に該当しない場合に表示される。

**主要な操作・処理内容**：
1. 警告メッセージの表示：5KiB を超えるテキストの貼り付け確認メッセージを表示する
2. 貼り付け続行（Primary ボタン）：「Paste anyway」ボタンで貼り付け操作を続行する
3. キャンセル（Close ボタン）：「Cancel」ボタンで貼り付け操作を中断する

**画面遷移**：TerminalPage の貼り付け操作からダイアログが表示される。Primary ボタンで貼り付けが実行され、Close ボタンで TerminalPage に戻る。

**権限による表示制御**：特になし。ただし、`WarnAboutLargePaste` 設定が false の場合はダイアログが表示されない。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 32 | テキストの貼り付け | 主機能 | 大量テキスト貼り付け時の確認ダイアログ表示 |

## 画面種別

ダイアログ（ContentDialog - インライン定義）

## URL/ルーティング

該当なし（TerminalPage.xaml 内にインライン定義される ContentDialog）

## 入出力項目

| 項目名 | 入出力 | 型 | 必須 | 説明 |
|--------|--------|-----|------|------|
| ContentDialogResult | 出力 | ContentDialogResult | Yes | ユーザーの選択結果（Primary = 貼り付け / None = キャンセル） |

## 表示項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| Title | テキスト | "Warning" |
| Content | テキスト | "You are about to paste text that is longer than 5 KiB. Do you wish to continue?" |
| PrimaryButtonText | ボタンラベル | "Paste anyway" |
| CloseButtonText | ボタンラベル | "Cancel" |

## イベント仕様

### 1-ダイアログ表示条件

TerminalPage.cpp の `_PasteFromClipboardHandler` 内で、以下の条件が全て真の場合に表示される（行2997-2998, 3030-3032）：
- テキストサイズが5KiB（5120バイト）を超える
- `WarnAboutLargePaste` グローバル設定が有効
- 複数行警告（warnMultiLine）に該当しない

### 2-Primary ボタン（Paste anyway）

ユーザーが「Paste anyway」ボタンをクリックすると、ContentDialogResult::Primary が返される。貼り付け処理が続行され、バックグラウンドスレッドで `eventArgs.HandleClipboardData()` によりテキストがターミナルに送信される（行3050-3051）。

### 3-Close ボタン（Cancel）

ユーザーが「Cancel」ボタンをクリックすると、貼り付け操作が中断される（行3038-3041）。

## データベース更新仕様

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

該当なし。本画面はデータベースを操作しない。

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|----------|---------------|
| LargePasteDialog.Title | タイトル | 常時 | "Warning" |
| LargePasteDialog.Content | 本文 | 常時 | "You are about to paste text that is longer than 5 KiB. Do you wish to continue?" |
| LargePasteDialog.PrimaryButtonText | ボタンラベル | 常時 | "Paste anyway" |
| LargePasteDialog.CloseButtonText | ボタンラベル | 常時 | "Cancel" |

## 例外処理

- 特別な例外処理は実装されていない。MultiLinePasteDialog と同一のフロー内で処理される。

## 備考

- DefaultButton は Primary に設定されている（TerminalPage.xaml 行131）
- x:Load="False" により遅延読み込みされる（TerminalPage.xaml 行130）
- Content（本文テキスト）が設定されており、Title + Content の構成である
- MultiLinePasteDialog とは異なり、クリップボードテキストのプレビューは含まれない
- 大量テキストの閾値は `minimumSizeForWarning`（5KiB = 5120バイト）で定義されている（TerminalPage.cpp 行2997）
- 複数行警告条件と大量テキスト警告条件の両方に該当する場合は、複数行警告が優先される

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TerminalPage.xaml | `src/cascadia/TerminalApp/TerminalPage.xaml` | LargePasteDialog の XAML 定義（行127-131）。MultiLinePasteDialog とは異なり Content は x:Uid 経由のリソース文字列で設定されるシンプルな構成 |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | `_PasteFromClipboardHandler` 内の大量テキスト判定ロジック（行2997-2998）。`minimumSizeForWarning = 1024 * 5` の定義と、`warnLargeText` の条件判定を確認 |
| 2-2 | TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | `_ShowLargePasteWarningDialog`（行936-938）で `_ShowDialogHelper(L"LargePasteDialog")` を呼び出す |

**主要処理フロー**:
1. **行2997**: `minimumSizeForWarning = 1024 * 5`（5KiB）定義
2. **行2998**: `text.size() > minimumSizeForWarning && globalSettings.WarnAboutLargePaste()` 判定
3. **行3030-3032**: `warnMultiLine` でない場合に `_ShowLargePasteWarningDialog()` を呼び出し
4. **行3038-3041**: Primary でない場合は co_return（キャンセル）

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

```
TerminalPage::_PasteFromClipboardHandler (TerminalPage.cpp:~2970)
    |
    +-- テキストサイズチェック（5KiB超過?）
    +-- WarnAboutLargePaste 設定チェック
    |
    +-- [warnLargeText && !warnMultiLine]
    |       |
    |       +-- _ShowLargePasteWarningDialog (TerminalPage.cpp:936)
    |               +-- _ShowDialogHelper("LargePasteDialog")
    |                       +-- FindName + DialogPresenter::ShowDialog
    |
    +-- [結果判定]
            +-- Primary --> eventArgs.HandleClipboardData()（バックグラウンド）
            +-- Other --> co_return（キャンセル）
```

### データフロー図

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

クリップボード          --> _PasteFromClipboardHandler      --> LargePasteDialog 表示
  (テキスト > 5KiB)          |                                   (条件付き)
                        --> サイズチェック
                        --> WarnAboutLargePaste 設定チェック
                             |
ユーザー選択            --> ContentDialogResult              --> 貼り付け実行 or キャンセル
                                                                 (バックグラウンドスレッドで実行)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TerminalPage.xaml | `src/cascadia/TerminalApp/TerminalPage.xaml` | ソース（XAML） | LargePasteDialog のインライン定義（行127-131） |
| TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | ソース（実装） | _PasteFromClipboardHandler / _ShowLargePasteWarningDialog の実装 |
| Resources.resw | `src/cascadia/TerminalApp/Resources/en-US/Resources.resw` | リソース | ダイアログテキストの文字列リソース（行529-540） |
