# 画面設計書 89-ShowWindowTest

## 概要

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

### 本画面の処理概要

このウィンドウは、Avaloniaフレームワークのウィンドウ表示・制御機能をテストするための専用ウィンドウです。ウィンドウのクライアントサイズ、フレームサイズ、位置、スクリーン情報、スケーリング、ウィンドウ状態、システム装飾、タイトルバー拡張などの各種プロパティをリアルタイムで監視・変更できます。マウスイベントのカウントやMeasureBorderによる測定も行います。

**業務上の目的・背景**：
Avaloniaフレームワークのウィンドウ関連機能の統合テストを実行するためのテストウィンドウです。ウィンドウサイズ、位置、状態の変更が正しく動作するか、プラットフォーム固有の動作（macOSのウィンドウ順序など）を検証するために使用されます。

**画面へのアクセス方法**：
IntegrationTestAppメインウィンドウのWindowPageから、またはプログラムから直接ShowWindowTestをインスタンス化して表示します。

**主要な操作・処理内容**：
1. クライアントサイズ、フレームサイズ、位置、スクリーン情報、スケーリングのリアルタイム表示
2. WindowStateのComboBox選択による状態変更（Normal/Minimized/Maximized/FullScreen）
3. SystemDecorationsのComboBox選択による装飾変更（None/BorderOnly/Full）
4. ExtendClientAreaToDecorationsHintのCheckBoxによるタイトルバー拡張
5. マウス移動/押下/解放/ダブルクリックのイベントカウント表示
6. Hide/AddToWidth/AddToHeightボタンによるウィンドウ操作
7. macOS固有のウィンドウ順序表示（タイマー更新）

**画面遷移**：
- 遷移元：IntegrationTestApp WindowPage
- 遷移先：なし（単独のテストウィンドウ）

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 42 | Window | 主機能 | ウィンドウ表示テスト、サイズ・位置・状態の制御 |
| 52 | MouseDevice | 補助機能 | マウスイベント（移動/押下/解放）のカウント |

## 画面種別

テスト / インタラクティブ

## URL/ルーティング

独立したウィンドウ（コードから直接表示）

## 入出力項目

| 項目名 | 入出力 | 型 | 説明 |
|--------|--------|-----|------|
| WindowState | 入力 | ComboBox | ウィンドウ状態の選択（Normal/Minimized/Maximized/FullScreen） |
| SystemDecorations | 入力 | ComboBox | システム装飾の選択（None/BorderOnly/Full） |
| ExtendClientAreaToDecorationsHint | 入力 | CheckBox | タイトルバー拡張のON/OFF |
| HideButton | 入力 | Button | ウィンドウを非表示にする |
| AddToWidth | 入力 | Button | 幅を10px追加 |
| AddToHeight | 入力 | Button | 高さを10px追加 |

## 表示項目

| 項目名 | データ型 | 説明 |
|--------|----------|------|
| CurrentClientSize | TextBox | 現在のクライアントサイズ（読み取り専用） |
| CurrentFrameSize | TextBox | 現在のフレームサイズ（読み取り専用） |
| CurrentPosition | TextBox | 現在のウィンドウ位置（読み取り専用） |
| CurrentOwnerRect | TextBox | オーナーウィンドウの矩形（読み取り専用） |
| CurrentScreenRect | TextBox | 現在のスクリーン作業領域（読み取り専用） |
| CurrentScaling | TextBox | 現在のDPIスケーリング（読み取り専用） |
| CurrentOrder（macOS） | TextBox | ウィンドウ順序（読み取り専用、macOSのみ） |
| CurrentMeasuredWithText | TextBlock | MeasureBorderの測定サイズ |
| MouseMoveCount | TextBox | マウス移動イベントカウント |
| MouseDownCount | TextBox | マウス押下イベントカウント |
| MouseReleaseCount | TextBox | マウス解放イベントカウント |
| DoubleClickCount | TextBox | ダブルクリックイベントカウント |
| TitleAreaControl | Grid | タイトルバー領域コントロール（初期非表示） |

## イベント仕様

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

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

- **トリガー**：ウィンドウのインスタンス化時
- **処理内容**：
  1. InitializeComponent()でXAMLリソースを読み込み
  2. DataContext = thisでウィンドウ自身をDataContextに設定
  3. PositionChangedイベントハンドラを登録
  4. PointerMoved/PointerPressed/PointerReleased/PointerExited/DoubleTappedイベントを登録
  5. macOS環境の場合、250ms間隔のDispatcherTimerを開始

### 2-OnOpened

ウィンドウが開かれた際のイベントです。

- **トリガー**：ウィンドウのShowまたはShowDialog完了時
- **処理内容**：
  1. DesktopScalingを取得
  2. CurrentPositionにPosition値を設定
  3. CurrentScreenRectにスクリーン作業領域を設定
  4. CurrentScalingにスケーリング値を設定
  5. Ownerがある場合、CurrentOwnerRectにオーナー情報を設定

### 3-ポインターイベント

マウス/ポインターイベントのカウントを行います。

- **トリガー**：マウス移動/押下/解放/ダブルタップ
- **処理内容**：
  1. 各カウンター変数をインクリメント
  2. UpdateCounterDisplays()で表示を更新

### 4-PointerExited

ポインターがウィンドウ外に出た際のイベントです。

- **トリガー**：マウスがウィンドウ領域外に移動
- **処理内容**：
  1. ResetCounters()で全カウンターを0にリセット

