OSDN Git Service

・ ver0.996リリース
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / model / AppConfig.java
index 1609d3f..368f9ec 100644 (file)
@@ -11,6 +11,8 @@ import java.io.OutputStream;
 import java.net.URI;\r
 import java.net.URL;\r
 import java.nio.charset.Charset;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
 import java.util.Properties;\r
 import java.util.Set;\r
 import java.util.logging.Level;\r
@@ -23,7 +25,9 @@ import charactermanaj.util.ConfigurationDirUtilities;
 \r
 /**\r
  * アプリケーションの全域にわたる設定.<br>\r
- * アプリケーション設定は、クラスパス上のリソース、コートベース直下のappConfig.xml、ユーザーごとのappConfig.xmlの順に読み込まれます.<br>\r
+ * アプリケーション設定は、クラスパス上のリソース、コートベース直下のappConfig.xml、ユーザーごとのappConfig.xmlの順に読み込まれます\r
+ * .<br>\r
+ *\r
  * @author seraphy\r
  */\r
 public final class AppConfig {\r
@@ -42,22 +46,23 @@ public final class AppConfig {
         * 開発用仕様バージョン番号\r
         */\r
        private static final String DEFAULT_SPECIFICATION_VERSION = "1.0";\r
-       \r
-       \r
+\r
+\r
        /**\r
         * ロガー\r
         */\r
        private static final Logger logger = Logger.getLogger(AppConfig.class.getName());\r
-       \r
-       \r
+\r
+\r
        /**\r
         * シングルトンインスタンス\r
         */\r
        private static final AppConfig singleton = new AppConfig();\r
-       \r
-       \r
+\r
+\r
        /**\r
         * インスタンスを取得する.\r
+        *\r
         * @return インスタンス\r
         */\r
        public static AppConfig getInstance() {\r
@@ -70,15 +75,16 @@ public final class AppConfig {
        private AppConfig() {\r
                loadAppVersions();\r
        }\r
-       \r
+\r
        private String implementationVersion;\r
-       \r
+\r
        private String specificationVersion;\r
-       \r
+\r
        /**\r
         * 実装バージョンを取得する.<br>\r
         * ビルドされたjarパッケージからバージョン情報を取得する.<br>\r
         * クラスパスの実行からのバージョンは常に「develop」となる.<br>\r
+        *\r
         * @return 実装バージョン\r
         */\r
        public String getImplementationVersion() {\r
@@ -89,12 +95,13 @@ public final class AppConfig {
         * 仕様バージョンを取得する.<br>\r
         * ビルドされたjarパッケージからバージョン情報を取得する.<br>\r
         * クラスパスの実行からのバージョンは常に「develop」となる.<br>\r
+        *\r
         * @return 仕様バージョン\r
         */\r
        public String getSpecificationVersion() {\r
                return specificationVersion;\r
        }\r
-       \r
+\r
        /**\r
         * ビルドされたjarパッケージからバージョン情報を取得する.<br>\r
         * クラスパスの実行からのバージョンは常に「develop」となる.<br>\r
@@ -113,27 +120,90 @@ public final class AppConfig {
                                specificationVersion = specVInfo.trim();\r
                        }\r
                }\r
-               \r
+\r
                this.implementationVersion = implementationVersion;\r
                this.specificationVersion = specificationVersion;\r
        }\r
-       \r
+\r
+       /**\r
+        * 設定ファイルの読み込み順序で、読み込むべきURIのリストを返す.<br>\r
+        * <ul>\r
+        * <li>(1) リソース上の/appConfig.xml</li>\r
+        * <li>(2) appConfigFileシステムプロパティで指定されたファイル</li>\r
+        * <li>(3) コードベース下のappConfig.xml</li>\r
+        * <li>(4) アプリケーションデータ保存先のappConfig.xml</li>\r
+        * </ul>\r
+        * appConfigFileシステムプロパティがある場合は、(1)(2)の順。 <br>\r
+        * 指定がない場合は、(1)(3)(4)の順に読み取る.<br>\r
+        *\r
+        * @return 優先順位での設定ファイルの読み込み先URIのリスト\r
+        * @throws IOException\r
+        */\r
+       public List<URI> getCandidateURIs() throws IOException {\r
+               List<URI> uris = new ArrayList<URI>();\r
+               // リソース中の既定\r
+               uris.add(new File(getClass().getResource("/" + CONFIG_NAME).getPath())\r
+                               .toURI());\r
+\r
+               String specifiedAppConfig = System.getProperty("appConfigFile");\r
+               if (specifiedAppConfig != null) {\r
+                       // システムプロパティでappConfig.xmlを明示している場合は、それを読み込む。\r
+                       // (appConfigFileシステムプロパティが空の場合は、リソース埋め込みの既定の設定だけをよみこむ)\r
+                       if (specifiedAppConfig.trim().length() > 0) {\r
+                               File specifiedAppConfigFile = new File(specifiedAppConfig);\r
+                               uris.add(specifiedAppConfigFile.toURI());\r
+                       }\r
+\r
+               } else {\r
+                       // システムプロパティが指定されていない場合は、\r
+                       // コードベース、つぎにユーザーディレクトリの順で読み込む\r
+                       File codeBase = ConfigurationDirUtilities.getApplicationBaseDir();\r
+                       File userDataDir = ConfigurationDirUtilities.getUserDataDir();\r
+\r
+                       // システムプロパティて明示していない場合は、コードベースおよびユーザディレクトリを使用する.\r
+                       uris.add(new File(codeBase, CONFIG_NAME).getCanonicalFile().toURI());\r
+                       uris.add(new File(userDataDir, CONFIG_NAME).toURI());\r
+               }\r
+               return uris;\r
+       }\r
+\r
+       /**\r
+        * 保存先の試行順序ごとのファイルのリスト。\r
+        *\r
+        * @return 保存先(優先順)\r
+        */\r
+       public List<File> getPrioritySaveFileList() {\r
+               ArrayList<File> saveFiles = new ArrayList<File>();\r
+\r
+               String specifiedAppConfig = System.getProperty("appConfigFile");\r
+               if (specifiedAppConfig != null) {\r
+                       // システムプロパティでappConfig.xmlを明示している場合\r
+                       if (specifiedAppConfig.trim().length() > 0) {\r
+                               File specifiedAppConfigFile = new File(specifiedAppConfig);\r
+                               if (!specifiedAppConfigFile.exists()\r
+                                               || specifiedAppConfigFile.canWrite()) {\r
+                                       // まだ存在しないか、書き込み可能である場合のみ候補とする.\r
+                                       saveFiles.add(specifiedAppConfigFile);\r
+                               }\r
+                       }\r
+               } else {\r
+                       // システムプロパティappConfigFileがなければユーザディレクトリへ書き込む\r
+                       // ユーザディレクトリは常に候補とする.\r
+                       File userDataDir = ConfigurationDirUtilities.getUserDataDir();\r
+                       saveFiles.add(new File(userDataDir, CONFIG_NAME));\r
+               }\r
+\r
+               return saveFiles;\r
+       }\r
+\r
        /**\r
         * プロパティをロードする.<br>\r
-        * リソース上の/appConfig.xml、コードベース下のappConfig.xml、アプリケーションデータ保存先のappConfig.xmlの順に読み取る.<br>\r
         * 存在しないか、読み取りに失敗した場合は、該当ファイルはスキップされる.<br>\r
         */\r
        public void loadConfig() {\r
                Properties config = new Properties();\r
                try {\r
-                       File codeBase = ConfigurationDirUtilities.getApplicationBaseDir();\r
-                       File userDataDir = ConfigurationDirUtilities.getUserDataDir();\r
-                       URI[] uris = {\r
-                                       new File(getClass().getResource("/" + CONFIG_NAME).getPath()).toURI(),\r
-                                       new File(codeBase, CONFIG_NAME).getCanonicalFile().toURI(),\r
-                                       new File(userDataDir, CONFIG_NAME).toURI(),\r
-                       };\r
-                       for (URI uri : uris) {\r
+                       for (URI uri : getCandidateURIs()) {\r
                                if (uri == null) {\r
                                        continue; // リソースがない場合はnullになる\r
                                }\r
@@ -157,7 +227,7 @@ public final class AppConfig {
                                        } finally {\r
                                                is.close();\r
                                        }\r
-                                       \r
+\r
                                } catch (FileNotFoundException ex) {\r
                                        logger.log(Level.CONFIG, "appConfig.xml is not found.: " + uri, ex);\r
                                        // 無視する (無い場合は十分にありえるので「情報」レベルでログ。)\r
@@ -176,26 +246,54 @@ public final class AppConfig {
        }\r
 \r
        /**\r
-        * プロパティをアプリケーションデータの保存先に保存する.\r
-        * @throws IOException 保存に失敗した場合\r
+        * プロパティをアプリケーションデータの指定した保存先に保存する.\r
+        *\r
+        * @throws IOException\r
+        *             保存に失敗した場合\r
         */\r
-       public void saveConfig() throws IOException {\r
+       public void saveConfig(List<File> prioritySaveFiles) throws IOException {\r
                Properties config = getProperties();\r
-               \r
-               File userDataDir = ConfigurationDirUtilities.getUserDataDir();\r
-               File configStore = new File(userDataDir, CONFIG_NAME);\r
-               OutputStream os = new BufferedOutputStream(new FileOutputStream(configStore));\r
-               try {\r
-                       config.storeToXML(os, CONFIG_NAME, "UTF-8");\r
-               } finally {\r
-                       os.close();\r
+               IOException oex = null;\r
+               for (File configStore : prioritySaveFiles) {\r
+                       try {\r
+                               OutputStream os = new BufferedOutputStream(\r
+                                               new FileOutputStream(configStore));\r
+                               try {\r
+                                       config.storeToXML(os, CONFIG_NAME, "UTF-8");\r
+                                       return; // 成功した時点で終了\r
+\r
+                               } finally {\r
+                                       os.close();\r
+                               }\r
+\r
+                       } catch (IOException ex) {\r
+                               logger.log(Level.WARNING, "アプリケーション設定の保存に失敗しました" + ex, ex);\r
+                               oex = ex;\r
+                       }\r
+               }\r
+\r
+               // 例外が発生していれば、最後の例外を返す.\r
+               if (oex != null) {\r
+                       throw oex;\r
                }\r
        }\r
-       \r
+\r
+       /**\r
+        * プロパティをアプリケーションデータの保存先に保存する.\r
+        *\r
+        * @throws IOException\r
+        *             保存に失敗した場合\r
+        */\r
+       public void saveConfig() throws IOException {\r
+               saveConfig(getPrioritySaveFileList());\r
+       }\r
+\r
        /**\r
         * Propertiesの値を設定した場合に設定できない項目があるかチェックする.<br>\r
         * このメソッドを呼び出しても、アプリケーション設定自身は何も影響されない.<br>\r
-        * @param props 適用するプロパティ\r
+        *\r
+        * @param props\r
+        *            適用するプロパティ\r
         * @return 設定できなかったプロパティキーのコレクション、問題なければ空が返される.\r
         */\r
        public static Set<String> checkProperties(Properties props) {\r
@@ -208,7 +306,9 @@ public final class AppConfig {
 \r
        /**\r
         * Propertiesの値で設定を更新する.<br>\r
-        * @param props 適用するプロパティ\r
+        *\r
+        * @param props\r
+        *            適用するプロパティ\r
         * @return 設定できなかったプロパティキーのコレクション、問題なければ空が返される.\r
         */\r
        public Set<String> update(Properties props) {\r
@@ -220,6 +320,7 @@ public final class AppConfig {
 \r
        /**\r
         * このアプリケーション設定をプロパティに書き出して返します.<br>\r
+        *\r
         * @return プロパティ\r
         */\r
        public Properties getProperties() {\r
@@ -227,132 +328,140 @@ public final class AppConfig {
                BeanPropertiesUtilities.saveToProperties(this, config);\r
                return config;\r
        }\r
-       \r
+\r
 \r
        /**\r
         * プロファイル選択ダイアログのプロファイルのサンプルイメージの背景色\r
+        *\r
         * @return サンプルイメージの背景色\r
         */\r
        public Color getSampleImageBgColor() {\r
                return sampleImageBgColor;\r
        }\r
-       \r
+\r
        public void setSampleImageBgColor(Color sampleImageBgColor) {\r
                if (sampleImageBgColor == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.sampleImageBgColor = sampleImageBgColor;\r
        }\r
-       \r
+\r
        private Color sampleImageBgColor = Color.white;\r
-       \r
+\r
 \r
        /**\r
         * デフォルトのイメージ背景色を取得する.\r
+        *\r
         * @return デフォルトのイメージ背景色\r
         */\r
        public Color getDefaultImageBgColor() {\r
                return defaultImageBgColor;\r
        }\r
-       \r
+\r
        public void setDefaultImageBgColor(Color defaultImageBgColor) {\r
                if (defaultImageBgColor == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.defaultImageBgColor = defaultImageBgColor;\r
        }\r
-       \r
+\r
        private Color defaultImageBgColor = Color.white;\r
 \r
        /**\r
         * 使用中アイテムの背景色を取得する.\r
+        *\r
         * @return 使用中アイテムの背景色\r
         */\r
        public Color getCheckedItemBgColor() {\r
                return checkedItemBgColor;\r
        }\r
-       \r
+\r
        public void setCheckedItemBgColor(Color checkedItemBgColor) {\r
                if (checkedItemBgColor == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.checkedItemBgColor = checkedItemBgColor;\r
        }\r
-       \r
+\r
        private Color checkedItemBgColor = Color.cyan.brighter();\r
-       \r
-       \r
+\r
+\r
        /**\r
-        * 選択アイテムの背景色を取得する \r
+        *  選択アイテムの背景色を取得する\r
+        *\r
         * @return 選択アイテムの背景色\r
         */\r
        public Color getSelectedItemBgColor() {\r
                return selectedItemBgColor;\r
        }\r
-       \r
+\r
        public void setSelectedItemBgColor(Color selectedItemBgColor) {\r
                this.selectedItemBgColor = selectedItemBgColor;\r
        }\r
-       \r
+\r
        private Color selectedItemBgColor = Color.orange;\r
-       \r
+\r
        /**\r
         * 不備のあるデータ行の背景色を取得する.\r
+        *\r
         * @return 不備のあるデータ行の背景色\r
         */\r
        public Color getInvalidBgColor() {\r
                return invalidBgColor;\r
        }\r
-       \r
+\r
        public void setInvalidBgColor(Color invalidBgColor) {\r
                if (invalidBgColor == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.invalidBgColor = invalidBgColor;\r
        }\r
-       \r
+\r
        private Color invalidBgColor = Color.red.brighter().brighter();\r
 \r
        /**\r
         * JPEG画像変換時の圧縮率を取得する.\r
+        *\r
         * @return 圧縮率\r
         */\r
        public float getCompressionQuality() {\r
                return compressionQuality;\r
        }\r
-       \r
+\r
        public void setCompressionQuality(float compressionQuality) {\r
                if (compressionQuality < .1f || compressionQuality > 1f) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.compressionQuality = compressionQuality;\r
        }\r
-       \r
+\r
        private float compressionQuality = .8f;\r
 \r
        /**\r
         * エクスポートウィザードのプリセットにパーツ不足時の警告色(前景色)を取得する.\r
+        *\r
         * @return エクスポートウィザードのプリセットにパーツ不足時の警告色(前景色)\r
         */\r
        public Color getExportPresetWarningsForegroundColor() {\r
                return exportPresetWarningsForegroundColor;\r
        }\r
-       \r
+\r
        public void setExportPresetWarningsForegroundColor(\r
                        Color exportPresetWarningsForegroundColor) {\r
                this.exportPresetWarningsForegroundColor = exportPresetWarningsForegroundColor;\r
        }\r
-       \r
+\r
        private Color exportPresetWarningsForegroundColor = Color.red;\r
-       \r
+\r
        /**\r
         * JARファイル転送用バッファサイズ.<br>\r
+        *\r
         * @return JARファイル転送用バッファサイズ.\r
         */\r
        public int getJarTransferBufferSize() {\r
                return jarTransferBufferSize;\r
        }\r
-       \r
+\r
        public void setJarTransferBufferSize(int jarTransferBufferSize) {\r
                if (jarTransferBufferSize <= 0) {\r
                        throw new IllegalArgumentException();\r
@@ -361,15 +470,16 @@ public final class AppConfig {
        }\r
 \r
        private int jarTransferBufferSize = 4096;\r
-       \r
+\r
        /**\r
         * ZIPファイル名のエンコーディング.<br>\r
+        *\r
         * @return ZIPファイル名のエンコーディング.<br>\r
         */\r
        public String getZipNameEncoding() {\r
                return zipNameEncoding;\r
        }\r
-       \r
+\r
        public void setZipNameEncoding(String zipNameEncoding) {\r
                if (zipNameEncoding == null) {\r
                        throw new IllegalArgumentException();\r
@@ -381,111 +491,117 @@ public final class AppConfig {
                }\r
                this.zipNameEncoding = zipNameEncoding;\r
        }\r
-       \r
+\r
        private String zipNameEncoding = "csWindows31J";\r
 \r
        /**\r
         * ディセーブルなテーブルのセルのフォアグラウンドカラーを取得する.\r
+        *\r
         * @return ディセーブルなテーブルのセルのフォアグラウンドカラー\r
         */\r
        public Color getDisabledCellForgroundColor() {\r
                return disabledCellForegroundColor;\r
        }\r
-       \r
+\r
        public void setDisabledCellForegroundColor(Color disabledCellForegroundColor) {\r
                if (disabledCellForegroundColor == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.disabledCellForegroundColor = disabledCellForegroundColor;\r
        }\r
-       \r
+\r
        private Color disabledCellForegroundColor = Color.gray;\r
-       \r
-       \r
+\r
+\r
        /**\r
         * ディレクトリを監視する間隔(mSec)を取得する.\r
+        *\r
         * @return ディレクトリを監視する間隔(mSec)\r
         */\r
        public int getDirWatchInterval() {\r
                return dirWatchInterval;\r
        }\r
-       \r
+\r
        public void setDirWatchInterval(int dirWatchInterval) {\r
                if (dirWatchInterval <= 0) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.dirWatchInterval = dirWatchInterval;\r
        }\r
-       \r
+\r
        private int dirWatchInterval = 7 * 1000;\r
-       \r
+\r
        /**\r
         * ディレクトリの監視を有効にするか?\r
+        *\r
         * @return ディレクトリの監視を有効にする場合はtrue\r
         */\r
        public boolean isEnableDirWatch() {\r
                return enableDirWatch;\r
        }\r
-       \r
+\r
        public void setEnableDirWatch(boolean enableDirWatch) {\r
                this.enableDirWatch = enableDirWatch;\r
        }\r
-       \r
+\r
        private boolean enableDirWatch = true;\r
-       \r
+\r
        /**\r
         * ファイル転送に使うバッファサイズ.<br>\r
+        *\r
         * @return バッファサイズ\r
         */\r
        public int getFileTransferBufferSize() {\r
                return fileTransferBufferSize;\r
        }\r
-       \r
+\r
        public void setFileTransferBufferSize(int fileTransferBufferSize) {\r
                if (fileTransferBufferSize <= 0) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.fileTransferBufferSize = fileTransferBufferSize;\r
        }\r
-       \r
+\r
        private int fileTransferBufferSize = 4096;\r
-       \r
+\r
        /**\r
         * プレビューのインジケータを表示するまでのディレイ(mSec)を取得する.\r
+        *\r
         * @return プレビューのインジケータを表示するまでのディレイ(mSec)\r
         */\r
        public long getPreviewIndicatorDelay() {\r
                return previewIndeicatorDelay;\r
        }\r
-       \r
+\r
        public void setPreviewIndeicatorDelay(long previewIndeicatorDelay) {\r
                if (previewIndeicatorDelay < 0) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.previewIndeicatorDelay = previewIndeicatorDelay;\r
        }\r
-       \r
+\r
        private long previewIndeicatorDelay = 300;\r
-       \r
+\r
        /**\r
         * 情報ダイアログの編集ボタンを「開く」アクションにする場合はtrue、「編集」アクションにする場合はfalse\r
+        *\r
         * @return trueならばOpen、falseならばEdit\r
         */\r
        public boolean isInformationDialogOpenMethod() {\r
                return informationDialogOpenMethod;\r
        }\r
-       \r
+\r
        public void setInformationDialogOpenMethod(\r
                        boolean informationDialogOpenMethod) {\r
                this.informationDialogOpenMethod = informationDialogOpenMethod;\r
        }\r
 \r
        private boolean informationDialogOpenMethod = true;\r
-       \r
+\r
        /**\r
         * ログを常に残すか?<br>\r
-        * falseの場合は{@link ApplicationLogHandler}の実装に従って終了時に\r
-        * 必要なければログは削除される.<br>\r
+        * falseの場合は{@link ApplicationLogHandler}の実装に従って終了時に 必要なければログは削除される.<br>\r
+        *\r
         * @return 常に残す場合はtrue、そうでなければfalse\r
         */\r
        public boolean isNoRemoveLog() {\r
@@ -495,41 +611,43 @@ public final class AppConfig {
        public void setNoRemoveLog(boolean noRemoveLog) {\r
                this.noRemoveLog = noRemoveLog;\r
        }\r
-       \r
+\r
        private boolean noRemoveLog = false;\r
 \r
 \r
        /**\r
         * テーブルのグリッド色.<br>\r
+        *\r
         * @return テーブルのグリッド色\r
         */\r
        public Color getGridColor() {\r
                return gridColor;\r
        }\r
-       \r
+\r
        public void setGridColor(Color gridColor) {\r
                if (gridColor == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.gridColor = gridColor;\r
        }\r
-       \r
+\r
        private Color gridColor = Color.gray;\r
 \r
        /**\r
         * カラーダイアログの値が変更されたら、自動的にプレビューを更新するか?\r
+        *\r
         * @return カラーダイアログの値が変更されたら、自動的にプレビューを更新する場合はtrue (デフォルトはtrue)\r
         */\r
        public boolean isEnableAutoColorChange() {\r
                return enableAutoColorChange;\r
        }\r
-       \r
+\r
        public void setEnableAutoColorChange(boolean enableAutoColorChange) {\r
                this.enableAutoColorChange = enableAutoColorChange;\r
        }\r
-       \r
+\r
        private boolean enableAutoColorChange = true;\r
-       \r
+\r
        public void setAuthorEditConflictBgColor(Color authorEditConflictBgColor) {\r
                if (authorEditConflictBgColor == null) {\r
                        throw new IllegalArgumentException();\r
@@ -539,129 +657,345 @@ public final class AppConfig {
 \r
        /**\r
         * パーツの作者編集時に複数作者を選択した場合のに入力ボックスの背景色\r
+        *\r
         * @return 背景色\r
         */\r
        public Color getAuthorEditConflictBgColor() {\r
                return authorEditConflictBgColor;\r
        }\r
-       \r
+\r
        Color authorEditConflictBgColor = Color.yellow;\r
-       \r
-       \r
+\r
+\r
        public void setMainFrameMaxWidth(int width) {\r
                this.mainFrameMaxWidth = width;\r
        }\r
-       \r
+\r
        /**\r
         * メインフレームの初期表示時の最大幅\r
+        *\r
         * @return メインフレームの初期表示時の最大幅\r
         */\r
        public int getMainFrameMaxWidth() {\r
                return mainFrameMaxWidth;\r
        }\r
-       \r
+\r
        private int mainFrameMaxWidth = 800;\r
-       \r
+\r
        public void setMainFrameMaxHeight(int height) {\r
                this.mainFrameMaxHeight = height;\r
        }\r
 \r
        /**\r
         * メインフレームの初期表示時の最大高さ\r
+        *\r
         * @return メインフレームの初期表示時の最大高さ\r
         */\r
        public int getMainFrameMaxHeight() {\r
                return mainFrameMaxHeight;\r
        }\r
-       \r
+\r
        private int mainFrameMaxHeight = 600;\r
-       \r
-       \r
+\r
+\r
        /**\r
         * カラーダイアログで存在しないレイヤーをディセーブルにしない.\r
+        *\r
         * @return ディセーブルにしない場合はtrue\r
         */\r
        public boolean isNotDisableLayerTab() {\r
                return notDisableLayerTab;\r
        }\r
-       \r
+\r
        public void setNotDisableLayerTab(boolean notDisableLayerTab) {\r
                this.notDisableLayerTab = notDisableLayerTab;\r
        }\r
-       \r
+\r
        private boolean notDisableLayerTab;\r
-       \r
+\r
 \r
        /**\r
         * ログを消去する日数.<br>\r
         * この指定日を経過した古いログは削除される.<br>\r
         * 0の場合は削除されない.\r
-        * @return \r
+        *\r
+        * @return\r
         */\r
        public long getPurgeLogDays() {\r
                return purgeLogDays;\r
        }\r
-       \r
+\r
        public void setPurgeLogDays(long purgeLogDays) {\r
                this.purgeLogDays = purgeLogDays;\r
        }\r
-       \r
+\r
        private long purgeLogDays = 10;\r
-       \r
+\r
        public String getPartsColorGroupPattern() {\r
                return partsColorGroupPattern;\r
        }\r
-       \r
+\r
        public void setPartsColorGroupPattern(String pattern) {\r
                if (pattern != null && pattern.trim().length() > 0) {\r
                        Pattern.compile(pattern);\r
                }\r
                partsColorGroupPattern = pattern;\r
        }\r
-       \r
+\r
        private String partsColorGroupPattern = "^.*\\(@\\).*$";\r
-       \r
+\r
        private Color selectPanelTitleColor = Color.BLUE;\r
-       \r
+\r
        public Color getSelectPanelTitleColor() {\r
                return selectPanelTitleColor;\r
        }\r
-       \r
+\r
        public void setSelectPanelTitleColor(Color color) {\r
                if (color == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
                selectPanelTitleColor = color;\r
        }\r
-       \r
+\r
        private boolean enableAutoShrinkPanel;\r
-       \r
+\r
        public boolean isEnableAutoShrinkPanel() {\r
                return enableAutoShrinkPanel;\r
        }\r
-       \r
+\r
        public void setEnableAutoShrinkPanel(boolean enableAutoShrinkPanel) {\r
                this.enableAutoShrinkPanel = enableAutoShrinkPanel;\r
        }\r
-       \r
+\r
        public boolean isDisableWatchDirIfNotWritable() {\r
                return disableWatchDirIfNotWritable;\r
        }\r
-       \r
+\r
        public void setDisableWatchDirIfNotWritable(boolean disableWatchDirIfNotWritable) {\r
                this.disableWatchDirIfNotWritable = disableWatchDirIfNotWritable;\r
        }\r
-       \r
+\r
        private boolean disableWatchDirIfNotWritable = true;\r
-       \r
+\r
        public void setEnablePNGSupportForWindows(boolean enablePNGSupportForWindows) {\r
                this.enablePNGSupportForWindows = enablePNGSupportForWindows;\r
        }\r
-       \r
+\r
        public boolean isEnablePNGSupportForWindows() {\r
                return enablePNGSupportForWindows;\r
        }\r
-       \r
+\r
        private boolean enablePNGSupportForWindows = true;\r
 \r
+       /**\r
+        * 画像表示(通常モード)でオプティマイズを有効にする最大倍率.\r
+        */\r
+       private double renderingOptimizeThresholdForNormal = 2.;\r
+\r
+       public void setRenderingOptimizeThresholdForNormal(\r
+                       double renderingOptimizeThresholdForNormal) {\r
+               this.renderingOptimizeThresholdForNormal = renderingOptimizeThresholdForNormal;\r
+       }\r
+\r
+       public double getRenderingOptimizeThresholdForNormal() {\r
+               return renderingOptimizeThresholdForNormal;\r
+       }\r
+       /**\r
+        * 画像表示(チェックモード)でオプティマイズを有効にする最大倍率.\r
+        */\r
+       private double renderingOptimizeThresholdForCheck = 0.;\r
+\r
+       public void setRenderingOptimizeThresholdForCheck(\r
+                       double renderingOptimizeThresholdForCheck) {\r
+               this.renderingOptimizeThresholdForCheck = renderingOptimizeThresholdForCheck;\r
+       }\r
+\r
+       public double getRenderingOptimizeThresholdForCheck() {\r
+               return renderingOptimizeThresholdForCheck;\r
+       }\r
+\r
+       /**\r
+        * バイキュービックをサポートする場合\r
+        */\r
+       private boolean enableInterpolationBicubic = true;\r
+\r
+       public void setEnableInterpolationBicubic(boolean enableInterpolationBicubic) {\r
+               this.enableInterpolationBicubic = enableInterpolationBicubic;\r
+       }\r
+\r
+       public boolean isEnableInterpolationBicubic() {\r
+               return enableInterpolationBicubic;\r
+       }\r
+\r
+       /**\r
+        * 事前定義済みの倍率候補.<br>\r
+        */\r
+       private String predefinedZoomRanges = "20, 50, 80, 100, 120, 150, 200, 300, 400, 800";\r
+\r
+       public String getPredefinedZoomRanges() {\r
+               return predefinedZoomRanges;\r
+       }\r
+\r
+       public void setPredefinedZoomRanges(String predefinedZoomRanges) {\r
+               this.predefinedZoomRanges = predefinedZoomRanges;\r
+       }\r
+\r
+       /**\r
+        * ズームパネルを初期状態で表示するか?\r
+        */\r
+       private boolean enableZoomPanel = true;\r
+\r
+       public boolean isEnableZoomPanel() {\r
+               return enableZoomPanel;\r
+       }\r
+\r
+       public void setEnableZoomPanel(boolean enableZoomPanel) {\r
+               this.enableZoomPanel = enableZoomPanel;\r
+       }\r
+\r
+       /**\r
+        * ズームパネルをアクティブにする下部範囲\r
+        */\r
+       private int zoomPanelActivationArea = 30;\r
+\r
+       public int getZoomPanelActivationArea() {\r
+               return zoomPanelActivationArea;\r
+       }\r
+\r
+       public void setZoomPanelActivationArea(int zoomPanelActivationArea) {\r
+               this.zoomPanelActivationArea = zoomPanelActivationArea;\r
+       }\r
+\r
+       /**\r
+        * レンダリングヒントを使用するか?\r
+        */\r
+       private boolean enableRenderingHints = true;\r
+\r
+       public void setEnableRenderingHints(boolean enableRenderingHints) {\r
+               this.enableRenderingHints = enableRenderingHints;\r
+       }\r
+\r
+       public boolean isEnableRenderingHints() {\r
+               return enableRenderingHints;\r
+       }\r
+\r
+       /**\r
+        * グリッド描画とマスク\r
+        */\r
+       private int drawGridMask = 2;\r
+\r
+       public int getDrawGridMask() {\r
+               return drawGridMask;\r
+       }\r
+\r
+       public void setDrawGridMask(int drawGridMask) {\r
+               this.drawGridMask = drawGridMask & 0x03;\r
+       }\r
+\r
+       private int previewGridColor = 0x7f7f0000;\r
+\r
+       public int getPreviewGridColor() {\r
+               return previewGridColor;\r
+       }\r
+\r
+       public void setPreviewGridColor(int previewGridColor) {\r
+               this.previewGridColor = previewGridColor;\r
+       }\r
+\r
+       private int previewGridSize = 20;\r
+\r
+       public int getPreviewGridSize() {\r
+               return previewGridSize;\r
+       }\r
+\r
+       public void setPreviewGridSize(int previewGridSize) {\r
+               this.previewGridSize = previewGridSize;\r
+       }\r
+\r
+       /**\r
+        * チェックモード時の余白サイズ(片側)\r
+        */\r
+       private int previewUnfilledSpaceForCheckMode = 0;\r
+\r
+       public int getPreviewUnfilledSpaceForCheckMode() {\r
+               return previewUnfilledSpaceForCheckMode;\r
+       }\r
+\r
+       public void setPreviewUnfilledSpaceForCheckMode(\r
+                       int previewUnfilledSpaceForCheckMode) {\r
+               this.previewUnfilledSpaceForCheckMode = previewUnfilledSpaceForCheckMode;\r
+       }\r
+\r
+       /**\r
+        * チェックモードでツールチップを表示するか?\r
+        */\r
+       private boolean enableCheckInfoTooltip = true;\r
+\r
+       public boolean isEnableCheckInfoTooltip() {\r
+               return enableCheckInfoTooltip;\r
+       }\r
+\r
+       public void setEnableCheckInfoTooltip(boolean enableCheckInfoTooltip) {\r
+               this.enableCheckInfoTooltip = enableCheckInfoTooltip;\r
+       }\r
+\r
+       /**\r
+        * ホイールによるスクロールの単位.<br>\r
+        */\r
+       private int wheelScrollUnit = 10;\r
+\r
+       public int getWheelScrollUnit() {\r
+               return wheelScrollUnit;\r
+       }\r
+\r
+       public void setWheelScrollUnit(int wheelScrollUnit) {\r
+               this.wheelScrollUnit = wheelScrollUnit;\r
+       }\r
+\r
+       /**\r
+        * 壁紙にオフスクリーン描画を使用するか?.<br>\r
+        * (あまり劇的なパフォーマンス効果はない.)\r
+        */\r
+       private boolean enableOffscreenWallpaper = false;\r
+\r
+       public boolean isEnableOffscreenWallpaper() {\r
+               return enableOffscreenWallpaper;\r
+       }\r
+\r
+       public void setEnableOffscreenWallpaper(boolean enableOffscreenWallpaper) {\r
+               this.enableOffscreenWallpaper = enableOffscreenWallpaper;\r
+       }\r
+\r
+       /**\r
+        * 壁紙のオフスクリーンの既定サイズ.\r
+        */\r
+       private int offscreenWallpaperSize = 300;\r
+\r
+       public int getOffscreenWallpaperSize() {\r
+               return offscreenWallpaperSize;\r
+       }\r
+\r
+       public void setOffscreenWallpaperSize(int offscreenWallpaperSize) {\r
+               this.offscreenWallpaperSize = offscreenWallpaperSize;\r
+       }\r
+\r
+       private int randomChooserMaxHistory = 10;\r
+\r
+       public int getRandomChooserMaxHistory() {\r
+               return randomChooserMaxHistory;\r
+       }\r
+\r
+       public void setRandomChooserMaxHistory(int randomChooserMaxHistory) {\r
+               this.randomChooserMaxHistory = randomChooserMaxHistory;\r
+       }\r
+\r
+       private int defaultFontSize = 12;\r
+\r
+       public int getDefaultFontSize() {\r
+               return defaultFontSize;\r
+       }\r
+\r
+       public void setDefaultFontSize(int defaultFontSize) {\r
+               this.defaultFontSize = defaultFontSize;\r
+       }\r
 }\r