# 機能設計書 16-TabControl

## 概要

本ドキュメントは、Avalonia UIフレームワークにおけるTabControlコントロールの機能設計を記述する。TabControlはタブ付きのコンテンツ切り替えインターフェースを提供するコントロールである。

### 本機能の処理概要

TabControlは、複数のタブを持ち、選択されたタブに対応するコンテンツを表示するコントロールである。タブストリップとコンテンツエリアを組み合わせて、効率的な画面スペースの活用を実現する。

**業務上の目的・背景**：アプリケーション内で複数の関連する画面やセクションを切り替える必要がある場合、TabControlは直感的なナビゲーション手段を提供する。設定画面の分類、ドキュメントの複数タブ表示、ダッシュボードの複数ビューなど、幅広いユースケースに対応する。

**機能の利用シーン**：
- 設定画面での複数カテゴリの切り替え
- ドキュメントエディタでの複数ファイル表示
- ダッシュボードの複数ビュー切り替え
- ウィザード形式のステップ表示

**主要な処理内容**：
1. タブストリップの表示と選択管理
2. 選択タブに応じたコンテンツの表示
3. タブストリップの配置位置設定（Top/Bottom/Left/Right）
4. キーボードナビゲーション
5. 選択タブの自動追跡

**関連システム・外部連携**：SelectingItemsControlを継承し、選択管理機能を使用。TabItemをコンテナとして使用し、IContentPresenterHostインターフェースを実装。

**権限による制御**：特になし。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 58 | TabControl | 主画面 | TabControlコントロールのデモ。タブ切り替え |
| 110 | TabControl | テスト画面 | TabControlのテスト |

## 機能種別

ナビゲーションコントロール / コンテンツ切り替え

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| TabStripPlacement | Dock | No | タブストリップの配置位置 | デフォルト: Top |
| HorizontalContentAlignment | HorizontalAlignment | No | コンテンツの水平配置 | - |
| VerticalContentAlignment | VerticalAlignment | No | コンテンツの垂直配置 | - |
| ContentTemplate | IDataTemplate | No | コンテンツのテンプレート | - |
| SelectedItem | object | No | 選択されているタブ | - |
| SelectedIndex | int | No | 選択されているタブのインデックス | - |
| ItemsSource | IEnumerable | No | タブアイテムのソース | - |

### 入力データソース

- ItemsSourceプロパティへのデータバインディング
- XAMLでのTabItem直接定義

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| SelectedItem | object | 選択されているタブ |
| SelectedContent | object | 選択されているタブのコンテンツ |
| SelectedContentTemplate | IDataTemplate | 選択されているコンテンツのテンプレート |

### 出力先

- SelectionChangedイベントによる選択変更通知
- プロパティバインディングによるViewModel更新

## 処理フロー

### 処理シーケンス

```
1. タブ選択の検出
   └─ クリック/キー入力/プログラム的な選択
2. UpdateSelectedContent()呼び出し
   └─ 選択タブのコンテンツを取得
3. SelectedContent/SelectedContentTemplate更新
   └─ ContentPresenterに反映
4. TabItem.TabStripPlacement更新
   └─ 全TabItemのプレースメント同期
5. SelectionChangedイベント発火
```

### フローチャート

