--- /dev/null
+/*\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