# 画面設計書 1-IntelliSense オプション設定画面

## 概要

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

### 本画面の処理概要

この画面は、F# コードエディタにおける IntelliSense 機能（コード補完リストの表示機能）の動作をカスタマイズするためのオプションページです。

**業務上の目的・背景**：F# 開発者がコード補完機能の動作を自身の開発スタイルに合わせてカスタマイズするために必要な画面です。IntelliSense の表示タイミングや Enter キーの動作を調整することで、開発効率の向上やコーディング体験の最適化を実現します。デフォルト設定では対応できない多様な開発者の好みやワークフローに対応するため、詳細な設定オプションを提供しています。

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

**主要な操作・処理内容**：
1. 補完リストの表示タイミング設定（文字入力後、文字削除後）
2. 未オープンの名前空間・モジュールからのシンボル表示設定
3. オーバーライドメソッドのボディ自動生成設定
4. Enter キー押下時の動作設定（改行挿入のルール）

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

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 59 | 補完プロバイダ | 主機能 | IntelliSense 補完リストの表示タイミング（文字入力後・削除後）や Enter キーの動作を設定し、補完プロバイダの動作を制御 |
| 17 | 補完機能 | 主機能 | コード補完候補の生成動作の設定（未openの名前空間からのシンボル表示、オーバーライドメソッドのボディ生成） |

## 画面種別

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

## URL/ルーティング

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

## 入出力項目

| 項目名 | 項目種別 | データ型 | 必須 | 説明 |
|--------|----------|----------|------|------|
| ShowAfterCharIsTyped | 入力（チェックボックス） | bool | - | 文字入力後に補完リストを表示するかどうか |
| ShowAfterCharIsDeleted | 入力（チェックボックス） | bool | - | 文字削除後に補完リストを表示するかどうか（ShowAfterCharIsTyped が有効な場合のみ） |
| IncludeSymbolsFromUnopenedNamespacesOrModules | 入力（チェックボックス） | bool | - | 未オープンの名前空間・モジュールからシンボルを表示するかどうか |
| GenerateBodyForOverriddenMethod | 入力（チェックボックス） | bool | - | オーバーライドメソッドの既定の実装ボディを生成するかどうか |
| EnterKeySetting | 入力（ラジオボタン） | EnterKeySetting | - | Enter キー押下時の動作（NeverNewline / NewlineOnCompleteWord / AlwaysNewline） |

## 表示項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| Completion Lists グループ | GroupBox | 補完リスト関連の設定をグループ化 |
| 文字入力後に補完リスト表示 | CheckBox | `charTyped` - 主要なトリガー設定 |
| 文字削除後に補完リスト表示 | CheckBox | `charDeleted` - charTyped の子設定（インデント付き） |
| 全シンボル表示 | CheckBox | `showAllSymbols` - 未open の名前空間からのシンボル表示 |
| オーバーライドメソッドボディ生成 | CheckBox | `generateBodyForOverriddenMethod` |
| Enter Key Rule グループ | GroupBox | Enter キーの動作設定をグループ化 |
| 改行しない | RadioButton | `nevernewline` |
| 完全入力後のみ改行 | RadioButton | `newlinecompleteline` |
| 常に改行 | RadioButton | `alwaysnewline` |

## イベント仕様

### 1-文字入力後補完表示チェック変更

ユーザーが「文字入力後に補完リスト表示」チェックボックスをオフにした場合、「文字削除後に補完リスト表示」チェックボックスも自動的にオフになり、無効化されます（IsEnabled がバインドされているため）。

### 2-設定値の保存

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

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

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

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

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

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

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

## メッセージ仕様

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

## 例外処理

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

## 備考

- 本画面は WPF UserControl として実装されています（`IntelliSenseOptionControl.xaml`）
- 設定値は `IntelliSenseOptions` レコード型で管理され、MEF (Managed Extensibility Framework) を通じて他のコンポーネントからアクセス可能です
- デフォルト値は以下の通りです：
  - ShowAfterCharIsTyped: true
  - ShowAfterCharIsDeleted: false
  - IncludeSymbolsFromUnopenedNamespacesOrModules: false
  - EnterKeySetting: NeverNewline
  - GenerateBodyForOverriddenMethod: true

---

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

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

### 推奨読解順序

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | EditorOptions.fs | `vsintegration/src/FSharp.Editor/Options/EditorOptions.fs` | `IntelliSenseOptions` レコード型（21-37行目）の定義を確認。5つのフィールドとデフォルト値を把握する |
| 1-2 | EditorOptions.fs | `vsintegration/src/FSharp.Editor/Options/EditorOptions.fs` | `EnterKeySetting` 列挙型（14-17行目）の3つの値を確認 |

**読解のコツ**: F# の `[<CLIMutable>]` 属性はレコード型を WPF データバインディングで使用可能にするために必要です。

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

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

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

**主要処理フロー**:
1. **182行目**: `[<Guid(Guids.intelliSenseOptionPageIdString)>]` 属性で GUID を指定
2. **183行目**: `AbstractOptionPage<IntelliSenseOptions>` を継承してオプションページを定義
3. **185-196行目**: `CreateView()` メソッドで UI コントロールを生成し、データバインディングを設定

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

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

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

**主要処理フロー**:
- **22-44行目**: Completion Lists グループ内の CheckBox 定義
- **24-27行目**: `charTyped` チェックボックスと `ShowAfterCharIsTyped` プロパティのバインディング
- **29-33行目**: `charDeleted` の IsEnabled が `charTyped` の IsChecked にバインド
- **45-51行目**: Enter Key Rule グループ内の RadioButton 定義

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Strings.resx | `vsintegration/src/FSharp.UIResources/Strings.resx` | `Completion_Lists`、`Show_completion_list_after_a_character_is_typed` などのリソースキーと表示文字列 |

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

```
Visual Studio オプションダイアログ
    │
    ├─ IntelliSenseOptionPage (EditorOptions.fs:182-196)
    │      │
    │      └─ CreateView()
    │             │
    │             └─ IntelliSenseOptionControl (XAML)
    │                    │
    │                    ├─ DataContext: IntelliSenseOptions
    │                    └─ SettingsStore への読み書き
    │
    └─ EditorOptions (EditorOptions.fs:151-174)
           │
           ├─ IntelliSense プロパティ (163行目)
           └─ SettingsStore.Get<IntelliSenseOptions>()
```

### データフロー図

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

ユーザー操作 ───▶ IntelliSenseOptionControl ───▶ IntelliSenseOptions
(CheckBox/                     │                         │
 RadioButton)                  │                         │
                               ▼                         ▼
                    SettingsStore.Register() ───▶ Visual Studio 設定ストア
                               │
                               ▼
                    EditorOptions.IntelliSense ───▶ 補完プロバイダ
                                                   (CompletionProvider)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| IntelliSenseOptionControl.xaml | `vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.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 | 共通スタイル定義 |
| UIHelpers.fs | `vsintegration/src/FSharp.Editor/Options/UIHelpers.fs` | ソース | データバインディングヘルパー |
| SettingsStore.fs | `vsintegration/src/FSharp.Editor/Options/SettingsStore.fs` | ソース | 設定の永続化処理 |
