# 画面設計書 16-CloseReadOnlyDialog（読み取り専用警告）

## 概要

本ドキュメントは、Windows Terminal の CloseReadOnlyDialog（読み取り専用警告）画面の設計仕様を記述する。CloseReadOnlyDialog は、読み取り専用に設定されたターミナルセッションを閉じようとした際に警告を表示するダイアログである。

### 本画面の処理概要

CloseReadOnlyDialog は、ユーザーが読み取り専用モードに設定されたペイン/タブを閉じようとした際に、意図を確認するための警告ダイアログである。読み取り専用モードはペインの誤操作防止のために使用されるため、その閉じ操作にも明示的な確認を求める。

**業務上の目的・背景**：読み取り専用モードは、重要なログ表示や監視用のターミナルセッションを誤って操作することを防ぐために設けられた機能である。読み取り専用のセッションを閉じる操作も誤操作の可能性があるため、CloseReadOnlyDialog により確認を求めることで、重要なセッションの意図しない終了を防止する。

**画面へのアクセス方法**：読み取り専用モードに設定されたペインまたはタブを閉じる操作を行った際に、TabManagement.cpp 内の `_ShowCloseReadOnlyDialog()` が呼び出されて表示される。

**主要な操作・処理内容**：
1. 警告メッセージの表示：読み取り専用ターミナルを閉じようとしている旨の警告を表示する
2. 閉じる続行（Primary ボタン）：「Close anyway」ボタンをクリックすると、読み取り専用ペイン/タブの閉じ処理が続行される
3. キャンセル（Close ボタン）：「Cancel」ボタンをクリックすると、閉じ操作が中断される

**画面遷移**：TerminalPage のタブ/ペイン閉じ操作からダイアログが表示される。Primary ボタンでタブ/ペインが閉じられ、Close ボタンで TerminalPage に戻る。

**権限による表示制御**：特になし。全ユーザーが利用可能。ただし、読み取り専用モードが設定されたペインに対する閉じ操作時にのみ表示される。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 26 | ペインの読み取り専用切替 | 主機能 | 読み取り専用セッション閉じの警告表示 |

## 画面種別

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

## URL/ルーティング

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

## 入出力項目

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

## 表示項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| Title | テキスト | "Warning" |
| Content | テキスト | "You are about to close a read-only terminal. Do you wish to continue?" |
| PrimaryButtonText | ボタンラベル | "Close anyway" |
| CloseButtonText | ボタンラベル | "Cancel" |

## イベント仕様

### 1-ダイアログ表示（タブ/ペイン閉じ操作）

TabManagement.cpp 内で読み取り専用ペインを含むタブの閉じ操作時に `_ShowCloseReadOnlyDialog()` が呼び出される（TabManagement.cpp 行405, 行721）。閉じ処理のフロー内で、対象ペインの読み取り専用状態がチェックされ、読み取り専用の場合にダイアログが表示される。

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

ユーザーが「Close anyway」ボタンをクリックすると、ContentDialogResult::Primary が返される。呼び出し元で結果を判定し、Primary の場合はペイン/タブの閉じ処理が続行される。

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

ユーザーが「Cancel」ボタンをクリックすると、ContentDialogResult::None が返される。呼び出し元で閉じ処理が中断される。

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

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

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

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|----------|---------------|
| CloseReadOnlyDialog.Title | タイトル | 常時 | "Warning" |
| CloseReadOnlyDialog.Content | 本文 | 常時 | "You are about to close a read-only terminal. Do you wish to continue?" |
| CloseReadOnlyDialog.PrimaryButtonText | ボタンラベル | 常時 | "Close anyway" |
| CloseReadOnlyDialog.CloseButtonText | ボタンラベル | 常時 | "Cancel" |

## 例外処理

- 特別な例外処理は実装されていない。ダイアログの表示と結果の取得のみを行うシンプルな構造である。

## 備考

- DefaultButton は Close に設定されている（TerminalPage.xaml 行105）。これは QuitDialog/CloseAllDialog（Primary がデフォルト）とは異なり、安全側のボタンがデフォルトとなっている
- x:Load="False" により遅延読み込みされる（TerminalPage.xaml 行104）
- ペイン閉じ時とタブ閉じ時の両方で呼び出される（TabManagement.cpp 行405, 721）
- Content が設定されており、Title + Content の構成でメッセージを表示する

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TerminalPage.xaml | `src/cascadia/TerminalApp/TerminalPage.xaml` | CloseReadOnlyDialog の XAML 定義（行101-105）。DefaultButton="Close"（安全側がデフォルト）である点に注目 |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TabManagement.cpp | `src/cascadia/TerminalApp/TabManagement.cpp` | 読み取り専用ペインの閉じ操作フロー。行405 と行721 で `_ShowCloseReadOnlyDialog()` が呼び出される |
| 2-2 | TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | `_ShowCloseReadOnlyDialog`（行912-915）で `_ShowDialogHelper(L"CloseReadOnlyDialog")` を呼び出す |

**主要処理フロー**:
1. **TabManagement.cpp**: ペイン/タブ閉じ時に読み取り専用チェック
2. **行405 or 721**: `_ShowCloseReadOnlyDialog()` を co_await
3. **行912-915**: `_ShowDialogHelper` で FindName + DialogPresenter 経由でダイアログ表示

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

```
[タブ/ペイン閉じ操作] (TabManagement.cpp)
    |
    +-- 読み取り専用チェック
    |
    +-- _ShowCloseReadOnlyDialog (TerminalPage.cpp:912)
    |       |
    |       +-- _ShowDialogHelper("CloseReadOnlyDialog")
    |               +-- FindName + DialogPresenter::ShowDialog
    |
    +-- [結果判定]
            +-- Primary --> ペイン/タブ閉じ続行
            +-- None --> 操作中断
```

### データフロー図

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

タブ/ペイン閉じ操作  --> 読み取り専用チェック           --> CloseReadOnlyDialog 表示
                          |                                  (読み取り専用の場合)
ユーザー選択          --> ContentDialogResult 判定       --> ペイン/タブ閉じ or 中断
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TerminalPage.xaml | `src/cascadia/TerminalApp/TerminalPage.xaml` | ソース（XAML） | CloseReadOnlyDialog のインライン定義（行101-105） |
| TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | ソース（実装） | _ShowCloseReadOnlyDialog の実装（行912-915） |
| TabManagement.cpp | `src/cascadia/TerminalApp/TabManagement.cpp` | ソース（実装） | ダイアログ呼び出し元（行405, 721） |
| Resources.resw | `src/cascadia/TerminalApp/Resources/en-US/Resources.resw` | リソース | ダイアログテキストの文字列リソース（行517-527） |
