# 画面設計書 107-Window

## 概要

本ドキュメントは、IntegrationTestAppにおけるウィンドウコントロールのテストページ（WindowPage）の画面設計書です。

### 本画面の処理概要

本画面は、Avaloniaフレームワークのウィンドウ管理機能を統合テストするためのテストページです。ウィンドウの表示モード、位置、状態、装飾、リサイズ設定など、多様なウィンドウ設定をテストできます。

**業務上の目的・背景**：本画面は、Avaloniaフレームワークの品質保証のために存在します。ウィンドウ管理機能は、デスクトップアプリケーションの基盤となる重要な機能です。ウィンドウの表示位置、サイズ、状態（最小化/最大化/全画面）、装飾（タイトルバー、枠線）、所有ウィンドウ/モーダルダイアログ、透過ウィンドウなど、様々なウィンドウ設定が正しく動作することを検証します。

**画面へのアクセス方法**：IntegrationTestAppのメインウィンドウから、ListBoxナビゲーションで「Window」項目を選択することでアクセスします。

**主要な操作・処理内容**：
1. ウィンドウサイズ、表示モード、位置、状態、装飾を設定
2. Show Windowボタンで設定に従ったウィンドウを表示
3. フルスクリーン、最前面ウィンドウ、透過ウィンドウのテスト
4. 全ウィンドウの復元操作

**画面遷移**：
- 遷移元：IntegrationTestApp MainWindow（ListBoxナビゲーション）
- 遷移先：ShowWindowTest（モーダル/非モーダル）、TopmostWindowTest、TransparentWindow

**権限による表示制御**：本画面は統合テスト用のため、権限による表示制御は実装されていません。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 42 | Window | 主機能 | ウィンドウのテスト。ウィンドウ管理とプロパティ設定 |

## 画面種別

テスト画面

## URL/ルーティング

IntegrationTestApp内のUserControlとして読み込まれるため、URLルーティングはありません。
クラス名: `IntegrationTestApp.Pages.WindowPage`

## 入出力項目

| 項目名 | 種別 | データ型 | 必須 | 説明 |
|--------|------|----------|------|------|
| ウィンドウサイズ | 入力 | string | - | 幅,高さの形式（例: "400,300"） |
| 表示モード | 入力 | enum | - | NonOwned/Owned/Modal |
| 表示位置 | 入力 | enum | - | Manual/CenterScreen/CenterOwner |
| ウィンドウ状態 | 入力 | enum | - | Normal/Minimized/Maximized/FullScreen |
| システム装飾 | 入力 | enum | - | None/BorderOnly/Full |
| 拡張クライアントエリア | 入力 | bool | - | ExtendClientAreaToDecorationsHint |
| リサイズ可否 | 入力 | bool | - | CanResize |
| 最小化可否 | 入力 | bool | - | CanMinimize |
| 最大化可否 | 入力 | bool | - | CanMaximize |

## 表示項目

| 項目名 | コントロール名 | 種別 | 説明 |
|--------|--------------|------|------|
| Window Size | ShowWindowSize | TextBox | ウィンドウサイズ入力（PlaceholderText: "Window Size"） |
| Show Window Mode | ShowWindowMode | ComboBox | 表示モード選択（NonOwned/Owned/Modal） |
| Show Window Location | ShowWindowLocation | ComboBox | 表示位置選択（Manual/CenterScreen/CenterOwner） |
| Show Window State | ShowWindowState | ComboBox | 状態選択（Normal/Minimized/Maximized/FullScreen） |
| Show Window System Decorations | ShowWindowSystemDecorations | ComboBox | 装飾選択（None/BorderOnly/Full） |
| Extend Client Area | ShowWindowExtendClientAreaToDecorationsHint | CheckBox | クライアントエリア拡張設定 |
| Can Resize | ShowWindowCanResize | CheckBox | リサイズ可否（初期値: True） |
| Can Minimize | ShowWindowCanMinimize | CheckBox | 最小化可否（初期値: True） |
| Can Maximize | ShowWindowCanMaximize | CheckBox | 最大化可否（初期値: True） |
| Show Window | ShowWindow | Button | 設定に従ってウィンドウを表示 |
| Send to Back | SendToBack | Button | 全ウィンドウをアクティブ化 |
| Enter Fullscreen | EnterFullscreen | Button | 全画面モードに入る |
| Exit Fullscreen | ExitFullscreen | Button | 全画面モードを終了 |
| Restore All | RestoreAll | Button | 全ウィンドウを復元 |
| Show Topmost Window | ShowTopmostWindow | Button | 最前面ウィンドウを表示 |
| Show Transparent Window | ShowTransparentWindow | Button | 透過ウィンドウを表示 |
| Show Transparent Popup | ShowTransparentPopup | Button | 透過ポップアップを表示 |

