# 機能設計書 7-前のタブに切り替え

## 概要

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

### 本機能の処理概要

**業務上の目的・背景**：「次のタブに切り替え」（No.6）と対になる機能であり、逆方向のタブナビゲーションを提供する。キーボードショートカットによる双方向のタブ移動を実現し、効率的なマルチタブ作業を支援する。

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

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

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

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

## 関連画面

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

## 機能種別

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

## 入力仕様

### 入力パラメータ

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

### 入力データソース

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

## 出力仕様

### 出力データ

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

### 出力先

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

## 処理フロー

### 処理シーケンス

```
1. _HandlePrevTab がアクションイベントを受信
   └─ PrevTabArgs から SwitcherMode を取得
2. _SelectNextTab(false, SwitcherMode) の呼び出し
   └─ 第一引数 false は「左方向（前のタブ）」を示す
3. タブスイッチャーモードの決定
   └─ 引数指定がある場合: その値を使用
   └─ 未指定の場合: グローバル設定を使用
4. モード別処理
   └─ Disabled の場合:
      └─ 前のタブインデックスを計算: (tabCount + index - 1) % tabCount
      └─ _SelectTab(newTabIndex) でフォーカス移動
   └─ InOrder / MRU の場合:
      └─ コマンドパレットをタブスイッチャーモードで表示
      └─ SelectNextItem(false) で前のアイテムを選択
```

### フローチャート

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

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | モード指定優先 | PrevTabArgs に SwitcherMode が指定されている場合、その値を使用する | SwitcherMode が null でない場合 |
| BR-02 | グローバル設定フォールバック | SwitcherMode が未指定の場合、グローバル設定の TabSwitcherMode を使用 | SwitcherMode が null の場合 |
| BR-03 | ラップアラウンド | Disabled モードでは最初のタブの前は最後のタブに移動する（循環） | Disabled モードで先頭タブにフォーカスがある場合 |
| BR-04 | 共用メソッド | _SelectNextTab メソッドを bMoveRight=false で呼び出すことで前方向ナビゲーションを実現 | 常時 |

### 計算ロジック

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

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

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

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

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

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

該当なし。

## エラー処理

### エラーケース一覧

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

### リトライ仕様

リトライは行わない。

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

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

## パフォーマンス要件

タブ切り替えは遅延なく即座に実行される必要がある。

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

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

## 備考

- No.6（次のタブに切り替え）と同一の _SelectNextTab メソッドを使用し、bMoveRight パラメータで方向を制御
- PrevTabArgs と NextTabArgs は同一の構造（SwitcherMode プロパティのみ）

---

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

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

### 推奨読解順序

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

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

**読解のコツ**: PrevTabArgs と NextTabArgs は同じプロパティ構造を持つ。違いは呼び出し側の bMoveRight パラメータのみ。

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

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

**主要処理フロー**:
1. **166-167行目**: _HandlePrevTab の定義
2. **169行目**: PrevTabArgs へのキャスト
3. **172行目**: `_SelectNextTab(false, realArgs.SwitcherMode())` 呼び出し。false は「前のタブ」方向

#### Step 3: タブ切り替えロジックを理解する（No.6 と共通）

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | TabManagement.cpp | `src/cascadia/TerminalApp/TabManagement.cpp` | _SelectNextTab（528-553行目） - No.6 と共通。bMoveRight=false の場合は -1 される |

**主要処理フロー**:
- **539行目**: `bMoveRight ? 1 : -1` で方向を決定。PrevTab の場合は -1
- **551行目**: `SelectNextItem(bMoveRight)` でコマンドパレットの選択方向も制御

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

```
_HandlePrevTab (AppActionHandlers.cpp:166)
    |
    +-- _SelectNextTab(false, SwitcherMode) (TabManagement.cpp:528)
            |
            +-- [Disabled mode]
            |       +-- ラップアラウンド計算（-1方向）
            |       +-- _SelectTab
            |
            +-- [InOrder/MRU mode]
                    +-- CommandPalette.EnableTabSwitcherMode()
                    +-- SelectNextItem(false)
```

### データフロー図

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

PrevTabArgs ------------> _HandlePrevTab
  SwitcherMode              |
                          _SelectNextTab(false)
                            |
                          +-[Disabled]-> インデックス計算(-1) -> _SelectTab -> TabView フォーカス移動
                          |
                          +-[InOrder/MRU]-> CommandPalette -> タブスイッチャーUI表示
```

### 関連ファイル一覧

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