OSDN Git Service

Merge branch 'ビュアーモード' into develop
[strokestylet/CsWin10Desktop3.git] / FDK24 / Activity.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5
6 namespace FDK
7 {
8         public class Activity
9         {
10                 /// <summary>
11                 /// 子リストに Activity を登録すると、活性化・非活性化・デバイス依存リソースの生成・解放が、親と連動するようになる。
12                 /// </summary>
13                 /// <remarks>
14                 /// 子リストには静的・動的の2種類があり、それぞれ以下のように使い分ける。
15                 /// 
16                 /// (A) メンバとして定義する静的な子の場合:
17                 ///      ・子Activity の生成と子リストへの追加は、親Activity のコンストラクタで行う。
18                 ///      ・子リストからの削除は不要。
19                 ///      
20                 /// (B) 活性化時に生成する動的な子の場合:
21                 ///  ・子Activity の生成と子リストへの追加は、親Activity の On活性化() で行う。
22                 ///  ・子リストからの削除は、親Activity の On非活性化() で行う。
23                 ///  
24                 /// </remarks>
25                 public List<Activity> 子リスト { get; } = new List<Activity>();
26
27                 public bool 活性化している { get; private set; } = false; // 派生クラスからも設定は禁止。
28                 public bool 活性化していない
29                 {
30                         get { return !this.活性化している; }
31                         private set { this.活性化している = !value; }  // 派生クラスからも設定は禁止。
32                 }
33                 public bool デバイス依存リソースが生成されている { get; private set; } = false;   // 派生クラスからも設定は禁止。
34                 public bool デバイス依存リソースが生成されていない
35                 {
36                         get { return !this.デバイス依存リソースが生成されている; }
37                         private set { this.デバイス依存リソースが生成されている = !value; }   // 派生クラスからも設定は禁止。
38                 }
39
40                 /// <summary>
41                 /// この Activity を初期化し、進行や描画を行える状態にする。
42                 /// これにはデバイス依存リソースの作成も含まれる。
43                 /// </summary>
44                 public void 活性化する( FDK.メディア.デバイスリソース dr )
45                 {
46                         Debug.Assert( this.活性化していない );
47
48                         // (1) 自分を活性化する。
49                         this.On活性化( dr );
50                         this.活性化している = true;
51
52                         // (2) 自分のデバイス依存リソースを作成する。
53                         this.デバイス依存リソースを作成する( dr, 子へ再帰する: false );  // 自分だけ。
54
55                         // (3) すべての子Activityを活性化し、デバイス依存リソースを作成する。
56                         foreach( var child in this.子リスト )
57                                 child.活性化する( dr );  // この中でデバイス依存リソースが作成される。
58                 }
59
60                 /// <summary>
61                 /// この Activity を終了し、進行や描画を行わない状態に戻す。
62                 /// これにはデバイス依存リソースの解放も含まれる。
63                 /// </summary>
64                 public void 非活性化する( FDK.メディア.デバイスリソース dr )
65                 {
66                         Debug.Assert( this.活性化している );
67
68                         // (1) すべての子Activityのデバイス依存リソースを解放し、非活性化する。
69                         foreach( var child in this.子リスト )
70                                 child.非活性化する( dr ); // この中でデバイス依存リソースも解放される。
71
72                         // (2) 自分のデバイス依存リソースを解放する。
73                         this.デバイス依存リソースを解放する( dr, 子へ再帰する: false );    // 自分だけ。
74
75                         // (3) 自分を非活性化する。
76                         this.On非活性化( dr );
77                         this.活性化していない = true;
78                 }
79
80                 /// <summary>
81                 /// デバイスに依存するリソースを作成する。
82                 /// </summary>
83                 /// <remarks>
84                 /// 活性化時だけではなく、活性化している最中はいつでも
85                 /// (デバイスが再構築またはリサイズされた 後 に)呼び出される可能性がある。
86                 /// </remarks>
87                 public void デバイス依存リソースを作成する( FDK.メディア.デバイスリソース dr, bool 子へ再帰する = true )
88                 {
89                         Debug.Assert( this.活性化している );
90                         Debug.Assert( this.デバイス依存リソースが生成されていない );   // 多重呼び出しは NG。
91
92                         // (1) 自分のデバイス依存リソースを生成する。
93                         this.Onデバイス依存リソースの作成( dr );
94                         this.デバイス依存リソースが生成されている = true;
95
96                         if( 子へ再帰する )
97                         {
98                                 // (2) すべての子Activityのデバイス依存リソースを生成する。
99                                 foreach( var child in this.子リスト )
100                                         child.デバイス依存リソースを作成する( dr, 子へ再帰する );
101                         }
102                 }
103
104                 /// <summary>
105                 /// デバイスに依存するリソースを解放する。
106                 /// </summary>
107                 /// <remarks>
108                 /// 非活性化時だけではなく、活性化している最中はいつでも
109                 /// (デバイスが再構築またはリサイズされる 前 に)呼び出される可能性がある。
110                 /// </remarks>
111                 public void デバイス依存リソースを解放する( FDK.メディア.デバイスリソース dr, bool 子へ再帰する = true )
112                 {
113                         Debug.Assert( this.活性化している );
114                         Debug.Assert( this.デバイス依存リソースが生成されている );   // 多重呼び出しは NG。
115
116                         if( 子へ再帰する )
117                         {
118                                 // (1) すべての子Activityのデバイス依存リソースを解放する。
119                                 foreach( var child in this.子リスト )
120                                         child.デバイス依存リソースを解放する( dr, 子へ再帰する );
121                         }
122
123                         // (2) 自分のデバイス依存リソースを解放する。
124                         this.Onデバイス依存リソースの解放( dr );
125                         this.デバイス依存リソースが生成されていない = true;
126                 }
127
128                 /* public void 進行描画する( FDK.メディア.デバイスリソース dr )
129                 {
130                         // このクラスでは、進行描画用の共通メソッドは定義しない。
131                         // (派生クラスにより引数がいろいろ変わるので、共通して定義する意味が薄い。)
132                         
133                         // 以下は、推奨される実装の一部。
134
135                         // 活性化していないときに呼び出しがあるならコーディングミス。
136                         Debug.Assert( this.活性化していない );
137                 
138                         // デバイス依存リソースが使えないなら何もしない(デバイス再構築またはリサイズ中)。
139                         if( this.デバイス依存リソースが解放済みである )
140                                 return;
141                 }
142                 */
143
144                 // 以下、派生クラスでオーバーライドするもの。
145
146                 protected virtual void On活性化( FDK.メディア.デバイスリソース dr )
147                 {
148                 }
149                 protected virtual void On非活性化( FDK.メディア.デバイスリソース dr )
150                 {
151                 }
152                 protected virtual void Onデバイス依存リソースの作成( FDK.メディア.デバイスリソース dr )
153                 {
154                 }
155                 protected virtual void Onデバイス依存リソースの解放( FDK.メディア.デバイスリソース dr )
156                 {
157                 }
158         }
159 }