# 画面設計書 6-フォーマットオプション画面

## 概要

本ドキュメントは、Visual Studio の F# 言語サービスにおけるコードフォーマット機能の動作を設定する「フォーマットオプション画面」の設計仕様を記述するものです。

### 本画面の処理概要

この画面は、F# コードエディタにおけるコードフォーマット機能をカスタマイズするためのオプションページです。現在は貼り付け時の自動フォーマット機能の有効・無効を設定できます。

**業務上の目的・背景**：F# 開発者がコードの貼り付け時にインデントを自動調整する機能を制御するために必要な画面です。他のソースからコードをコピー&ペーストする際に、自動的にインデントを調整することでコーディング効率を向上させます。ただし、実験的機能のため、無効化オプションも提供しています。

**画面へのアクセス方法**：Visual Studio のメニューバーから「ツール」→「オプション」を選択し、オプションダイアログを開きます。左側のツリーから「テキストエディター」→「F#」→「Formatting」を選択することで本画面にアクセスできます。

**主要な操作・処理内容**：
1. 貼り付け時の自動フォーマット（インデント調整）の有効化・無効化

**画面遷移**：
- 遷移元：Visual Studio オプションダイアログ
- 遷移先画面：同じ F# オプションカテゴリ内の他のページ（IntelliSense、QuickInfo、Code Fixes、Advanced、Performance）へタブ切替で遷移可能

**権限による表示制御**：特になし。Visual Studio のユーザー設定として保存され、すべてのユーザーが設定を変更可能です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 67 | フォーマット | 主機能 | 貼り付け時の自動フォーマットの有効/無効設定 |

## 画面種別

設定画面（オプションページ）

## URL/ルーティング

Visual Studio 内部ダイアログのため、URLは存在しません。
- GUIDパス: `{Guids.formattingOptionPageIdString}`
- オプションツリーパス: `テキストエディター` > `F#` > `Formatting`

## 入出力項目

| 項目名 | 項目種別 | データ型 | 必須 | 説明 |
|--------|----------|----------|------|------|
| FormatOnPaste | 入力（チェックボックス） | bool | - | 貼り付け時に自動でインデントを調整するかどうか |

## 表示項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| 貼り付け時フォーマット | CheckBox | `toggleBlockStructure` - 貼り付け時の自動インデント調整（実験的） |

## イベント仕様

### 1-設定値の保存

OK ボタン押下時、設定値は Visual Studio の SettingsStore を通じて永続化されます。設定は `FormattingOptions` レコード型として管理されます。

### 2-設定値の読み込み

画面表示時、`EditorOptions` クラスの `Formatting` プロパティから現在の設定値が読み込まれ、各コントロールにバインドされます。

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

本画面はデータベースを使用しません。設定値は Visual Studio のユーザー設定ストア（レジストリまたは設定ファイル）に保存されます。

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

該当なし（Visual Studio 内部設定ストアを使用）

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|--------------|------|----------------|----------|
| - | - | 本画面固有のメッセージはありません | - |

## 例外処理

| 例外状況 | 処理内容 |
|----------|----------|
| 設定読み込み失敗 | デフォルト値（FormattingOptions.Default）が使用される |
| 設定保存失敗 | Visual Studio 標準のエラーハンドリングに従う |

## 備考

- 本画面は WPF UserControl として実装されています（`FormattingOptionsControl.xaml`）
- 設定値は `FormattingOptions` レコード型で管理され、MEF を通じて他のコンポーネントからアクセス可能です
- デフォルト値は以下の通りです：
  - FormatOnPaste: false（実験的機能のため無効）
- この機能は実験的であり、UI には "(Experimental)" の注記が表示されます
- 本画面は現在1つの設定項目のみですが、将来的に他のフォーマット関連設定が追加される可能性があります

---

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

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

### 推奨読解順序

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

まず、画面で扱う設定データの構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | EditorOptions.fs | `vsintegration/src/FSharp.Editor/Options/EditorOptions.fs` | `FormattingOptions` レコード型（142-148行目）の定義を確認。1つのフィールドとデフォルト値を把握する |

**読解のコツ**: 非常にシンプルな構造で、FormatOnPaste フィールドのみを持ちます。

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

オプションページとして Visual Studio に登録される仕組みを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | EditorOptions.fs | `vsintegration/src/FSharp.Editor/Options/EditorOptions.fs` | `FormattingOptionPage` クラス（230-233行目）が Visual Studio オプションページとして登録される |

**主要処理フロー**:
1. **230行目**: `[<Guid(Guids.formattingOptionPageIdString)>]` 属性で GUID を指定
2. **231行目**: `AbstractOptionPage<FormattingOptions>` を継承してオプションページを定義
3. **233行目**: `CreateView()` メソッドで `FormattingOptionsControl` を生成

#### Step 3: UI 定義を理解する

XAML で定義された UI コントロールの構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | FormattingOptionsControl.xaml | `vsintegration/src/FSharp.UIResources/FormattingOptionsControl.xaml` | UserControl の全体構造（単一の CheckBox） |

**主要処理フロー**:
- **17-21行目**: ScrollViewer 内の StackPanel
- **19-20行目**: `toggleBlockStructure` CheckBox（名前が誤っているが FormatOnPaste にバインド）

#### Step 4: リソース文字列を理解する

UI に表示される文字列リソースを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Strings.resx | `vsintegration/src/FSharp.UIResources/Strings.resx` | `Format_on_paste` リソースキー: "Re-format indentation on paste (Experimental)" |

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

```
Visual Studio オプションダイアログ
    │
    ├─ FormattingOptionPage (EditorOptions.fs:230-233)
    │      │
    │      └─ CreateView()
    │             │
    │             └─ FormattingOptionsControl (XAML)
    │                    │
    │                    ├─ DataContext: FormattingOptions
    │                    └─ CheckBox のバインディング
    │
    └─ EditorOptions (EditorOptions.fs:151-174)
           │
           ├─ Formatting プロパティ (168行目)
           └─ SettingsStore.Get<FormattingOptions>()
```

### データフロー図

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

ユーザー操作 ───▶ FormattingOptionsControl ───▶ FormattingOptions
(CheckBox)                     │                         │
                               │                         │
                               ▼                         ▼
                    SettingsStore.Register() ───▶ Visual Studio 設定ストア
                               │
                               ▼
                    EditorOptions.Formatting ───▶ 貼り付けフォーマッタ
                                                  (PasteFormattingService)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| FormattingOptionsControl.xaml | `vsintegration/src/FSharp.UIResources/FormattingOptionsControl.xaml` | XAML | UI レイアウト定義 |
| EditorOptions.fs | `vsintegration/src/FSharp.Editor/Options/EditorOptions.fs` | ソース | オプションデータ構造とオプションページ登録 |
| Strings.resx | `vsintegration/src/FSharp.UIResources/Strings.resx` | リソース | UI 表示文字列の定義 |
| OptionPageStyle.xaml | `vsintegration/src/FSharp.UIResources/OptionPageStyle.xaml` | XAML | 共通スタイル定義 |
| SettingsStore.fs | `vsintegration/src/FSharp.Editor/Options/SettingsStore.fs` | ソース | 設定の永続化処理 |
