OSDN Git Service

eae737dc3e6cf349fab15a7c978f8124375c0753
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / model / AppConfig.java
1 package charactermanaj.model;\r
2 \r
3 import java.awt.Color;\r
4 import java.io.BufferedOutputStream;\r
5 import java.io.File;\r
6 import java.io.FileNotFoundException;\r
7 import java.io.FileOutputStream;\r
8 import java.io.IOException;\r
9 import java.io.InputStream;\r
10 import java.io.OutputStream;\r
11 import java.net.URI;\r
12 import java.net.URL;\r
13 import java.nio.charset.Charset;\r
14 import java.util.ArrayList;\r
15 import java.util.List;\r
16 import java.util.Properties;\r
17 import java.util.Set;\r
18 import java.util.logging.Level;\r
19 import java.util.logging.Logger;\r
20 import java.util.regex.Pattern;\r
21 \r
22 import charactermanaj.util.ApplicationLogHandler;\r
23 import charactermanaj.util.BeanPropertiesUtilities;\r
24 import charactermanaj.util.ConfigurationDirUtilities;\r
25 \r
26 /**\r
27  * アプリケーションの全域にわたる設定.<br>\r
28  * アプリケーション設定は、クラスパス上のリソース、コートベース直下のappConfig.xml、ユーザーごとのappConfig.xmlの順に読み込まれます\r
29  * .<br>\r
30  * \r
31  * @author seraphy\r
32  */\r
33 public final class AppConfig {\r
34 \r
35         /**\r
36          * アプリケーション設定ファイルの名前\r
37          */\r
38         private static final String CONFIG_NAME = "appConfig.xml";\r
39 \r
40         /**\r
41          * 全ユーザー用キャラクターディレクトリのシステムプロパティのキー名.<br>\r
42          */\r
43         public static final String COMMON_CHARACTER_DIR_PROPERTY_NAME = "character.dir";\r
44 \r
45         /**\r
46          * 開発用仕様バージョン番号\r
47          */\r
48         private static final String DEFAULT_SPECIFICATION_VERSION = "1.0";\r
49         \r
50         \r
51         /**\r
52          * ロガー\r
53          */\r
54         private static final Logger logger = Logger.getLogger(AppConfig.class.getName());\r
55         \r
56         \r
57         /**\r
58          * シングルトンインスタンス\r
59          */\r
60         private static final AppConfig singleton = new AppConfig();\r
61         \r
62         \r
63         /**\r
64          * インスタンスを取得する.\r
65          * \r
66          * @return インスタンス\r
67          */\r
68         public static AppConfig getInstance() {\r
69                 return singleton;\r
70         }\r
71 \r
72         /**\r
73          * プライベートコンストラクタ\r
74          */\r
75         private AppConfig() {\r
76                 loadAppVersions();\r
77         }\r
78         \r
79         private String implementationVersion;\r
80         \r
81         private String specificationVersion;\r
82         \r
83         /**\r
84          * 実装バージョンを取得する.<br>\r
85          * ビルドされたjarパッケージからバージョン情報を取得する.<br>\r
86          * クラスパスの実行からのバージョンは常に「develop」となる.<br>\r
87          * \r
88          * @return 実装バージョン\r
89          */\r
90         public String getImplementationVersion() {\r
91                 return implementationVersion;\r
92         }\r
93 \r
94         /**\r
95          * 仕様バージョンを取得する.<br>\r
96          * ビルドされたjarパッケージからバージョン情報を取得する.<br>\r
97          * クラスパスの実行からのバージョンは常に「develop」となる.<br>\r
98          * \r
99          * @return 仕様バージョン\r
100          */\r
101         public String getSpecificationVersion() {\r
102                 return specificationVersion;\r
103         }\r
104         \r
105         /**\r
106          * ビルドされたjarパッケージからバージョン情報を取得する.<br>\r
107          * クラスパスの実行からのバージョンは常に「develop」となる.<br>\r
108          */\r
109         private void loadAppVersions() {\r
110                 Package pak = this.getClass().getPackage();\r
111                 String implementationVersion = "develop";\r
112                 String specificationVersion = DEFAULT_SPECIFICATION_VERSION;\r
113                 if (pak != null) {\r
114                         String vInfo = pak.getImplementationVersion();\r
115                         if (vInfo != null && implementationVersion.trim().length() > 0) {\r
116                                 implementationVersion = vInfo.trim();\r
117                         }\r
118                         String specVInfo = pak.getSpecificationVersion();\r
119                         if (specVInfo != null && specVInfo.trim().length() > 0) {\r
120                                 specificationVersion = specVInfo.trim();\r
121                         }\r
122                 }\r
123                 \r
124                 this.implementationVersion = implementationVersion;\r
125                 this.specificationVersion = specificationVersion;\r
126         }\r
127         \r
128         /**\r
129          * 設定ファイルの読み込み順序で、読み込むべきURIのリストを返す.<br>\r
130          * <ul>\r
131          * <li>(1) リソース上の/appConfig.xml</li>\r
132          * <li>(2) appConfigFileシステムプロパティで指定されたファイル</li>\r
133          * <li>(3) コードベース下のappConfig.xml</li>\r
134          * <li>(4) アプリケーションデータ保存先のappConfig.xml</li>\r
135          * </ul>\r
136          * appConfigFileシステムプロパティがある場合は、(1)(2)の順。 <br>\r
137          * 指定がない場合は、(1)(3)(4)の順に読み取る.<br>\r
138          * \r
139          * @return 優先順位での設定ファイルの読み込み先URIのリスト\r
140          * @throws IOException\r
141          */\r
142         public List<URI> getCandidateURIs() throws IOException {\r
143                 List<URI> uris = new ArrayList<URI>();\r
144                 // リソース中の既定\r
145                 uris.add(new File(getClass().getResource("/" + CONFIG_NAME).getPath())\r
146                                 .toURI());\r
147 \r
148                 String specifiedAppConfig = System.getProperty("appConfigFile");\r
149                 if (specifiedAppConfig != null) {\r
150                         // システムプロパティでappConfig.xmlを明示している場合は、それを読み込む。\r
151                         // (appConfigFileシステムプロパティが空の場合は、リソース埋め込みの既定の設定だけをよみこむ)\r
152                         if (specifiedAppConfig.trim().length() > 0) {\r
153                                 File specifiedAppConfigFile = new File(specifiedAppConfig);\r
154                                 uris.add(specifiedAppConfigFile.toURI());\r
155                         }\r
156 \r
157                 } else {\r
158                         // システムプロパティが指定されていない場合は、\r
159                         // コードベース、つぎにユーザーディレクトリの順で読み込む\r
160                         File codeBase = ConfigurationDirUtilities.getApplicationBaseDir();\r
161                         File userDataDir = ConfigurationDirUtilities.getUserDataDir();\r
162 \r
163                         // システムプロパティて明示していない場合は、コードベースおよびユーザディレクトリを使用する.\r
164                         uris.add(new File(codeBase, CONFIG_NAME).getCanonicalFile().toURI());\r
165                         uris.add(new File(userDataDir, CONFIG_NAME).toURI());\r
166                 }\r
167                 return uris;\r
168         }\r
169 \r
170         /**\r
171          * 保存先の試行順序ごとのファイルのリスト。\r
172          * \r
173          * @return 保存先(優先順)\r
174          */\r
175         public List<File> getPrioritySaveFileList() {\r
176                 ArrayList<File> saveFiles = new ArrayList<File>();\r
177 \r
178                 String specifiedAppConfig = System.getProperty("appConfigFile");\r
179                 if (specifiedAppConfig != null) {\r
180                         // システムプロパティでappConfig.xmlを明示している場合\r
181                         if (specifiedAppConfig.trim().length() > 0) {\r
182                                 File specifiedAppConfigFile = new File(specifiedAppConfig);\r
183                                 if (!specifiedAppConfigFile.exists()\r
184                                                 || specifiedAppConfigFile.canWrite()) {\r
185                                         // まだ存在しないか、書き込み可能である場合のみ候補とする.\r
186                                         saveFiles.add(specifiedAppConfigFile);\r
187                                 }\r
188                         }\r
189                 } else {\r
190                         // システムプロパティappConfigFileがなければユーザディレクトリへ書き込む\r
191                         // ユーザディレクトリは常に候補とする.\r
192                         File userDataDir = ConfigurationDirUtilities.getUserDataDir();\r
193                         saveFiles.add(new File(userDataDir, CONFIG_NAME));\r
194                 }\r
195 \r
196                 return saveFiles;\r
197         }\r
198 \r
199         /**\r
200          * プロパティをロードする.<br>\r
201          * 存在しないか、読み取りに失敗した場合は、該当ファイルはスキップされる.<br>\r
202          */\r
203         public void loadConfig() {\r
204                 Properties config = new Properties();\r
205                 try {\r
206                         for (URI uri : getCandidateURIs()) {\r
207                                 if (uri == null) {\r
208                                         continue; // リソースがない場合はnullになる\r
209                                 }\r
210                                 // ファイルの実在チェック (チェックできる場合のみ)\r
211                                 if ("file".equals(uri.getScheme())) {\r
212                                         File file = new File(uri);\r
213                                         if (!file.exists()) {\r
214                                                 logger.log(Level.CONFIG, "appConfig.xml is not found.:" + file);\r
215                                                 continue;\r
216                                         }\r
217                                 }\r
218                                 // appConfig.xmlの読み込みを行う.\r
219                                 // Properties#loadFromXML() はXMLからキーを読み取り、既存のキーに対して上書きする.\r
220                                 // XMLに存在しないキーは読み込み前のままなので、繰り返し呼び出すことで「重ね合わせ」することができる.\r
221                                 try {\r
222                                         URL resourceURL = uri.toURL();\r
223                                         InputStream is = resourceURL.openStream();\r
224                                         try {\r
225                                                 config.loadFromXML(is);\r
226                                                 logger.log(Level.CONFIG, "appConfig.xml is loaded.:" + uri);\r
227                                         } finally {\r
228                                                 is.close();\r
229                                         }\r
230                                         \r
231                                 } catch (FileNotFoundException ex) {\r
232                                         logger.log(Level.CONFIG, "appConfig.xml is not found.: " + uri, ex);\r
233                                         // 無視する (無い場合は十分にありえるので「情報」レベルでログ。)\r
234                                 } catch (Exception ex) {\r
235                                         logger.log(Level.WARNING, "appConfig.xml loading failed.: " + uri, ex);\r
236                                         // 無視する\r
237                                 }\r
238                         }\r
239 \r
240                 } catch (IOException ex) {\r
241                         throw new RuntimeException("appConfig.xml loading failed.", ex);\r
242                 } catch (RuntimeException ex) {\r
243                         throw new RuntimeException("appConfig.xml loading failed.", ex);\r
244                 }\r
245                 BeanPropertiesUtilities.loadFromProperties(this, config);\r
246         }\r
247 \r
248         /**\r
249          * プロパティをアプリケーションデータの指定した保存先に保存する.\r
250          * \r
251          * @throws IOException\r
252          *             保存に失敗した場合\r
253          */\r
254         public void saveConfig(List<File> prioritySaveFiles) throws IOException {\r
255                 Properties config = getProperties();\r
256                 IOException oex = null;\r
257                 for (File configStore : prioritySaveFiles) {\r
258                         try {\r
259                                 OutputStream os = new BufferedOutputStream(\r
260                                                 new FileOutputStream(configStore));\r
261                                 try {\r
262                                         config.storeToXML(os, CONFIG_NAME, "UTF-8");\r
263                                         return; // 成功した時点で終了\r
264 \r
265                                 } finally {\r
266                                         os.close();\r
267                                 }\r
268 \r
269                         } catch (IOException ex) {\r
270                                 logger.log(Level.WARNING, "アプリケーション設定の保存に失敗しました" + ex, ex);\r
271                                 oex = ex;\r
272                         }\r
273                 }\r
274 \r
275                 // 例外が発生していれば、最後の例外を返す.\r
276                 if (oex != null) {\r
277                         throw oex;\r
278                 }\r
279         }\r
280 \r
281         /**\r
282          * プロパティをアプリケーションデータの保存先に保存する.\r
283          * \r
284          * @throws IOException\r
285          *             保存に失敗した場合\r
286          */\r
287         public void saveConfig() throws IOException {\r
288                 saveConfig(getPrioritySaveFileList());\r
289         }\r
290 \r
291         /**\r
292          * Propertiesの値を設定した場合に設定できない項目があるかチェックする.<br>\r
293          * このメソッドを呼び出しても、アプリケーション設定自身は何も影響されない.<br>\r
294          * \r
295          * @param props\r
296          *            適用するプロパティ\r
297          * @return 設定できなかったプロパティキーのコレクション、問題なければ空が返される.\r
298          */\r
299         public static Set<String> checkProperties(Properties props) {\r
300                 if (props == null) {\r
301                         throw new IllegalArgumentException();\r
302                 }\r
303                 AppConfig dummy = new AppConfig(); // アプリケーションから参照されないダミーのインスタンスを作成する.\r
304                 return BeanPropertiesUtilities.loadFromProperties(dummy, props);\r
305         }\r
306 \r
307         /**\r
308          * Propertiesの値で設定を更新する.<br>\r
309          * \r
310          * @param props\r
311          *            適用するプロパティ\r
312          * @return 設定できなかったプロパティキーのコレクション、問題なければ空が返される.\r
313          */\r
314         public Set<String> update(Properties props) {\r
315                 if (props == null) {\r
316                         throw new IllegalArgumentException();\r
317                 }\r
318                 return BeanPropertiesUtilities.loadFromProperties(this, props);\r
319         }\r
320 \r
321         /**\r
322          * このアプリケーション設定をプロパティに書き出して返します.<br>\r
323          * \r
324          * @return プロパティ\r
325          */\r
326         public Properties getProperties() {\r
327                 Properties config = new Properties();\r
328                 BeanPropertiesUtilities.saveToProperties(this, config);\r
329                 return config;\r
330         }\r
331         \r
332 \r
333         /**\r
334          * プロファイル選択ダイアログのプロファイルのサンプルイメージの背景色\r
335          * \r
336          * @return サンプルイメージの背景色\r
337          */\r
338         public Color getSampleImageBgColor() {\r
339                 return sampleImageBgColor;\r
340         }\r
341         \r
342         public void setSampleImageBgColor(Color sampleImageBgColor) {\r
343                 if (sampleImageBgColor == null) {\r
344                         throw new IllegalArgumentException();\r
345                 }\r
346                 this.sampleImageBgColor = sampleImageBgColor;\r
347         }\r
348         \r
349         private Color sampleImageBgColor = Color.white;\r
350         \r
351 \r
352         /**\r
353          * デフォルトのイメージ背景色を取得する.\r
354          * \r
355          * @return デフォルトのイメージ背景色\r
356          */\r
357         public Color getDefaultImageBgColor() {\r
358                 return defaultImageBgColor;\r
359         }\r
360         \r
361         public void setDefaultImageBgColor(Color defaultImageBgColor) {\r
362                 if (defaultImageBgColor == null) {\r
363                         throw new IllegalArgumentException();\r
364                 }\r
365                 this.defaultImageBgColor = defaultImageBgColor;\r
366         }\r
367         \r
368         private Color defaultImageBgColor = Color.white;\r
369 \r
370         /**\r
371          * 使用中アイテムの背景色を取得する.\r
372          * \r
373          * @return 使用中アイテムの背景色\r
374          */\r
375         public Color getCheckedItemBgColor() {\r
376                 return checkedItemBgColor;\r
377         }\r
378         \r
379         public void setCheckedItemBgColor(Color checkedItemBgColor) {\r
380                 if (checkedItemBgColor == null) {\r
381                         throw new IllegalArgumentException();\r
382                 }\r
383                 this.checkedItemBgColor = checkedItemBgColor;\r
384         }\r
385         \r
386         private Color checkedItemBgColor = Color.cyan.brighter();\r
387         \r
388         \r
389         /**\r
390          *  選択アイテムの背景色を取得する\r
391          * \r
392          * @return 選択アイテムの背景色\r
393          */\r
394         public Color getSelectedItemBgColor() {\r
395                 return selectedItemBgColor;\r
396         }\r
397         \r
398         public void setSelectedItemBgColor(Color selectedItemBgColor) {\r
399                 this.selectedItemBgColor = selectedItemBgColor;\r
400         }\r
401         \r
402         private Color selectedItemBgColor = Color.orange;\r
403         \r
404         /**\r
405          * 不備のあるデータ行の背景色を取得する.\r
406          * \r
407          * @return 不備のあるデータ行の背景色\r
408          */\r
409         public Color getInvalidBgColor() {\r
410                 return invalidBgColor;\r
411         }\r
412         \r
413         public void setInvalidBgColor(Color invalidBgColor) {\r
414                 if (invalidBgColor == null) {\r
415                         throw new IllegalArgumentException();\r
416                 }\r
417                 this.invalidBgColor = invalidBgColor;\r
418         }\r
419         \r
420         private Color invalidBgColor = Color.red.brighter().brighter();\r
421 \r
422         /**\r
423          * JPEG画像変換時の圧縮率を取得する.\r
424          * \r
425          * @return 圧縮率\r
426          */\r
427         public float getCompressionQuality() {\r
428                 return compressionQuality;\r
429         }\r
430         \r
431         public void setCompressionQuality(float compressionQuality) {\r
432                 if (compressionQuality < .1f || compressionQuality > 1f) {\r
433                         throw new IllegalArgumentException();\r
434                 }\r
435                 this.compressionQuality = compressionQuality;\r
436         }\r
437         \r
438         private float compressionQuality = .8f;\r
439 \r
440         /**\r
441          * エクスポートウィザードのプリセットにパーツ不足時の警告色(前景色)を取得する.\r
442          * \r
443          * @return エクスポートウィザードのプリセットにパーツ不足時の警告色(前景色)\r
444          */\r
445         public Color getExportPresetWarningsForegroundColor() {\r
446                 return exportPresetWarningsForegroundColor;\r
447         }\r
448         \r
449         public void setExportPresetWarningsForegroundColor(\r
450                         Color exportPresetWarningsForegroundColor) {\r
451                 this.exportPresetWarningsForegroundColor = exportPresetWarningsForegroundColor;\r
452         }\r
453         \r
454         private Color exportPresetWarningsForegroundColor = Color.red;\r
455         \r
456         /**\r
457          * JARファイル転送用バッファサイズ.<br>\r
458          * \r
459          * @return JARファイル転送用バッファサイズ.\r
460          */\r
461         public int getJarTransferBufferSize() {\r
462                 return jarTransferBufferSize;\r
463         }\r
464         \r
465         public void setJarTransferBufferSize(int jarTransferBufferSize) {\r
466                 if (jarTransferBufferSize <= 0) {\r
467                         throw new IllegalArgumentException();\r
468                 }\r
469                 this.jarTransferBufferSize = jarTransferBufferSize;\r
470         }\r
471 \r
472         private int jarTransferBufferSize = 4096;\r
473         \r
474         /**\r
475          * ZIPファイル名のエンコーディング.<br>\r
476          * \r
477          * @return ZIPファイル名のエンコーディング.<br>\r
478          */\r
479         public String getZipNameEncoding() {\r
480                 return zipNameEncoding;\r
481         }\r
482         \r
483         public void setZipNameEncoding(String zipNameEncoding) {\r
484                 if (zipNameEncoding == null) {\r
485                         throw new IllegalArgumentException();\r
486                 }\r
487                 try {\r
488                         Charset.forName(zipNameEncoding);\r
489                 } catch (Exception ex) {\r
490                         throw new RuntimeException("unsupported charset: " + zipNameEncoding);\r
491                 }\r
492                 this.zipNameEncoding = zipNameEncoding;\r
493         }\r
494         \r
495         private String zipNameEncoding = "csWindows31J";\r
496 \r
497         /**\r
498          * ディセーブルなテーブルのセルのフォアグラウンドカラーを取得する.\r
499          * \r
500          * @return ディセーブルなテーブルのセルのフォアグラウンドカラー\r
501          */\r
502         public Color getDisabledCellForgroundColor() {\r
503                 return disabledCellForegroundColor;\r
504         }\r
505         \r
506         public void setDisabledCellForegroundColor(Color disabledCellForegroundColor) {\r
507                 if (disabledCellForegroundColor == null) {\r
508                         throw new IllegalArgumentException();\r
509                 }\r
510                 this.disabledCellForegroundColor = disabledCellForegroundColor;\r
511         }\r
512         \r
513         private Color disabledCellForegroundColor = Color.gray;\r
514         \r
515         \r
516         /**\r
517          * ディレクトリを監視する間隔(mSec)を取得する.\r
518          * \r
519          * @return ディレクトリを監視する間隔(mSec)\r
520          */\r
521         public int getDirWatchInterval() {\r
522                 return dirWatchInterval;\r
523         }\r
524         \r
525         public void setDirWatchInterval(int dirWatchInterval) {\r
526                 if (dirWatchInterval <= 0) {\r
527                         throw new IllegalArgumentException();\r
528                 }\r
529                 this.dirWatchInterval = dirWatchInterval;\r
530         }\r
531         \r
532         private int dirWatchInterval = 7 * 1000;\r
533         \r
534         /**\r
535          * ディレクトリの監視を有効にするか?\r
536          * \r
537          * @return ディレクトリの監視を有効にする場合はtrue\r
538          */\r
539         public boolean isEnableDirWatch() {\r
540                 return enableDirWatch;\r
541         }\r
542         \r
543         public void setEnableDirWatch(boolean enableDirWatch) {\r
544                 this.enableDirWatch = enableDirWatch;\r
545         }\r
546         \r
547         private boolean enableDirWatch = true;\r
548         \r
549         /**\r
550          * ファイル転送に使うバッファサイズ.<br>\r
551          * \r
552          * @return バッファサイズ\r
553          */\r
554         public int getFileTransferBufferSize() {\r
555                 return fileTransferBufferSize;\r
556         }\r
557         \r
558         public void setFileTransferBufferSize(int fileTransferBufferSize) {\r
559                 if (fileTransferBufferSize <= 0) {\r
560                         throw new IllegalArgumentException();\r
561                 }\r
562                 this.fileTransferBufferSize = fileTransferBufferSize;\r
563         }\r
564         \r
565         private int fileTransferBufferSize = 4096;\r
566         \r
567         /**\r
568          * プレビューのインジケータを表示するまでのディレイ(mSec)を取得する.\r
569          * \r
570          * @return プレビューのインジケータを表示するまでのディレイ(mSec)\r
571          */\r
572         public long getPreviewIndicatorDelay() {\r
573                 return previewIndeicatorDelay;\r
574         }\r
575         \r
576         public void setPreviewIndeicatorDelay(long previewIndeicatorDelay) {\r
577                 if (previewIndeicatorDelay < 0) {\r
578                         throw new IllegalArgumentException();\r
579                 }\r
580                 this.previewIndeicatorDelay = previewIndeicatorDelay;\r
581         }\r
582         \r
583         private long previewIndeicatorDelay = 300;\r
584         \r
585         /**\r
586          * 情報ダイアログの編集ボタンを「開く」アクションにする場合はtrue、「編集」アクションにする場合はfalse\r
587          * \r
588          * @return trueならばOpen、falseならばEdit\r
589          */\r
590         public boolean isInformationDialogOpenMethod() {\r
591                 return informationDialogOpenMethod;\r
592         }\r
593         \r
594         public void setInformationDialogOpenMethod(\r
595                         boolean informationDialogOpenMethod) {\r
596                 this.informationDialogOpenMethod = informationDialogOpenMethod;\r
597         }\r
598 \r
599         private boolean informationDialogOpenMethod = true;\r
600         \r
601         /**\r
602          * ログを常に残すか?<br>\r
603          * falseの場合は{@link ApplicationLogHandler}の実装に従って終了時に 必要なければログは削除される.<br>\r
604          * \r
605          * @return 常に残す場合はtrue、そうでなければfalse\r
606          */\r
607         public boolean isNoRemoveLog() {\r
608                 return noRemoveLog;\r
609         }\r
610 \r
611         public void setNoRemoveLog(boolean noRemoveLog) {\r
612                 this.noRemoveLog = noRemoveLog;\r
613         }\r
614         \r
615         private boolean noRemoveLog = false;\r
616 \r
617 \r
618         /**\r
619          * テーブルのグリッド色.<br>\r
620          * \r
621          * @return テーブルのグリッド色\r
622          */\r
623         public Color getGridColor() {\r
624                 return gridColor;\r
625         }\r
626         \r
627         public void setGridColor(Color gridColor) {\r
628                 if (gridColor == null) {\r
629                         throw new IllegalArgumentException();\r
630                 }\r
631                 this.gridColor = gridColor;\r
632         }\r
633         \r
634         private Color gridColor = Color.gray;\r
635 \r
636         /**\r
637          * カラーダイアログの値が変更されたら、自動的にプレビューを更新するか?\r
638          * \r
639          * @return カラーダイアログの値が変更されたら、自動的にプレビューを更新する場合はtrue (デフォルトはtrue)\r
640          */\r
641         public boolean isEnableAutoColorChange() {\r
642                 return enableAutoColorChange;\r
643         }\r
644         \r
645         public void setEnableAutoColorChange(boolean enableAutoColorChange) {\r
646                 this.enableAutoColorChange = enableAutoColorChange;\r
647         }\r
648         \r
649         private boolean enableAutoColorChange = true;\r
650         \r
651         public void setAuthorEditConflictBgColor(Color authorEditConflictBgColor) {\r
652                 if (authorEditConflictBgColor == null) {\r
653                         throw new IllegalArgumentException();\r
654                 }\r
655                 this.authorEditConflictBgColor = authorEditConflictBgColor;\r
656         }\r
657 \r
658         /**\r
659          * パーツの作者編集時に複数作者を選択した場合のに入力ボックスの背景色\r
660          * \r
661          * @return 背景色\r
662          */\r
663         public Color getAuthorEditConflictBgColor() {\r
664                 return authorEditConflictBgColor;\r
665         }\r
666         \r
667         Color authorEditConflictBgColor = Color.yellow;\r
668         \r
669         \r
670         public void setMainFrameMaxWidth(int width) {\r
671                 this.mainFrameMaxWidth = width;\r
672         }\r
673         \r
674         /**\r
675          * メインフレームの初期表示時の最大幅\r
676          * \r
677          * @return メインフレームの初期表示時の最大幅\r
678          */\r
679         public int getMainFrameMaxWidth() {\r
680                 return mainFrameMaxWidth;\r
681         }\r
682         \r
683         private int mainFrameMaxWidth = 800;\r
684         \r
685         public void setMainFrameMaxHeight(int height) {\r
686                 this.mainFrameMaxHeight = height;\r
687         }\r
688 \r
689         /**\r
690          * メインフレームの初期表示時の最大高さ\r
691          * \r
692          * @return メインフレームの初期表示時の最大高さ\r
693          */\r
694         public int getMainFrameMaxHeight() {\r
695                 return mainFrameMaxHeight;\r
696         }\r
697         \r
698         private int mainFrameMaxHeight = 600;\r
699         \r
700         \r
701         /**\r
702          * カラーダイアログで存在しないレイヤーをディセーブルにしない.\r
703          * \r
704          * @return ディセーブルにしない場合はtrue\r
705          */\r
706         public boolean isNotDisableLayerTab() {\r
707                 return notDisableLayerTab;\r
708         }\r
709         \r
710         public void setNotDisableLayerTab(boolean notDisableLayerTab) {\r
711                 this.notDisableLayerTab = notDisableLayerTab;\r
712         }\r
713         \r
714         private boolean notDisableLayerTab;\r
715         \r
716 \r
717         /**\r
718          * ログを消去する日数.<br>\r
719          * この指定日を経過した古いログは削除される.<br>\r
720          * 0の場合は削除されない.\r
721          * \r
722          * @return\r
723          */\r
724         public long getPurgeLogDays() {\r
725                 return purgeLogDays;\r
726         }\r
727         \r
728         public void setPurgeLogDays(long purgeLogDays) {\r
729                 this.purgeLogDays = purgeLogDays;\r
730         }\r
731         \r
732         private long purgeLogDays = 10;\r
733         \r
734         public String getPartsColorGroupPattern() {\r
735                 return partsColorGroupPattern;\r
736         }\r
737         \r
738         public void setPartsColorGroupPattern(String pattern) {\r
739                 if (pattern != null && pattern.trim().length() > 0) {\r
740                         Pattern.compile(pattern);\r
741                 }\r
742                 partsColorGroupPattern = pattern;\r
743         }\r
744         \r
745         private String partsColorGroupPattern = "^.*\\(@\\).*$";\r
746         \r
747         private Color selectPanelTitleColor = Color.BLUE;\r
748         \r
749         public Color getSelectPanelTitleColor() {\r
750                 return selectPanelTitleColor;\r
751         }\r
752         \r
753         public void setSelectPanelTitleColor(Color color) {\r
754                 if (color == null) {\r
755                         throw new IllegalArgumentException();\r
756                 }\r
757                 selectPanelTitleColor = color;\r
758         }\r
759         \r
760         private boolean enableAutoShrinkPanel;\r
761         \r
762         public boolean isEnableAutoShrinkPanel() {\r
763                 return enableAutoShrinkPanel;\r
764         }\r
765         \r
766         public void setEnableAutoShrinkPanel(boolean enableAutoShrinkPanel) {\r
767                 this.enableAutoShrinkPanel = enableAutoShrinkPanel;\r
768         }\r
769         \r
770         public boolean isDisableWatchDirIfNotWritable() {\r
771                 return disableWatchDirIfNotWritable;\r
772         }\r
773         \r
774         public void setDisableWatchDirIfNotWritable(boolean disableWatchDirIfNotWritable) {\r
775                 this.disableWatchDirIfNotWritable = disableWatchDirIfNotWritable;\r
776         }\r
777         \r
778         private boolean disableWatchDirIfNotWritable = true;\r
779         \r
780         public void setEnablePNGSupportForWindows(boolean enablePNGSupportForWindows) {\r
781                 this.enablePNGSupportForWindows = enablePNGSupportForWindows;\r
782         }\r
783         \r
784         public boolean isEnablePNGSupportForWindows() {\r
785                 return enablePNGSupportForWindows;\r
786         }\r
787         \r
788         private boolean enablePNGSupportForWindows = true;\r
789         \r
790         /**\r
791          * 画像表示(通常モード)でオプティマイズを有効にする最大倍率.\r
792          */\r
793         private double renderingOptimizeThresholdForNormal = 2.;\r
794         \r
795         public void setRenderingOptimizeThresholdForNormal(\r
796                         double renderingOptimizeThresholdForNormal) {\r
797                 this.renderingOptimizeThresholdForNormal = renderingOptimizeThresholdForNormal;\r
798         }\r
799         \r
800         public double getRenderingOptimizeThresholdForNormal() {\r
801                 return renderingOptimizeThresholdForNormal;\r
802         }\r
803         /**\r
804          * 画像表示(チェックモード)でオプティマイズを有効にする最大倍率.\r
805          */\r
806         private double renderingOptimizeThresholdForCheck = 0.;\r
807         \r
808         public void setRenderingOptimizeThresholdForCheck(\r
809                         double renderingOptimizeThresholdForCheck) {\r
810                 this.renderingOptimizeThresholdForCheck = renderingOptimizeThresholdForCheck;\r
811         }\r
812         \r
813         public double getRenderingOptimizeThresholdForCheck() {\r
814                 return renderingOptimizeThresholdForCheck;\r
815         }\r
816 \r
817         /**\r
818          * バイキュービックをサポートする場合\r
819          */\r
820         private boolean enableInterpolationBicubic = true;\r
821         \r
822         public void setEnableInterpolationBicubic(boolean enableInterpolationBicubic) {\r
823                 this.enableInterpolationBicubic = enableInterpolationBicubic;\r
824         }\r
825 \r
826         public boolean isEnableInterpolationBicubic() {\r
827                 return enableInterpolationBicubic;\r
828         }\r
829 \r
830         /**\r
831          * 事前定義済みの倍率候補.<br>\r
832          */\r
833         private String predefinedZoomRanges = "20, 50, 80, 100, 120, 150, 200, 300, 400, 800";\r
834         \r
835         public String getPredefinedZoomRanges() {\r
836                 return predefinedZoomRanges;\r
837         }\r
838         \r
839         public void setPredefinedZoomRanges(String predefinedZoomRanges) {\r
840                 this.predefinedZoomRanges = predefinedZoomRanges;\r
841         }\r
842 \r
843         /**\r
844          * ズームパネルを初期状態で表示するか?\r
845          */\r
846         private boolean enableZoomPanel = true;\r
847         \r
848         public boolean isEnableZoomPanel() {\r
849                 return enableZoomPanel;\r
850         }\r
851         \r
852         public void setEnableZoomPanel(boolean enableZoomPanel) {\r
853                 this.enableZoomPanel = enableZoomPanel;\r
854         }\r
855         \r
856         /**\r
857          * ズームパネルをアクティブにする下部範囲\r
858          */\r
859         private int zoomPanelActivationArea = 30;\r
860         \r
861         public int getZoomPanelActivationArea() {\r
862                 return zoomPanelActivationArea;\r
863         }\r
864         \r
865         public void setZoomPanelActivationArea(int zoomPanelActivationArea) {\r
866                 this.zoomPanelActivationArea = zoomPanelActivationArea;\r
867         }\r
868 \r
869         /**\r
870          * レンダリングヒントを使用するか?\r
871          */\r
872         private boolean enableRenderingHints = true;\r
873 \r
874         public void setEnableRenderingHints(boolean enableRenderingHints) {\r
875                 this.enableRenderingHints = enableRenderingHints;\r
876         }\r
877         \r
878         public boolean isEnableRenderingHints() {\r
879                 return enableRenderingHints;\r
880         }\r
881 \r
882         /**\r
883          * グリッド描画とマスク\r
884          */\r
885         private int drawGridMask = 2;\r
886         \r
887         public int getDrawGridMask() {\r
888                 return drawGridMask;\r
889         }\r
890         \r
891         public void setDrawGridMask(int drawGridMask) {\r
892                 this.drawGridMask = drawGridMask & 0x03;\r
893         }\r
894         \r
895         private int previewGridColor = 0x7f7f0000;\r
896         \r
897         public int getPreviewGridColor() {\r
898                 return previewGridColor;\r
899         }\r
900         \r
901         public void setPreviewGridColor(int previewGridColor) {\r
902                 this.previewGridColor = previewGridColor;\r
903         }\r
904         \r
905         private int previewGridSize = 20;\r
906         \r
907         public int getPreviewGridSize() {\r
908                 return previewGridSize;\r
909         }\r
910         \r
911         public void setPreviewGridSize(int previewGridSize) {\r
912                 this.previewGridSize = previewGridSize;\r
913         }\r
914         \r
915         /**\r
916          * チェックモード時の余白サイズ(片側)\r
917          */\r
918         private int previewUnfilledSpaceForCheckMode = 0;\r
919         \r
920         public int getPreviewUnfilledSpaceForCheckMode() {\r
921                 return previewUnfilledSpaceForCheckMode;\r
922         }\r
923 \r
924         public void setPreviewUnfilledSpaceForCheckMode(\r
925                         int previewUnfilledSpaceForCheckMode) {\r
926                 this.previewUnfilledSpaceForCheckMode = previewUnfilledSpaceForCheckMode;\r
927         }\r
928         \r
929         /**\r
930          * チェックモードでツールチップを表示するか?\r
931          */\r
932         private boolean enableCheckInfoTooltip = true;\r
933         \r
934         public boolean isEnableCheckInfoTooltip() {\r
935                 return enableCheckInfoTooltip;\r
936         }\r
937         \r
938         public void setEnableCheckInfoTooltip(boolean enableCheckInfoTooltip) {\r
939                 this.enableCheckInfoTooltip = enableCheckInfoTooltip;\r
940         }\r
941         \r
942         /**\r
943          * ホイールによるスクロールの単位.<br>\r
944          */\r
945         private int wheelScrollUnit = 10;\r
946         \r
947         public int getWheelScrollUnit() {\r
948                 return wheelScrollUnit;\r
949         }\r
950         \r
951         public void setWheelScrollUnit(int wheelScrollUnit) {\r
952                 this.wheelScrollUnit = wheelScrollUnit;\r
953         }\r
954         \r
955         /**\r
956          * 壁紙にオフスクリーン描画を使用するか?.<br>\r
957          * (あまり劇的なパフォーマンス効果はない.)\r
958          */\r
959         private boolean enableOffscreenWallpaper = false;\r
960         \r
961         public boolean isEnableOffscreenWallpaper() {\r
962                 return enableOffscreenWallpaper;\r
963         }\r
964         \r
965         public void setEnableOffscreenWallpaper(boolean enableOffscreenWallpaper) {\r
966                 this.enableOffscreenWallpaper = enableOffscreenWallpaper;  \r
967         }\r
968         \r
969         /**\r
970          * 壁紙のオフスクリーンの既定サイズ.\r
971          */\r
972         private int offscreenWallpaperSize = 300;\r
973         \r
974         public int getOffscreenWallpaperSize() {\r
975                 return offscreenWallpaperSize;\r
976         }\r
977         \r
978         public void setOffscreenWallpaperSize(int offscreenWallpaperSize) {\r
979                 this.offscreenWallpaperSize = offscreenWallpaperSize;\r
980         }\r
981 }\r