# 画面設計書 15-CloseAllDialog（全タブ閉じ確認）

## 概要

本ドキュメントは、Windows Terminal の CloseAllDialog（全タブ閉じ確認）画面の設計仕様を記述する。CloseAllDialog は、複数のタブが開いている状態でウィンドウを閉じようとした際に確認を求めるダイアログである。

### 本画面の処理概要

CloseAllDialog は、複数のタブが開かれている状態で、ユーザーがウィンドウを閉じようとする操作を行った際に表示される確認ダイアログである。全てのタブを閉じてウィンドウを閉じるか、操作をキャンセルするかの選択を提供する。

**業務上の目的・背景**：ターミナルアプリケーションでは、複数のタブで異なるシェルセッションが動作していることが一般的である。ウィンドウを閉じる操作は全タブの終了を意味するため、意図しない操作で進行中の作業が失われることを防止するために確認ダイアログが必要となる。この機能は設定（`ConfirmCloseAllTabs`）で無効化することも可能。

**画面へのアクセス方法**：TerminalPage の CloseWindow メソッドが呼び出された際に、複数タブが開いており `ConfirmCloseAllTabs` 設定が有効な場合に表示される。ウィンドウの閉じるボタンクリックやキーバインドによる CloseWindow アクション（`_HandleCloseWindow`）が発動のトリガーとなる。

**主要な操作・処理内容**：
1. 確認メッセージの表示：「全タブを閉じますか？」というメッセージをユーザーに提示する
2. 全タブ閉じ（Primary ボタン）：ユーザーが承認すると `CloseWindowRequested` イベントが発火される
3. キャンセル（Close ボタン）：ユーザーがキャンセルすると、ダイアログが閉じて操作が中断される

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

**権限による表示制御**：特になし。ただし、`ConfirmCloseAllTabs` 設定が false の場合、ダイアログは表示されずに直接ウィンドウが閉じられる。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 3 | タブを閉じる | 主機能 | 全タブ閉じ操作の確認ダイアログ |

## 画面種別

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

## URL/ルーティング

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

## 入出力項目

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

## 表示項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| Title | テキスト | "Do you want to close all tabs?" |
| PrimaryButtonText | ボタンラベル | "Close all" |
| CloseButtonText | ボタンラベル | "Cancel" |

## イベント仕様

### 1-ダイアログ表示条件チェック（CloseWindow）

TerminalPage::CloseWindow（TerminalPage.cpp 行2307-2329）で以下の条件が全て真の場合にダイアログが表示される：
- `_HasMultipleTabs()` が true（複数タブが開いている）
- `_settings.GlobalSettings().ConfirmCloseAllTabs()` が true（設定で有効）
- `_displayingCloseDialog` が false（既にダイアログが表示されていない）

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

ユーザーが「Close all」ボタンをクリックすると、ContentDialogResult::Primary が返される。CloseWindow コルーチン内で `CloseWindowRequested` イベントを発火し、ウィンドウ閉じ処理が続行される（TerminalPage.cpp 行2328）。

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

ユーザーが「Cancel」ボタンをクリックすると、ContentDialogResult::None が返される。CloseWindow コルーチン内で早期リターンし、操作が中断される（TerminalPage.cpp 行2322-2325）。

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

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

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

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|----------|---------------|
| CloseAllDialog.Title | タイトル | 常時 | "Do you want to close all tabs?" |
| CloseAllDialog.PrimaryButtonText | ボタンラベル | 常時 | "Close all" |
| CloseAllDialog.CloseButtonText | ボタンラベル | 常時 | "Cancel" |

## 例外処理

- タブが1つ以下の場合：ダイアログは表示されず、直接 `CloseWindowRequested` が発火される
- `ConfirmCloseAllTabs` が false の場合：ダイアログは表示されず、直接ウィンドウが閉じられる

## 備考

- DefaultButton は Primary に設定されている（TerminalPage.xaml 行99）
- x:Load="False" により遅延読み込みされる（TerminalPage.xaml 行98）
- ダイアログ表示前にタブコンテキストメニューと新しいタブフライアウトが非表示にされる（TerminalPage.cpp 行2313-2317）
- `_displayingCloseDialog` フラグにより、QuitDialog と CloseAllDialog の重複表示が防止される

---

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

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

### 推奨読解順序

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

CloseAllDialog は標準の ContentDialog を使用するため、独自のデータ構造はない。表示条件に関わる設定値を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TerminalPage.xaml | `src/cascadia/TerminalApp/TerminalPage.xaml` | CloseAllDialog の XAML 定義（行95-99）。x:Uid="CloseAllDialog" によるリソース文字列バインディング、DefaultButton="Primary" の設定を確認 |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | AppActionHandlers.cpp | `src/cascadia/TerminalApp/AppActionHandlers.cpp` | `_HandleCloseWindow`（行119-123）がアクションのエントリーポイント。CloseWindow() を呼び出す |
| 2-2 | TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | `CloseWindow` メソッド（行2307-2329）で条件チェックとダイアログ表示。`_ShowCloseWarningDialog`（行905-908）で `_ShowDialogHelper` を呼び出す |

**主要処理フロー**:
1. **行2309-2311**: 複数タブ、ConfirmCloseAllTabs 設定、重複表示の3条件をチェック
2. **行2319**: `_ShowCloseWarningDialog()` を co_await で非同期呼び出し
3. **行2322-2325**: Primary でない場合は co_return（キャンセル）
4. **行2328**: `CloseWindowRequested.raise()` でウィンドウ閉じ処理

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

```
TerminalPage::_HandleCloseWindow (AppActionHandlers.cpp:119)
    |
    +-- TerminalPage::CloseWindow (TerminalPage.cpp:2307)
            |
            +-- _HasMultipleTabs() チェック
            +-- ConfirmCloseAllTabs 設定チェック
            +-- _displayingCloseDialog チェック
            |
            +-- [条件合致時] _ShowCloseWarningDialog (TerminalPage.cpp:905)
            |       |
            |       +-- _ShowDialogHelper("CloseAllDialog")
            |               +-- FindName + DialogPresenter::ShowDialog
            |
            +-- [結果判定]
                    +-- Primary --> CloseWindowRequested.raise()
                    +-- None --> co_return（キャンセル）
```

### データフロー図

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

ウィンドウ閉じ操作      --> CloseWindow                      --> CloseAllDialog 表示
                             |                                     (条件付き)
_HasMultipleTabs        --> 条件チェック
ConfirmCloseAllTabs     --> (3条件全て true?)
_displayingCloseDialog      |
                             +-- true  --> _ShowCloseWarningDialog
                             +-- false --> CloseWindowRequested
                                           (直接ウィンドウ閉じ)
ユーザー選択            --> ContentDialogResult 判定          --> CloseWindowRequested
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TerminalPage.xaml | `src/cascadia/TerminalApp/TerminalPage.xaml` | ソース（XAML） | CloseAllDialog のインライン定義（行95-99） |
| TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | ソース（実装） | CloseWindow / _ShowCloseWarningDialog の実装 |
| AppActionHandlers.cpp | `src/cascadia/TerminalApp/AppActionHandlers.cpp` | ソース（実装） | _HandleCloseWindow エントリーポイント |
| Resources.resw | `src/cascadia/TerminalApp/Resources/en-US/Resources.resw` | リソース | ダイアログテキストの文字列リソース（行508-515） |
