OSDN Git Service

[予約ダイアログ]自動予約編集への対応に伴うレイアウト変更
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / AbsKeywordDialog.java
1 package tainavi;\r
2 \r
3 import java.awt.Dimension;\r
4 import java.awt.event.ActionEvent;\r
5 import java.awt.event.ActionListener;\r
6 import java.awt.event.ItemEvent;\r
7 import java.awt.event.ItemListener;\r
8 import java.util.ArrayList;\r
9 import java.util.regex.Matcher;\r
10 import java.util.regex.Pattern;\r
11 import java.util.regex.PatternSyntaxException;\r
12 \r
13 import javax.swing.DefaultComboBoxModel;\r
14 import javax.swing.JButton;\r
15 import javax.swing.JComboBox;\r
16 import javax.swing.JDialog;\r
17 import javax.swing.JLabel;\r
18 import javax.swing.JOptionPane;\r
19 import javax.swing.JPanel;\r
20 import javax.swing.JScrollPane;\r
21 import javax.swing.JTextField;\r
22 import javax.swing.ListSelectionModel;\r
23 import javax.swing.SpringLayout;\r
24 import javax.swing.SwingConstants;\r
25 import javax.swing.table.DefaultTableColumnModel;\r
26 import javax.swing.table.DefaultTableModel;\r
27 \r
28 import tainavi.SearchKey.TargetId;\r
29 import tainavi.TVProgram.ProgGenre;\r
30 import tainavi.TVProgram.ProgSubgenre;\r
31 \r
32 \r
33 /**\r
34  * キーワード検索の設定のクラス(延長警告管理でも流用する)\r
35  */\r
36 abstract class AbsKeywordDialog extends JDialog {\r
37 \r
38         private static final long serialVersionUID = 1L;\r
39 \r
40         public void setWindowTitle(String s) { windowTitle = s; }\r
41 \r
42         /*******************************************************************************\r
43          * 抽象メソッド\r
44          ******************************************************************************/\r
45         \r
46         abstract void preview(SearchKey search);\r
47 \r
48         /*******************************************************************************\r
49          * 定数\r
50          ******************************************************************************/\r
51 \r
52         // レイアウト関連\r
53         \r
54         private static final int PARTS_HEIGHT = 30;\r
55         private static final int SEP_WIDTH = 10;\r
56         private static final int SEP_HEIGHT = 10;\r
57         private static final int SEP_HEIGHT_NARROW = 3;\r
58 \r
59         private static final int LABEL_WIDTH_S = 50;\r
60         private static final int LABEL_WIDTH_L = 75;\r
61         \r
62         private static final int TEXT_WIDTH = 300;\r
63 \r
64         private static final int UPDOWN_WIDTH = 50;\r
65         private static final int BUTTON_WIDTH_S = 75;\r
66         private static final int BUTTON_WIDTH_L = 100;\r
67 \r
68         private static final int TARGET_WIDTH = 175;\r
69         private static final int REGEX_WIDTH = 300;\r
70         \r
71         private static final int CHECKBOX_WIDTH = 200;\r
72         private static final int CHECKLABEL_WIDTH = CHECKBOX_WIDTH-25;\r
73         \r
74         private static final int CONDITION_WIDTH = 220;\r
75         \r
76         private static final int SELECTION_WIDTH = 150;\r
77 \r
78         private static final int TABLE_WIDTH = REGEX_WIDTH+TARGET_WIDTH*2+SEP_WIDTH*2;  // スクロールバー分\r
79         private static final int TABLEPANE_WIDTH = TABLE_WIDTH+25;      // スクロールバー分\r
80         private static final int TABLE_HEIGHT = 160;\r
81         \r
82         private static final int PANEL_WIDTH = TABLEPANE_WIDTH+UPDOWN_WIDTH+SEP_WIDTH*2;\r
83 \r
84         // カラム関連\r
85         \r
86         private static enum KDColumn {\r
87                 TARGET          ("",    TARGET_WIDTH+SEP_WIDTH/2),\r
88                 REGEX           ("",    REGEX_WIDTH+SEP_WIDTH),\r
89                 CONTAIN         ("",    TARGET_WIDTH+SEP_WIDTH/2)\r
90                 ;\r
91                 \r
92                 private String name;\r
93                 private int iniWidth;\r
94                 \r
95                 private KDColumn(String name, int iniWidth) {\r
96                         this.name = name;\r
97                         this.iniWidth = iniWidth;\r
98                 }\r
99 \r
100                 public String getName() {\r
101                         return name;\r
102                 }\r
103 \r
104                 public int getIniWidth() {\r
105                         return iniWidth;\r
106                 }\r
107                 \r
108                 public int getColumn() {\r
109                         return ordinal();\r
110                 }\r
111         }\r
112         \r
113         /*******************************************************************************\r
114          * 部品\r
115          ******************************************************************************/\r
116         \r
117         // コンポーネント\r
118         \r
119         private JPanel jPanel = null;\r
120         private JLabel jLabel_label = null;\r
121         private JTextField jTextField_label = null;\r
122         private JButton jButton_label = null;\r
123         private JButton jButton_cancel = null;\r
124         private JButton jButton_preview = null;\r
125         private JComboBox jComboBox_target = null;\r
126         private JComboBox jComboBox_regex = null;\r
127         private JComboBox jComboBox_contain = null;\r
128         private JButton jButton_add = null;\r
129         private JButton jButton_remove = null;\r
130         private JComboBox jComboBox_condition = null;\r
131         private JComboBox jComboBox_infection = null;\r
132         private JScrollPane jScrollPane_keywords = null;\r
133         private KDTable jTable_keywords = null;\r
134         private JLabel jLabel_okiniiri = null;\r
135         private JComboBox jComboBox_okiniiri = null;\r
136         private JLabel jLabel_group = null;\r
137         private JComboBox jComboBox_group = null;\r
138         private JCheckBoxPanel jCheckBox_caseSensitive = null;\r
139         private JCheckBoxPanel jCheckBox_showInStandby = null;\r
140         private JButton jButton_up = null;\r
141         private JButton jButton_down = null;\r
142 \r
143         // コンポーネント以外\r
144         \r
145         private String windowTitle = "";\r
146         private String originalLabel = "";\r
147         private SearchProgram xKeys = null;\r
148         private SearchGroupList xGroups = null;\r
149         \r
150         private boolean reg = false;\r
151         \r
152         private ArrayList<TargetId> target_items = new ArrayList<TargetId>();\r
153         private ArrayList<String> contain_items = new ArrayList<String>(); \r
154         private ArrayList<String> condition_items = new ArrayList<String>(); \r
155         private ArrayList<String> infection_items = new ArrayList<String>();\r
156         private ArrayList<String> okiniiri_items = new ArrayList<String>(); \r
157         public void clean_target_items() { target_items.clear(); }\r
158         public void add_target_item(TargetId ti) { target_items.add(ti); }\r
159         public void clean_contain_items() { contain_items.clear(); }\r
160         public void add_contain_item(String s) { contain_items.add(s); }\r
161         public void clean_condition_items() { condition_items.clear(); }\r
162         public void add_condition_item(String s) { condition_items.add(s); }\r
163         public void clean_infection_items() { infection_items.clear(); }\r
164         public void add_infection_item(String s) { infection_items.add(s); }\r
165         public void clean_okiniiri_items() { okiniiri_items.clear(); }\r
166         public void add_okiniiri_item(String s) { okiniiri_items.add(s); }\r
167         \r
168         // 分類的にここでないような\r
169         \r
170         public String getNewLabel() { return jTextField_label.getText(); }\r
171         public String getNewGroup() { return (String)jComboBox_group.getSelectedItem(); }\r
172 \r
173         /*******************************************************************************\r
174          * コンストラクタ\r
175          ******************************************************************************/\r
176         \r
177         public AbsKeywordDialog() {\r
178                 \r
179                 super();\r
180 \r
181                 //\r
182                 reg = false;\r
183                 \r
184                 //\r
185                 setItems();\r
186                 \r
187                 //\r
188                 this.setModal(true);\r
189                 this.setContentPane(getJPanel());\r
190                 // タイトルバーの高さも考慮する必要がある\r
191                 Dimension d = getJPanel().getPreferredSize();\r
192                 this.pack();\r
193                 this.setPreferredSize(new Dimension(\r
194                                 d.width+(this.getInsets().left+this.getInsets().right),\r
195                                 d.height+(this.getInsets().top+this.getInsets().bottom)));\r
196                 this.setResizable(false);\r
197                 //\r
198                 this.setTitle(windowTitle);\r
199         }\r
200         \r
201         /*******************************************************************************\r
202          * アクション\r
203          ******************************************************************************/\r
204         \r
205         // 公開メソッド\r
206         \r
207         /**\r
208          *  検索条件が登録が実行されたかな?\r
209          */\r
210         public boolean isRegistered() { return reg; } \r
211         \r
212         // 使っている人いないね…\r
213         /*\r
214         private void open(String s, SearchProgram sKeys) {\r
215                 //\r
216                 xKeys = sKeys;\r
217                 //\r
218                 jComboBox_target.setSelectedIndex(0);\r
219                 jComboBox_contain.setSelectedIndex(0);\r
220                 jComboBox_condition.setSelectedIndex(0);\r
221                 for (int i=jTable_keywords.getRowCount()-1; i>=0; i--) {\r
222                         jTable_keywords.getRowItemList().remove(i);\r
223                 }\r
224                 //\r
225                 jTextField_label.setText(s);\r
226                 jTextField_label.setCaretPosition(0);\r
227                 jComboBox_regex.addItem(s);\r
228         }\r
229         */\r
230         \r
231         // キーワード検索管理としてのオープン(新規)\r
232         public void open(String label, SearchKey sK, SearchProgram sKeys, SearchGroupList gList) {\r
233                 //\r
234                 xKeys = sKeys;\r
235                 xGroups = gList; \r
236                 //\r
237                 jComboBox_target.setSelectedIndex(0);\r
238                 jComboBox_contain.setSelectedIndex(0);\r
239                 jComboBox_condition.setSelectedIndex(0);\r
240                 for (int i=jTable_keywords.getRowCount()-1; i>=0; i--) {\r
241                         jTable_keywords.getRowItemList().remove(i);\r
242                 }\r
243                 //\r
244                 for (int i=0; i<sK.alTarget.size(); i++) {\r
245                         \r
246                         KDItem data = new KDItem();\r
247                         data.target = sK.alTarget.get(i);\r
248                         data.regex = sK.alKeyword.get(i);\r
249                         data.contain = contain_items.get(Integer.valueOf(sK.alContain.get(i)));\r
250                         data.fireChanged();\r
251                         jTable_keywords.getRowItemList().add(data);\r
252                 }\r
253                 jTable_keywords.fireChanged();\r
254                 \r
255                 jTextField_label.setText(label);\r
256                 jTextField_label.setCaretPosition(0);\r
257                 //\r
258                 if ( xGroups != null && xGroups.size() != 0 ) {\r
259                         jComboBox_group.setEnabled(true);\r
260                         jComboBox_group.addItem("");\r
261                         for ( SearchGroup gr : xGroups ) {\r
262                                 jComboBox_group.addItem(gr.getName());\r
263                         }\r
264                 }\r
265 \r
266                 jCheckBox_caseSensitive.setSelected(sK.getCaseSensitive());\r
267                 jCheckBox_showInStandby.setSelected(sK.getShowInStandby());\r
268         }\r
269         \r
270         // 延長警告管理としてのオープン(新規)\r
271         public void open(String title, String center, boolean isInfection, SearchProgram sKeys) {\r
272                 //\r
273                 xKeys = sKeys;\r
274                 //\r
275                 if (isInfection) {\r
276                         jTextField_label.setText("●"+title);\r
277                 }\r
278                 else {\r
279                         jTextField_label.setText("○"+title);\r
280                 }\r
281                 jTextField_label.setCaretPosition(0);\r
282                 \r
283                 jComboBox_regex.addItem("");\r
284                 jComboBox_target.setSelectedIndex(0);\r
285                 jComboBox_contain.setSelectedIndex(0);\r
286                 jComboBox_condition.setSelectedIndex(0);\r
287                 for (int i=jTable_keywords.getRowCount()-1; i>=0; i--) {\r
288                         jTable_keywords.getRowItemList().remove(i);\r
289                 }\r
290                 //\r
291                 KDItem d1 = new KDItem();\r
292                 d1.target = TargetId.TITLE;\r
293                 d1.regex = title;\r
294                 d1.contain = (String) jComboBox_contain.getItemAt(0);\r
295                 d1.fireChanged();\r
296                 jTable_keywords.getRowItemList().add(d1);\r
297                 \r
298                 KDItem d2 = new KDItem();\r
299                 d2.target = TargetId.CHANNEL;\r
300                 d2.regex = center;\r
301                 d2.contain = (String) jComboBox_contain.getItemAt(0);\r
302                 d2.fireChanged();\r
303                 if (isInfection) {\r
304                         jComboBox_infection.setSelectedItem(infection_items.get(0));\r
305                 }\r
306                 else {\r
307                         jComboBox_infection.setSelectedItem(infection_items.get(1));\r
308                 }\r
309                 jTable_keywords.getRowItemList().add(d2);\r
310                 \r
311                 jTable_keywords.fireChanged();\r
312         }\r
313         \r
314         // キーワード検索管理としてのオープン(更新)\r
315         public void reopen(String s, SearchProgram sKeys) {\r
316                 //\r
317                 xKeys = sKeys;\r
318                 originalLabel = s;\r
319                 //\r
320                 jTextField_label.setText(s);\r
321                 jTextField_label.setCaretPosition(0);\r
322 \r
323                 jComboBox_regex.addItem("");\r
324                 jComboBox_target.setSelectedIndex(0);\r
325                 jComboBox_contain.setSelectedIndex(0);\r
326                 jComboBox_condition.setSelectedIndex(0);\r
327                 for (int i=jTable_keywords.getRowCount()-1; i>=0; i--) {\r
328                         jTable_keywords.getRowItemList().remove(i);\r
329                 }\r
330                 //\r
331                 for (SearchKey k : xKeys.getSearchKeys()) {\r
332                         if (k.getLabel().equals(s)) {\r
333                         jComboBox_condition.setSelectedIndex(Integer.valueOf(k.getCondition()));\r
334                         \r
335                                 Matcher ma = Pattern.compile("(.*?)\t").matcher(k.getTarget());\r
336                                 Matcher mb = Pattern.compile("(.*?)\t").matcher(k.getKeyword());\r
337                                 Matcher mc = Pattern.compile("(.*?)\t").matcher(k.getContain());\r
338                                 while (ma.find()) {\r
339                                         mb.find();\r
340                                         mc.find();\r
341                                         KDItem data = new KDItem();\r
342                                         data.target = TargetId.getTargetId(ma.group(1));\r
343                                         data.regex = mb.group(1);\r
344                                         data.contain = contain_items.get(Integer.valueOf(mc.group(1)));\r
345                                         data.fireChanged();\r
346                                         jTable_keywords.getRowItemList().add(data);\r
347                                 }\r
348                                 \r
349                                 jComboBox_okiniiri.setSelectedItem(k.getOkiniiri());\r
350                                 \r
351                                 jCheckBox_caseSensitive.setSelected(k.getCaseSensitive());\r
352                                 jCheckBox_showInStandby.setSelected(k.getShowInStandby());\r
353                         }\r
354                 }\r
355                 \r
356                 jTable_keywords.fireChanged();\r
357         }\r
358         \r
359         // 延長警告管理としてのオープン(更新)\r
360         public void reopen(String s, ExtProgram sKeys) {\r
361                 //\r
362                 for (SearchKey k : sKeys.getSearchKeys()) {\r
363                         if (k.getLabel().equals(s)) {\r
364                                 int idx = Integer.valueOf(k.getInfection());\r
365                                 if (jComboBox_infection.getItemCount() >= idx) {\r
366                                         jComboBox_infection.setSelectedIndex(idx);\r
367                                 }\r
368                         }\r
369                 }\r
370                 reopen(s,(SearchProgram)sKeys);\r
371         }\r
372         \r
373         /**\r
374          *  コンパイル部分を分離してみました\r
375          */\r
376         protected SearchKey skCompile() {\r
377                 \r
378                 SearchKey sk = new SearchKey();\r
379                 \r
380                 String tStr = "";\r
381                 String rStr = "";\r
382                 String cStr = "";\r
383                 for (int row=0; row<jTable_keywords.getRowCount(); row++) {\r
384                         \r
385                         KDItem c = jTable_keywords.getRowItemList().get(row);\r
386                         TargetId ti = c.target;\r
387                         tStr += ti.getId()+"\t";\r
388                         \r
389                         if ( ti.getUseRegexpr() ) {\r
390                                 try {\r
391                                         Pattern.compile(TraceProgram.replacePop(c.regex));\r
392                                 }\r
393                                 catch (PatternSyntaxException ex) {\r
394                                         showExprFmtWarn(c.contain);\r
395                                         return null;\r
396                                 }\r
397                         }\r
398                         rStr += c.regex+"\t";\r
399                         \r
400                         for (int i=0; i<contain_items.size(); i++) {\r
401                                 if (contain_items.get(i).equals(c.contain)) {\r
402                                         cStr += i+"\t";\r
403                                         break;\r
404                                 }\r
405                         }\r
406                 }\r
407                 sk.setTarget(tStr);             // compile後は順番が変わるので残すことにする\r
408                 sk.setKeyword(rStr);    // 同上\r
409                 sk.setContain(cStr);    // 同上\r
410                 \r
411                 for (int i=0; i<condition_items.size(); i++) {\r
412                         if (condition_items.get(i).equals((String) jComboBox_condition.getSelectedItem())) {\r
413                                 sk.setCondition(String.valueOf(i));\r
414                                 break;\r
415                         }\r
416                 }\r
417                 for (int i=0; i<infection_items.size(); i++) {\r
418                         if (infection_items.get(i).equals((String) jComboBox_infection.getSelectedItem())) {\r
419                                 sk.setInfection(String.valueOf(i));\r
420                                 break;\r
421                         }\r
422                 }\r
423                 \r
424                 sk.setLabel(jTextField_label.getText());\r
425                 sk.setOkiniiri((String) jComboBox_okiniiri.getSelectedItem());\r
426                 sk.setCaseSensitive(jCheckBox_caseSensitive.isSelected());\r
427                 sk.setShowInStandby(jCheckBox_showInStandby.isSelected());\r
428 \r
429                 new SearchProgram().compile(sk);\r
430                 \r
431                 return sk;\r
432         }\r
433 \r
434         /**\r
435          * 正規表現がおかしかったら警告したい\r
436          * @param expr\r
437          */\r
438         private void showExprFmtWarn(String expr) {\r
439                 JOptionPane.showMessageDialog(this, "正規表現の文法に則っていません: "+expr, "エラー", JOptionPane.ERROR_MESSAGE);\r
440         }\r
441         \r
442         /*******************************************************************************\r
443          * リスナー\r
444          ******************************************************************************/\r
445         \r
446         /**\r
447          * 条件を保存する\r
448          */\r
449         private final ActionListener al_save = new ActionListener() {\r
450                 @Override\r
451                 public void actionPerformed(ActionEvent e) {\r
452                         if (jTextField_label.getText().equals("") || jTable_keywords.getRowCount()<=0) {\r
453                                 return;\r
454                         }\r
455                         \r
456                         SearchKey sk = skCompile();\r
457                         if (sk == null) {\r
458                                 return;\r
459                         }\r
460                         \r
461                         // 検索キーワードを保存する\r
462                         if (xKeys.replace(originalLabel, sk) == null) {\r
463                                 xKeys.add(sk);\r
464                         }\r
465                         xKeys.save();\r
466                         \r
467                         // グループに登録するかも\r
468                         if ( jComboBox_group.getSelectedItem() != null && ! ((String)jComboBox_group.getSelectedItem()).equals("")) {\r
469                                 xGroups.add((String)jComboBox_group.getSelectedItem(),sk.getLabel());\r
470                                 xGroups.save();\r
471                         }\r
472                         \r
473                         // 登録したお!\r
474                         reg = true;\r
475                         \r
476                         // ウィンドウを閉じる\r
477                         dispose();\r
478                 }\r
479         };\r
480         \r
481         /**\r
482          * キャンセルしたい\r
483          */\r
484         private final ActionListener al_cancel = new ActionListener() {\r
485                 @Override\r
486                 public void actionPerformed(ActionEvent e) {\r
487                         dispose();\r
488                 }\r
489         };\r
490         \r
491         /**\r
492          * プレビューしたい\r
493          */\r
494         private final ActionListener al_preview = new ActionListener() {\r
495                 @Override\r
496                 public void actionPerformed(ActionEvent e) {\r
497                         SearchKey sk = skCompile(); \r
498                         if (jTable_keywords.getRowCount() > 0 && sk != null) {\r
499                                 preview(sk);\r
500                         }\r
501                 }\r
502         };\r
503         \r
504         /**\r
505          * 条件選択コンボボックスが選択された\r
506          */\r
507         private final ItemListener il_targetChanged = new ItemListener() {\r
508                 @Override\r
509                 public void itemStateChanged(ItemEvent e) {\r
510                         //\r
511                         if ( e.getStateChange() != ItemEvent.SELECTED ) {\r
512                                 return;\r
513                         }\r
514                         //\r
515                         TargetId target = (TargetId) jComboBox_target.getSelectedItem();\r
516                         if (target == TargetId.NEW || target == TargetId.LAST || target == TargetId.REPEAT || target == TargetId.FIRST || target == TargetId.REPEAT || target == TargetId.NOSCRUMBLE) {\r
517                                 jComboBox_regex.setEnabled(false);\r
518                                 jComboBox_regex.setEditable(false);\r
519                                 jComboBox_regex.removeAllItems();\r
520                                 jComboBox_regex.addItem("");\r
521                         }\r
522                         else if (target == TargetId.LENGTH) {\r
523                                 jComboBox_regex.removeAllItems();\r
524                                 jComboBox_regex.setEnabled(true);\r
525                                 jComboBox_regex.setEditable(false);\r
526                                 for (int i=1; i <= 120; i++) {\r
527                                         jComboBox_regex.addItem(i+" 分以上である");\r
528                                 }\r
529                                 jComboBox_regex.setSelectedIndex(29);\r
530                         }\r
531                         else if (target == TargetId.STARTA) {\r
532                                 jComboBox_regex.removeAllItems();\r
533                                 jComboBox_regex.setEnabled(true);\r
534                                 jComboBox_regex.setEditable(false);\r
535                                 for (int i=0; i < 24; i++) {\r
536                                         jComboBox_regex.addItem(String.format("%02d:00以降である", (i+5)%24));\r
537                                 }\r
538                                 jComboBox_regex.setSelectedIndex(18-5);\r
539                         }\r
540                         else if (target == TargetId.STARTZ) {\r
541                                 jComboBox_regex.removeAllItems();\r
542                                 jComboBox_regex.setEnabled(true);\r
543                                 jComboBox_regex.setEditable(false);\r
544                                 for (int i=0; i < 24; i++) {\r
545                                         jComboBox_regex.addItem(String.format("%02d:00以前である", (i+5)%24));\r
546                                 }\r
547                                 jComboBox_regex.setSelectedIndex(23-5);\r
548                         }\r
549                         else if (target == TargetId.GENRE) {\r
550                                 jComboBox_regex.removeAllItems();\r
551                                 jComboBox_regex.setEnabled(true);\r
552                                 jComboBox_regex.setEditable(false);\r
553                                 for ( ProgGenre genre : ProgGenre.values()) {\r
554                                         jComboBox_regex.addItem(genre.toString());\r
555                                 }\r
556                         }\r
557                         else if (target == TargetId.SUBGENRE) {\r
558                                 jComboBox_regex.removeAllItems();\r
559                                 jComboBox_regex.setEnabled(true);\r
560                                 jComboBox_regex.setEditable(false);\r
561                                 for ( ProgSubgenre subgenre : ProgSubgenre.values()) {\r
562                                         jComboBox_regex.addItem(subgenre.toString());\r
563                                 }\r
564                         }\r
565                         else {\r
566                                 // 番組名・番組詳細・放送局・開始日時\r
567                                 jComboBox_regex.setEnabled(true);\r
568                                 jComboBox_regex.setEditable(true);\r
569                                 if (jComboBox_regex.getItemCount() > 1) {\r
570                                         jComboBox_regex.removeAllItems();\r
571                                         jComboBox_regex.addItem("");\r
572                                 }\r
573                         }\r
574                 }\r
575         };\r
576         \r
577         /**\r
578          * 条件を追加する\r
579          */\r
580         private final ActionListener al_addTarget = new ActionListener() {\r
581                 @Override\r
582                 public void actionPerformed(ActionEvent e) {\r
583                         TargetId ti = (TargetId) jComboBox_target.getSelectedItem();\r
584                         String re = (String) jComboBox_regex.getSelectedItem();\r
585                         \r
586                         if ( ti.getUseKeyword() && re.length() == 0 ) {\r
587                                 // キーワードが必要なのに入力されていなければNG\r
588                                 return;\r
589                         }\r
590                         \r
591                         KDItem data = new KDItem();\r
592                         data.target = ti;\r
593                         data.regex = re;\r
594                         data.contain = (String) jComboBox_contain.getSelectedItem();\r
595                         data.fireChanged();\r
596                         jTable_keywords.getRowItemList().add(data);\r
597                         jTable_keywords.fireChanged();\r
598                         \r
599                         if (jComboBox_regex.getItemCount() <= 1) {\r
600                                 jComboBox_regex.removeAllItems();\r
601                                 jComboBox_regex.addItem("");\r
602                         }\r
603                 }\r
604         };\r
605         \r
606         /**\r
607          * 条件を削除する(コンボボックスに戻す)\r
608          */\r
609         private final ActionListener al_removeTarget = new ActionListener() {\r
610                 @Override\r
611                 public void actionPerformed(ActionEvent e) {\r
612                         int row = -1;\r
613                         if ((row = jTable_keywords.getSelectedRow()) == -1) {\r
614                                 return;\r
615                         }\r
616                         \r
617                         KDItem c = jTable_keywords.getRowItemList().get(row);\r
618                         jComboBox_target.setSelectedItem(c.target);\r
619                         if (jComboBox_target.getSelectedItem() ==  TargetId.GENRE ||\r
620                                         jComboBox_target.getSelectedItem() ==  TargetId.SUBGENRE ||\r
621                                         jComboBox_target.getSelectedItem() ==  TargetId.LENGTH ||\r
622                                         jComboBox_target.getSelectedItem() ==  TargetId.STARTA ||\r
623                                         jComboBox_target.getSelectedItem() ==  TargetId.STARTZ ) {\r
624                                 jComboBox_regex.setSelectedItem(c.regex);\r
625                         }\r
626                         else {\r
627                                 jComboBox_regex.removeAllItems();\r
628                                 jComboBox_regex.addItem(c.regex);\r
629                         }\r
630                         jComboBox_contain.setSelectedItem(c.contain);\r
631                         \r
632                         jTable_keywords.getRowItemList().remove(jTable_keywords.getSelectedRow());\r
633                         jTable_keywords.fireChanged();\r
634                 }\r
635         };\r
636         \r
637         /**\r
638          * \r
639          */\r
640         private final ActionListener al_upTarget = new ActionListener() {\r
641                 @Override\r
642                 public void actionPerformed(ActionEvent e) {\r
643                         int row = jTable_keywords.getSelectedRow();\r
644                         if ( jTable_keywords.getRowItemList().up(row, 1) ) {\r
645                                 jTable_keywords.fireChanged();\r
646                                 jTable_keywords.setRowSelectionInterval(row-1,row-1);\r
647                         }\r
648                 }\r
649         };\r
650         \r
651         /**\r
652          * \r
653          */\r
654         private final ActionListener al_downTarget = new ActionListener() {\r
655                 @Override\r
656                 public void actionPerformed(ActionEvent e) {\r
657                         int row = jTable_keywords.getSelectedRow();\r
658                         if ( jTable_keywords.getRowItemList().down(row, 1) ) {\r
659                                 jTable_keywords.fireChanged();\r
660                                 jTable_keywords.setRowSelectionInterval(row+1,row+1);\r
661                         }\r
662                 }\r
663         };\r
664 \r
665         /*******************************************************************************\r
666          * コンポーネント\r
667          ******************************************************************************/\r
668         \r
669         private JPanel getJPanel() {\r
670                 if (jPanel == null) {\r
671                         jPanel = new JPanel();\r
672 \r
673                         jPanel.setLayout(new SpringLayout());\r
674                         \r
675                         int y = SEP_HEIGHT;\r
676                         int x = SEP_WIDTH;\r
677                         \r
678                         x = SEP_WIDTH;\r
679                         CommonSwingUtils.putComponentOn(jPanel, getJLabel_label("設定名"), LABEL_WIDTH_S, PARTS_HEIGHT, x, y);\r
680                         CommonSwingUtils.putComponentOn(jPanel, getJTextField_label(), TEXT_WIDTH, PARTS_HEIGHT, x+=LABEL_WIDTH_S, y);\r
681                         CommonSwingUtils.putComponentOn(jPanel, getJButton_label("登録"), BUTTON_WIDTH_S, PARTS_HEIGHT, x+=TEXT_WIDTH+SEP_WIDTH, y);\r
682                         CommonSwingUtils.putComponentOn(jPanel, getJButton_cancel("キャンセル"), BUTTON_WIDTH_S, PARTS_HEIGHT, x+=BUTTON_WIDTH_S+SEP_WIDTH, y);\r
683                         CommonSwingUtils.putComponentOn(jPanel, getJButton_preview("プレビュー"), BUTTON_WIDTH_S, PARTS_HEIGHT, PANEL_WIDTH-BUTTON_WIDTH_S-SEP_WIDTH, y);\r
684                         \r
685                         y += PARTS_HEIGHT+SEP_HEIGHT;\r
686                         x = SEP_WIDTH;\r
687                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_target(), TARGET_WIDTH, PARTS_HEIGHT, x, y);\r
688                         CommonSwingUtils.putComponentOn(jPanel, getJTextField_regex(), REGEX_WIDTH, PARTS_HEIGHT, x+=TARGET_WIDTH+SEP_WIDTH, y);\r
689                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_contain(), TARGET_WIDTH, PARTS_HEIGHT, x+=REGEX_WIDTH+SEP_WIDTH, y);\r
690                         \r
691                         y += PARTS_HEIGHT+SEP_HEIGHT_NARROW;\r
692                         x = (TABLE_WIDTH/2-(BUTTON_WIDTH_L+SEP_WIDTH/2))+SEP_WIDTH;\r
693                         CommonSwingUtils.putComponentOn(jPanel, getJButton_add("追加↓"), BUTTON_WIDTH_L, PARTS_HEIGHT, x , y);\r
694                         CommonSwingUtils.putComponentOn(jPanel, getJButton_remove("↑削除"), BUTTON_WIDTH_L, PARTS_HEIGHT, x+=BUTTON_WIDTH_L+SEP_WIDTH, y);\r
695                         \r
696                         CommonSwingUtils.putComponentOn(jPanel, getJCheckBox_caseSensitive("文字列比較は完全一致で",CHECKLABEL_WIDTH,false), CHECKBOX_WIDTH, PARTS_HEIGHT, PANEL_WIDTH-CHECKBOX_WIDTH-SEP_WIDTH, y);\r
697                         \r
698                         y += PARTS_HEIGHT+SEP_HEIGHT_NARROW;\r
699                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_condition(), CONDITION_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);\r
700                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_infection(), CONDITION_WIDTH, PARTS_HEIGHT, TABLE_WIDTH-CONDITION_WIDTH+SEP_WIDTH, y);\r
701                         \r
702                         y += PARTS_HEIGHT+SEP_HEIGHT_NARROW;\r
703                         CommonSwingUtils.putComponentOn(jPanel, getJScrollPane_keywords(), TABLEPANE_WIDTH, TABLE_HEIGHT, SEP_WIDTH, y);\r
704                         int yz = y + (TABLE_HEIGHT/2-(PARTS_HEIGHT+SEP_HEIGHT/2));\r
705                         CommonSwingUtils.putComponentOn(jPanel, getJButton_up("↑"), UPDOWN_WIDTH, PARTS_HEIGHT, TABLEPANE_WIDTH+SEP_WIDTH*2, yz);\r
706                         CommonSwingUtils.putComponentOn(jPanel, getJButton_down("↓"), UPDOWN_WIDTH, PARTS_HEIGHT, TABLEPANE_WIDTH+SEP_WIDTH*2, yz+=SEP_HEIGHT+PARTS_HEIGHT);\r
707 \r
708                         y += TABLE_HEIGHT+SEP_HEIGHT;\r
709                         x = SEP_WIDTH;\r
710                         CommonSwingUtils.putComponentOn(jPanel, getJLabel_okiniiri("お気に入り度"), LABEL_WIDTH_L, PARTS_HEIGHT, x, y);\r
711                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_okiniiri(), SELECTION_WIDTH, PARTS_HEIGHT, x+=LABEL_WIDTH_L+SEP_WIDTH, y);\r
712                         CommonSwingUtils.putComponentOn(jPanel, getJLabel_group("グループ"), LABEL_WIDTH_L, PARTS_HEIGHT, x+=SELECTION_WIDTH+SEP_WIDTH, y);\r
713                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_group(), SELECTION_WIDTH, PARTS_HEIGHT, x+=LABEL_WIDTH_L+SEP_WIDTH, y);\r
714                         \r
715                         CommonSwingUtils.putComponentOn(jPanel, getJCheckBox_showInStandby("予約待機に表示する",CHECKLABEL_WIDTH,true), CHECKBOX_WIDTH, PARTS_HEIGHT, PANEL_WIDTH-CHECKBOX_WIDTH-SEP_WIDTH, y);\r
716 \r
717                         y += PARTS_HEIGHT+SEP_HEIGHT*2;\r
718                         \r
719                         jPanel.setPreferredSize(new Dimension(PANEL_WIDTH, y));\r
720                 }\r
721                 return jPanel;\r
722         }\r
723         \r
724         //\r
725         private JLabel getJLabel_label(String s) {\r
726                 if (jLabel_label == null) {\r
727                         jLabel_label = new JLabel(s);\r
728                 }\r
729                 return(jLabel_label);\r
730         }\r
731         \r
732         //\r
733         private JTextField getJTextField_label() {\r
734                 if (jTextField_label == null) {\r
735                         jTextField_label = new JTextFieldWithPopup();\r
736                 }\r
737                 return(jTextField_label);\r
738         }\r
739         \r
740         //\r
741         private JButton getJButton_label(String s) {\r
742                 if (jButton_label == null) {\r
743                         jButton_label = new JButton();\r
744                         jButton_label.setText(s);\r
745                         \r
746                         jButton_label.addActionListener(al_save);\r
747                 }\r
748                 return(jButton_label);\r
749         }\r
750         \r
751         //\r
752         private JButton getJButton_cancel(String s) {\r
753                 if (jButton_cancel == null) {\r
754                         jButton_cancel = new JButton();\r
755                         jButton_cancel.setText(s);\r
756                         \r
757                         jButton_cancel.addActionListener(al_cancel);\r
758                 }\r
759                 return jButton_cancel;\r
760         }\r
761         \r
762         //\r
763         private JButton getJButton_preview(String s) {\r
764                 if (jButton_preview == null) {\r
765                         jButton_preview = new JButton();\r
766                         jButton_preview.setText(s);\r
767                         \r
768                         jButton_preview.addActionListener(al_preview);\r
769                 }\r
770                 return jButton_preview;\r
771         }\r
772                         \r
773         \r
774         //\r
775         private JComboBox getJComboBox_target() {\r
776                 if (jComboBox_target == null) {\r
777                         jComboBox_target = new JComboBox();\r
778                         \r
779                         DefaultComboBoxModel aModel = new DefaultComboBoxModel();\r
780                         jComboBox_target.setModel(aModel);\r
781                         for (TargetId k : target_items) {\r
782                                 aModel.addElement(k);\r
783                         }\r
784                         \r
785                         jComboBox_target.addItemListener(il_targetChanged);\r
786                 }\r
787                 return(jComboBox_target);\r
788         }\r
789         \r
790         //\r
791         private JComboBox getJTextField_regex() {\r
792                 if (jComboBox_regex == null) {\r
793                         jComboBox_regex = new JComboBoxWithPopup();\r
794                         jComboBox_regex.setEditable(true);\r
795                 }\r
796                 return(jComboBox_regex);\r
797         }\r
798         \r
799         //\r
800         private JComboBox getJComboBox_contain() {\r
801                 if (jComboBox_contain == null) {\r
802                         jComboBox_contain = new JComboBox();\r
803                         \r
804                         DefaultComboBoxModel aModel = new DefaultComboBoxModel();\r
805                         jComboBox_contain.setModel(aModel);\r
806                         for (String k : contain_items) {\r
807                                 aModel.addElement(k);\r
808                         }\r
809                 }\r
810                 return(jComboBox_contain);\r
811         }\r
812         \r
813         //\r
814         private JComboBox getJComboBox_condition() {\r
815                 if (jComboBox_condition == null) {\r
816                         jComboBox_condition = new JComboBox();\r
817                         \r
818                         DefaultComboBoxModel aModel = new DefaultComboBoxModel();\r
819                         jComboBox_condition.setModel(aModel);\r
820                         for (String k : condition_items) {\r
821                                 aModel.addElement(k);\r
822                         }\r
823                 }\r
824                 return(jComboBox_condition);\r
825         }\r
826         \r
827         //\r
828         private JComboBox getJComboBox_infection() {\r
829                 if (jComboBox_infection == null) {\r
830                         jComboBox_infection = new JComboBox();\r
831                         \r
832                         if (infection_items.size() > 0) {\r
833                         DefaultComboBoxModel aModel = new DefaultComboBoxModel();\r
834                         jComboBox_infection.setModel(aModel);\r
835                         for (String k : infection_items) {\r
836                                 aModel.addElement(k);\r
837                         }\r
838                         }\r
839                         else {\r
840                                 jComboBox_infection.setEnabled(false);\r
841                         }\r
842                 }\r
843                 return(jComboBox_infection);\r
844         }\r
845         \r
846         //\r
847         private JLabel getJLabel_okiniiri(String s) {\r
848                 if (jLabel_okiniiri == null) {\r
849                         jLabel_okiniiri = new JLabel(s,SwingConstants.RIGHT);\r
850                 }\r
851                 return(jLabel_okiniiri);\r
852         }\r
853         private JComboBox getJComboBox_okiniiri() {\r
854                 if (jComboBox_okiniiri == null) {\r
855                         jComboBox_okiniiri = new JComboBox();\r
856                         \r
857                         DefaultComboBoxModel aModel = new DefaultComboBoxModel();\r
858                         jComboBox_okiniiri.setModel(aModel);\r
859                         for (String k : okiniiri_items) {\r
860                                 aModel.addElement(k);\r
861                         }\r
862                 }\r
863                 return(jComboBox_okiniiri);\r
864         }\r
865 \r
866         \r
867         //\r
868         private JLabel getJLabel_group(String s) {\r
869                 if (jLabel_group == null) {\r
870                         jLabel_group = new JLabel(s,SwingConstants.RIGHT);\r
871                 }\r
872                 return(jLabel_group);\r
873         }\r
874         private JComboBox getJComboBox_group() {\r
875                 if (jComboBox_group == null) {\r
876                         jComboBox_group = new JComboBox();\r
877                         \r
878                         jComboBox_group.setEnabled(false);\r
879                 }\r
880                 return(jComboBox_group);\r
881         }\r
882         \r
883         //\r
884         private JCheckBoxPanel getJCheckBox_caseSensitive(String s,int labelWidth, boolean b) {\r
885                 if (jCheckBox_caseSensitive == null) {\r
886                         jCheckBox_caseSensitive = new JCheckBoxPanel(s,labelWidth,true);\r
887                         jCheckBox_caseSensitive.setSelected(b);\r
888                 }\r
889                 return(jCheckBox_caseSensitive);\r
890         }\r
891         \r
892         //\r
893         private JCheckBoxPanel getJCheckBox_showInStandby(String s,int labelWidth, boolean b) {\r
894                 if (jCheckBox_showInStandby == null) {\r
895                         jCheckBox_showInStandby = new JCheckBoxPanel(s,labelWidth,true);\r
896                         jCheckBox_showInStandby.setSelected(b);\r
897                 }\r
898                 return(jCheckBox_showInStandby);\r
899         }\r
900         \r
901         // 条件追加のボタン\r
902         private JButton getJButton_add(String s) {\r
903                 if (jButton_add == null) {\r
904                         jButton_add = new JButton();\r
905                         jButton_add.setText(s);\r
906                         \r
907                         jButton_add.addActionListener(al_addTarget);\r
908                 }\r
909                 return(jButton_add);\r
910         }\r
911         \r
912         // 条件削除のボタン\r
913         private JButton getJButton_remove(String s) {\r
914                 if (jButton_remove == null) {\r
915                         jButton_remove = new JButton();\r
916                         jButton_remove.setText(s);\r
917                         \r
918                         jButton_remove.addActionListener(al_removeTarget);\r
919                 }\r
920                 return(jButton_remove);\r
921         }\r
922         \r
923         private JButton getJButton_up(String s) {\r
924                 if (jButton_up == null) {\r
925                         jButton_up = new JButton();\r
926                         jButton_up.setText(s);\r
927                         \r
928                         jButton_up.addActionListener(al_upTarget);\r
929                 }\r
930                 return(jButton_up);\r
931         }\r
932         \r
933         private JButton getJButton_down(String s) {\r
934                 if (jButton_down == null) {\r
935                         jButton_down = new JButton();\r
936                         jButton_down.setText(s);\r
937                         \r
938                         jButton_down.addActionListener(al_downTarget);\r
939                 }\r
940                 return(jButton_down);\r
941         }\r
942         \r
943         //\r
944         private JScrollPane getJScrollPane_keywords() {\r
945                 if (jScrollPane_keywords == null) {\r
946                         jScrollPane_keywords = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);\r
947                         jScrollPane_keywords.setViewportView(getJTable_keywords());\r
948                 }\r
949                 return jScrollPane_keywords;\r
950         }\r
951         \r
952         //\r
953         private KDTable getJTable_keywords() {\r
954                 if (jTable_keywords == null) {\r
955                         \r
956                         jTable_keywords = new KDTable(false, new RowItemList<KDItem>());\r
957                         \r
958                         // テーブルの基本的な設定\r
959                         ArrayList<String> cola = new ArrayList<String>();\r
960                         for ( KDColumn rc : KDColumn.values() ) {\r
961                                 if ( rc.getIniWidth() >= 0 ) {\r
962                                         cola.add(rc.getName());\r
963                                 }\r
964                         }\r
965                         jTable_keywords.setModel(new DefaultTableModel(cola.toArray(new String[0]), 0));\r
966                         \r
967                         jTable_keywords.setAutoResizeMode(JNETable.AUTO_RESIZE_OFF);\r
968                         jTable_keywords.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
969                         jTable_keywords.getTableHeader().setReorderingAllowed(false);\r
970                         \r
971                         // 各カラムの幅\r
972                         DefaultTableColumnModel columnModel = (DefaultTableColumnModel)jTable_keywords.getColumnModel();\r
973                         //TableColumn column = null;\r
974                         for ( KDColumn rc : KDColumn.values() ) {\r
975                                 if ( rc.getIniWidth() < 0 ) {\r
976                                         continue;\r
977                                 }\r
978                                 columnModel.getColumn(rc.ordinal()).setPreferredWidth(rc.getIniWidth());;\r
979                         }\r
980 \r
981                 }\r
982                 return(jTable_keywords);\r
983         }\r
984         \r
985         /*******************************************************************************\r
986          * 独自コンポーネント\r
987          ******************************************************************************/\r
988         \r
989         private class KDItem extends RowItem implements Cloneable {\r
990                 TargetId target;\r
991                 String regex;\r
992                 String contain;\r
993                 \r
994                 @Override\r
995                 protected void myrefresh(RowItem o) {\r
996                         KDItem c = (KDItem) o;\r
997                         c.addData(target);\r
998                         c.addData(regex);\r
999                         c.addData(contain);\r
1000                 }\r
1001                 \r
1002                 @Override\r
1003                 public KDItem clone() {\r
1004                         return (KDItem) super.clone();\r
1005                 }\r
1006         }\r
1007         \r
1008         private class KDTable extends JNETable {\r
1009 \r
1010                 private static final long serialVersionUID = 1L;\r
1011                 \r
1012                 RowItemList<KDItem> rowdata = null;\r
1013                 \r
1014                 public KDTable(boolean b, RowItemList<KDItem> rowdata) {\r
1015                         super(b);\r
1016                         this.rowdata = rowdata;\r
1017                 }\r
1018                 \r
1019                 public RowItemList<KDItem> getRowItemList() { return rowdata; }\r
1020                 \r
1021                 public void fireChanged() { ((DefaultTableModel) this.getModel()).fireTableDataChanged(); }\r
1022                 \r
1023                 @Override\r
1024                 public int getRowCount() { return rowdata.size(); }\r
1025                 \r
1026                 @Override\r
1027                 public Object getValueAt(int row, int column) {\r
1028                         return rowdata.get(row).get(column);\r
1029                 }\r
1030                 \r
1031                 @Override\r
1032                 public void setValueAt(Object aValue, int row, int column) {\r
1033                         KDItem c = rowdata.get(row);\r
1034                         if ( column == KDColumn.TARGET.getColumn() ) {\r
1035                                 c.target = (TargetId) aValue;\r
1036                         }\r
1037                         else if ( column == KDColumn.REGEX.getColumn() ) {\r
1038                                 c.regex = (String) aValue;\r
1039                         }\r
1040                         else if ( column == KDColumn.CONTAIN.getColumn() ) {\r
1041                                 c.contain = (String) aValue;\r
1042                         }\r
1043                         c.fireChanged();\r
1044                 }\r
1045                 \r
1046         }\r
1047 \r
1048         /*******************************************************************************\r
1049          * 延長警告管理では以下をオーバーライドしてください\r
1050          ******************************************************************************/\r
1051         \r
1052         protected void setItems() {\r
1053                 setWindowTitle("キーワード検索の設定");\r
1054                 \r
1055                 clean_target_items();\r
1056                 add_target_item(TargetId.TITLEANDDETAIL);\r
1057                 add_target_item(TargetId.TITLE);\r
1058                 add_target_item(TargetId.DETAIL);\r
1059                 add_target_item(TargetId.CHANNEL);\r
1060                 add_target_item(TargetId.GENRE);\r
1061                 add_target_item(TargetId.SUBGENRE);\r
1062                 add_target_item(TargetId.NEW);\r
1063                 add_target_item(TargetId.LAST);\r
1064                 add_target_item(TargetId.REPEAT);\r
1065                 add_target_item(TargetId.FIRST);\r
1066                 add_target_item(TargetId.SPECIAL);\r
1067                 add_target_item(TargetId.RATING);\r
1068                 add_target_item(TargetId.NOSCRUMBLE);\r
1069                 add_target_item(TargetId.LIVE);\r
1070                 add_target_item(TargetId.BILINGUAL);\r
1071                 add_target_item(TargetId.STANDIN);\r
1072                 add_target_item(TargetId.LENGTH);\r
1073                 add_target_item(TargetId.STARTA);\r
1074                 add_target_item(TargetId.STARTZ);\r
1075                 add_target_item(TargetId.STARTDATETIME);\r
1076 \r
1077                 clean_contain_items();\r
1078                 add_contain_item("を含む番組");\r
1079                 add_contain_item("を含む番組を除く");\r
1080                 \r
1081                 clean_condition_items();\r
1082                 add_condition_item("次のすべての条件に一致");\r
1083                 add_condition_item("次のいずれかの条件に一致");\r
1084         \r
1085                 clean_infection_items();\r
1086         //add_infection_item();\r
1087 \r
1088                 clean_okiniiri_items();\r
1089                 for (String okini : TVProgram.OKINIIRI) {\r
1090                         add_okiniiri_item(okini);\r
1091                 }\r
1092         }\r
1093 }\r