OSDN Git Service

935005a021416a873c1d4549681313433405cd2a
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / ui / model / WallpaperFactory.java
1 package charactermanaj.ui.model;\r
2 \r
3 import java.awt.image.BufferedImage;\r
4 import java.io.File;\r
5 import java.io.IOException;\r
6 \r
7 import charactermanaj.graphics.io.EmbeddedImageResource;\r
8 import charactermanaj.graphics.io.FileImageResource;\r
9 import charactermanaj.graphics.io.ImageLoaderImpl;\r
10 import charactermanaj.graphics.io.ImageResource;\r
11 import charactermanaj.graphics.io.LoadedImage;\r
12 import charactermanaj.ui.Wallpaper;\r
13 import charactermanaj.ui.model.WallpaperInfo.WallpaperResourceType;\r
14 \r
15 /**\r
16  * 壁紙情報から壁紙オブジェクトを作成するファクトリクラス.<br>\r
17  * @author seraphy\r
18  */\r
19 public class WallpaperFactory {\r
20         \r
21         /**\r
22          * エラーが発生した場合にハンドリングするインターフェィス.<br>\r
23          * ハンドラは、そのままエラーを送出するか、もしくは回復して続行させることができる.<br>\r
24          * @author seraphy\r
25          */\r
26         public interface ErrorHandler {\r
27 \r
28                 /**\r
29                  * 指定された壁紙ファイルが、ファイルとして実在しない場合のエラー.<br>\r
30                  * 代わりのファイルを指定するかnullを返して画像なしとして扱うか、\r
31                  * もしくは例外を送出することができる.<br>\r
32                  * @param wallpaperInfo 設定対象(回復時には更新可能)\r
33                  * @param file 対象となったファイル\r
34                  * @return 読み替えるファイル、nullの場合は画像なしとみなす.\r
35                  * @throws WallpaperFactoryException 例外とする場合\r
36                  */\r
37                 File missingImageFile(WallpaperInfo wallpaperInfo, File file)\r
38                                 throws WallpaperFactoryException;\r
39 \r
40                 /**\r
41                  * 指定した画像リソースの読み込みに失敗した場合のエラー.<br>\r
42                  * 代わりの画像を指定するかnullを返して画像なしとして扱うか、\r
43                  * もしくは例外を送出することができる.<br>\r
44                  * @param wallpaperInfo 設定対象(回復時には更新可能)\r
45                  * @param imageResource 対象となった画像リソース\r
46                  * @param ex 失敗事由\r
47                  * @return 代わりの画像、もしくは画像なしとするためにnullを返すことができる\r
48                  * @throws WallpaperFactoryException 例外とする場合\r
49                  */\r
50                 BufferedImage imageCreationFailed(WallpaperInfo wallpaperInfo,\r
51                                 ImageResource imageResource, Throwable ex)\r
52                                 throws WallpaperFactoryException;\r
53 \r
54                 /**\r
55                  * その他の内部例外(RuntimeException)が発生した場合のハンドラ.<br>\r
56                  * 代わりの壁紙オブジェクトを返すか、もしくは例外を送出することができる.<br>\r
57                  * @param wallpaperInfo 壁紙情報\r
58                  * @param wallpaper 構築中の壁紙オブジェクト\r
59                  * @param ex 発生した例外\r
60                  * @return 代わりの壁紙オブジェクト (nullは返してはならない.)\r
61                  * @throws WallpaperFactoryException 例外とする場合\r
62                  */\r
63                 Wallpaper internalError(WallpaperInfo wallpaperInfo,\r
64                                 Wallpaper wallpaper, Throwable ex)\r
65                                 throws WallpaperFactoryException;\r
66         }\r
67         \r
68         /**\r
69          * 壁紙画像を読み取るためのイメージローダ.<br>\r
70          */\r
71         private ImageLoaderImpl imageLoader = new ImageLoaderImpl();\r
72 \r
73         /**\r
74          * シングルトン\r
75          */\r
76         private static final WallpaperFactory inst = new WallpaperFactory();\r
77 \r
78         /**\r
79          * エラーを例外として送出する既定のハンドラ.<br>\r
80          */\r
81         public final ErrorHandler defaultErrorHandler = new WallpaperFactoryDefaultErrorHandler();\r
82         \r
83         private WallpaperFactory() {\r
84                 super();\r
85         }\r
86         \r
87         public static WallpaperFactory getInstance() {\r
88                 return inst;\r
89         }\r
90 \r
91         /**\r
92          * 壁紙情報から壁紙オブジェクトを作成して返します.<br>\r
93          * 壁紙情報に不備があるか何らかの問題により壁紙が作成できない場合はエラーハンドラが呼び出されます.<br>\r
94          * エラーハンドラは例外を送出するか、もしくは回復して続行させることができます.<br>\r
95          * 引数に渡される壁紙情報はエラーハンドラにより修復される可能性があります.<br>\r
96          * @param wallpaperInfo 壁紙情報、nullの場合はデフォルト設定が用いられる.\r
97          * @param errorHandler エラーハンドラ、省略した場合は{@link #DEFAULT_ERROR_HANDLER}が用いられる.\r
98          * @return 生成された壁紙オブジェクト\r
99          * @throws WallpaperFactoryException 壁紙オブジェクトの生成に失敗したことを通知する例外\r
100          */\r
101         public Wallpaper createWallpaper(WallpaperInfo wallpaperInfo,\r
102                         ErrorHandler errorHandler) throws WallpaperFactoryException {\r
103                 if (wallpaperInfo == null) {\r
104                         return new Wallpaper();\r
105                 }\r
106                 if (errorHandler == null) {\r
107                         errorHandler = defaultErrorHandler;\r
108                 }\r
109                 \r
110                 Wallpaper wallpaper = new Wallpaper();\r
111 \r
112                 try {\r
113                         // 背景画像の設定.\r
114                         WallpaperResourceType typ = wallpaperInfo.getType();\r
115                         ImageResource imageResource = null;\r
116                         if (typ == WallpaperResourceType.FILE) {\r
117                                 // 選択ファイルから\r
118                                 File imageFile = wallpaperInfo.getFile();\r
119                                 if (imageFile == null || !imageFile.exists() || !imageFile.isFile()\r
120                                                 || !imageFile.canRead()) {\r
121                                         // ハンドラによってエラーを通知するか、もしくは回復する.\r
122                                         imageFile = errorHandler.missingImageFile(wallpaperInfo,\r
123                                                         imageFile);\r
124                                 }\r
125                                 if (imageFile != null) {\r
126                                         imageResource = new FileImageResource(imageFile);\r
127                                 }\r
128         \r
129                         } else if (typ == WallpaperResourceType.PREDEFINED) {\r
130                                 // リソースファイルから\r
131                                 String resource = wallpaperInfo.getResource();\r
132                                 if (resource != null && resource.trim().length() > 0) {\r
133                                         imageResource = new EmbeddedImageResource(resource);\r
134                                 }\r
135                         }\r
136                         BufferedImage wallpaperImg = null;\r
137                         if (imageResource != null) {\r
138                                 try {\r
139                                         LoadedImage wallpaperLoadedImage = imageLoader.load(imageResource);\r
140                                         wallpaperImg = wallpaperLoadedImage.getImage();\r
141         \r
142                                 } catch (IOException ex) {\r
143                                         // ハンドラによってエラーを通知するか、もしくは回復する.\r
144                                         wallpaperImg = errorHandler.imageCreationFailed(wallpaperInfo, imageResource, ex);\r
145                                 }\r
146                         }\r
147                         wallpaper.setWallpaperImage(wallpaperImg);\r
148         \r
149                         // アルファ値\r
150                         wallpaper.setWallpaperAlpha(wallpaperInfo.getAlpha());\r
151                         \r
152                         // 背景色\r
153                         wallpaper.setBackgroundColor(wallpaperInfo.getBackgroundColor());\r
154                 \r
155                 } catch (RuntimeException ex) {\r
156                         // ハンドラによってエラーを通知するか、もしくは回復する.\r
157                         wallpaper = errorHandler.internalError(wallpaperInfo, wallpaper, ex);\r
158                         if (wallpaper == null) {\r
159                                 throw ex;\r
160                         }\r
161                 }\r
162 \r
163                 return wallpaper;\r
164         }\r
165 }\r
166 \r
167 /**\r
168  * 壁紙を構築時に問題があった場合に例外を送出するエラーハンドラ.<br>\r
169  * @author seraphy\r
170  */\r
171 class WallpaperFactoryDefaultErrorHandler implements WallpaperFactory.ErrorHandler {\r
172 \r
173         public BufferedImage imageCreationFailed(WallpaperInfo wallpaperInfo,\r
174                         ImageResource imageResource, Throwable ex) throws WallpaperFactoryException {\r
175                 throw new WallpaperFactoryException("image creation failed: " + imageResource, ex);\r
176         }\r
177         \r
178         public Wallpaper internalError(WallpaperInfo wallpaperInfo,\r
179                         Wallpaper wallpaper, Throwable ex) throws WallpaperFactoryException {\r
180                 throw new WallpaperFactoryException("internal error: " + (ex == null ? "" : ex.getMessage()), ex);\r
181         }\r
182         \r
183         public File missingImageFile(WallpaperInfo wallpaperInfo, File file)\r
184                         throws WallpaperFactoryException {\r
185                 throw new WallpaperFactoryException("missing image file: " + file);\r
186         }\r
187 }\r
188 \r