## イベント仕様

### 1-ShowWindow_Click

Show Windowボタンがクリックされた際に発火します。

**処理フロー**:
1. ShowWindowSizeからサイズを解析（空の場合はデフォルト）
2. 各設定項目から値を取得してShowWindowTestインスタンスを作成
3. 既存のShowWindowTestの数を確認し、AutomationIdとTitleに番号を付加
4. ExtendClientAreaToDecorationsHint、SystemDecorations、WindowStateを設定
5. 表示モードに応じてShow()/Show(owner)/ShowDialog(owner)を呼び出し

### 2-ShowTransparentWindow_Click

Transparent Windowボタンがクリックされた際に発火します。

**処理フロー**:
1. 背景ウィンドウ（緑色）を作成してCenterOwnerで表示
2. 透過ウィンドウ（赤い円）を作成して背景ウィンドウの所有ウィンドウとして表示
3. 透過ウィンドウのクリックで両ウィンドウを閉じる

### 3-ShowTransparentPopup_Click

Transparent Popupボタンがクリックされた際に発火します。

**処理フロー**:
1. 緑色の背景ウィンドウを作成
2. PopupコントロールをPlacement=AnchorAndGravityで配置
3. ポップアップ内に赤い円のBorderを配置
4. ポップアップのクリックで背景ウィンドウを閉じる

### 4-SendToBack_Click

Send to Backボタンがクリックされた際に発火します。

**処理フロー**:
1. ApplicationLifetimeから全ウィンドウリストを取得
2. 各ウィンドウをActivateして最前面に移動

### 5-EnterFullscreen_Click / ExitFullscreen_Click

フルスクリーン切り替えボタンがクリックされた際に発火します。

**処理フロー**:
1. Window.WindowStateをFullScreen/Normalに設定

### 6-RestoreAll_Click

Restore Allボタンがクリックされた際に発火します。

**処理フロー**:
1. 全ウィンドウをShow()
2. 最小化されているウィンドウをNormal状態に復元

### 7-ShowTopmostWindow_Click

Show Topmost Windowボタンがクリックされた際に発火します。

**処理フロー**:
1. Topmost=trueのオーナーウィンドウを作成
2. オーナーウィンドウの所有ウィンドウとしてOwnedWindowを作成
3. 両ウィンドウを表示

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

本画面はUIテスト用であり、データベースとの連携はありません。

## メッセージ仕様

本画面では明示的なメッセージ表示はありません。

## 例外処理

| 例外状況 | 処理内容 |
|---------|---------|
| WindowPageがWindowにアタッチされていない場合 | AvaloniaInternalExceptionをスロー |

## 備考

- ShowWindowTestとTopmostWindowTestは専用のテスト用ウィンドウクラス
- CanMaximizeはCanResizeがtrueの場合のみ有効
- 透過ウィンドウはTransparencyLevelHint=Transparentで作成
- SystemDecorations=Noneで装飾なしウィンドウを作成可能

---

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

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

### 推奨読解順序

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

ウィンドウ関連の列挙型を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | WindowStartupLocation.cs | `src/Avalonia.Controls/WindowStartupLocation.cs` | ウィンドウ開始位置の列挙型 |
| 1-2 | WindowState.cs | `src/Avalonia.Controls/WindowState.cs` | ウィンドウ状態の列挙型 |
| 1-3 | SystemDecorations.cs | `src/Avalonia.Controls/SystemDecorations.cs` | システム装飾の列挙型 |

**読解のコツ**: ウィンドウの動作は多くの列挙型で制御されます。WindowStartupLocation（Manual/CenterScreen/CenterOwner）、WindowState（Normal/Minimized/Maximized/FullScreen）、SystemDecorations（None/BorderOnly/Full）の組み合わせを理解することが重要です。

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

処理の起点となるXAMLファイルとコードビハインドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | WindowPage.axaml | `samples/IntegrationTestApp/Pages/WindowPage.axaml` | 画面レイアウトと設定項目 |
| 2-2 | WindowPage.axaml.cs | `samples/IntegrationTestApp/Pages/WindowPage.axaml.cs` | イベントハンドラの実装 |

