# 機能設計書 10-タブ検索

## 概要

本ドキュメントは、Windows Terminal における「タブ検索」機能の設計を記述する。コマンドパレットをタブ検索モードで開き、タブを名前で検索できる機能の詳細を定義する。

### 本機能の処理概要

**業務上の目的・背景**：多数のタブを開いて作業している場合、視覚的にタブを見つけるのが困難になる。タブ検索機能は、コマンドパレットのインクリメンタルサーチ機能を活用して、タブのタイトルやプロファイル名でタブを素早く見つけて切り替えることを可能にする。ブラウザのタブ検索機能に相当するUXを提供する。

**機能の利用シーン**：多数のタブが開かれた状態で、特定のタブを名前で検索して切り替えたい場合に使用される。キーボードショートカットやコマンドパレットから起動される。タブのタイトルを入力してインクリメンタルに絞り込み、目的のタブを選択して切り替える。

**主要な処理内容**：
1. TabSearch アクションの受信
2. コマンドパレットのロード
3. タブリスト（通常順と MRU 順）の設定
4. タブ検索モードの有効化
5. コマンドパレットの表示

**関連システム・外部連携**：コマンドパレット（CommandPalette）コントロールとの連携がある。

**権限による制御**：特別な権限制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | TerminalPage（メイン画面） | 主画面 | _HandleTabSearch によりコマンドパレットをタブ検索モードで起動 |
| 10 | CommandPalette（コマンドパレット） | 結果表示画面 | タブ検索モードでタブを名前検索 |

## 機能種別

検索操作 / ナビゲーション操作

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| (なし) | - | - | TabSearch アクションは追加のパラメータを受け取らない | なし |

### 入力データソース

- タブリスト: _tabs（全タブの通常順リスト）
- MRU タブリスト: _mruTabs（最近使用順のタブリスト）
- ユーザー入力: コマンドパレット内での検索テキスト入力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (なし) | - | コマンドパレットがタブ検索モードで表示される。ユーザーがタブを選択すると、そのタブにフォーカスが移動する |

### 出力先

- コマンドパレット（CommandPalette）UIの表示
- タブ選択後: TabView のフォーカスが選択タブに移動

## 処理フロー

### 処理シーケンス

```
1. _HandleTabSearch がアクションイベントを受信
2. LoadCommandPalette でコマンドパレットをロード
   └─ コマンドパレットが未ロードの場合は遅延ロードされる
3. SetTabs でタブリストを設定
   └─ _tabs（通常順）と _mruTabs（MRU順）を渡す
4. EnableTabSearchMode でタブ検索モードを有効化
   └─ CommandPaletteMode::TabSearchMode に切り替え
5. Visibility を Visible に設定
   └─ コマンドパレットを表示
6. ユーザーが検索テキストを入力してタブを絞り込み
7. タブを選択すると _OnSwitchToTabRequested が呼ばれ、そのタブにフォーカス移動
```

### フローチャート

