# 機能設計書 6-次のタブに切り替え

## 概要

本ドキュメントは、Windows Terminal における「次のタブに切り替え」機能の設計を記述する。次のタブにフォーカスを移動する（MRUモードにも対応）機能の詳細を定義する。

### 本機能の処理概要

**業務上の目的・背景**：複数のターミナルタブを開いて作業している場合、タブ間を素早く切り替える必要がある。この機能は、キーボードショートカットによるタブナビゲーションを提供し、マウスを使わずに効率的なタブ切り替えを可能にする。タブスイッチャーモード（MRUまたはインオーダー）に応じた2つの動作モードをサポートする。

**機能の利用シーン**：キーボードショートカット（Ctrl+Tab等）で次のタブに切り替える場合に使用される。設定により、順番通りの切り替えか、最近使用順（MRU）の切り替えかを選択できる。

**主要な処理内容**：
1. NextTab アクションの受信と引数（NextTabArgs）の解析
2. タブスイッチャーモードの決定（引数指定またはグローバル設定）
3. Disabled モード: 直接次のタブインデックスを計算してフォーカス移動
4. InOrder/MRU モード: コマンドパレットをタブスイッチャーモードで表示

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

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | TerminalPage（メイン画面） | 主画面 | _HandleNextTab により次タブへフォーカス移動 |
| 2 | TabRowControl（タブ行） | 補助画面 | TabView上のタブ切り替え操作 |
| 10 | CommandPalette（コマンドパレット） | 補助画面 | タブスイッチャーモードでの表示（InOrder/MRU時） |

## 機能種別

ナビゲーション操作（タブフォーカスの移動）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SwitcherMode | IReference<TabSwitcherMode> | No | タブスイッチャーモード（Disabled / InOrder / MostRecentlyUsed）。未指定の場合はグローバル設定を使用 | TabSwitcherMode 列挙値であること |

### 入力データソース

- アクション引数: NextTabArgs 経由の SwitcherMode
- グローバル設定: _settings.GlobalSettings().TabSwitcherMode()
- 現在のフォーカスタブインデックス: _GetFocusedTabIndex()

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (なし) | - | 次のタブにフォーカスが移動する、またはタブスイッチャーUIが表示される |

### 出力先

- Disabled モード: TabView のフォーカスが次のタブに移動
- InOrder/MRU モード: コマンドパレットがタブスイッチャーモードで表示

## 処理フロー

### 処理シーケンス

```
1. _HandleNextTab がアクションイベントを受信
   └─ NextTabArgs から SwitcherMode を取得
2. _SelectNextTab(true, SwitcherMode) の呼び出し
   └─ 第一引数 true は「右方向（次のタブ）」を示す
3. タブスイッチャーモードの決定
   └─ customTabSwitcherMode が指定されている場合: その値を使用
   └─ 未指定の場合: _settings.GlobalSettings().TabSwitcherMode() を使用
4. モード別処理
   └─ Disabled の場合:
      └─ 次のタブインデックスを計算: (tabCount + index + 1) % tabCount
      └─ _SelectTab(newTabIndex) でフォーカス移動
   └─ InOrder / MRU の場合:
      └─ コマンドパレットをロード
      └─ タブリストを設定（_tabs, _mruTabs）
      └─ EnableTabSwitcherMode で指定モードでの表示
      └─ SelectNextItem(true) で次のアイテムを選択
```

### フローチャート

