# 画面設計書 13-ビルドイベントコマンドラインダイアログ

## 概要

本ドキュメントは、ビルドイベントのコマンドラインを編集するためのダイアログ「ビルドイベントコマンドラインダイアログ」の画面設計を記載します。

### 本画面の処理概要

**業務上の目的・背景**：ビルドイベントコマンドラインダイアログは、F# プロジェクトのビルド前後に実行されるコマンドを詳細に編集するためのダイアログです。複数行のコマンド入力に加え、MSBuild マクロ（$(OutDir)、$(ProjectName) など）を視覚的に選択・挿入できる機能を提供します。これにより、開発者は複雑なビルドスクリプトを効率的に作成でき、プロジェクトパスやビルド構成に依存する値を動的に参照できます。

**画面へのアクセス方法**：ビルドイベントプロパティページの「Edit Pre-build...」または「Edit Post-build...」ボタンをクリックして本ダイアログを開きます。直接アクセスすることはできません。

**主要な操作・処理内容**：
1. コマンドラインの入力・編集：複数行対応のテキストボックスでコマンドを直接編集
2. マクロパネルの表示/非表示：「Macros >>」ボタンでマクロ一覧パネルの展開/折りたたみ
3. マクロの選択と挿入：リストビューからマクロを選択し「Insert」ボタンまたはダブルクリックで挿入
4. OK ボタンによる確定：編集内容を保存してダイアログを閉じる
5. Cancel ボタンによるキャンセル：編集内容を破棄してダイアログを閉じる

**画面遷移**：
- この画面への遷移元：ビルドイベントプロパティページ（Edit Pre-build... / Edit Post-build... ボタン）
- この画面からの遷移先：ビルドイベントプロパティページ（OK / Cancel ボタン押下時）

**権限による表示制御**：親画面（ビルドイベントプロパティページ）の権限に依存します。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 48 | MSBuildタスク（Fsc） | 主機能 | 複数行のビルドイベントコマンド編集 |

## 画面種別

ダイアログ（モーダル）

## URL/ルーティング

Visual Studio 内のダイアログとして動作するため、URL/ルーティングは存在しません。

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 必須 | 説明 |
|--------|-----------|----------|------|------|
| EventCommandLine | 入力/出力 | String | いいえ | 編集対象のコマンドライン文字列 |
| Tokens | 入力 | String[] | いいえ | 使用可能なマクロ名の配列 |
| Values | 入力 | String[] | いいえ | 各マクロの現在値の配列 |

## 表示項目

| コントロール名 | 種類 | 説明 | データバインド |
|---------------|------|------|----------------|
| CommandLine | TextBox | コマンドライン入力欄（複数行、AcceptsReturn=True） | EventCommandLine |
| ShowMacrosButton | Button | 「Macros >>」ボタン（マクロパネル展開） | - |
| MacrosPanel | Panel | マクロ一覧パネル（展開/折りたたみ可能） | - |
| HideMacrosButton | Button | 「<< Hide」ボタン（マクロパネル折りたたみ） | - |
| TokenList | ListView | マクロ一覧（Macro列とValue列の2列構成） | Tokens, Values |
| Macro | ColumnHeader | マクロ名列ヘッダー | - |
| Value | ColumnHeader | マクロ値列ヘッダー | - |
| InsertButton | Button | 「Insert」ボタン（選択マクロを挿入） | - |
| OKButton | Button | 「OK」ボタン（確定） | - |
| Cancel_Button | Button | 「Cancel」ボタン（キャンセル） | - |

### 使用可能なマクロ一覧

| マクロ名 | 説明 | 例 |
|---------|------|-----|
| OutDir | 出力ディレクトリパス | bin\Debug\ |
| ConfigurationName | ビルド構成名 | Debug |
| ProjectName | プロジェクト名 | MyProject |
| TargetName | ターゲット名（拡張子なし） | MyProject |
| TargetPath | ターゲットファイルフルパス | C:\Projects\MyProject\bin\Debug\MyProject.dll |
| ProjectPath | プロジェクトファイルフルパス | C:\Projects\MyProject\MyProject.fsproj |
| ProjectFileName | プロジェクトファイル名 | MyProject.fsproj |
| TargetExt | ターゲット拡張子 | .dll |
| TargetFileName | ターゲットファイル名 | MyProject.dll |
| DevEnvDir | Visual Studio インストールディレクトリ | C:\Program Files\Microsoft Visual Studio\... |
| TargetDir | ターゲットディレクトリ | C:\Projects\MyProject\bin\Debug\ |
| ProjectDir | プロジェクトディレクトリ | C:\Projects\MyProject\ |
| PlatformName | プラットフォーム名 | AnyCPU |
| ProjectExt | プロジェクト拡張子 | .fsproj |