```mermaid
flowchart TD
    A[_HandleTabSearch 受信] --> B[LoadCommandPalette]
    B --> C[SetTabs _tabs, _mruTabs]
    C --> D[EnableTabSearchMode]
    D --> E[Visibility = Visible]
    E --> F[ユーザーが検索テキスト入力]
    F --> G[インクリメンタル絞り込み]
    G --> H{タブを選択?}
    H -->|Yes| I[_OnSwitchToTabRequested]
    I --> J[_SelectTab でフォーカス移動]
    H -->|No/ESC| K[コマンドパレットを閉じる]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 遅延ロード | コマンドパレットは初回使用時に遅延ロードされる | コマンドパレットが未ロードの場合 |
| BR-02 | タブリスト設定 | 通常順（_tabs）と MRU 順（_mruTabs）の両方のリストがコマンドパレットに渡される | 常時 |
| BR-03 | タブ検索モード | EnableTabSearchMode により CommandPaletteMode::TabSearchMode が設定される | 常時 |
| BR-04 | インクリメンタル検索 | ユーザーの入力に応じてリアルタイムでタブリストが絞り込まれる | 常時 |

### 計算ロジック

該当なし。検索ロジックはコマンドパレット内部で処理される。

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

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

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

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

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

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| (なし) | - | 本機能にはエラーケースがない。タブが0個の場合でもコマンドパレットは空の状態で表示される | - |

### リトライ仕様

リトライは行わない。

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

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

## パフォーマンス要件

コマンドパレットの表示とインクリメンタル検索は即座に実行される必要がある。タブリストのフィルタリングはユーザー入力に応じてリアルタイムで行われる。

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

特別なセキュリティ考慮事項はない。

## 備考

- タブ検索モードとタブスイッチャーモード（No.6/No.7 で使用）は異なるモード。タブ検索はテキストベースのフィルタリング、タブスイッチャーはキー操作による順次選択
- CommandPaletteMode には ActionMode、CommandlineMode、TabSearchMode、TabSwitchMode の4つのモードがある
- タブ選択時の _OnSwitchToTabRequested は _SelectTab を呼び出し、No.8（指定タブに切り替え）と同じロジックでフォーカスを移動する

---

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

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

### 推奨読解順序

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

タブ検索機能は専用のアクション引数を持たないが、コマンドパレットのモード列挙を理解する必要がある。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | CommandPalette.idl | `src/cascadia/TerminalApp/CommandPalette.idl` | CommandPalette の公開インターフェース。SetTabs、EnableTabSearchMode メソッドの定義 |

**読解のコツ**: CommandPalette は複数のモード（アクション、コマンドライン、タブ検索、タブスイッチ）を持つ複合UIコンポーネントである。タブ検索モードはそのモードの1つ。

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

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

**主要処理フロー**:
1. **844-845行目**: _HandleTabSearch の定義
2. **847行目**: `LoadCommandPalette()` でコマンドパレットを遅延ロード
3. **848行目**: `p.SetTabs(_tabs, _mruTabs)` でタブリストを設定
4. **849行目**: `p.EnableTabSearchMode()` でタブ検索モードを有効化
5. **850行目**: `p.Visibility(Visibility::Visible)` でコマンドパレットを表示
6. **852行目**: `args.Handled(true)` でアクション処理済みを通知

#### Step 3: コマンドパレットのタブ検索モードを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | CommandPalette.cpp | `src/cascadia/TerminalApp/CommandPalette.cpp` | EnableTabSearchMode（1321-1324行目） |

**主要処理フロー**:
- **1321-1324行目**: EnableTabSearchMode - `_switchToMode(CommandPaletteMode::TabSearchMode)` でモードを切り替える

#### Step 4: タブ選択後の処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | TabManagement.cpp | `src/cascadia/TerminalApp/TabManagement.cpp` | _OnSwitchToTabRequested（597-604行目）、_SelectTab（565-588行目） |

**主要処理フロー**:
- **597-604行目**: _OnSwitchToTabRequested - タブスイッチャーからのタブ選択イベントを処理
- **600-602行目**: `_tabs.IndexOf(tab, index)` でタブのインデックスを取得し、`_SelectTab(index)` を呼び出す

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

```
_HandleTabSearch (AppActionHandlers.cpp:844)
    |
    +-- LoadCommandPalette() -- コマンドパレットの遅延ロード
    |
    +-- SetTabs(_tabs, _mruTabs) -- タブリストの設定
    |
    +-- EnableTabSearchMode() (CommandPalette.cpp:1321)
    |       |
    |       +-- _switchToMode(CommandPaletteMode::TabSearchMode)
    |
    +-- Visibility(Visible) -- コマンドパレットの表示
    |
    [ユーザーがタブを選択]
    |
    +-- _OnSwitchToTabRequested (TabManagement.cpp:597)
            |
            +-- _SelectTab(index) (TabManagement.cpp:565)
```

### データフロー図

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

TabSearch アクション ----> _HandleTabSearch
                            |
_tabs -------------------> SetTabs ---------> CommandPalette
_mruTabs ----------------> SetTabs            (タブ検索モード)
                            |                      |
                          EnableTabSearchMode       |
                            |                      |
                          Visibility=Visible        v
                                              [ユーザー入力]
                                                   |
                                              インクリメンタル絞り込み
                                                   |
                                              [タブ選択]
                                                   |
                                              _OnSwitchToTabRequested
                                                   |
                                              _SelectTab --> フォーカス移動
```

### 関連ファイル一覧

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