1 package charactermanaj.ui.model;
\r
3 import java.awt.image.BufferedImage;
\r
5 import java.io.IOException;
\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
16 * 壁紙情報から壁紙オブジェクトを作成するファクトリクラス.<br>
\r
19 public class WallpaperFactory {
\r
22 * エラーが発生した場合にハンドリングするインターフェィス.<br>
\r
23 * ハンドラは、そのままエラーを送出するか、もしくは回復して続行させることができる.<br>
\r
26 public interface ErrorHandler {
\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
37 File missingImageFile(WallpaperInfo wallpaperInfo, File file)
\r
38 throws WallpaperFactoryException;
\r
41 * 指定した画像リソースの読み込みに失敗した場合のエラー.<br>
\r
42 * 代わりの画像を指定するかnullを返して画像なしとして扱うか、
\r
43 * もしくは例外を送出することができる.<br>
\r
44 * @param wallpaperInfo 設定対象(回復時には更新可能)
\r
45 * @param imageResource 対象となった画像リソース
\r
47 * @return 代わりの画像、もしくは画像なしとするためにnullを返すことができる
\r
48 * @throws WallpaperFactoryException 例外とする場合
\r
50 BufferedImage imageCreationFailed(WallpaperInfo wallpaperInfo,
\r
51 ImageResource imageResource, Throwable ex)
\r
52 throws WallpaperFactoryException;
\r
55 * その他の内部例外(RuntimeException)が発生した場合のハンドラ.<br>
\r
56 * 代わりの壁紙オブジェクトを返すか、もしくは例外を送出することができる.<br>
\r
57 * @param wallpaperInfo 壁紙情報
\r
58 * @param wallpaper 構築中の壁紙オブジェクト
\r
60 * @return 代わりの壁紙オブジェクト (nullは返してはならない.)
\r
61 * @throws WallpaperFactoryException 例外とする場合
\r
63 Wallpaper internalError(WallpaperInfo wallpaperInfo,
\r
64 Wallpaper wallpaper, Throwable ex)
\r
65 throws WallpaperFactoryException;
\r
69 * 壁紙画像を読み取るためのイメージローダ.<br>
\r
71 private ImageLoaderImpl imageLoader = new ImageLoaderImpl();
\r
76 private static final WallpaperFactory inst = new WallpaperFactory();
\r
79 * エラーを例外として送出する既定のハンドラ.<br>
\r
81 public final ErrorHandler defaultErrorHandler = new WallpaperFactoryDefaultErrorHandler();
\r
83 private WallpaperFactory() {
\r
87 public static WallpaperFactory getInstance() {
\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
101 public Wallpaper createWallpaper(WallpaperInfo wallpaperInfo,
\r
102 ErrorHandler errorHandler) throws WallpaperFactoryException {
\r
103 if (wallpaperInfo == null) {
\r
104 return new Wallpaper();
\r
106 if (errorHandler == null) {
\r
107 errorHandler = defaultErrorHandler;
\r
110 Wallpaper wallpaper = new Wallpaper();
\r
114 WallpaperResourceType typ = wallpaperInfo.getType();
\r
115 ImageResource imageResource = null;
\r
116 if (typ == WallpaperResourceType.FILE) {
\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
125 if (imageFile != null) {
\r
126 imageResource = new FileImageResource(imageFile);
\r
129 } else if (typ == WallpaperResourceType.PREDEFINED) {
\r
131 String resource = wallpaperInfo.getResource();
\r
132 if (resource != null && resource.trim().length() > 0) {
\r
133 imageResource = new EmbeddedImageResource(resource);
\r
136 BufferedImage wallpaperImg = null;
\r
137 if (imageResource != null) {
\r
139 LoadedImage wallpaperLoadedImage = imageLoader.load(imageResource);
\r
140 wallpaperImg = wallpaperLoadedImage.getImage();
\r
142 } catch (IOException ex) {
\r
143 // ハンドラによってエラーを通知するか、もしくは回復する.
\r
144 wallpaperImg = errorHandler.imageCreationFailed(wallpaperInfo, imageResource, ex);
\r
147 wallpaper.setWallpaperImage(wallpaperImg);
\r
150 wallpaper.setWallpaperAlpha(wallpaperInfo.getAlpha());
\r
153 wallpaper.setBackgroundColor(wallpaperInfo.getBackgroundColor());
\r
155 } catch (RuntimeException ex) {
\r
156 // ハンドラによってエラーを通知するか、もしくは回復する.
\r
157 wallpaper = errorHandler.internalError(wallpaperInfo, wallpaper, ex);
\r
158 if (wallpaper == null) {
\r
168 * 壁紙を構築時に問題があった場合に例外を送出するエラーハンドラ.<br>
\r
171 class WallpaperFactoryDefaultErrorHandler implements WallpaperFactory.ErrorHandler {
\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
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
183 public File missingImageFile(WallpaperInfo wallpaperInfo, File file)
\r
184 throws WallpaperFactoryException {
\r
185 throw new WallpaperFactoryException("missing image file: " + file);
\r