**主要処理フロー**:
1. **行8-35**: 左側のStackPanelに設定項目を配置
2. **行36-45**: 右側のStackPanelにボタンを配置
3. **行23-69**: ShowWindow_Clickでウィンドウを作成・表示
4. **行71-111**: ShowTransparentWindow_Clickで透過ウィンドウを作成
5. **行113-153**: ShowTransparentPopup_Clickで透過ポップアップを作成
6. **行187-202**: ShowTopmostWindow_Clickで最前面ウィンドウを作成

#### Step 3: ウィンドウ表示ロジックを理解する

ウィンドウの表示方法を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Window.cs | `src/Avalonia.Controls/Window.cs` | Windowクラスの実装 |
| 3-2 | ShowWindowTest.axaml | `samples/IntegrationTestApp/ShowWindowTest.axaml` | テスト用ウィンドウ |

**主要処理フロー**:
- **Show()**: 非所有ウィンドウとして表示
- **Show(owner)**: 所有ウィンドウとして表示
- **ShowDialog(owner)**: モーダルダイアログとして表示

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

```
WindowPage
    │
    ├─ ShowWindow_Click()
    │      │
    │      ├─ Size.Parse(ShowWindowSize.Text)
    │      │
    │      ├─ new ShowWindowTest {
    │      │      WindowStartupLocation,
    │      │      CanResize,
    │      │      CanMinimize,
    │      │      CanMaximize
    │      │  }
    │      │
    │      ├─ AutomationProperties.SetAutomationId()
    │      │
    │      └─ switch (ShowWindowMode.SelectedIndex)
    │             ├─ 0: window.Show()
    │             ├─ 1: window.Show(Window)
    │             └─ 2: window.ShowDialog(Window)
    │
    ├─ ShowTransparentWindow_Click()
    │      ├─ backgroundWindow = new Window { Background = Green }
    │      ├─ window = new Window { TransparencyLevelHint = Transparent }
    │      └─ PointerPressed → Close both
    │
    ├─ ShowTransparentPopup_Click()
    │      ├─ backgroundWindow = new Window { Background = Green }
    │      ├─ popup = new Popup { ... }
    │      └─ PointerPressed → Close background
    │
    ├─ SendToBack_Click()
    │      └─ foreach (window) { window.Activate() }
    │
    ├─ EnterFullscreen_Click()
    │      └─ Window.WindowState = FullScreen
    │
    ├─ ExitFullscreen_Click()
    │      └─ Window.WindowState = Normal
    │
    ├─ RestoreAll_Click()
    │      └─ foreach (window) { Show() + WindowState = Normal }
    │
    └─ ShowTopmostWindow_Click()
           ├─ mainWindow = new TopmostWindowTest { Topmost = true }
           ├─ ownedWindow = new TopmostWindowTest { ... }
           └─ mainWindow.Show(), ownedWindow.Show(mainWindow)
```

### データフロー図

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

UI設定項目 ───▶ ShowWindow_Click() ───▶ ShowWindowTestウィンドウ表示
                       │
                       ├─ WindowStartupLocation
                       ├─ WindowState
                       ├─ SystemDecorations
                       ├─ ExtendClientAreaToDecorationsHint
                       ├─ CanResize/CanMinimize/CanMaximize
                       └─ Show mode (NonOwned/Owned/Modal)

Transparent Window ───▶ 背景Window + 透過Window ───▶ 重ね合わせ表示

Topmost Window ───▶ Owner + Owned Window ───▶ 最前面表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| WindowPage.axaml | `samples/IntegrationTestApp/Pages/WindowPage.axaml` | ソース | 画面レイアウト定義（XAML） |
| WindowPage.axaml.cs | `samples/IntegrationTestApp/Pages/WindowPage.axaml.cs` | ソース | イベントハンドラ実装（コードビハインド） |
| ShowWindowTest.axaml | `samples/IntegrationTestApp/ShowWindowTest.axaml` | ソース | テスト用ウィンドウ |
| TopmostWindowTest.axaml | `samples/IntegrationTestApp/TopmostWindowTest.axaml` | ソース | 最前面テスト用ウィンドウ |
| MainWindow.axaml | `samples/IntegrationTestApp/MainWindow.axaml` | ソース | 親ウィンドウ（ナビゲーション） |
| Window.cs | `src/Avalonia.Controls/Window.cs` | ソース | Windowクラスの実装 |
