# 画面設計書 88-メインウィンドウ

## 概要

本ドキュメントは、IntegrationTestAppアプリケーションにおけるメインウィンドウの画面設計について記載します。

### 本画面の処理概要

このウィンドウは、Avaloniaフレームワークの統合テスト用アプリケーションのメインウィンドウです。ListBoxによるナビゲーション構造を持ち、18種類のテストページ（Automation、Button、CheckBoxなど）へのアクセスを提供します。UIオートメーション、入力イベント、コントロール動作の自動テストを実行するための基盤となります。

**業務上の目的・背景**：
Avaloniaフレームワークの各種コントロールとプラットフォーム機能の統合テストを自動化するためのテストアプリケーションです。CI/CDパイプラインでのUIテスト、プラットフォーム固有の動作検証、リグレッションテストの実行に使用されます。

**画面へのアクセス方法**：
IntegrationTestAppアプリケーションを起動すると、このメインウィンドウが直接表示されます。

**主要な操作・処理内容**：
1. ListBoxによる18種類のテストページ間のナビゲーション
2. NativeMenuによるファイル・ビュー・オプションメニューの表示
3. ウィンドウ状態（WindowState）のリアルタイム表示
4. オーバーレイポップアップ/ネイティブポップアップモードの表示
5. PositionChanged監視によるオフスクリーン検出と自動位置調整

**画面遷移**：
- 遷移元：アプリケーション起動
- 遷移先：
  - Automationページ、Buttonページ、CheckBoxページなど18種類のテストページ
  - ShowWindowTest（条件付き）
  - TopmostWindowTest（条件付き）

**権限による表示制御**：
特に権限による表示制御はありません。テスト用途のため全ての機能が常に利用可能です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 42 | Window | 主機能 | 統合テストアプリのメインウィンドウ表示 |
| 9 | ListBox | 補助機能 | テストページナビゲーション |
| 48 | NativeMenu | 補助機能 | File/View/Optionsメニューの表示 |

## 画面種別

ナビゲーション / コンテナ

## URL/ルーティング

アプリケーションルート（起動時に表示）

## 入出力項目

| 項目名 | 入出力 | 型 | 説明 |
|--------|--------|-----|------|
| ページ選択 | 入力 | Page | ListBoxで選択されたテストページ |
| WindowState表示 | 出力 | string | 現在のウィンドウ状態 |
| ポップアップモード表示 | 出力 | string | "Overlay Popups"または"Native Popups" |

## 表示項目

| 項目名 | データ型 | 説明 |
|--------|----------|------|
| NativeMenuBar | NativeMenuBar | File/View/Optionsメニュー |
| Pager（ListBox） | ListBox | テストページナビゲーション用リスト |
| PagerContent（Decorator） | Decorator | 選択されたページのコンテンツ表示領域 |
| MainWindowState（TextBlock） | TextBlock | WindowState表示 |
| AppOverlayPopups（TextBlock） | TextBlock | ポップアップモード表示 |

## イベント仕様

### 1-コンストラクタ

ウィンドウ初期化時に発生するイベントです。

- **トリガー**：アプリケーション起動時
- **処理内容**：
  1. Name = "MainWindow"を設定（ソースジェネレータ回避）
  2. InitializeComponent()でXAMLリソースを読み込み
  3. CreatePages()で18種類のテストページを生成
  4. MainWindowViewModelをDataContextに設定
  5. InitializeViewMenu()でビューメニューにページ項目を追加
  6. PositionChangedイベントハンドラを登録

### 2-Pager_SelectionChanged

ListBoxの選択が変更された際のイベントです。

- **トリガー**：Pager（ListBox）の選択変更時
- **処理内容**：
  1. Pager.SelectedItemからPageオブジェクトを取得
  2. page.CreateContent()でページコンテンツを生成
  3. PagerContent.Childに設定して表示

### 3-OnPositionChanged

ウィンドウ位置が変更された際のイベントです。

- **トリガー**：ウィンドウの移動時
- **処理内容**：
  1. Screens.ScreenFromWindow(this)で現在のスクリーンを取得
  2. ウィンドウ境界がWorkingArea内にあるか確認
  3. 範囲外の場合、Position = screen.WorkingArea.Positionで位置を補正

### 4-InitializeViewMenu

ビューメニューの初期化を行います。

- **トリガー**：コンストラクタから呼び出し
- **処理内容**：
  1. 各ページに対してNativeMenuItemを作成
  2. ToggleType = MenuItemToggleType.Radioに設定
  3. Click時にSelectedPageを更新するハンドラを登録

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

