# 画面設計書 7-SearchBoxControl（検索ボックス）

## 概要

本ドキュメントは、Windows Terminal のターミナル出力内テキスト検索機能を提供する SearchBoxControl の画面設計書である。TermControl 内の子コンポーネントとして動作し、テキスト検索・次/前の一致箇所移動・大文字小文字区別・正規表現検索の機能を提供する。

### 本画面の処理概要

**業務上の目的・背景**：SearchBoxControl はターミナル出力のログから特定のテキストを効率的に検索するための機能を提供する。開発者がエラーメッセージや特定のパターンを素早く見つけるために不可欠な機能である。

**画面へのアクセス方法**：TermControl 内で検索アクション（Ctrl+Shift+F）が実行された際に、画面上部にオーバーレイとして表示される。

**主要な操作・処理内容**：
1. テキスト入力による検索テキストの指定
2. 前方/後方検索ボタンによる一致箇所の移動
3. 大文字/小文字区別の切替（CaseSensitivityButton）
4. 正規表現検索の切替（RegexButton）
5. 検索結果のステータス表示（一致件数/現在位置）
6. 閉じるボタンによる検索ボックスの非表示化
7. 開閉アニメーション

**画面遷移**：
- 親：TermControl

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 42 | 検索を開く | 主機能 | テキスト検索入力フィールドとオプションの表示 |
| 43 | 次/前の一致を検索 | 主機能 | 検索結果の次/前の一致箇所への移動ボタン |

## 画面種別

コンポーネント / 検索

## URL/ルーティング

該当なし

## 入出力項目

| 項目名 | 入出力 | 型 | 説明 |
|--------|--------|------|------|
| Text | 出力 | hstring | 検索テキスト |
| GoForward | 出力 | bool | 前方検索方向 |
| CaseSensitive | 出力 | bool | 大文字/小文字区別 |
| RegularExpression | 出力 | bool | 正規表現検索 |
| Search | 出力 | イベント | 検索実行イベント |
| SearchChanged | 出力 | イベント | 検索条件変更イベント |
| Closed | 出力 | イベント | 検索ボックス閉じイベント |

## 表示項目

| 項目名 | 表示位置 | 説明 |
|--------|----------|------|
| TextBox | StackPanel 1番目 | 検索テキスト入力欄（Width=160） |
| StatusBox | StackPanel 2番目 | 検索結果ステータス表示（一致件数） |
| GoBackwardButton | StackPanel 3番目 | 後方検索ToggleButton（Glyph: E74A、32x32） |
| GoForwardButton | StackPanel 4番目 | 前方検索ToggleButton（Glyph: E74B、32x32） |
| CaseSensitivityButton | StackPanel 5番目 | 大文字/小文字区別ToggleButton（PathIconでAaアイコン、32x32） |
| RegexButton | StackPanel 6番目 | 正規表現ToggleButton（PathIconで.*アイコン、32x32） |
| CloseButton | StackPanel 7番目 | 閉じるButton（Glyph: E711、32x32） |

## イベント仕様

### 1-テキスト検索（TextBoxTextChanged）

検索テキストが変更されると TextBoxTextChanged が呼び出され、SearchChanged イベントが発火する。リアルタイムでインクリメンタル検索が行われる。

### 2-前方/後方移動（GoForwardClicked/GoBackwardClicked）

GoForwardButton/GoBackwardButton のクリックで検索方向を切り替え、次/前の一致箇所に移動する。ToggleButton のため、一方が選択されるともう一方は非選択になる。

### 3-検索オプション変更

CaseSensitivityButton/RegexButton のクリックで検索オプションを切り替え、SearchChanged イベントが発火して再検索が実行される。

### 4-キーボード操作（TextBoxKeyDown）

Enter キーで次の一致箇所に移動、Escape キーで検索ボックスを閉じる。

### 5-開閉アニメーション

