# 画面設計書 3-TabHeaderControl（タブヘッダー）

## 概要

本ドキュメントは、Windows Terminal の個々のタブヘッダーを表示する TabHeaderControl の画面設計書である。TabHeaderControl はタブ名の表示・インラインリネーム・各種ステータスアイコンの表示を担う、TabRowControl の子コンポーネントである。

### 本画面の処理概要

**業務上の目的・背景**：TabHeaderControl は各タブの状態（名前、進行状況、ベル通知、ズーム、読み取り専用、接続切断、ブロードキャスト）を視覚的にユーザーに伝えるためのコントロールである。タブ名のインラインリネーム機能も提供し、ユーザーがタブを識別しやすくする。

**画面へのアクセス方法**：TabRowControl の TabView 内に各タブのヘッダーとして自動的に配置される。

**主要な操作・処理内容**：
1. タブ名の表示（HeaderTextBlock）
2. タブ名のインラインリネーム（HeaderRenamerTextBox）
3. プログレスリング表示（HeaderProgressRing）
4. ベル通知アイコン表示（HeaderBellIndicator）
5. ペインズームアイコン表示（HeaderZoomIcon）
6. 読み取り専用アイコン表示（HeaderLockIcon）
7. 接続切断アイコン表示（HeaderClosedIcon）
8. ブロードキャスト入力アイコン表示（HeaderBroadcastIcon）

**画面遷移**：
- 親：TabRowControl（TabView内のタブヘッダーとして配置）
- タブ選択操作でTermControl / MarkdownPaneContent / SnippetsPaneContent に遷移

**権限による表示制御**：特になし（タブ状態に応じたアイコン表示のみ）

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 11 | タブ名の変更 | 主機能 | HeaderRenamerTextBoxによるインラインタブ名編集 |
| 3 | タブを閉じる | 補助機能 | タブヘッダーの閉じるボタンによりタブを閉じる |
| 24 | ペインのズーム切替 | 補助機能 | HeaderZoomIconによりペインズーム状態を表示 |
| 26 | ペインの読み取り専用切替 | 補助機能 | HeaderLockIconにより読み取り専用状態を表示 |
| 30 | ブロードキャスト入力切替 | 補助機能 | HeaderBroadcastIconによりブロードキャスト状態を表示 |

## 画面種別

コンポーネント / 表示

## URL/ルーティング

該当なし

## 入出力項目

| 項目名 | 入出力 | 型 | 説明 |
|--------|--------|------|------|
| Title | 入力 | hstring | タブ名 |
| RenamerMaxWidth | 入力 | double | リネームテキストボックスの最大幅 |
| TabStatus | 入力 | TerminalTabStatus | タブ状態（プログレス、ベル、ズーム、読み取り専用、接続切断、ブロードキャスト） |
| TitleChangeRequested | 出力 | イベント | タブ名変更要求イベント |
| RenameEnded | 出力 | イベント | リネーム終了イベント |

## 表示項目

| 項目名 | 表示位置 | 説明 |
|--------|----------|------|
| HeaderProgressRing | StackPanel先頭 | 進行状況リング（ProgressRing、15x15px） |
| HeaderBellIndicator | StackPanel | ベル通知アイコン（Glyph: EA8F） |
| HeaderZoomIcon | StackPanel | ペインズームアイコン（Glyph: E8A3） |
| HeaderLockIcon | StackPanel | 読み取り専用アイコン（Glyph: E72E） |
| HeaderClosedIcon | StackPanel | 接続切断アイコン（Glyph: EA39） |
| HeaderBroadcastIcon | StackPanel | ブロードキャスト入力アイコン（Glyph: EC05） |
| HeaderTextBlock | StackPanel | タブ名テキスト |
| HeaderRenamerTextBox | StackPanel | リネーム用テキストボックス（通常はCollapsed） |

## イベント仕様

### 1-インラインリネーム（BeginRename）

BeginRename()が呼び出されると、HeaderTextBlockがCollapsedになりHeaderRenamerTextBoxがVisibleになる。テキストボックスにフォーカスが移り、ユーザーが新しい名前を入力できる。

### 2-リネーム完了/キャンセル

テキストボックスからフォーカスが外れると（RenameBoxLostFocusHandler）、入力された名前でTitleChangeRequestedイベントが発火する。Escapeキーでキャンセルされた場合は変更を破棄する。リネーム終了後にRenameEndedイベントが発火する。

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

該当なし（データベース非使用）

## メッセージ仕様

該当なし

## 例外処理

該当なし

## 備考

- UserControl ベースのコントロール
- MinHeight=16 で最小高さを制限
- HeaderRenamerTextBox の MaxLength=1024 でタブ名の最大文字数を制限
- HeaderRenamerTextBox は IsSpellCheckEnabled=False でスペルチェック無効
- 全アイコンのフォントサイズは 12px で統一
- 各ステータスアイコンは TabStatus の各プロパティに Mode=OneWay でバインド

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TabHeaderControl.h | `src/cascadia/TerminalApp/TabHeaderControl.h` | WINRT_OBSERVABLE_PROPERTY で Title, RenamerMaxWidth, TabStatus を確認（26-28行目）。TitleChangeRequested イベント（22行目）とRenameEnded イベント（23行目） |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TabHeaderControl.xaml | `src/cascadia/TerminalApp/TabHeaderControl.xaml` | StackPanel内にアイコン群とテキスト表示を水平配置（17-76行目） |

**主要処理フロー**:
1. **19-28行目**: HeaderProgressRing - TabStatus.IsProgressRingActive にバインド
2. **29-34行目**: HeaderBellIndicator - TabStatus.BellIndicator にバインド
3. **35-40行目**: HeaderZoomIcon - TabStatus.IsPaneZoomed にバインド
4. **59-61行目**: HeaderTextBlock - Title にバインド
5. **62-75行目**: HeaderRenamerTextBox - LostFocus で RenameBoxLostFocusHandler

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

```
TabRowControl
  └─ TabView
       └─ TabViewItem (各タブ)
            └─ TabHeaderControl
                 ├─ HeaderProgressRing ← TabStatus.IsProgressRingActive
                 ├─ HeaderBellIndicator ← TabStatus.BellIndicator
                 ├─ HeaderZoomIcon ← TabStatus.IsPaneZoomed
                 ├─ HeaderLockIcon ← TabStatus.IsReadOnlyActive
                 ├─ HeaderClosedIcon ← TabStatus.IsConnectionClosed
                 ├─ HeaderBroadcastIcon ← TabStatus.IsInputBroadcastActive
                 ├─ HeaderTextBlock ← Title
                 └─ HeaderRenamerTextBox
                      ├─ BeginRename() -> Visible
                      └─ RenameBoxLostFocusHandler -> TitleChangeRequested
```

### データフロー図

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

TabStatus 変更 ────> XAML バインディング ──> アイコン表示/非表示
(OneWay)

ユーザー入力 ──────> HeaderRenamerTextBox ──> TitleChangeRequested イベント
(リネーム)            └─> _CloseRenameBox      └─> RenameEnded イベント
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TabHeaderControl.xaml | `src/cascadia/TerminalApp/TabHeaderControl.xaml` | テンプレート | XAML レイアウト定義 |
| TabHeaderControl.h | `src/cascadia/TerminalApp/TabHeaderControl.h` | ソース | クラス宣言 |
| TabHeaderControl.cpp | `src/cascadia/TerminalApp/TabHeaderControl.cpp` | ソース | リネーム処理実装 |
| TerminalTabStatus.h | `src/cascadia/TerminalApp/TerminalTabStatus.h` | ソース | タブ状態データ構造 |
