OSDN Git Service

ピックアップ表示の問題修正ほか
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / Env.java
1 package tainavi;\r
2 \r
3 import java.awt.Color;\r
4 import java.awt.RenderingHints;\r
5 import java.io.File;\r
6 import java.util.ArrayList;\r
7 import java.util.HashMap;\r
8 import java.util.regex.Matcher;\r
9 import java.util.regex.Pattern;\r
10 \r
11 \r
12 /**\r
13  *\r
14  * @version 3.15.4β {@link #getAutoEventIdComplete()} 追加\r
15  */\r
16 public class Env {\r
17 \r
18         /*******************************************************************************\r
19          * 定数とか\r
20          ******************************************************************************/\r
21         \r
22         // 変更できないフォルダ\r
23         public static final String binDir = "bin";\r
24         private static final String metainfDir = binDir+File.separator+"META-INF";\r
25         private static final String services = metainfDir+File.separator+"services";\r
26         \r
27         public static final String envDir = "env";\r
28         private static final String envFile = envDir+File.separator+"envs.xml";\r
29         private static final String envText = envDir+File.separator+"envs.txt";\r
30         private static final String lafFile = envDir+File.separator+"laf.txt";\r
31         private static final String GTKRC = envDir+File.separator+"_gtkrc-2.0";\r
32         \r
33         public static final String skinDir = "skin";\r
34         \r
35         private static final int PAGER_DEFAULT = 7;\r
36         \r
37         private static final Color RSVDLINE_COLOR = new Color(204,153,255);\r
38         private static final Color PICKEDLINE_COLOR = new Color(51,255,0);\r
39         private static final Color CURRENTLINE_COLOR = new Color(240,120,120);\r
40         private static final Color MATCHEDKEYWORD_COLOR = new Color(51,102,255);\r
41         \r
42         private static final Color TIMEBAR_COLOR_06_12 = new Color(180,180,180);\r
43         private static final Color TIMEBAR_COLOR_12_18 = new Color(160,160,160);\r
44         private static final Color TIMEBAR_COLOR_18_24 = new Color(140,140,140);\r
45         private static final Color TIMEBAR_COLOR_24_06 = new Color(120,120,120);\r
46         private static final Color EXECON_TUNE_COLOR = Color.WHITE;\r
47         private static final Color EXECOFF_TUNE_COLOR = Color.GRAY;\r
48         private static final Color PICKUP_BORDER_COLOR = new Color(0,255,0);\r
49         private static final Color PICKUP_TUNER_COLOR = Color.GRAY;\r
50         private static final Color MOUSEOVER_COLOR = new Color(180,180,255);\r
51         private static final Color TITLE_COLOR = Color.BLUE;\r
52         private static final Color DETAIL_COLOR = Color.DARK_GRAY;\r
53         private static final Color MATCHBORDER_COLOR = Color.RED;\r
54         private static final Color ITERATIONITEM_COLOR = Color.GRAY;\r
55         \r
56         private static final Color TUNERSHORT_COLOR = new Color(255,255,0);\r
57         private static final Color RECORDED_COLOR = new Color(204,153,255);\r
58         \r
59         private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";\r
60         \r
61         // この記述は…どうなの?\r
62         private static final String TV_SITE = "Dimora";\r
63         private static final String CS_SITE = "スカパー!";\r
64         private static final String CS2_SITE = "webザテレビジョン(CSデジ)";\r
65         private static final String RADIO_SITE = "";\r
66         \r
67         private static final String MSGID = "[環境] ";\r
68         private static final String ERRID = "[ERROR]"+MSGID;\r
69         \r
70         public static String[] SHUTDOWN_COMMANDS = { "shutdown /s /t 0", "sudo shutdown -h now" };\r
71         \r
72         // ダブルクリック時の動作\r
73         public static enum DblClkCmd {\r
74                 \r
75                 SHOWRSVDIALOG ("予約ダイアログを開く"),\r
76                 JUMPTOPAPER ("番組欄へジャンプする"),\r
77                 JUMPTOWEB ("ブラウザで番組詳細のページを開く");\r
78                 \r
79                 private String name;\r
80                 \r
81                 private DblClkCmd(String name) {\r
82                         this.name = name;\r
83                 }\r
84                 \r
85                 @Override\r
86                 public String toString() {\r
87                         return(name);\r
88                 }\r
89                 \r
90                 public String getId() {\r
91                         return(super.toString());\r
92                 }\r
93                 \r
94                 public static DblClkCmd get(String id) {\r
95                         for ( DblClkCmd dcc : DblClkCmd.values() ) {\r
96                                 if ( dcc.getId().equals(id) ) {\r
97                                         return dcc;\r
98                                 }\r
99                         }\r
100                         return null;\r
101                 }\r
102         };\r
103 \r
104         //\r
105         public static enum SnapshotFmt {\r
106                 JPG ("JPEG","jpg"),\r
107                 PNG ("PNG","png"),\r
108                 BMP ("BMP","bmp");\r
109                 \r
110                 private String name;\r
111                 private String ext;\r
112                 \r
113                 private SnapshotFmt(String name, String ext) {\r
114                         this.name = name;\r
115                         this.ext = ext;\r
116                 }\r
117                 \r
118                 @Override\r
119                 public String toString() {\r
120                         return(name);\r
121                 }\r
122 \r
123                 public String getExtension() {\r
124                         return(ext);\r
125                 }\r
126                 \r
127                 \r
128                 public String getId() {\r
129                         return(super.toString());\r
130                 }\r
131 \r
132                 public static SnapshotFmt get(String id) {\r
133                         for ( SnapshotFmt sf : SnapshotFmt.values() ) {\r
134                                 if ( sf.getId().equals(id) ) {\r
135                                         return sf;\r
136                                 }\r
137                         }\r
138                         return null;\r
139                 }\r
140         }\r
141         \r
142         public static enum AAMode {\r
143                 OFF             ("無効","off",RenderingHints.VALUE_TEXT_ANTIALIAS_OFF),\r
144                 ON              ("有効","on",RenderingHints.VALUE_TEXT_ANTIALIAS_ON),\r
145                 GASP    ("小さい文字には無効", "gasp",RenderingHints.VALUE_TEXT_ANTIALIAS_GASP),\r
146                 LCD             ("サブピクセルAA", "lcd",RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB),\r
147                 HRGB    ("サブピク横方向RGB", "lcd_hrgb",RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB),\r
148                 HBGR    ("サブピク横方向BGR", "lcd_hbgr",RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR),\r
149                 VRGB    ("サブピク縦方向RGB", "lcd_vrgb",RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB),\r
150                 VBGR    ("サブピク縦方向BGR", "lcd_vbgr",RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR);\r
151                 \r
152                 private String name;\r
153                 private String mode;\r
154                 private Object hint;\r
155                 \r
156                 private AAMode(String name, String mode, Object hint) {\r
157                         this.name = name;\r
158                         this.mode = mode;\r
159                         this.hint = hint;\r
160                 }\r
161                 \r
162                 @Override\r
163                 public String toString() {\r
164                         return name;\r
165                 }\r
166                 \r
167                 public String getId() {\r
168                         return(super.toString());\r
169                 }\r
170                 \r
171                 public String getMode() {\r
172                         return mode;\r
173                 }\r
174 \r
175                 public Object getHint() {\r
176                         return hint;\r
177                 }\r
178                 \r
179                 public static AAMode get(String id) {\r
180                         for ( AAMode aam : AAMode.values() ) {\r
181                                 if ( aam.getId().equals(id) ) {\r
182                                         return aam;\r
183                                 }\r
184                         }\r
185                         return null;\r
186                 }\r
187         }\r
188         \r
189         // 自動アップデートの間隔\r
190         public static enum UpdateOn {\r
191                 DISABLE ("無効にする", -1),\r
192                 EVERYDAY ("毎日実行する", 0),\r
193                 EVERY1DAY ("1日おきに実行する", 1),\r
194                 EVERY2DAY ("2日おきに実行する", 2),\r
195                 EVERY3DAY ("3日おきに実行する", 3),\r
196                 EVERY4DAY ("4日おきに実行する", 4),\r
197                 EVERY5DAY ("5日おきに実行する", 5),\r
198                 EVERY6DAY ("6日おきに実行する", 6);\r
199                 \r
200                 private String name;\r
201                 private int interval;\r
202                 \r
203                 private UpdateOn(String name, int interval) {\r
204                         this.name = name;\r
205                         this.interval = interval;\r
206                 }\r
207                 \r
208                 @Override\r
209                 public String toString() {\r
210                         return this.name;\r
211                 }\r
212 \r
213                 public String getId() {\r
214                         return(super.toString());\r
215                 }\r
216 \r
217                 public int getInterval() {\r
218                         return this.interval;\r
219                 }\r
220                 \r
221                 public static UpdateOn get(String id) {\r
222                         for ( UpdateOn uo : UpdateOn.values() ) {\r
223                                 if ( uo.getId().equals(id) ) {\r
224                                         return uo;\r
225                                 }\r
226                         }\r
227                         return null;\r
228                 }\r
229         }\r
230         \r
231         /*******************************************************************************\r
232          * 隠し\r
233          ******************************************************************************/\r
234         \r
235         private static boolean firstinstance = true;    // 起動後最初の呼び出しか(2インスタンス目以降は実行しない)\r
236         \r
237         // CHソートを有効にするかどうか\r
238         public boolean getChSortEnabled() { return chSortEnabled; }\r
239         public void setChSortEnabled(boolean b) { chSortEnabled = b; }\r
240         private boolean chSortEnabled = true;\r
241         \r
242         \r
243         /*******************************************************************************\r
244          * メンバ\r
245          ******************************************************************************/\r
246         \r
247         /*\r
248          * リスト形式関連の設定\r
249          */\r
250 \r
251         // 番組追跡であいまい検索をしない\r
252         public boolean getDisableFazzySearch() { return disableFazzySearch; }\r
253         public void setDisableFazzySearch(boolean b) { disableFazzySearch = b; }\r
254         private boolean disableFazzySearch = false;\r
255         // あいまい検索で逆引きはしない\r
256         public boolean getDisableFazzySearchReverse() { return disableFazzySearchReverse; }\r
257         public void setDisableFazzySearchReverse(boolean b) { disableFazzySearchReverse = b; }\r
258         private boolean disableFazzySearchReverse = false;\r
259         // あいまい検索の閾値のデフォルト値\r
260         public int getDefaultFazzyThreshold() { return defaultFazzyThreshold; }\r
261         public void setDefaultFazzyThreshold(int c) { defaultFazzyThreshold = c; }\r
262         private int defaultFazzyThreshold = TraceKey.defaultFazzyThreshold;\r
263         // しょぼかるの検索結果も有効な放送局のみに絞る\r
264         public boolean getSyoboFilterByCenters() { return syoboFilterByCenters; }\r
265         public void setSyoboFilterByCenters(boolean b) { syoboFilterByCenters = b; }\r
266         private boolean syoboFilterByCenters = true;\r
267         // 終了済みエントリも表示する\r
268         public boolean getDisplayPassedEntry() { return displayPassedEntry; }\r
269         public void setDisplayPassedEntry(boolean b) { displayPassedEntry = b; }\r
270         private boolean displayPassedEntry = true;\r
271         // ピックアップマークの表示\r
272         public boolean getShowRsvPickup() { return showRsvPickup; }\r
273         public void setShowRsvPickup(boolean b) { showRsvPickup = b; }\r
274         private boolean showRsvPickup = true;\r
275         // 時間重複マークの表示\r
276         public boolean getShowRsvDup() { return showRsvDup; }\r
277         public void setShowRsvDup(boolean b) { showRsvDup = b; }\r
278         private boolean showRsvDup = true;\r
279         // 裏番組予約マークの表示\r
280         public boolean getShowRsvUra() { return showRsvUra; }\r
281         public void setShowRsvUra(boolean b) { showRsvUra = b; }\r
282         private boolean showRsvUra = false;\r
283         // 予約行の背景色を変えて強調する\r
284         public boolean getRsvdLineEnhance() { return rsvdLineEnhance; }\r
285         public void setRsvdLineEnhance(boolean b) { rsvdLineEnhance = b; }\r
286         private boolean rsvdLineEnhance = true;\r
287         // 予約行の背景色\r
288         public Color getRsvdLineColor() { return rsvdLineColor; }\r
289         public void setRsvdLineColor(Color c) { rsvdLineColor = c; }\r
290         private Color rsvdLineColor = RSVDLINE_COLOR;\r
291         // ピックアップ行の背景色\r
292         public Color getPickedLineColor() { return pickedLineColor; }\r
293         public void setPickedLineColor(Color c) { pickedLineColor = c; }\r
294         private Color pickedLineColor = PICKEDLINE_COLOR;\r
295         // 現在放送中行の背景色を変えて強調する\r
296         public boolean getCurrentLineEnhance() { return currentLineEnhance; }\r
297         public void setCurrentLineEnhance(boolean b) { currentLineEnhance = b; }\r
298         private boolean currentLineEnhance = true;\r
299         // 現在放送中行の背景色\r
300         public Color getCurrentLineColor() { return currentLineColor; }\r
301         public void setCurrentLineColor(Color c) { currentLineColor = c; }\r
302         private Color currentLineColor = CURRENTLINE_COLOR;\r
303         // 現在放送中ノードに終了後何分までの番組を表示するか\r
304         public int getCurrentAfter() { return currentAfter; }\r
305         public void setCurrentAfter(int n) { currentAfter = n; }\r
306         private int currentAfter = 10*60;\r
307         // 現在放送中ノードに開始前何分までの番組を表示するか\r
308         public int getCurrentBefore() { return currentBefore; }\r
309         public void setCurrentBefore(int n) { currentBefore = n; }\r
310         private int currentBefore = 60*60;\r
311         // キーワードにマッチした箇所の強調色\r
312         public Color getMatchedKeywordColor() { return matchedKeywordColor; }\r
313         public void setMatchedKeywordColor(Color c) { matchedKeywordColor = c; }\r
314         private Color matchedKeywordColor = MATCHEDKEYWORD_COLOR;\r
315         // 削除時に確認ダイアログを表示する\r
316         public boolean getShowWarnDialog() { return showWarnDialog; }\r
317         public void setShowWarnDialog(boolean b) { showWarnDialog = b; }\r
318         private boolean showWarnDialog = false;\r
319         // マーク表示を個別欄に分離する\r
320         public boolean getSplitMarkAndTitle() { return splitMarkAndTitle; }\r
321         public void setSplitMarkAndTitle(boolean b) { splitMarkAndTitle = b; }\r
322         private boolean splitMarkAndTitle = true;\r
323         // 番組詳細も表示する\r
324         public boolean getShowDetailOnList() { return showDetailOnList; }\r
325         public void setShowDetailOnList(boolean b) { showDetailOnList = b; }\r
326         private boolean showDetailOnList = true;\r
327         // 予約待機の実予約番組自動選択数\r
328         public int getRsvTargets() { return rsvTargets; }\r
329         public void setRsvTargets(int c) { rsvTargets = c; }\r
330         private int rsvTargets = 32;\r
331         // 行ヘッダを表示する\r
332         public boolean getRowHeaderVisible() { return rowHeaderVisible; }\r
333         public void setRowHeaderVisible(boolean b) { rowHeaderVisible = b; }\r
334         private boolean rowHeaderVisible = false;\r
335         // ダブルクリック時の動作\r
336         public DblClkCmd getDblClkCmd() { return dblClkCmd; }\r
337         public void setDblClkCmd(DblClkCmd c) { dblClkCmd = c; }\r
338         private DblClkCmd dblClkCmd = DblClkCmd.SHOWRSVDIALOG;\r
339 \r
340         // 過去ログ検索件数の上限\r
341         public int getSearchResultMax() { return searchResultMax; }\r
342         public void setSearchResultMax(int c) { searchResultMax = c; }\r
343         private int searchResultMax = 50;\r
344 \r
345         // 過去ログ検索履歴の上限\r
346         public int getSearchResultBufferMax() { return searchResultBufferMax; }\r
347         public void setSearchResultBufferMax(int c) { searchResultBufferMax = c; }\r
348         private int searchResultBufferMax = 5;\r
349 \r
350         /*\r
351          * 新聞形式関連の設定\r
352          */\r
353         \r
354         // 描画速度優先\r
355         public boolean getDrawcacheEnable() { return drawcacheEnable; }\r
356         public void setDrawcacheEnable(boolean b) { drawcacheEnable = b; }\r
357         private boolean drawcacheEnable = false;\r
358         // 新聞形式での、1ページあたりの放送局数\r
359         public int getCenterPerPage() { return centerPerPage; }\r
360         public void setCenterPerPage(int c) { centerPerPage = c; }\r
361         public boolean isPagerEnabled() { return ( ! drawcacheEnable) && (centerPerPage > 0); }\r
362         /**\r
363          * indexなので、0から始まる\r
364          */\r
365         public int getPageIndex(int n) {\r
366                 int rem = n % centerPerPage;\r
367                 return (n-rem)/centerPerPage + ((rem==0)?(0):(1)) - 1;\r
368         }\r
369         private int centerPerPage = PAGER_DEFAULT;\r
370         // 全ページを連続スナップショット\r
371         public boolean getAllPageSnapshot() { return allPageSnapshot; }\r
372         public void setAllPageSnapshot(boolean b) { allPageSnapshot = b; }\r
373         private boolean allPageSnapshot = false;\r
374         // 番組表のツールチップを表示する\r
375         public boolean getTooltipEnable() { return tooltipEnable; }\r
376         public void setTooltipEnable(boolean b) { tooltipEnable = b; }\r
377         private boolean tooltipEnable = false;\r
378         // ツールチップの表示遅延(100ミリ秒)\r
379         public int getTooltipInitialDelay() { return tooltipInitialDelay; }\r
380         public void setTooltipInitialDelay(int c) { tooltipInitialDelay = c; }\r
381         private int tooltipInitialDelay = 3;\r
382         // ツールチップの消去遅延(100ミリ秒)\r
383         public int getTooltipDismissDelay() { return tooltipDismissDelay; }\r
384         public void setTooltipDismissDelay(int c) { tooltipDismissDelay = c; }\r
385         private int tooltipDismissDelay = 30*10;\r
386         // タイムバーにあわせてスクロール\r
387         public boolean getTimerbarScrollEnable() { return timerbarScrollEnable; }\r
388         public void setTimerbarScrollEnable(boolean b) { timerbarScrollEnable = b; }\r
389         private boolean timerbarScrollEnable = true;\r
390         // 過去ログの日付ノードの表示数\r
391         public int getPassedLogLimit() { return passedLogLimit; }\r
392         public void setPassedLogLimit(int c) { passedLogLimit = c; }\r
393         private int passedLogLimit = 31;\r
394         // 局ごとの幅(->bounds)\r
395         // 番組枠の高さ(->bounds)\r
396         // タイムバーの色設定\r
397         public Color getTimebarColor() { return timebarColor; }\r
398         public void setTimebarColor(Color c) { timebarColor = c; }\r
399         private Color timebarColor = TIMEBAR_COLOR_06_12;\r
400         public Color getTimebarColor2() { return timebarColor2; }\r
401         public void setTimebarColor2(Color c) { timebarColor2 = c; }\r
402         private Color timebarColor2 = TIMEBAR_COLOR_12_18;\r
403         public Color getTimebarColor3() { return timebarColor3; }\r
404         public void setTimebarColor3(Color c) { timebarColor3 = c; }\r
405         private Color timebarColor3 = TIMEBAR_COLOR_18_24;\r
406         public Color getTimebarColor4() { return timebarColor4; }\r
407         public void setTimebarColor4(Color c) { timebarColor4 = c; }\r
408         private Color timebarColor4 = TIMEBAR_COLOR_24_06;\r
409         // 予約枠の色設定\r
410         public Color getExecOnFontColor() { return execOnFontColor; }\r
411         public void setExecOnFontColor(Color c) { execOnFontColor = c; }\r
412         private Color execOnFontColor = EXECON_TUNE_COLOR;\r
413         // 無効予約のフォント色\r
414         public Color getExecOffFontColor() { return execOffFontColor; }\r
415         public void setExecOffFontColor(Color c) { execOffFontColor = c; }\r
416         private Color execOffFontColor = EXECOFF_TUNE_COLOR;\r
417         // ピックアップ枠の色設定\r
418         public Color getPickedColor() { return pickedColor; }\r
419         public void setPickedColor(Color c) { pickedColor = c; }\r
420         private Color pickedColor = PICKUP_BORDER_COLOR;\r
421         public Color getPickedFontColor() { return pickedFontColor; }\r
422         public void setPickedFontColor(Color c) { pickedFontColor = c; }\r
423         private Color pickedFontColor = PICKUP_TUNER_COLOR;\r
424         // ジャンル別色設定(ここでは設定しない。PaperColorMapクラスで)\r
425         @Deprecated\r
426         public String getPaperColors() { return paperColors; }\r
427         @Deprecated\r
428         public void setPaperColors(String s) { paperColors = s; }\r
429         @Deprecated\r
430         private String paperColors = "";\r
431         // マウスオーバー時のハイライト色設定\r
432         public boolean getEnableHighlight() { return enableHighlight; }\r
433         public void setEnableHighlight(boolean b) { enableHighlight = b; }\r
434         private boolean enableHighlight = true;\r
435         public Color getHighlightColor() { return highlightColor; }\r
436         public void setHighlightColor(Color c) { highlightColor = c; }\r
437         private Color highlightColor = MOUSEOVER_COLOR;\r
438         // 番組枠の設定(titleFontStyleの初期化はコンストラクタで)\r
439         public boolean getShowStart() { return showStart; }\r
440         public void setShowStart(boolean b) { showStart = b; }\r
441         private boolean showStart = true;\r
442         public String getTitleFont() { return titleFont; }\r
443         public void setTitleFont(String s) { titleFont = s; }\r
444         private String titleFont = "";\r
445         public int getTitleFontSize() { return titleFontSize; }\r
446         public void setTitleFontSize(int n) { titleFontSize = n; }\r
447         private int titleFontSize = 13;\r
448         public Color getTitleFontColor() { return titleFontColor; }\r
449         public void setTitleFontColor(Color c) { titleFontColor = c; }\r
450         private Color titleFontColor = TITLE_COLOR;\r
451         public ArrayList<JTXTButton.FontStyle> getTitleFontStyle() { return titleFontStyle; }\r
452         public void setTitleFontStyle(ArrayList<JTXTButton.FontStyle> a) { titleFontStyle = a; }\r
453         private ArrayList<JTXTButton.FontStyle> titleFontStyle = new ArrayList<JTXTButton.FontStyle>();\r
454         public boolean getShowDetail() { return showDetail; }\r
455         public void setShowDetail(boolean b) { showDetail = b; }\r
456         private boolean showDetail = true;\r
457         public int getDetailRows() { return detailRows; }\r
458         public void setDetailRows(int n) { detailRows = n; }\r
459         private int detailRows = 50;\r
460         public String getDetailFont() { return detailFont; }\r
461         public void setDetailFont(String s) { detailFont = s; }\r
462         private String detailFont = "";\r
463         public int getDetailFontSize() { return detailFontSize; }\r
464         public void setDetailFontSize(int n) { detailFontSize = n; }\r
465         private int detailFontSize = 11;\r
466         public Color getDetailFontColor() { return detailFontColor; }\r
467         public void setDetailFontColor(Color c) { detailFontColor = c; }\r
468         private Color detailFontColor = DETAIL_COLOR;\r
469         public ArrayList<JTXTButton.FontStyle> getDetailFontStyle() { return detailFontStyle; }\r
470         public void setDetailFontStyle(ArrayList<JTXTButton.FontStyle> a) { detailFontStyle = a; }\r
471         private ArrayList<JTXTButton.FontStyle> detailFontStyle = new ArrayList<JTXTButton.FontStyle>();\r
472         public int getDetailTab() { return detailTab; }\r
473         public void setDetailTab(int n) { detailTab = n; }\r
474         private int detailTab = 8;\r
475         public Color getMatchedBorderColor() { return matchedBorderColor; }\r
476         public void setMatchedBorderColor(Color c) { matchedBorderColor = c; }\r
477         private Color matchedBorderColor = MATCHBORDER_COLOR;\r
478         public Color getMatchedKeywordBorderColor() { return matchedKeywordBorderColor; }\r
479         public void setMatchedKeywordBorderColor(Color c) { matchedKeywordBorderColor = c; }\r
480         private Color matchedKeywordBorderColor = MATCHBORDER_COLOR;\r
481         public int getMatchedBorderThickness() { return matchedBorderThickness; }\r
482         public void setMatchedBorderThickness(int n) { matchedBorderThickness = n; }\r
483         private int matchedBorderThickness = 6;\r
484         // AAモード\r
485         public AAMode getPaperAAMode() { return paperAAMode; }\r
486         public void setPaperAAMode(AAMode a) { paperAAMode = a; }\r
487         private AAMode paperAAMode = AAMode.ON;\r
488         // 新聞形式でもレコーダーコンボボックスを有効にする\r
489         public boolean getEffectComboToPaper() { return effectComboToPaper; }\r
490         public void setEffectComboToPaper(boolean b) { effectComboToPaper = b; }\r
491         private boolean effectComboToPaper = true;\r
492         // スナップショットのフォーマット\r
493         public SnapshotFmt getSnapshotFmt() { return snapshotFmt; }\r
494         public void setSnapshotFmt(SnapshotFmt s) { snapshotFmt = s; }\r
495         private SnapshotFmt snapshotFmt = SnapshotFmt.JPG;\r
496         // スナップショットを印刷する\r
497         public boolean getPrintSnapshot() { return printSnapshot; }\r
498         public void setPrintSnapshot(boolean b) { printSnapshot = b; }\r
499         private boolean printSnapshot = false;\r
500         \r
501         /*\r
502          * リスト・新聞形式共通\r
503          */\r
504         \r
505         // 実行ONのエントリのみ予約マークを表示する\r
506         public boolean getDisplayOnlyExecOnEntry() { return displayOnlyExecOnEntry; }\r
507         public void setDisplayOnlyExecOnEntry(boolean b) { displayOnlyExecOnEntry = b; }\r
508         private boolean displayOnlyExecOnEntry = false;\r
509         // 終了済み予約も表示する\r
510         public boolean getDisplayPassedReserve() { return displayPassedReserve; }\r
511         public void setDisplayPassedReserve(boolean b) { displayPassedReserve = b; }\r
512         private boolean displayPassedReserve = false;\r
513         // リピート放送を表示しない\r
514         public boolean getShowOnlyNonrepeated() { return showOnlyNonrepeated; }\r
515         public void setShowOnlyNonrepeated(boolean b) { showOnlyNonrepeated = b; }\r
516         private boolean showOnlyNonrepeated = true;\r
517         // 深夜(24:00-28:59)の帯予約を一日前にずらす\r
518         public boolean getAdjLateNight() { return adjLateNight; }\r
519         public void setAdjLateNight(boolean b) { adjLateNight = b; }\r
520         private boolean adjLateNight = false;\r
521         // ツリーペーンにrootノードを表示させる\r
522         public boolean getRootNodeVisible() { return rootNodeVisible; }\r
523         public void setRootNodeVisible(boolean b) { rootNodeVisible = b; }\r
524         private boolean rootNodeVisible = false;\r
525         // ツリーペーンの幅を同期させる\r
526         public boolean getSyncTreeWidth() { return syncTreeWidth; }\r
527         public void setSyncTreeWidth(boolean b) { syncTreeWidth = b; }\r
528         private boolean syncTreeWidth = true;\r
529         // ★延長警告★を短縮表示\r
530         public boolean getShortExtMark() { return shortExtMark; }\r
531         public void setShortExtMark(boolean b) { shortExtMark = b; }\r
532         private boolean shortExtMark = false;\r
533         // 表示マークの選択\r
534         public HashMap<TVProgram.ProgOption,Boolean> getOptMarks() { return optMarks; }\r
535         public void setOptMarks(HashMap<TVProgram.ProgOption,Boolean> h) { optMarks = h;        }\r
536         private HashMap<TVProgram.ProgOption,Boolean> optMarks = new HashMap<TVProgram.ProgOption, Boolean>();\r
537         // クリップボードアイテムの選択(->clipboardItem)\r
538         // 右クリックメニューの実行アイテム\r
539         public ArrayList<TextValueSet> getTvCommand() { return tvCommand; }\r
540         public void setTvCommand(ArrayList<TextValueSet> al) { tvCommand = al; }\r
541         private ArrayList<TextValueSet> tvCommand = new ArrayList<TextValueSet>();\r
542         \r
543         /*\r
544          * Web番組表対応\r
545          */\r
546         \r
547         // 29時をまたいで同タイトルが続いている場合は同一番組とみなす\r
548         public boolean getContinueTomorrow() { return continueTomorrow; }\r
549         public void setContinueTomorrow(boolean b) { continueTomorrow = b; }\r
550         private boolean continueTomorrow = true;\r
551         // Web番組表のキャッシュ保持時間\r
552         public int getCacheTimeLimit() { return cacheTimeLimit; }\r
553         public void setCacheTimeLimit(int w) { cacheTimeLimit = w; }\r
554         public boolean isShutdownEnabled() { return (cacheTimeLimit == 0)&&(shutdownCmd!=null&&shutdownCmd.length()>0); }\r
555         private int cacheTimeLimit = 12;\r
556         // シャットダウンコマンド\r
557         public String getShutdownCmd() { return shutdownCmd; }\r
558         public void setShutdownCmd(String s) { shutdownCmd = s; }\r
559         private String shutdownCmd = "";\r
560         // 可能なら番組表8日分を取得する\r
561         public boolean getExpandTo8() { return expandTo8; }\r
562         public void setExpandTo8(boolean b) { expandTo8 = b; dogdays = (b)?(8):(7); }\r
563         private boolean expandTo8 = false;\r
564         public int getDogDays() { return dogdays; }\r
565         private int dogdays = 7;\r
566         // 番組詳細取得を行なうかどうか(廃止)\r
567         @Deprecated\r
568         public boolean getUseDetailCache() { return false; }\r
569         @Deprecated\r
570         public void setUseDetailCache(boolean b) { useDetailCache = false; }\r
571         @Deprecated\r
572         private boolean useDetailCache = false;\r
573         /**\r
574          *  予約ダイアログを開いたときに自動で番組IDを取得する\r
575          */\r
576         public boolean getAutoEventIdComplete() { return autoEventIdComplete; }\r
577         public void setAutoEventIdComplete(boolean b) { autoEventIdComplete = b; }\r
578         private boolean autoEventIdComplete = false;\r
579         // タイトルに話数が含まれる場合に以降を分離する\r
580         public boolean getSplitEpno() { return splitEpno; }\r
581         public void setSplitEpno(boolean b) { splitEpno = b; }\r
582         private boolean splitEpno = false;\r
583         // サブタイトルを番組追跡の対象から除外する\r
584         public boolean getTraceOnlyTitle() { return traceOnlyTitle; }\r
585         public void setTraceOnlyTitle(boolean b) { traceOnlyTitle = b; }\r
586         private boolean traceOnlyTitle = true;\r
587         // タイトルを整形する\r
588         public boolean getFixTitle() { return fixTitle; }\r
589         public void setFixTitle(boolean b) { fixTitle = b; }\r
590         private boolean fixTitle = true;\r
591         // NGワード\r
592         public ArrayList<String> getNgword() { return ngword; }\r
593         public void setNgword(ArrayList<String> ngw) { ngword = ngw; }\r
594         public void setNgword(String ngw) {\r
595                 ngword = new ArrayList<String>();\r
596                 for (String ngs : ngw.split(";")) {\r
597                         if (ngs.trim().length() > 0) {\r
598                                 ngword.add(ngs.trim());\r
599                         }\r
600                 }\r
601         }\r
602         private ArrayList<String> ngword = new ArrayList<String>();\r
603         // Web番組表をアクセスする際のUser-Agentの値\r
604         public String getUserAgent() { return userAgent; }\r
605         public void setUserAgent(String s) { userAgent = s; }\r
606         private String userAgent = USER_AGENT;\r
607         // HTTP Proxy\r
608         public boolean getUseProxy() { return useProxy; }\r
609         public void setUseProxy(boolean b) { useProxy = b; }\r
610         public String getProxyAddr() { return proxyAddr; }\r
611         public void setProxyAddr(String s) { proxyAddr = s; }\r
612         public String getProxyPort() { return proxyPort; }\r
613         public void setProxyPort(String s) { proxyPort = s; }\r
614         private boolean useProxy = false;\r
615         private String proxyAddr = "";\r
616         private String proxyPort = "";\r
617         // しょぼかるを利用する\r
618         public boolean getUseSyobocal() { return useSyobocal; }\r
619         public void setUseSyobocal(boolean b) { useSyobocal = b; }\r
620         private boolean useSyobocal = true;\r
621         // 日に一回しか新着履歴を更新しない\r
622         public boolean getHistoryOnlyUpdateOnce() { return historyOnlyUpdateOnce; }\r
623         public void setHistoryOnlyUpdateOnce(boolean b) { historyOnlyUpdateOnce = b; }\r
624         private boolean historyOnlyUpdateOnce = true;\r
625         // 過去ログを利用する\r
626         public boolean getUsePassedProgram() { return usePassedProgram; }\r
627         public void setUsePassedProgram(boolean b) { usePassedProgram = b; }\r
628         private boolean usePassedProgram = true;\r
629         // 何日先までのログを過去ログ用に準備しておくか\r
630         public int getPrepPassedProgramCount() { return prepPassedProgramCount; }\r
631         public void setPrepPassedProgramCount(int w) { prepPassedProgramCount = w; }\r
632         private int prepPassedProgramCount = 4;\r
633         \r
634         \r
635         \r
636         /*\r
637          * レコーダ対応\r
638          */\r
639         \r
640         // 常に予約詳細情報を取得する\r
641         @Deprecated\r
642         public boolean getForceGetRdReserveDetails() { return forceGetRdReserveDetails; }\r
643         @Deprecated\r
644         public void setForceGetRdReserveDetails(boolean b) { forceGetRdReserveDetails = b; }\r
645         @Deprecated\r
646         private boolean forceGetRdReserveDetails = false;\r
647         // 常に予約詳細情報を取得しない\r
648         @Deprecated\r
649         public boolean getNeverGetRdReserveDetails() { return neverGetRdReserveDetails; }\r
650         @Deprecated\r
651         public void setNeverGetRdReserveDetails(boolean b) { neverGetRdReserveDetails = b; }\r
652         @Deprecated\r
653         private boolean neverGetRdReserveDetails = false;\r
654         // 予約取得ボタンで録画結果も同時に取得する\r
655         @Deprecated\r
656         public boolean getSkipGetRdRecorded() { return skipGetRdRecorded; }\r
657         @Deprecated\r
658         public void setSkipGetRdRecorded(boolean b) { skipGetRdRecorded = b; }\r
659         @Deprecated\r
660         private boolean skipGetRdRecorded = false;\r
661 \r
662         // 予約一覧取得時に番組詳細も取得する\r
663         public int getForceLoadReserveDetails() { return forceLoadReserveDetails; }\r
664         public void setForceLoadReserveDetails(int n) { forceLoadReserveDetails = n; }\r
665         private int forceLoadReserveDetails = 0;\r
666         // 予約一覧取得時に自動予約一覧も取得する\r
667         public int getForceLoadAutoReserves() { return forceLoadAutoReserves; }\r
668         public void setForceLoadAutoReserves(int n) { forceLoadAutoReserves = n; }\r
669         private int forceLoadAutoReserves = 0;\r
670         // 予約一覧取得時に録画結果一覧も取得する\r
671         public int getForceLoadRecorded() { return forceLoadRecorded; }\r
672         public void setForceLoadRecorded(int n) { forceLoadRecorded = n; }\r
673         private int forceLoadRecorded = 0;\r
674 \r
675         // 録画結果一覧の保存期間\r
676         public void setRecordedSaveScope(int n) { recordedSaveScope = n; }\r
677         public int getRecordedSaveScope() { return recordedSaveScope; }\r
678         private int recordedSaveScope = 90;\r
679         \r
680         \r
681         //\r
682         @Deprecated\r
683         public boolean getDontCalendarWorkWithNull() { return dontCalendarWorkWithNull; }\r
684         @Deprecated\r
685         public void setDontCalendarWorkWithNull(boolean b) { dontCalendarWorkWithNull = b; }\r
686         @Deprecated\r
687         boolean dontCalendarWorkWithNull = true;\r
688         \r
689         /*\r
690          * 予約\r
691          */\r
692         \r
693         // スポーツ延長の長さ(分) \r
694         public String getSpoexLength() { return spoexLength; }\r
695         public void setSpoexLength(String l) { spoexLength = l; }\r
696         private String spoexLength = "90";\r
697         // 前倒し\r
698         public boolean getOverlapUp() { return overlapUp; }\r
699         public void setOverlapUp(boolean b) { overlapUp = b; }\r
700         private boolean overlapUp = false;\r
701         // 先送り\r
702         public boolean getOverlapDown() { return overlapDown; }\r
703         public void setOverlapDown(boolean b) { overlapDown = b; }\r
704         private boolean overlapDown = false;\r
705         // ケツ短縮\r
706         public boolean getOverlapDown2() { return overlapDown2; }\r
707         public void setOverlapDown2(boolean b) { overlapDown2 = b; }\r
708         private boolean overlapDown2 = false;\r
709         // OVAとか縮めんといて\r
710         public boolean getNoOverlapDown2Sp() { return noOverlapDown2Sp; }\r
711         public void setNoOverlapDown2Sp(boolean b) { noOverlapDown2Sp = b; }\r
712         private boolean noOverlapDown2Sp = true;\r
713         // 自動フォルダ選択\r
714         public boolean getAutoFolderSelect() { return autoFolderSelect; }\r
715         public void setAutoFolderSelect(boolean b) { autoFolderSelect = b; }\r
716         private boolean autoFolderSelect = true;\r
717         // ジャンルではなく放送局でAV設定をする\r
718         public boolean getEnableCHAVsetting() { return enableCHAVsetting; }\r
719         public void setEnableCHAVsetting(boolean b) { enableCHAVsetting = b; }\r
720         private boolean enableCHAVsetting = false;\r
721         // 類似予約の検索範囲\r
722         public int getRangeLikeRsv() { return rangeLikeRsv; }\r
723         public void setRangeLikeRsv(int c) { rangeLikeRsv = c; }\r
724         private int rangeLikeRsv = 0;\r
725         // 類似予約の情報を引き継ぐ\r
726         public boolean getGivePriorityToReserved() { return givePriorityToReserved; }\r
727         public void setGivePriorityToReserved(boolean b) { givePriorityToReserved = b; }\r
728         private boolean givePriorityToReserved = true;\r
729         // 類似予約の予約名を優先する\r
730         public boolean getGivePriorityToReservedTitle() { return givePriorityToReservedTitle; }\r
731         public void setGivePriorityToReservedTitle(boolean b) { givePriorityToReservedTitle = b; }\r
732         private boolean givePriorityToReservedTitle = true;\r
733         // 隣接する番組を重複扱いしない\r
734         public boolean getAdjoiningNotRepetition() { return adjoiningNotRepetition; }\r
735         public void setAdjoiningNotRepetition(boolean b) { adjoiningNotRepetition = b; }\r
736         private boolean adjoiningNotRepetition = false;\r
737         // 予約一覧で繰り返し予約を展開する\r
738         public boolean getShowAllIterationItem() { return showAllIterationItem; }\r
739         public void setShowAllIterationItem(boolean b) { showAllIterationItem = b; }\r
740         private boolean showAllIterationItem = true;\r
741         // 繰り返し予約の2つ目以降の文字色\r
742         public Color getIterationItemForeground() { return iterationItemForeground; }\r
743         public void setIterationItemForeground(Color c) { iterationItemForeground = c; }\r
744         private Color iterationItemForeground = ITERATIONITEM_COLOR;\r
745         // チューナー不足警告の強調色\r
746         public Color getTunerShortColor() { return tunerShortColor; }\r
747         public void setTunerShortColor(Color c) { tunerShortColor = c; }\r
748         private Color tunerShortColor = TUNERSHORT_COLOR;\r
749         // 正常録画済み(と思われる)と思われる背景色\r
750         public Color getRecordedColor() { return recordedColor; }\r
751         public void setRecordedColor(Color c) { recordedColor = c; }\r
752         private Color recordedColor = RECORDED_COLOR;\r
753         // タイトル自動補完\r
754         public boolean getUseAutocomplete() { return useAutocomplete; }\r
755         public void setUseAutocomplete(boolean b) { useAutocomplete = b; }\r
756         private boolean useAutocomplete = false;\r
757         \r
758         /*\r
759          * その他の設定\r
760          */\r
761         \r
762         // 起動時にアップデートを確認する\r
763         public boolean getCheckUpdate() { return checkUpdate; }\r
764         public void setCheckUpdate(boolean b) { checkUpdate= b; }\r
765         private boolean checkUpdate = true;\r
766         public UpdateOn getUpdateMethod() { return updateMethod; }\r
767         public void setUpdateMethod(UpdateOn u) { updateMethod = u; }\r
768         private UpdateOn updateMethod = UpdateOn.EVERY2DAY;\r
769         // beep音無効\r
770         public boolean getDisableBeep() { return disableBeep; }\r
771         public void setDisableBeep(boolean b) { disableBeep = b; }\r
772         private boolean disableBeep = false;\r
773         // システムトレイを表示する\r
774         public boolean getShowSysTray() { return showSysTray; }\r
775         public void setShowSysTray(boolean b) { showSysTray = b; }\r
776         private boolean showSysTray = false;\r
777         // [X]ボタンでシステムトレイに隠す\r
778         public boolean getHideToTray() { return hideToTray; }\r
779         public void setHideToTray(boolean b) { hideToTray = b; }\r
780         private boolean hideToTray = false;\r
781         // 多重起動禁止\r
782         public boolean getOnlyOneInstance() { return onlyOneInstance; }\r
783         public void setOnlyOneInstance(boolean b) { onlyOneInstance = b; }\r
784         private boolean onlyOneInstance = false;\r
785         // LookAndFeel\r
786         public String getLookAndFeel() { return lookAndFeel; }\r
787         public void setLookAndFeel(String n) { lookAndFeel = n; }\r
788         private String lookAndFeel = "";\r
789         // 表示フォント \r
790         public String getFontName() { return fontName; }\r
791         public void setFontName(String f) { fontName = f; }\r
792         private String fontName = "";\r
793         public int getFontSize() { return fontSize; }\r
794         public void setFontSize(int f) { fontSize = f; }\r
795         private int fontSize = 12;\r
796         \r
797         public boolean getUseGTKRC() { return useGTKRC; }\r
798         public void setUseGTKRC(boolean b) { useGTKRC = b; }\r
799         private boolean useGTKRC = true;\r
800         \r
801         private int fontSizeAdjustGTK = 3;\r
802         \r
803         // 【Win】ファイルオープンにrundll32を使用する\r
804         public boolean getUseRundll32() { return useRundll32; }\r
805         public void setUseRundll32(boolean b) { useRundll32 = b; }\r
806         private boolean useRundll32 = false;\r
807         // 【注意】デバッグモード\r
808         public boolean getDebug() { return debug; }\r
809         public void setDebug(boolean b) { debug = b; }\r
810         private boolean debug = false;\r
811         \r
812         \r
813         /*******************************************************************************\r
814          * 作ったけど使ってないもの\r
815          ******************************************************************************/\r
816         \r
817         /*\r
818          * フォルダの設定\r
819          */\r
820         \r
821         // キャッシュ格納場所\r
822         public String getProgDir() { return progDir; }\r
823         public void setProgDir(String s) { progDir = s; }\r
824         private String progDir = "progcache";\r
825         // 過去ログ格納場所\r
826         public String getPassedDir() { return passedDir; }\r
827         public void setPassedDir(String s) { passedDir = s; }\r
828         private String passedDir = "passed";\r
829 \r
830         \r
831         /*******************************************************************************\r
832          * 設定項目ではないもの\r
833          ******************************************************************************/\r
834         \r
835         /*\r
836          * Web番組表関連の設定 \r
837          */\r
838         \r
839         // Web番組表サイト(TV)\r
840         public String getTVProgramSite() { return tvProgramSite; }\r
841         public void setTVProgramSite(String s) { tvProgramSite = s; }\r
842         private String tvProgramSite = TV_SITE;\r
843         // Web番組表サイト(CS)\r
844         public String getCSProgramSite() { return csProgramSite; }\r
845         public void setCSProgramSite(String s) { csProgramSite = s; }\r
846         private String csProgramSite = CS_SITE;\r
847         // Web番組表サイト(CS2)\r
848         public String getCS2ProgramSite() { return cs2ProgramSite; }\r
849         public void setCS2ProgramSite(String s) { cs2ProgramSite = s; }\r
850         private String cs2ProgramSite = CS2_SITE;\r
851         // Web番組表サイト(Radio)\r
852         @Deprecated\r
853         public String getRadioProgramSite() { return radioProgramSite; }\r
854         @Deprecated\r
855         public void setRadioProgramSite(String s) { radioProgramSite = s; }\r
856         @Deprecated\r
857         private String radioProgramSite = RADIO_SITE;\r
858 \r
859         /*******************************************************************************\r
860          * もう使われていないアイテム\r
861          ******************************************************************************/\r
862         \r
863         // 番組表の表示を簡素化する(現在は使用していない)\r
864         @Deprecated\r
865         public boolean getLightProgramView() { return lightProgramView; }\r
866         @Deprecated\r
867         public void setLightProgramView(boolean b) { lightProgramView = b; }\r
868         @Deprecated\r
869         private boolean lightProgramView = false;\r
870         \r
871         // スポーツ延長の検索範囲\r
872         @Deprecated\r
873         public String getSpoexSearchStart() { return spoexSearchStart; }\r
874         @Deprecated\r
875         public void setSpoexSearchStart(String s) { spoexSearchStart = s; }\r
876         @Deprecated\r
877         public String getSpoexSearchEnd() { return spoexSearchEnd; }\r
878         \r
879         @Deprecated\r
880         public void setSpoexSearchEnd(String s) { spoexSearchEnd = s; }\r
881         @Deprecated\r
882         private String spoexSearchStart = "00:00";\r
883         @Deprecated\r
884         private String spoexSearchEnd = "00:00";\r
885         \r
886         // 「最大延長」の記載のあるもののみスポーツ延長のトリガーにする\r
887         @Deprecated\r
888         public boolean getSpoexLimitation() { return spoexLimitation; }\r
889         @Deprecated\r
890         public void setSpoexLimitation(boolean b) { spoexLimitation = b; }\r
891         @Deprecated\r
892         private boolean spoexLimitation = false;\r
893         \r
894         \r
895         /*******************************************************************************\r
896          * 雑多なメソッド\r
897          ******************************************************************************/\r
898 \r
899         // 各種ディレクトリの作成\r
900         public void makeEnvDir() {\r
901                 String cause = "";\r
902                 try {\r
903                         File d = null;\r
904                         \r
905                         // 設定ファイルを格納するディレクトリの作成\r
906                         d = new File(cause = envDir);\r
907                         if (d.exists() == false) {\r
908                                 if (d.mkdir() == false) {\r
909                                         // 何か致命的なエラー\r
910                                 }\r
911                         }\r
912 \r
913                         // プラグイン一覧ファイルを格納するディレクトリの作成\r
914                         d = new File(cause = metainfDir);\r
915                         if (d.exists() == false) {\r
916                                 if (d.mkdir() == false) {\r
917                                         // 何か致命的なエラー\r
918                                 }\r
919                         }\r
920                         d = new File(cause = services);\r
921                         if (d.exists() == false) {\r
922                                 if (d.mkdir() == false) {\r
923                                         // 何か致命的なエラー\r
924                                 }\r
925                         }\r
926                         \r
927                         // 番組表をキャッシュするディレクトリの作成\r
928                         d = new File(cause = progDir);\r
929                         if (d.exists() == false) {\r
930                                 if (d.mkdir() == false) {\r
931                                         // 何か致命的なエラー\r
932                                 }\r
933                         }\r
934                         \r
935                         // 過去ログ\r
936                         d = new File(cause = passedDir);\r
937                         if (d.exists() == false) {\r
938                                 if (d.mkdir() == false) {\r
939                                         // 何か致命的なエラー\r
940                                 }\r
941                         }\r
942                         \r
943                         // skin\r
944                         d = new File(cause = skinDir);\r
945                         if (d.exists() == false) {\r
946                                 if (d.mkdir() == false) {\r
947                                         // 何か致命的なエラー\r
948                                 }\r
949                         }\r
950                         \r
951                         /*\r
952                         // debug\r
953                         d = new File(cause = debugDir);\r
954                         if (d.exists() == false) {\r
955                                 if (d.mkdir() == false) {\r
956                                         // 何か致命的なエラー\r
957                                 }\r
958                         }\r
959                         */\r
960                 }\r
961                 catch (Exception e) {\r
962                         System.err.println(ERRID+"フォルダの作成に失敗 "+cause);\r
963                 }\r
964         }\r
965         \r
966         // 保存する・読みだす\r
967         public boolean save() {\r
968         \r
969                 if ( FieldUtils.save(envText,this) ) {\r
970                 // テキスト形式へ移行済み\r
971                         \r
972                         if ( useGTKRC ) {\r
973                                 saveGTKRC();\r
974                         }\r
975                         else {\r
976                                 File f = new File(GTKRC);\r
977                                 if ( f.exists() ) {\r
978                                         f.delete();\r
979                                 }\r
980                         }\r
981                 \r
982                         return true;\r
983                 }\r
984         \r
985         System.out.println(MSGID+"保存します: "+envFile);\r
986         if ( ! CommonUtils.writeXML(envFile, this) ) {\r
987                 System.err.println(ERRID+"保存に失敗しました");\r
988                 return false;\r
989         }\r
990         return true;\r
991         }\r
992         \r
993         private boolean saveGTKRC() {\r
994                 StringBuilder sb = new StringBuilder();\r
995                 sb.append("style \"tainavistyle\" {\n");\r
996                 sb.append("font_name = \"");\r
997                 sb.append(this.getFontName());\r
998                 sb.append(" ");\r
999                 sb.append(String.valueOf(this.getFontSize()-fontSizeAdjustGTK));\r
1000                 sb.append("\"\n");\r
1001                 sb.append("}\n");\r
1002                 sb.append("\n");\r
1003                 sb.append("class \"GtkWidget\" style \"tainavistyle\"\n");\r
1004                 return CommonUtils.write2file(GTKRC, sb.toString());\r
1005         }\r
1006         \r
1007         public boolean load() {\r
1008                 \r
1009         File ft = new File(envText);\r
1010         if ( ft.exists() ) {\r
1011                 // テキスト形式へ移行済み\r
1012                         System.out.println("@Deprecated: "+envFile);\r
1013                 return true;\r
1014         }\r
1015         \r
1016         System.out.println(MSGID+"読み込みます: "+envFile);\r
1017         File fx = new File(envFile);\r
1018         if ( fx.exists() ) {\r
1019                 Env b = (Env) CommonUtils.readXML(envFile);\r
1020                 if ( b != null ) {\r
1021                         FieldUtils.deepCopy(this, b);\r
1022                         \r
1023                                 // テキスト形式がなければ作るよ\r
1024                                 if ( FieldUtils.save(envText,this) ) {\r
1025                                         fx.renameTo(new File(envFile+".bak"));\r
1026                                 }\r
1027                         \r
1028                         return true;\r
1029                 }\r
1030         }\r
1031         \r
1032         System.err.println(ERRID+"環境設定が読み込めなかったのでデフォルトの設定値を利用します");\r
1033         return false;\r
1034         }\r
1035         \r
1036         \r
1037         /**\r
1038          * {@link Env#save()}から呼び出されるだけで公開はしない\r
1039          */\r
1040         @Deprecated\r
1041         private boolean saveLAF() {\r
1042         System.out.println(MSGID+"ルックアンドフィール設定を保存します: "+lafFile);\r
1043         if ( ! CommonUtils.write2file(lafFile, String.format("%s\t%s\t%d",this.lookAndFeel,fontName,fontSize)) ) {\r
1044                 System.err.println(ERRID+"ルックアンドフィール設定の保存に失敗しました");\r
1045                 return false;\r
1046         }\r
1047         return true;\r
1048         }\r
1049         \r
1050         /**\r
1051          * 移行用\r
1052          * @return\r
1053          */\r
1054         public boolean loadText() {\r
1055                 \r
1056                 boolean b = FieldUtils.load(envText,this);\r
1057                 \r
1058                 // 廃止するよ\r
1059                 File f = new File(lafFile); \r
1060         if ( f.exists() ) {\r
1061                 System.out.println(MSGID+"ルックアンドフィール設定ファイルは廃止されます: "+lafFile);\r
1062                 String s = CommonUtils.read4file(lafFile, true);\r
1063                 if ( s != null ) {\r
1064                         Matcher ma = Pattern.compile("^(.+?)\t(.+?)\t(\\d+?)$",Pattern.DOTALL).matcher(s);\r
1065                         if ( ma.find() ) {\r
1066                                 this.lookAndFeel = ma.group(1);\r
1067                                 this.fontName = ma.group(2);\r
1068                                 this.fontSize = Integer.valueOf(ma.group(3));\r
1069                                 System.out.println("+lookandfeel="+this.lookAndFeel+", fontname="+this.fontName+", fontsize="+this.fontSize);\r
1070                         }\r
1071                 }\r
1072                         f.delete();\r
1073         }\r
1074                 \r
1075                 return b;\r
1076                 \r
1077         }\r
1078         \r
1079         /**\r
1080          * <P>XMLDecoderに失敗すると起動できなくなる場合があるので、どうしても起動時に欲しい設定だけベタテキストで保存しおく\r
1081          * <P>{@link #saveLAF()}は公開しない\r
1082          */\r
1083         @Deprecated\r
1084         public boolean loadLAF() {\r
1085         return true;\r
1086         }\r
1087         \r
1088         /*******************************************************************************\r
1089          * コンストラクタ\r
1090          ******************************************************************************/\r
1091         \r
1092         public Env() {\r
1093 \r
1094                 // ↑の宣言時に設定できないもの\r
1095                 \r
1096                 {\r
1097                         ArrayList<JTXTButton.FontStyle> fsa = new ArrayList<JTXTButton.FontStyle>();\r
1098                         fsa.add(JTXTButton.FontStyle.BOLD);\r
1099                         fsa.add(JTXTButton.FontStyle.UNDERLINE);\r
1100                         this.setTitleFontStyle(fsa);\r
1101                 }\r
1102                 {\r
1103                         ArrayList<JTXTButton.FontStyle> fsa = new ArrayList<JTXTButton.FontStyle>();\r
1104                         this.setDetailFontStyle(fsa);\r
1105                 }\r
1106                 {\r
1107                         HashMap<TVProgram.ProgOption, Boolean> h = new HashMap<TVProgram.ProgOption, Boolean>();\r
1108                         for ( Object[] obj : TVProgram.optMarks ) {\r
1109                                 h.put((TVProgram.ProgOption) obj[0],true);\r
1110                         }\r
1111                         this.setOptMarks(h);\r
1112                 }\r
1113                 {\r
1114                         ArrayList<TextValueSet> al = new ArrayList<TextValueSet>();\r
1115                         \r
1116                         TextValueSet tv = new TextValueSet();\r
1117                         tv.setText("Googleでタイトルを検索");\r
1118                         tv.setValue("http://www.google.co.jp/search?q=%ENCTITLE%");\r
1119                         al.add(tv);\r
1120                         \r
1121                         tv = new TextValueSet();\r
1122                         tv.setText("Bingでタイトルを検索");\r
1123                         tv.setValue("http://www.bing.com/search?q=%ENCTITLE%");\r
1124                         al.add(tv);\r
1125                         \r
1126                         tv = new TextValueSet();\r
1127                         tv.setText("ブラウザで番組詳細のページを開く");\r
1128                         tv.setValue("%DETAILURL%");\r
1129                         al.add(tv);\r
1130                         \r
1131                         tv = new TextValueSet();\r
1132                         tv.setText("ブラウザで放送局のページを探す");\r
1133                         tv.setValue("http://www.google.co.jp/search?hl=ja&btnI=1&q=%ENCCHNAME%");\r
1134                         al.add(tv);\r
1135                         \r
1136                         tv = new TextValueSet();\r
1137                         tv.setText("ブラウザで番組情報のページを探す");\r
1138                         tv.setValue("http://www.google.co.jp/search?hl=ja&btnI=1&q=%ENCCHNAME%+%ENCTITLE%");\r
1139                         al.add(tv);\r
1140 \r
1141                         tv = new TextValueSet();\r
1142                         tv.setText("ブラウザでTweetする");\r
1143                         tv.setValue("https://twitter.com/share?text=%DATE%+%START%-%END%+%ENCCHNAME%+%ENCTITLE%");\r
1144                         al.add(tv);\r
1145                         \r
1146                         tv = new TextValueSet();\r
1147                         tv.setText("CHAN-TORUの予約ページを開く");\r
1148                         tv.setValue("https://tv.so-net.ne.jp/chan-toru/detail?type=bytime&cat=%TVKCAT%&area=%TVKAREACODE%&pid=%TVKPID%");\r
1149                         al.add(tv);\r
1150                         \r
1151                         this.setTvCommand(al);\r
1152                 }\r
1153                 \r
1154                 // おまけ\r
1155                 if ( firstinstance ) {\r
1156                         firstinstance = false;\r
1157                         loadLAF();\r
1158                 }\r
1159         }\r
1160 }\r