Open() でスライドインアニメーション（OpenAnimation）、Close() でスライドアウトアニメーション（CloseAnimation）が実行される。アニメーションは0.3秒の ExponentialEase を使用。

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

該当なし

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| SearchBox_TextBox | プレースホルダー | 検索テキスト入力のヒント | テキスト未入力時 |
| SearchBox_SearchBackwards | ToolTip | 前を検索 | GoBackwardButtonホバー時 |
| SearchBox_SearchForwards | ToolTip | 次を検索 | GoForwardButtonホバー時 |
| SearchBox_CaseSensitivity | ToolTip | 大文字/小文字の区別 | CaseSensitivityButtonホバー時 |
| SearchBox_RegularExpression | ToolTip | 正規表現 | RegexButtonホバー時 |
| SearchBox_Close | ToolTip | 閉じる | CloseButtonホバー時 |
| SearchBox_StatusBox | ステータス | 検索結果カウント | 検索実行時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 正規表現が無効 | SetStatus で searchRegexInvalid=true が設定され、無効な正規表現であることを表示 |
| 検索結果なし | ステータスに0件が表示される |

## 備考

- UserControl ベース（d:DesignWidth=285, d:DesignHeight=55）
- TabNavigation=Cycle でフォーカスが循環
- 検索結果の最大表示件数は 999（MaximumTotalResultsToShowInStatus）、超過時は "999+" と表示
- 現在のインデックスが不明な場合は "?" と表示
- FlyoutPresenterBackground でフライアウト風の背景を使用
- SharedShadow で影付き表示（Translation=0,0,16）
- Dark/Light/HighContrast の3テーマに対応
- ToggleButton は SubtleFill スタイルでフラットデザイン

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | SearchBoxControl.h | `src/cascadia/TerminalControl/SearchBoxControl.h` | 定数定義（MaximumTotalResultsToShowInStatus=999、24行目）。Search/SearchChanged/Closed イベント（60-62行目） |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SearchBoxControl.xaml | `src/cascadia/TerminalControl/SearchBoxControl.xaml` | StackPanel内にコントロールを水平配置。OpenAnimation/CloseAnimation（154-169行目） |

**主要処理フロー**:
1. **193-205行目**: TextBox（Width=160、検索入力）
2. **207-212行目**: StatusBox（検索結果ステータス）
3. **214-260行目**: ToggleButton群（方向、大文字小文字、正規表現）
4. **262-273行目**: CloseButton

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

```
TermControl
  └─ SearchBoxControl
       ├─ TextBox -> TextBoxTextChanged -> SearchChanged イベント
       ├─ GoBackwardButton -> GoBackwardClicked -> Search イベント
       ├─ GoForwardButton -> GoForwardClicked -> Search イベント
       ├─ CaseSensitivityButton -> CaseSensitivityButtonClicked -> SearchChanged
       ├─ RegexButton -> RegexButtonClicked -> SearchChanged
       └─ CloseButton -> CloseClick -> Closed イベント
```

### データフロー図

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

検索テキスト ─────> TextBoxTextChanged      ──> SearchChanged イベント
                     └─> インクリメンタル検索      └─> TermControl 検索実行

検索オプション ───> ToggleButton Click      ──> SearchChanged イベント
(大文字小文字/正規表現)                           └─> 再検索

検索結果 ────────> SetStatus()              ──> StatusBox 表示更新
(totalMatches,      └─> _FormatStatus()          (999+ 表示対応)
 currentMatch)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SearchBoxControl.xaml | `src/cascadia/TerminalControl/SearchBoxControl.xaml` | テンプレート | XAML レイアウト定義 |
| SearchBoxControl.h | `src/cascadia/TerminalControl/SearchBoxControl.h` | ソース | クラス宣言 |
| SearchBoxControl.cpp | `src/cascadia/TerminalControl/SearchBoxControl.cpp` | ソース | 実装 |
| TermControl.xaml | `src/cascadia/TerminalControl/TermControl.xaml` | テンプレート | 親コンポーネント |