### 5-AddToWidth_Click / AddToHeight_Click

サイズ変更ボタンのクリックイベントです。

- **トリガー**：AddToWidth/AddToHeightボタンのクリック
- **処理内容**：
  1. Width/Heightを現在値+10に設定

### 6-TimerOnTick（macOSのみ）

macOS環境でのウィンドウ順序更新タイマーです。

- **トリガー**：250msごと（macOSのみ）
- **処理内容**：
  1. MacOSIntegration.GetOrderedIndex(this)でウィンドウ順序を取得
  2. CurrentOrderに表示

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

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

## メッセージ仕様

本画面はシステムメッセージを表示しません。各種状態はテキストボックスで表示されます。

## 例外処理

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

## 備考

- MeasureBorderはカスタムBorderクラスで、MeasureOverrideをオーバーライドして測定サイズを記録
- macOSではMacOSIntegration.GetOrderedIndexでウィンドウのZ順序を取得可能
- PointerExitedでカウンターをリセットするのはテスト用の動作
- TitleAreaControlは初期非表示で、ShowTitleAreaControl()で表示可能

---

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

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

### 推奨読解順序

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

MeasureBorderカスタムコントロールとウィンドウプロパティのバインディングを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | ShowWindowTest.axaml.cs | `samples/IntegrationTestApp/ShowWindowTest.axaml.cs` | 行11-28でMeasureBorderクラスを確認 |

**読解のコツ**: MeasureBorderはMeasuredWithプロパティで測定サイズを公開するカスタムBorderです。

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

コンストラクタでのイベント登録を確認します。

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

**主要処理フロー**:
- **行40-42**: InitializeComponent()とDataContext設定
- **行43**: PositionChangedイベント登録
- **行45-49**: ポインターイベント登録
- **行51-57**: macOS環境でのタイマー設定

#### Step 3: XAMLレイアウトを理解する

ウィンドウのUI構成とデータバインディングを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | ShowWindowTest.axaml | `samples/IntegrationTestApp/ShowWindowTest.axaml` | 行1-86で全体構造を確認 |

**主要処理フロー**:
- **行9-15**: TitleAreaControl（非表示のタイトルバー領域）
- **行17**: MeasureBorderでコンテンツをラップ
- **行18-52**: WindowStateやSystemDecorationsのバインディング
- **行65-75**: マウスイベントカウント表示
- **行77-81**: ボタン群（Hide/AddToWidth/AddToHeight）

#### Step 4: イベントハンドラを理解する

ポインターイベントとカウンター更新ロジックを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | ShowWindowTest.axaml.cs | `samples/IntegrationTestApp/ShowWindowTest.axaml.cs` | 行89-140でイベントハンドラを確認 |

**主要処理フロー**:
- **行89-93**: OnPointerMoved
- **行95-99**: OnPointerPressed
- **行101-105**: OnPointerReleased
- **行107-114**: ResetCounters
- **行116-120**: OnDoubleTapped
- **行122-140**: UpdateCounterDisplays

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

```
ShowWindowTest (Window)
    │
    ├─ コンストラクタ
    │      ├─ InitializeComponent()
    │      ├─ DataContext = this
    │      ├─ PositionChanged += ...
    │      ├─ PointerMoved += OnPointerMoved
    │      ├─ PointerPressed += OnPointerPressed
    │      ├─ PointerReleased += OnPointerReleased
    │      ├─ PointerExited += ResetCounters
    │      ├─ DoubleTapped += OnDoubleTapped
    │      └─ [macOS] DispatcherTimer.Start()
    │
    ├─ MeasureBorder (カスタムコントロール)
    │      └─ MeasureOverride → MeasuredWith更新
    │
    ├─ OnOpened
    │      └─ Position/Screen/Scaling/OwnerRect設定
    │
    ├─ ポインターイベント
    │      ├─ OnPointerMoved → _mouseMoveCount++
    │      ├─ OnPointerPressed → _mouseDownCount++
    │      ├─ OnPointerReleased → _mouseReleaseCount++
    │      ├─ OnDoubleTapped → _doubleClickCount++
    │      └─ UpdateCounterDisplays()
    │
    ├─ PointerExited
    │      └─ ResetCounters() → 全カウンター=0
    │
    ├─ AddToWidth_Click
    │      └─ Width = Bounds.Width + 10
    │
    └─ AddToHeight_Click
           └─ Height = Bounds.Height + 10
```

### データフロー図

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

ウィンドウ表示   ─▶ OnOpened                 ─▶ Position/Screen/Scaling表示
                        │
                        ▼
マウス操作       ─▶ ポインターイベント        ─▶ カウンター表示
                        │
                        ▼
ComboBox選択     ─▶ バインディング更新        ─▶ WindowState/Decorations変更
                        │
                        ▼
ボタンクリック   ─▶ Width/Height変更          ─▶ ウィンドウサイズ変更
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| ShowWindowTest.axaml | `samples/IntegrationTestApp/ShowWindowTest.axaml` | テンプレート | ウィンドウテストのUIレイアウト |
| ShowWindowTest.axaml.cs | `samples/IntegrationTestApp/ShowWindowTest.axaml.cs` | ソース | イベント処理、カウンター管理、MeasureBorder定義 |
| MainWindow.axaml | `samples/IntegrationTestApp/MainWindow.axaml` | テンプレート | メインウィンドウ（遷移元） |