## イベント仕様

### 1-ShowMacrosButton_Click

「Macros >>」ボタン押下時の処理。

1. ShowExpandedForm メソッドを呼び出し
2. ShowMacrosButton を非表示に
3. MacrosPanel を表示（Visible=True）
4. TableLayoutPanel の行スタイルを Percent に変更
5. フォームの高さを MacrosPanel の高さ分拡大
6. InsertButton を表示（Visible=True）

### 2-HideMacrosButton_Click

「<< Hide」ボタン押下時の処理。

1. ShowCollapsedForm メソッドを呼び出し
2. ShowMacrosButton を表示
3. MacrosPanel を非表示
4. TableLayoutPanel の行スタイルを AutoSize に変更
5. フォームの高さを MacrosPanel の高さ分縮小
6. InsertButton を非表示

### 3-InsertButton_Click

「Insert」ボタン押下時の処理。

1. AddCurrentMacroToCommandLine メソッドを呼び出し
2. TokenList で選択されているすべての項目を取得
3. 各項目を "$(マクロ名)" 形式の文字列に変換
4. CommandLine テキストボックスの現在のカーソル位置（SelectedText）に挿入

### 4-TokenList_DoubleClick

マクロリストのダブルクリック時の処理。

1. AddCurrentMacroToCommandLine メソッドを呼び出し（InsertButton_Click と同じ動作）

### 5-TokenList_SelectedIndexChanged

マクロリストの選択変更時の処理。

1. SetInsertButtonEnableState メソッドを呼び出し
2. 選択項目がある場合は InsertButton を有効化
3. 選択項目がない場合は InsertButton を無効化

### 6-OKButton_Click

「OK」ボタン押下時の処理。

1. CommandLine.Text を m_CommandLine に保存
2. ダイアログを閉じる（DialogResult.OK）

### 7-CancelButton_Click

「Cancel」ボタン押下時の処理。

1. ダイアログを閉じる（DialogResult.Cancel）
2. 編集内容は破棄される

### 8-HelpButtonClicked

ヘルプボタン（?）クリック時の処理。

1. InvokeHelp メソッドを呼び出し
2. m_Page が設定されている場合、m_Page.Help(HelpTopic) を呼び出し
3. そうでない場合、VSHelp.Help サービスを使用してヘルプを表示

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

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

本ダイアログはデータベースを使用しません。編集結果は呼び出し元のビルドイベントプロパティページに返されます。

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| OK ボタン押下 | 呼び出し元 | 戻り値 | EventCommandLine プロパティを介して編集結果を返す |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| (動的設定) | タイトル | Pre-build Event Command Line / Post-build Event Command Line | SetFormTitleText で設定 |
| FSProjPropBuildEventsBuilder | ヘルプ | ビルドイベントビルダーのヘルプトピック | F1 キー押下時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| ヘルプサービス取得失敗 | Debug.Fail でデバッグ出力、処理を継続 |
| ヘルプ表示中の例外 | Debug.Fail でデバッグ出力、処理を継続 |

## 備考

- ダイアログは初期状態でマクロパネルが折りたたまれた状態で表示される
- IUIService を使用してダイアログを表示することで、Visual Studio のフォント設定が適用される
- MinimumSize がダイアログの初期サイズに設定され、それ以下へのリサイズは不可
- 複数のマクロを選択して一度に挿入することが可能（ListView.MultiSelect=False のため実際は単一選択）

---

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

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

### 推奨読解順序

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

ダイアログに渡されるデータと返されるデータを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | BuildEventCommandLineDialog.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/BuildEventCommandLineDialog.vb` | メンバ変数 m_CommandLine, m_Tokens, m_Values の用途 |

**読解のコツ**: このダイアログは BuildEventsPropPage から呼び出され、EventCommandLine プロパティを介してコマンドライン文字列をやり取りします。

#### Step 2: 初期化処理を理解する

ダイアログの初期化とマクロリストの設定方法を把握します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | BuildEventCommandLineDialog.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/BuildEventCommandLineDialog.vb` | SetFormTitleText, SetTokensAndValues メソッド |

**主要処理フロー**:
1. **行 25-36**: New() コンストラクタ - 初期状態でマクロパネルを非表示
2. **行 242-245**: SetFormTitleText - ダイアログタイトルの設定
3. **行 247-252**: SetTokensAndValues - マクロ名と値の設定、ParseAndPopulateTokens の呼び出し
4. **行 326-339**: ParseAndPopulateTokens - TokenList へのマクロ項目追加

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

