# 機能設計書 3-タブを閉じる

## 概要

本ドキュメントは、Windows Terminal における「タブを閉じる」機能の設計を記述する。指定されたインデックスまたは現在フォーカスされたタブを閉じる機能の詳細を定義する。

### 本機能の処理概要

**業務上の目的・背景**：ユーザーが不要になったターミナルセッションを終了し、リソースを解放するための基本機能である。タブの閉じ操作は、タブベースのアプリケーションにおける最も基本的なライフサイクル管理機能であり、ユーザーの作業効率とシステムリソース管理の両面で重要な役割を果たす。

**機能の利用シーン**：作業が完了したセッションを閉じる場合、誤って開いたタブを閉じる場合、または複数タブの整理を行う場合に使用される。タブヘッダーの閉じるボタンクリック、キーボードショートカット（Ctrl+W等）、コマンドパレットからの実行、またはタブの中クリックで使用される。

**主要な処理内容**：
1. CloseTab アクションの受信と引数（CloseTabArgs）の解析
2. 閉じるタブのインデックス決定（引数指定またはフォーカスタブ）
3. タブの閉じ要求処理（_HandleCloseTabRequested）
4. 読み取り専用ペインの確認ダイアログ表示（必要に応じて）
5. タブの削除とリソース解放
6. 閉じたタブ情報の復元用スタックへの保存

**関連システム・外部連携**：ConPTY 接続の切断、シェルプロセスの終了がある。

**権限による制御**：読み取り専用ペインが含まれるタブを閉じる場合、確認ダイアログが表示される。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | TerminalPage（メイン画面） | 主画面 | _HandleCloseTab によりインデックス指定またはフォーカス中のタブを閉じる |
| 3 | TabHeaderControl（タブヘッダー） | 補助画面 | タブヘッダーの閉じるボタンによりタブを閉じる |
| 15 | CloseAllDialog（全タブ閉じ確認） | 補助画面 | 全タブ閉じ操作の確認ダイアログ |
| 16 | CloseReadOnlyDialog（読み取り専用警告） | 補助画面 | 読み取り専用セッション閉じの警告表示 |

## 機能種別

CRUD操作（タブの削除） / プロセス管理（シェルプロセスの終了）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| Index | IReference<UInt32> | No | 閉じるタブのインデックス。未指定の場合はフォーカスタブを使用 | 指定する場合は 0 以上 _tabs.Size() 未満であること |

### 入力データソース

- アクション引数: CloseTabArgs 経由の Index（タブインデックス）
- フォーカスタブ: Index 未指定時に _GetFocusedTabIndex() で取得
- UIイベント: タブヘッダーの閉じるボタンクリック、中クリック

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (なし) | - | タブが閉じられ、関連リソースが解放される |

### 出力先

- タブバー（TabView）からのタブアイテム削除
- タブ管理リスト（_tabs, _mruTabs）からの削除
- 復元用スタック（_previouslyClosedPanesAndTabs）への保存

## 処理フロー

### 処理シーケンス

```
1. _HandleCloseTab がアクションイベントを受信
   └─ CloseTabArgs から Index を取得
2. インデックスの決定
   └─ Index が指定されている場合: その値を使用
   └─ Index が未指定の場合: _GetFocusedTabIndex() でフォーカスタブのインデックスを取得
   └─ どちらも取得できない場合: Handled(false) で処理を中断
3. _CloseTabAtIndex の呼び出し
   └─ インデックスが _tabs.Size() 以上の場合は処理をスキップ
   └─ 指定インデックスのタブを取得
4. _HandleCloseTabRequested の呼び出し
   └─ 読み取り専用ペインの確認
   └─ 確認ダイアログの表示（必要に応じて）
   └─ タブの削除処理
```

### フローチャート