```mermaid
flowchart TD
    A[_HandleNextTab 受信] --> B[NextTabArgs から SwitcherMode 取得]
    B --> C[_SelectNextTab true, SwitcherMode]
    C --> D{SwitcherMode 決定}
    D --> E{Disabled?}
    E -->|Yes| F[次のインデックス計算]
    F --> G[_SelectTab でフォーカス移動]
    E -->|No| H[コマンドパレットをロード]
    H --> I[EnableTabSwitcherMode]
    I --> J[SelectNextItem true]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | モード指定優先 | NextTabArgs に SwitcherMode が指定されている場合、その値を使用する | SwitcherMode が null でない場合 |
| BR-02 | グローバル設定フォールバック | SwitcherMode が未指定の場合、グローバル設定の TabSwitcherMode を使用 | SwitcherMode が null の場合 |
| BR-03 | ラップアラウンド | Disabled モードでは最後のタブの次は最初のタブに戻る（循環） | Disabled モードで末尾タブにフォーカスがある場合 |
| BR-04 | タブスイッチャーUI | InOrder/MRU モードではコマンドパレットをタブスイッチャーとして表示する | Disabled 以外のモードの場合 |

### 計算ロジック

次のタブインデックスの算出（Disabled モード）：
- `newTabIndex = (tabCount + index + 1) % tabCount`
- `tabCount` の加算はラップアラウンド（負数回避のため）。`bMoveRight` が true なので +1。

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

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

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

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

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

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| (なし) | フォーカスタブ不在 | _GetFocusedTabIndex() が nullopt | value_or(0) で インデックス 0 をフォールバック使用 |

### リトライ仕様

リトライは行わない。

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

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

## パフォーマンス要件

タブ切り替えはユーザーが頻繁に使用する操作であり、遅延なく即座に実行される必要がある。

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

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

## 備考

- _SelectNextTab は NextTab（No.6）と PrevTab（No.7）で共用されるメソッド。第一引数 bMoveRight で方向を制御
- MRU モードでは、タブスイッチャーのインデックス 0 が最も最近使用されたタブを示す

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | ActionArgs.idl | `src/cascadia/TerminalSettingsModel/ActionArgs.idl` | NextTabArgs の定義（410-415行目）。IReference<TabSwitcherMode> 型の SwitcherMode プロパティ |

**読解のコツ**: `TabSwitcherMode` は列挙型で、`Disabled`（直接切り替え）、`InOrder`（順番通り）、`MostRecentlyUsed`（最近使用順）の3値を持つ。

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

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

**主要処理フロー**:
1. **155-156行目**: _HandleNextTab の定義
2. **158行目**: NextTabArgs へのキャスト
3. **161行目**: `_SelectNextTab(true, realArgs.SwitcherMode())` 呼び出し。true は「次のタブ」方向

#### Step 3: タブ切り替えロジックを理解する

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

**主要処理フロー**:
- **528-553行目**: _SelectNextTab - モード別の分岐処理
- **530行目**: `_GetFocusedTabIndex().value_or(0)` でフォーカスインデックス取得
- **531行目**: モード決定（引数指定 or グローバル設定）
- **532-541行目**: Disabled モード - ラップアラウンド計算して _SelectTab
- **543-552行目**: InOrder/MRU モード - コマンドパレットをタブスイッチャーとして表示
- **565-588行目**: _SelectTab - 実際のタブフォーカス移動

#### Step 4: コマンドパレットのタブスイッチャーを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | CommandPalette.cpp | `src/cascadia/TerminalApp/CommandPalette.cpp` | EnableTabSwitcherMode（1311-1319行目） |

**主要処理フロー**:
- **1311-1319行目**: EnableTabSwitcherMode - タブスイッチャーモードの初期化
- **1316行目**: InOrder モードの場合のみ _switcherStartIdx を設定

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

```
_HandleNextTab (AppActionHandlers.cpp:155)
    |
    +-- _SelectNextTab(true, SwitcherMode) (TabManagement.cpp:528)
            |
            +-- [Disabled mode]
            |       |
            |       +-- ラップアラウンド計算
            |       +-- _SelectTab (TabManagement.cpp:565)
            |               +-- _tabView.SelectedItem()
            |               +-- _SetFocusedTab() or _UpdatedSelectedTab()
            |
            +-- [InOrder/MRU mode]
                    |
                    +-- LoadCommandPalette()
                    +-- SetTabs(_tabs, _mruTabs)
                    +-- EnableTabSwitcherMode (CommandPalette.cpp:1311)
                    +-- SelectNextItem(true)
```

### データフロー図

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

NextTabArgs ------------> _HandleNextTab
  SwitcherMode              |
                          _SelectNextTab(true)
                            |
GlobalSettings ---------> モード決定
  TabSwitcherMode           |
                          +-[Disabled]-> インデックス計算 -> _SelectTab -> TabView フォーカス移動
                          |
                          +-[InOrder/MRU]-> CommandPalette -> タブスイッチャーUI表示
```

### 関連ファイル一覧

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