OSDN Git Service

Merge commit 'cb03a1ed529387c1084e04e6f141eb9d35d095b8'
[jindolf/Jindolf.git] / src / main / java / jp / sfjp / jindolf / config / AppSetting.java
index 373d209..8ffab6d 100644 (file)
@@ -9,14 +9,29 @@ package jp.sfjp.jindolf.config;
 
 import java.awt.Font;
 import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
 import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+import javax.imageio.ImageIO;
+import jp.sfjp.jindolf.data.Avatar;
 import jp.sfjp.jindolf.data.DialogPref;
 import jp.sfjp.jindolf.glyph.Font2Json;
 import jp.sfjp.jindolf.glyph.FontInfo;
 import jp.sfjp.jindolf.net.ProxyInfo;
+import jp.sfjp.jindolf.view.AvatarPics;
+import jp.sfjp.jindolf.view.LocalAvatarImg;
 import jp.sourceforge.jovsonz.JsBoolean;
 import jp.sourceforge.jovsonz.JsObject;
 import jp.sourceforge.jovsonz.JsPair;
+import jp.sourceforge.jovsonz.JsString;
+import jp.sourceforge.jovsonz.JsTypes;
 import jp.sourceforge.jovsonz.JsValue;
 
 /**
@@ -35,6 +50,12 @@ public class AppSetting{
     private static final String HASH_ALIGNBALOON = "alignBaloonWidth";
     private static final String HASH_PROXY       = "proxy";
 
+    private static final String MSG_NOIMG =
+            "画像ファイル{0}が読み込めないため"
+            + "{1}の表示に代替イメージを使います。";
+
+    private static final Logger LOGGER = Logger.getAnonymousLogger();
+
 
     private final OptionInfo optInfo;
     private final ConfigStore configStore;
@@ -49,6 +70,10 @@ public class AppSetting{
     private JsValue loadedNetConfig;
     private JsValue loadedTalkConfig;
 
+    private final Map<String, BufferedImage> avatarFaceMap = new HashMap<>();
+    private final Map<String, BufferedImage> avatarBodyMap = new HashMap<>();
+
+
     /**
      * コンストラクタ。
      * @param info コマンドライン引数
@@ -334,6 +359,116 @@ public class AppSetting{
     }
 
     /**
+     * JSONをパースしAvatar-Image間マップに反映させる。
+     *
+     * @param json JSON構造
+     * @param map マップ
+     */
+    private void parseImgMap(JsObject json, Map<String, BufferedImage> map){
+        Path imgDir = this.configStore.getLocalImgDir();
+
+        List<JsPair> pairList = json.getPairList();
+        for(JsPair pair : pairList){
+            String avatarId = pair.getName();
+            JsValue value = pair.getValue();
+
+            if(value.getJsTypes() != JsTypes.STRING) continue;
+            JsString sVal = (JsString)value;
+            String imgName = sVal.toRawString();
+
+            Path imgPath = Paths.get(imgName);
+            Path full = imgDir.resolve(imgPath);
+            File file = full.toFile();
+            if(        ! file.isAbsolute()
+                    || ! file.exists()
+                    || ! file.isFile()
+                    || ! file.canRead() ){
+                String msg = MessageFormat.format(
+                        MSG_NOIMG, file.getPath(), avatarId
+                );
+                LOGGER.info(msg);
+                continue;
+            }
+
+            BufferedImage image;
+            try {
+                image = ImageIO.read(file);
+            }catch(IOException e){
+                String msg = MessageFormat.format(
+                        MSG_NOIMG, file.getPath(), avatarId
+                );
+                LOGGER.info(msg);
+                continue;
+            }
+
+            map.put(avatarId, image);
+        }
+
+        return;
+    }
+
+    /**
+     * ローカル画像設定をロードする。
+     */
+    private void loadLocalImageConfig(){
+        JsObject root = this.configStore.loadLocalImgConfig();
+        if(root == null) return;
+
+        JsValue faceConfig = root.getValue("avatarFace");
+        JsValue bodyConfig = root.getValue("avatarBody");
+        if(faceConfig.getJsTypes() != JsTypes.OBJECT) return;
+        if(bodyConfig.getJsTypes() != JsTypes.OBJECT) return;
+
+        JsObject jsonFace = (JsObject) faceConfig;
+        parseImgMap(jsonFace, this.avatarFaceMap);
+
+
+        JsObject jsonBody = (JsObject) bodyConfig;
+        parseImgMap(jsonBody, this.avatarBodyMap);
+
+        return;
+    }
+
+    /**
+     * ローカル代替イメージを画像キャッシュに反映させる。
+     *
+     * @param avatarPics 画像キャッシュ
+     */
+    public void applyLocalImage(AvatarPics avatarPics){
+        BufferedImage graveImage     = this.avatarFaceMap.get("tomb");
+        BufferedImage graveBodyImage = this.avatarBodyMap.get("tomb");
+
+        if(graveImage == null){
+            graveImage = LocalAvatarImg.getGraveImage();
+        }
+        if(graveBodyImage == null){
+            graveBodyImage = LocalAvatarImg.getGraveBodyImage();
+        }
+
+        avatarPics.setGraveImage(graveImage);
+        avatarPics.setGraveBodyImage(graveBodyImage);
+
+        for(Avatar avatar : Avatar.getPredefinedAvatarList()){
+            String avatarId = avatar.getIdentifier();
+
+            BufferedImage faceImage = this.avatarFaceMap.get(avatarId);
+            BufferedImage bodyImage = this.avatarBodyMap.get(avatarId);
+
+            if(faceImage == null){
+                faceImage = LocalAvatarImg.getAvatarFaceImage(avatarId);
+            }
+            if(bodyImage == null){
+                bodyImage = LocalAvatarImg.getAvatarBodyImage(avatarId);
+            }
+
+            avatarPics.setAvatarFaceImage(avatar, faceImage);
+            avatarPics.setAvatarBodyImage(avatar, bodyImage);
+        }
+
+        return;
+    }
+
+    /**
      * ネットワーク設定をセーブする。
      */
     private void saveNetConfig(){
@@ -392,6 +527,7 @@ public class AppSetting{
     public void loadConfig(){
         loadNetConfig();
         loadTalkConfig();
+        loadLocalImageConfig();
         return;
     }