```mermaid
flowchart TD
    A[タブ選択] --> B[UpdateSelectedContent]
    B --> C{SelectedIndex == -1?}
    C -->|Yes| D[SelectedContent = null]
    C -->|No| E[コンテナ取得]
    E --> F[Content/ContentTemplate取得]
    F --> G[SelectedContent更新]
    G --> H[SelectedContentTemplate更新]
    D --> I[ContentPresenter更新]
    H --> I
    I --> J[SelectionChanged発火]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 常時選択 | SelectionMode=AlwaysSelectedにより、常に1つのタブが選択される | 常時 |
| BR-02 | コンテンツ継承 | TabItemにContentTemplateがない場合、TabControlのContentTemplateを使用 | ContentTemplate未設定時 |
| BR-03 | プレースメント同期 | TabStripPlacement変更時、全TabItemに同期 | プレースメント変更時 |

### 計算ロジック

特になし

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

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

該当なし（UIコントロール）

## エラー処理

### エラーケース一覧

特になし（シンプルな選択動作のため）

### リトライ仕様

該当なし

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

該当なし（UIコントロール）

## パフォーマンス要件

- タブ切り替え時のコンテンツ再構築を最小化
- WrapPanelをデフォルトItemsPanelとして使用

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

特になし（UIコントロールとして汎用的に使用可能）

## 備考

- SelectionMode=AlwaysSelectedがデフォルト（常に1つ選択）
- PART_ItemsPresenter、PART_SelectedContentHostがテンプレートパーツ
- AutomationControlType.Tabに設定

---

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

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

### 推奨読解順序

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

TabControlで使用するインターフェースを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | IContentPresenterHost.cs | `src/Avalonia.Controls/Presenters/IContentPresenterHost.cs` | ContentPresenter登録インターフェース |

**読解のコツ**: IContentPresenterHostはContentPresenterの登録を受け付け、選択されたタブのコンテンツをホストするために使用される。

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

TabControlクラスを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TabControl.cs | `src/Avalonia.Controls/TabControl.cs` | プロパティ、UpdateSelectedContent() |

**主要処理フロー**:
1. **22行目**: SelectingItemsControlを継承、IContentPresenterHostを実装
2. **31-62行目**: プロパティ定義（TabStripPlacement, ContentTemplate, SelectedContent等）
3. **73-80行目**: 静的コンストラクタで選択モードとデフォルトパネル設定
4. **155-163行目**: CreateContainerForItemOverride - TabItemを生成
5. **165-178行目**: PrepareContainerForItemOverride - TabStripPlacementを同期
6. **209-258行目**: UpdateSelectedContent - 選択コンテンツの更新

#### Step 3: TabItemを理解する

タブの個別アイテムを確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | TabItem.cs | `src/Avalonia.Controls/TabItem.cs` | ヘッダー、コンテンツ、TabStripPlacement |

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

```
TabControl
    │
    ├─ SelectingItemsControl (基底クラス)
    │      └─ 選択管理
    │
    ├─ TabItem (コンテナ)
    │      ├─ Header
    │      ├─ Content
    │      └─ TabStripPlacement
    │
    ├─ IContentPresenterHost
    │      └─ RegisterContentPresenter()
    │
    ├─ UpdateSelectedContent()
    │      ├─ SelectedContent
    │      └─ SelectedContentTemplate
    │
    └─ ContentPresenter (PART_SelectedContentHost)
           └─ コンテンツ表示
```

### データフロー図

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

タブクリック ───▶ SelectionChanged
                        │
                        ▼
              UpdateSelectedContent()
                        │
                        ▼
              ContainerFromIndex()
                        │
                        ▼
              Content取得 ───▶ SelectedContent
                        │
              ContentTemplate取得 ───▶ SelectedContentTemplate
                        │
                        ▼
              ContentPresenter更新 ───▶ 視覚的更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TabControl.cs | `src/Avalonia.Controls/TabControl.cs` | ソース | TabControlコントロール本体 |
| TabItem.cs | `src/Avalonia.Controls/TabItem.cs` | ソース | タブアイテムコントロール |
| SelectingItemsControl.cs | `src/Avalonia.Controls/Primitives/SelectingItemsControl.cs` | ソース | 基底クラス（選択管理） |
| ContentPresenter.cs | `src/Avalonia.Controls/Presenters/ContentPresenter.cs` | ソース | コンテンツ表示 |
| ItemsPresenter.cs | `src/Avalonia.Controls/Presenters/ItemsPresenter.cs` | ソース | アイテム表示 |