本画面はデータベースを使用しません。

## メッセージ仕様

| メッセージ種別 | 表示内容 | 表示タイミング |
|--------------|----------|---------------|
| 情報 | WindowState値 | ウィンドウ状態変更時 |
| 情報 | "Overlay Popups"または"Native Popups" | 起動時に固定表示 |

## 例外処理

本画面はテストアプリケーションのため、例外時の特別な処理は行いません。

## 備考

- Name = "MainWindow"はコードビハインドで設定（ソースジェネレータがXAMLから自動生成しないようにするため）
- AutomationProperties.LandmarkTypeでアクセシビリティ情報を提供
- PositionChanged監視はウィンドウ装飾変更時のオフスクリーン問題の回避策

---

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

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

### 推奨読解順序

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

PageレコードとViewModelの構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Page.cs | `samples/IntegrationTestApp/Models/Page.cs` | 行1-6でPageレコード定義を確認 |
| 1-2 | MainWindowViewModel.cs | `samples/IntegrationTestApp/ViewModels/MainWindowViewModel.cs` | 行1-23でViewModel構造を確認 |

**読解のコツ**: PageはName（string）とCreateContent（Func<Control>）を持つrecord型です。

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

コンストラクタでの初期化処理を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | MainWindow.axaml.cs | `samples/IntegrationTestApp/MainWindow.axaml.cs` | 行13-26でコンストラクタを確認 |

**主要処理フロー**:
- **行16**: Name = "MainWindow"（ソースジェネレータ回避）
- **行18**: InitializeComponent()
- **行20**: CreatePages()で18ページ生成
- **行21**: InitializeViewMenu()でビューメニュー初期化
- **行23**: DataContext = viewModel
- **行25**: PositionChangedイベント登録

#### Step 3: ページ生成とナビゲーションを理解する

CreatePagesとPager_SelectionChangedを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | MainWindow.axaml.cs | `samples/IntegrationTestApp/MainWindow.axaml.cs` | 行75-98でCreatePagesを確認 |

**主要処理フロー**:
- **行53-57**: Pager_SelectionChangedでページコンテンツを設定
- **行77-97**: 18種類のページを配列リテラルで定義

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

```
IntegrationTestApp.MainWindow (Window)
    │
    ├─ コンストラクタ
    │      ├─ Name = "MainWindow"
    │      ├─ InitializeComponent()
    │      ├─ CreatePages() → 18種類のPage
    │      ├─ InitializeViewMenu() → NativeMenu設定
    │      ├─ DataContext = new MainWindowViewModel(pages)
    │      └─ PositionChanged += OnPositionChanged
    │
    ├─ MainWindowViewModel
    │      ├─ Pages (ObservableCollection<Page>)
    │      └─ SelectedPage (Page?)
    │
    ├─ NativeMenu
    │      ├─ File → Open...
    │      ├─ View → 動的にページ一覧を追加
    │      └─ Options
    │
    ├─ Pager (ListBox)
    │      └─ SelectionChanged → Pager_SelectionChanged
    │
    ├─ PagerContent (Decorator)
    │      └─ Child = page.CreateContent()
    │
    └─ OnPositionChanged
           └─ オフスクリーン検出 → Position補正
```

### データフロー図

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

アプリ起動      ─▶ CreatePages()            ─▶ 18種類のPage
                        │
                        ▼
                   MainWindowViewModel
                        │
                        ▼
Pager選択       ─▶ page.CreateContent()     ─▶ PagerContent.Child
                        │
                        ▼
位置変更        ─▶ オフスクリーン検出        ─▶ Position補正
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| MainWindow.axaml | `samples/IntegrationTestApp/MainWindow.axaml` | テンプレート | メインウィンドウのUIレイアウト |
| MainWindow.axaml.cs | `samples/IntegrationTestApp/MainWindow.axaml.cs` | ソース | ページナビゲーション、メニュー初期化 |
| MainWindowViewModel.cs | `samples/IntegrationTestApp/ViewModels/MainWindowViewModel.cs` | ソース | ページリストと選択状態の管理 |
| Page.cs | `samples/IntegrationTestApp/Models/Page.cs` | ソース | ページモデルの定義 |
| ShowWindowTest.axaml | `samples/IntegrationTestApp/ShowWindowTest.axaml` | テンプレート | ウィンドウテスト用サブウィンドウ |
| TopmostWindowTest.axaml | `samples/IntegrationTestApp/TopmostWindowTest.axaml` | テンプレート | 最前面ウィンドウテスト用サブウィンドウ |
