# 画面設計書 2-TabRowControl（タブ行）

## 概要

本ドキュメントは、Windows Terminal のタブ行コントロール TabRowControl の画面設計書である。TabRowControl は開いているタブの一覧表示と新規タブ作成ボタンを提供する、TerminalPage の子コンポーネントである。

### 本画面の処理概要

**業務上の目的・背景**：TabRowControl は複数のターミナルセッションを視覚的に管理するためのタブバーUIを提供する。ユーザーはタブを切り替え、新規タブを作成し、ドラッグ&ドロップでタブを並べ替えることで、効率的にマルチセッション作業を行える。

**画面へのアクセス方法**：TerminalPage のGrid.Row=0に常時表示される。フォーカスモード時には非表示となる場合がある。

**主要な操作・処理内容**：
1. 新規タブ作成ボタン（SplitButton）のクリックによる新しいタブの作成
2. SplitButtonのドロップダウン展開によるプロファイル選択メニューの表示
3. TabView上でのタブ切り替え操作
4. TabViewのドラッグ&ドロップによるタブの並べ替え・別ウィンドウへの移動
5. 管理者権限実行時のElevationShieldアイコン表示

**画面遷移**：
- 親：TerminalPage（Grid.Row=0に配置）
- 子：TabHeaderControl（各タブのヘッダー）

**権限による表示制御**：管理者権限で実行中の場合、TabStripHeaderにElevationShield（盾アイコン）が表示される。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | 新しいタブの作成 | 主機能 | NewTabButtonのClick（OnNewTabButtonClick）により新しいタブを作成 |
| 15 | 新しいタブドロップダウンを開く | 主機能 | NewTabButtonのSplitButton展開によりプロファイル選択ドロップダウンを表示 |
| 6 | 次のタブに切り替え | 補助機能 | TabView上のタブ切り替え操作 |
| 7 | 前のタブに切り替え | 補助機能 | TabView上のタブ切り替え操作 |
| 9 | タブの移動 | 補助機能 | TabViewのCanReorderTabs=Trueによりドラッグ&ドロップでタブ移動 |

## 画面種別

コンポーネント / ナビゲーション

## URL/ルーティング

該当なし（デスクトップアプリケーションのUIコンポーネント）

## 入出力項目

| 項目名 | 入出力 | 型 | 説明 |
|--------|--------|------|------|
| ShowElevationShield | 入力 | bool | 管理者権限実行を示す盾アイコンの表示制御 |
| TabView | 出力 | TabView | タブ一覧の表示コントロール |

## 表示項目

| 項目名 | 表示位置 | 説明 |
|--------|----------|------|
| ElevationShield | TabStripHeader | 管理者権限実行時の盾アイコン（Glyph: EA18） |
| TabView | メイン領域 | タブ一覧（CanReorderTabs=True, AllowDropTabs=True） |
| NewTabButton | TabStripFooter | 新規タブ作成SplitButton（Glyph: E710 "+"） |

## イベント仕様

### 1-新規タブ作成（OnNewTabButtonClick）

NewTabButton（SplitButton）のClickイベントで OnNewTabButtonClick が呼び出される。TerminalPage の新規タブ作成処理にイベントが伝播し、デフォルトプロファイルで新しいタブが作成される。

### 2-新規タブドロップダウン

NewTabButton の SplitButton 展開操作により、プロファイル選択メニュー（Flyout）が表示される。TerminalPage の _CreateNewTabFlyout で構築されたプロファイル一覧から選択して新規タブを作成できる。

### 3-ドラッグ&ドロップ

NewTabButton は AllowDrop="True" で、ファイルやテキストのドロップを受け付ける。OnNewTabButtonDragOver でドロップ可否を判定し、OnNewTabButtonDrop でドロップ処理を実行する。

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

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

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| NewTabRun | ToolTip | 新しいタブの作成方法 | NewTabButtonホバー時 |
| NewPaneRun | ToolTip | 新しいペインの作成方法 | NewTabButtonホバー時 |
| NewWindowRun | ToolTip | 新しいウィンドウの作成方法 | NewTabButtonホバー時 |
| ElevationShield | ToolTip | 管理者権限で実行中 | ElevationShieldホバー時 |

## 例外処理

該当なし（TabRowControl自体には例外処理は定義されていない）

## 備考

- ContentPresenter ベースのコントロール（Page ではない）
- TabWidthMode="Equal" でタブ幅は均等配分
- IsAddTabButtonVisible="false" でWinUIの標準タブ追加ボタンは非表示にし、カスタムのSplitButtonを使用
- SplitButton のリソースは Light/Dark/HighContrast の3テーマに対応
- TabViewBackground をBackgroundに使用（GH#13143対応）

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TabRowControl.h | `src/cascadia/TerminalApp/TabRowControl.h` | ShowElevationShield プロパティと OnNewTabButtonClick 等のイベントハンドラ（10-28行目） |

**読解のコツ**: WINRT_OBSERVABLE_PROPERTY マクロで ShowElevationShield が定義されている（21行目）。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TabRowControl.xaml | `src/cascadia/TerminalApp/TabRowControl.xaml` | XAML構造。ContentPresenter ベースで、TabView をメインコンテンツとして持つ（5-140行目） |

**主要処理フロー**:
1. **27-35行目**: TabView定義（CanReorderTabs=True, AllowDropTabs=True, TabWidthMode=Equal）
2. **37-46行目**: TabStripHeader に ElevationShield アイコン
3. **48-136行目**: TabStripFooter に NewTabButton（SplitButton）

#### Step 3: イベントハンドラを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | TabRowControl.cpp | `src/cascadia/TerminalApp/TabRowControl.cpp` | OnNewTabButtonClick、OnNewTabButtonDrop、OnNewTabButtonDragOver の実装 |

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

```
TerminalPage
  └─ TabRowControl
       ├─ TabView (WinUI コントロール)
       │    ├─ TabStripHeader
       │    │    └─ ElevationShield (FontIcon)
       │    ├─ TabViewItems (各タブ)
       │    │    └─ TabHeaderControl
       │    └─ TabStripFooter
       │         └─ NewTabButton (SplitButton)
       │              ├─ OnNewTabButtonClick -> TerminalPage._HandleNewTab
       │              ├─ OnNewTabButtonDragOver
       │              └─ OnNewTabButtonDrop
       └─ PropertyChanged (ShowElevationShield)
```

### データフロー図

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

ユーザー操作 ─────> NewTabButton Click      ──> TerminalPage.NewTab処理
(ボタンクリック)      └─> OnNewTabButtonClick

タブドラッグ ──────> TabView DragDrop        ──> タブ位置変更 / 別ウィンドウ移動
                     └─> CanReorderTabs

管理者権限状態 ────> ShowElevationShield     ──> 盾アイコン表示/非表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TabRowControl.xaml | `src/cascadia/TerminalApp/TabRowControl.xaml` | テンプレート | XAML レイアウト定義 |
| TabRowControl.h | `src/cascadia/TerminalApp/TabRowControl.h` | ソース | クラス宣言 |
| TabRowControl.cpp | `src/cascadia/TerminalApp/TabRowControl.cpp` | ソース | イベントハンドラ実装 |
| TerminalPage.xaml | `src/cascadia/TerminalApp/TerminalPage.xaml` | テンプレート | 親コンテナ（TabRow配置） |
| TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | ソース | TabView操作の統合処理 |
