OSDN Git Service

Merge commit '2458eff3aea04f67893bc824b5cf896fbb767332'
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / AppSetting.java
diff --git a/src/main/java/jp/sourceforge/jindolf/AppSetting.java b/src/main/java/jp/sourceforge/jindolf/AppSetting.java
new file mode 100644 (file)
index 0000000..bc6b106
--- /dev/null
@@ -0,0 +1,416 @@
+/*\r
+ * application settings\r
+ *\r
+ * Copyright(c) 2008 olyutorskii\r
+ * $Id: AppSetting.java 977 2010-01-02 15:54:12Z olyutorskii $\r
+ */\r
+\r
+package jp.sourceforge.jindolf;\r
+\r
+import java.awt.Font;\r
+import java.awt.font.FontRenderContext;\r
+import java.io.File;\r
+import jp.sourceforge.jindolf.json.JsBoolean;\r
+import jp.sourceforge.jindolf.json.JsObject;\r
+import jp.sourceforge.jindolf.json.JsPair;\r
+import jp.sourceforge.jindolf.json.JsValue;\r
+\r
+/**\r
+ * アプリケーションの各種設定。\r
+ */\r
+public class AppSetting{\r
+\r
+    private static final String NETCONFIG_FILE = "netconfig.json";\r
+    private static final String HASH_PROXY = "proxy";\r
+\r
+    private static final String TALKCONFIG_FILE = "talkconfig.json";\r
+    private static final String HASH_FONT = "font";\r
+    private static final String HASH_USEBODYICON = "useBodyIcon";\r
+    private static final String HASH_USEMONOTOMB = "useMonoTomb";\r
+    private static final String HASH_SIMPLEMODE = "isSimpleMode";\r
+    private static final String HASH_ALIGNBALOON = "alignBaloonWidth";\r
+\r
+    private OptionInfo optInfo;\r
+\r
+    private boolean useConfigPath;\r
+    private File configPath;\r
+\r
+    private FontInfo fontInfo = FontInfo.DEFAULT_FONTINFO;\r
+\r
+    private int frameWidth  = 800;\r
+    private int frameHeight = 600;\r
+    private int frameXpos = Integer.MIN_VALUE;\r
+    private int frameYpos = Integer.MIN_VALUE;\r
+\r
+    private ProxyInfo proxyInfo = ProxyInfo.DEFAULT;\r
+\r
+    private DialogPref dialogPref = new DialogPref();\r
+\r
+    private JsValue loadedNetConfig;\r
+    private JsValue loadedTalkConfig;\r
+\r
+    /**\r
+     * コンストラクタ。\r
+     */\r
+    public AppSetting(){\r
+        super();\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * コマンドラインオプションからアプリ設定を展開する。\r
+     * @param optionInfo オプション情報\r
+     */\r
+    public void applyOptionInfo(OptionInfo optionInfo){\r
+        this.optInfo = optionInfo;\r
+        applyConfigPathSetting();\r
+        applyFontSetting();\r
+        applyGeometrySetting();\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * 設定格納ディレクトリ関係の設定。\r
+     */\r
+    private void applyConfigPathSetting(){\r
+        CmdOption opt = this.optInfo\r
+                .getExclusiveOption(CmdOption.OPT_CONFDIR,\r
+                                    CmdOption.OPT_NOCONF );\r
+        if(opt == CmdOption.OPT_NOCONF){\r
+            this.useConfigPath = false;\r
+            this.configPath = null;\r
+        }else if(opt == CmdOption.OPT_CONFDIR){\r
+            this.useConfigPath = true;\r
+            String path = this.optInfo.getStringArg(CmdOption.OPT_CONFDIR);\r
+            this.configPath = FileUtils.supplyFullPath(new File(path));\r
+        }else{\r
+            this.useConfigPath = true;\r
+            File path = ConfigFile.getImplicitConfigDirectory();\r
+            this.configPath = path;\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * フォント関係の設定。\r
+     */\r
+    private void applyFontSetting(){\r
+        String fontName = this.optInfo.getStringArg(CmdOption.OPT_INITFONT);\r
+        Boolean useAntiAlias =\r
+                this.optInfo.getBooleanArg(CmdOption.OPT_ANTIALIAS);\r
+        Boolean useFractional =\r
+                this.optInfo.getBooleanArg(CmdOption.OPT_FRACTIONAL);\r
+\r
+        if(fontName != null){\r
+            Font font = Font.decode(fontName);\r
+            this.fontInfo = this.fontInfo.deriveFont(font);\r
+        }\r
+\r
+        if(useAntiAlias != null){\r
+            FontRenderContext context = this.fontInfo.getFontRenderContext();\r
+            FontRenderContext newContext =\r
+                    new FontRenderContext(context.getTransform(),\r
+                                          useAntiAlias.booleanValue(),\r
+                                          context.usesFractionalMetrics() );\r
+            this.fontInfo = this.fontInfo.deriveRenderContext(newContext);\r
+        }\r
+\r
+        if(useFractional != null){\r
+            FontRenderContext context = this.fontInfo.getFontRenderContext();\r
+            FontRenderContext newContext =\r
+                    new FontRenderContext(context.getTransform(),\r
+                                          context.isAntiAliased(),\r
+                                          useFractional.booleanValue() );\r
+            this.fontInfo = this.fontInfo.deriveRenderContext(newContext);\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * ジオメトリ関係の設定。\r
+     */\r
+    private void applyGeometrySetting(){\r
+        Integer ival;\r
+\r
+        ival = this.optInfo.initialFrameWidth();\r
+        if(ival != null) this.frameWidth = ival;\r
+\r
+        ival = this.optInfo.initialFrameHeight();\r
+        if(ival != null) this.frameHeight = ival;\r
+\r
+        ival = this.optInfo.initialFrameXpos();\r
+        if(ival != null) this.frameXpos = ival;\r
+\r
+        ival = this.optInfo.initialFrameYpos();\r
+        if(ival != null) this.frameYpos = ival;\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * 設定格納ディレクトリを返す。\r
+     * @return 設定格納ディレクトリ。\r
+     */\r
+    public File getConfigPath(){\r
+        return this.configPath;\r
+    }\r
+\r
+    /**\r
+     * 設定格納ディレクトリを設定する。\r
+     * @param path 設定格納ディレクトリ\r
+     */\r
+    public void setConfigPath(File path){\r
+        this.configPath = path;\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * 設定格納ディレクトリを使うか否かを返す。\r
+     * @return 使うならtrue\r
+     */\r
+    public boolean useConfigPath(){\r
+        return this.useConfigPath;\r
+    }\r
+\r
+    /**\r
+     * 設定格納ディレクトリを使うか否か設定する。\r
+     * @param need 使うならtrue\r
+     */\r
+    public void setUseConfigPath(boolean need){\r
+        this.useConfigPath = need;\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * 初期のフレーム幅を返す。\r
+     * @return 初期のフレーム幅\r
+     */\r
+    public int initialFrameWidth(){\r
+        return this.frameWidth;\r
+    }\r
+\r
+    /**\r
+     * 初期のフレーム高を返す。\r
+     * @return 初期のフレーム高\r
+     */\r
+    public int initialFrameHeight(){\r
+        return this.frameHeight;\r
+    }\r
+\r
+    /**\r
+     * 初期のフレーム位置のX座標を返す。\r
+     * 特に指示されていなければInteger.MIN_VALUEを返す。\r
+     * @return 初期のフレーム位置のX座標\r
+     */\r
+    public int initialFrameXpos(){\r
+        return this.frameXpos;\r
+    }\r
+\r
+    /**\r
+     * 初期のフレーム位置のY座標を返す。\r
+     * 特に指示されていなければInteger.MIN_VALUEを返す。\r
+     * @return 初期のフレーム位置のY座標\r
+     */\r
+    public int initialFrameYpos(){\r
+        return this.frameYpos;\r
+    }\r
+\r
+    /**\r
+     * フォント設定を返す。\r
+     * @return フォント設定\r
+     */\r
+    public FontInfo getFontInfo(){\r
+        return this.fontInfo;\r
+    }\r
+\r
+    /**\r
+     * フォント設定を更新する。\r
+     * @param fontInfo フォント設定\r
+     */\r
+    public void setFontInfo(FontInfo fontInfo){\r
+        this.fontInfo = fontInfo;\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * プロクシ設定を返す。\r
+     * @return プロクシ設定\r
+     */\r
+    public ProxyInfo getProxyInfo(){\r
+        return this.proxyInfo;\r
+    }\r
+\r
+    /**\r
+     * プロクシ設定を更新する。\r
+     * @param proxyInfo プロクシ設定。nullならプロクシなしと解釈される。\r
+     */\r
+    public void setProxyInfo(ProxyInfo proxyInfo){\r
+        if(proxyInfo == null) this.proxyInfo = ProxyInfo.DEFAULT;\r
+        else                  this.proxyInfo = proxyInfo;\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * 発言表示設定を返す。\r
+     * @return 表示設定\r
+     */\r
+    public DialogPref getDialogPref(){\r
+        return this.dialogPref;\r
+    }\r
+\r
+    /**\r
+     * 発言表示設定を返す。\r
+     * @param pref 表示設定\r
+     */\r
+    public void setDialogPref(DialogPref pref){\r
+        if(pref == null) this.dialogPref = new DialogPref();\r
+        else             this.dialogPref = pref;\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * ネットワーク設定をロードする。\r
+     */\r
+    private void loadNetConfig(){\r
+        if( ! useConfigPath() ) return;\r
+\r
+        JsValue value = ConfigFile.loadJson(new File(NETCONFIG_FILE));\r
+        if(value == null) return;\r
+        this.loadedNetConfig = value;\r
+\r
+        if( ! (value instanceof JsObject) ) return;\r
+        JsObject root = (JsObject) value;\r
+\r
+        value = root.getValue(HASH_PROXY);\r
+        if( ! (value instanceof JsObject) ) return;\r
+        JsObject proxy = (JsObject) value;\r
+\r
+        ProxyInfo info = ProxyInfo.decodeJson(proxy);\r
+\r
+        setProxyInfo(info);\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * 会話表示設定をロードする。\r
+     */\r
+    private void loadTalkConfig(){\r
+        if( ! useConfigPath() ) return;\r
+\r
+        JsValue value = ConfigFile.loadJson(new File(TALKCONFIG_FILE));\r
+        if(value == null) return;\r
+        this.loadedTalkConfig = value;\r
+\r
+        if( ! (value instanceof JsObject) ) return;\r
+        JsObject root = (JsObject) value;\r
+\r
+        value = root.getValue(HASH_FONT);\r
+        if(value instanceof JsObject){\r
+            JsObject font = (JsObject) value;\r
+            FontInfo info = FontInfo.decodeJson(font);\r
+            setFontInfo(info);\r
+            applyFontSetting();\r
+        }\r
+\r
+        DialogPref pref = new DialogPref();\r
+        JsBoolean boolValue;\r
+        value = root.getValue(HASH_USEBODYICON);\r
+        if(value instanceof JsBoolean){\r
+            boolValue = (JsBoolean) value;\r
+            pref.setBodyImageSetting(boolValue.booleanValue());\r
+        }\r
+        value = root.getValue(HASH_USEMONOTOMB);\r
+        if(value instanceof JsBoolean){\r
+            boolValue = (JsBoolean) value;\r
+            pref.setMonoImageSetting(boolValue.booleanValue());\r
+        }\r
+        value = root.getValue(HASH_SIMPLEMODE);\r
+        if(value instanceof JsBoolean){\r
+            boolValue = (JsBoolean) value;\r
+            pref.setSimpleMode(boolValue.booleanValue());\r
+        }\r
+        value = root.getValue(HASH_ALIGNBALOON);\r
+        if(value instanceof JsBoolean){\r
+            boolValue = (JsBoolean) value;\r
+            pref.setAlignBalooonWidthSetting(boolValue.booleanValue());\r
+        }\r
+        setDialogPref(pref);\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * ネットワーク設定をセーブする。\r
+     */\r
+    private void saveNetConfig(){\r
+        if( ! useConfigPath() ) return;\r
+\r
+        JsObject root = new JsObject();\r
+        JsObject proxy = ProxyInfo.buildJson(getProxyInfo());\r
+        root.putValue(HASH_PROXY, proxy);\r
+\r
+        if(this.loadedNetConfig != null){\r
+            if(this.loadedNetConfig.equals(root)) return;\r
+        }\r
+\r
+        ConfigFile.saveJson(new File(NETCONFIG_FILE), root);\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * 会話表示設定をセーブする。\r
+     */\r
+    private void saveTalkConfig(){\r
+        if( ! useConfigPath() ) return;\r
+\r
+        JsObject root = new JsObject();\r
+\r
+        JsObject font = FontInfo.buildJson(getFontInfo());\r
+        root.putValue(HASH_FONT, font);\r
+\r
+        DialogPref pref = getDialogPref();\r
+        JsPair useBodyIcon =\r
+                new JsPair(HASH_USEBODYICON, pref.useBodyImage());\r
+        JsPair useMonoTomb =\r
+                new JsPair(HASH_USEMONOTOMB, pref.useMonoImage());\r
+        JsPair isSimple =\r
+                new JsPair(HASH_SIMPLEMODE, pref.isSimpleMode());\r
+        JsPair alignBaloon =\r
+                new JsPair(HASH_ALIGNBALOON, pref.alignBaloonWidth());\r
+        root.putPair(useBodyIcon);\r
+        root.putPair(useMonoTomb);\r
+        root.putPair(isSimple);\r
+        root.putPair(alignBaloon);\r
+\r
+        if(this.loadedTalkConfig != null){\r
+            if(this.loadedTalkConfig.equals(root)) return;\r
+        }\r
+\r
+        ConfigFile.saveJson(new File(TALKCONFIG_FILE), root);\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * 各種設定を設定格納ディレクトリからロードする。\r
+     */\r
+    public void loadConfig(){\r
+        loadNetConfig();\r
+        loadTalkConfig();\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * 各種設定を設定格納ディレクトリへセーブする。\r
+     */\r
+    public void saveConfig(){\r
+        saveNetConfig();\r
+        saveTalkConfig();\r
+        return;\r
+    }\r
+\r
+}\r