```mermaid
flowchart TD
    A[_HandleCloseTab 受信] --> B[CloseTabArgs 取得]
    B --> C{Index が指定?}
    C -->|Yes| D[指定されたインデックスを使用]
    C -->|No| E{フォーカスタブあり?}
    E -->|Yes| F[フォーカスタブのインデックスを使用]
    E -->|No| G[Handled=false で終了]
    D --> H[_CloseTabAtIndex]
    F --> H
    H --> I{インデックスが有効?}
    I -->|No| J[処理スキップ]
    I -->|Yes| K[_HandleCloseTabRequested]
    K --> L[タブ削除・リソース解放]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | インデックス指定優先 | Index が指定されている場合、その値を閉じるタブのインデックスとして使用する | CloseTabArgs.Index() が有効値の場合 |
| BR-02 | フォーカスタブのフォールバック | Index が未指定の場合、現在フォーカスされたタブを閉じる対象とする | Index が null の場合 |
| BR-03 | 範囲外インデックスの無視 | インデックスが _tabs.Size() 以上の場合、何も行わない | index >= _tabs.Size() の場合 |
| BR-04 | 閉じたタブの復元情報保存 | タブを閉じる際に復元用アクション情報を _previouslyClosedPanesAndTabs に保存する | 常時 |

### 計算ロジック

該当なし。

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

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | データベース操作なし |

### テーブル別操作詳細

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| Handled=false | インデックス未決定 | Index 未指定かつフォーカスタブなし | アクションを未処理として返却 |
| (なし) | 範囲外インデックス | index >= _tabs.Size() | 処理をスキップ（return） |

### リトライ仕様

リトライは行わない。

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

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

## パフォーマンス要件

タブの閉じ処理はユーザー操作に応じて即座に実行される必要がある。シェルプロセスの終了を含む後処理は非同期で行われる。

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

読み取り専用ペインを含むタブを閉じる場合、ユーザーへの確認が行われ、意図しないセッション終了を防止する。

## 備考

- _HandleCloseTabRequested は非同期（IAsyncAction）で実行され、確認ダイアログの表示を含む場合がある
- タブの閉じ操作は RestoreLastClosed アクション（機能No.16）で復元可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | ActionArgs.idl | `src/cascadia/TerminalSettingsModel/ActionArgs.idl` | CloseTabArgs の定義（335-339行目）。IReference<UInt32> 型の Index プロパティ |

**読解のコツ**: `Windows.Foundation.IReference<UInt32>` は nullable な整数型を表す。null の場合はフォーカスタブが使用される。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | AppActionHandlers.cpp | `src/cascadia/TerminalApp/AppActionHandlers.cpp` | _HandleCloseTab（71-94行目）がエントリーポイント |

**主要処理フロー**:
1. **71-73行目**: _HandleCloseTab の定義
2. **74行目**: CloseTabArgs へのキャスト
3. **77-80行目**: Index が指定されている場合、その値を使用
4. **81-84行目**: Index が未指定の場合、_GetFocusedTabIndex() でフォーカスタブのインデックスを取得
5. **85-89行目**: どちらも取得できない場合、Handled(false) で終了
6. **91行目**: `_CloseTabAtIndex(index)` を呼び出し

#### Step 3: タブ閉じロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | TabManagement.cpp | `src/cascadia/TerminalApp/TabManagement.cpp` | _CloseTabAtIndex（830-840行目） |

**主要処理フロー**:
- **830-840行目**: _CloseTabAtIndex - インデックスのバウンドチェックとタブ取得
- **832-835行目**: `index >= _tabs.Size()` の場合は即 return
- **836-839行目**: タブを取得して _HandleCloseTabRequested に委譲

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

```
_HandleCloseTab (AppActionHandlers.cpp:71)
    |
    +-- CloseTabArgs.Index() -- インデックス取得（引数から）
    |
    +-- _GetFocusedTabIndex() -- インデックス取得（フォーカスから）
    |
    +-- _CloseTabAtIndex (TabManagement.cpp:830)
            |
            +-- _HandleCloseTabRequested
                    |
                    +-- 確認ダイアログ（読み取り専用時）
                    |
                    +-- _RemoveTab -- タブ削除
```

### データフロー図

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

CloseTabArgs -----------> _HandleCloseTab
  Index（optional）         |
                          インデックス決定
                            |
                          _CloseTabAtIndex
                            |
                          _HandleCloseTabRequested --> タブ削除
                            |                          |
                            +-- 復元情報保存 ---------> _previouslyClosedPanesAndTabs
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| AppActionHandlers.cpp | `src/cascadia/TerminalApp/AppActionHandlers.cpp` | ソース | _HandleCloseTab エントリーポイント |
| TabManagement.cpp | `src/cascadia/TerminalApp/TabManagement.cpp` | ソース | _CloseTabAtIndex の実装 |
| TerminalPage.h | `src/cascadia/TerminalApp/TerminalPage.h` | ヘッダー | TerminalPage クラスのメソッド宣言 |
| ActionArgs.idl | `src/cascadia/TerminalSettingsModel/ActionArgs.idl` | IDL | CloseTabArgs の WinRT インターフェース定義 |