マクロパネルの展開/折りたたみの処理フローを追います。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | BuildEventCommandLineDialog.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/BuildEventCommandLineDialog.vb` | ShowCollapsedForm, ShowExpandedForm メソッド |

**主要処理フロー**:
- **行 360-372**: ShowCollapsedForm - マクロパネル非表示、フォーム高さ縮小
- **行 374-385**: ShowExpandedForm - マクロパネル表示、フォーム高さ拡大

#### Step 4: マクロ挿入ロジックを理解する

マクロの選択と挿入処理を追います。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | BuildEventCommandLineDialog.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/BuildEventCommandLineDialog.vb` | AddCurrentMacroToCommandLine メソッド |

**主要処理フロー**:
- **行 401-414**: AddCurrentMacroToCommandLine - 選択マクロを $(マクロ名) 形式に変換して挿入

#### Step 5: ヘルプ機能を理解する

ヘルプボタンとF1キーによるヘルプ表示を追います。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | BuildEventCommandLineDialog.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/BuildEventCommandLineDialog.vb` | InvokeHelp, HelpTopic プロパティ |

**主要処理フロー**:
- **行 416-434**: InvokeHelp - PropPage または VSHelp サービスを使用したヘルプ表示
- **行 281-293**: HelpTopic プロパティ - ヘルプキーワードの取得

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

```
BuildEventsPropPage.LaunchEventBuilder (呼び出し元)
    │
    └─ BuildEventCommandLineDialog
           │
           ├─ New()
           │      └─ SetInsertButtonState(False) (初期状態)
           │
           ├─ SetFormTitleText(title)
           │
           ├─ SetTokensAndValues(tokens, values)
           │      └─ ParseAndPopulateTokens
           │             └─ TokenList.Items.Add (マクロリスト作成)
           │
           ├─ EventCommandLine = commandLine (初期値設定)
           │
           ├─ ShowDialog(ServiceProvider)
           │      └─ IUIService.ShowDialog (VS 統合表示)
           │
           │      [ユーザー操作]
           │      │
           │      ├─ ShowMacrosButton_Click
           │      │      └─ ShowExpandedForm
           │      │
           │      ├─ HideMacrosButton_Click
           │      │      └─ ShowCollapsedForm
           │      │
           │      ├─ InsertButton_Click / TokenList_DoubleClick
           │      │      └─ AddCurrentMacroToCommandLine
           │      │             └─ CommandLine.SelectedText = "$(マクロ)"
           │      │
           │      ├─ OKButton_Click
           │      │      └─ m_CommandLine = CommandLine.Text
           │      │
           │      └─ CancelButton_Click
           │             └─ Close()
           │
           └─ EventCommandLine (結果取得)
```

### データフロー図

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

BuildEventsPropPage
    │
    ├─ WindowTitleText  ───▶  SetFormTitleText
    │                         │
    ├─ Tokens[]         ───▶  SetTokensAndValues
    ├─ Values[]         ───▶  │
    │                         ▼
    │                         ParseAndPopulateTokens
    │                         │
    │                         ▼
    │                         TokenList (ListView)
    │                         │
    │                         ▼
    └─ CommandLine      ───▶  CommandLine (TextBox)  ◀───  Insert ボタン
                              │                            │
                              ▼                            │
                              ユーザー編集                  │
                              │                            │
                              ▼                            │
                              OKButton_Click               │
                              │                            │
                              ▼                            │
BuildEventsPropPage   ◀───  EventCommandLine   ◀─────────┘
(txtPreBuildEventCommandLine
 or txtPostBuildEventCommandLine)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| BuildEventCommandLineDialog.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/BuildEventCommandLineDialog.vb` | ソース | ビルドイベントコマンドライン編集ダイアログ本体 |
| BuildEventCommandLineDialog.resx | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/BuildEventCommandLineDialog.resx` | リソース | UI 文字列、レイアウト定義 |
| BuildEventsPropPage.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/BuildEventsPropPage.vb` | ソース | 呼び出し元プロパティページ、LaunchEventBuilder メソッド |
| PropPageUserControlBase.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/PropPageUserControlBase.vb` | ソース | Help メソッド提供 |
| HelpKeywords.vb | `vsintegration/src/FSharp.ProjectSystem.PropertyPages/Common/HelpKeywords.vb` | ソース | FSProjPropBuildEventsBuilder 定義 |
