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                         \r
517                         jComboBox_regex.setEditable(target.getUseRegexpr());\r
518                         jComboBox_regex.setEnabled(target.getUseKeyword());\r
519                         jComboBox_regex.removeAllItems();\r
520 \r
521                         if (target == TargetId.LENGTH) {\r
522                                 for (int i=1; i <= 120; i++) {\r
523                                         jComboBox_regex.addItem(i+" 分以上である");\r
524                                 }\r
525                                 jComboBox_regex.setSelectedIndex(29);\r
526                         }\r
527                         else if (target == TargetId.STARTA) {\r
528                                 for (int i=0; i < 24; i++) {\r
529                                         jComboBox_regex.addItem(String.format("%02d:00以降である", (i+5)%24));\r
530                                 }\r
531                                 jComboBox_regex.setSelectedIndex(18-5);\r
532                         }\r
533                         else if (target == TargetId.STARTZ) {\r
534                                 for (int i=0; i < 24; i++) {\r
535                                         jComboBox_regex.addItem(String.format("%02d:00以前である", (i+5)%24));\r
536                                 }\r
537                                 jComboBox_regex.setSelectedIndex(23-5);\r
538                         }\r
539                         else if (target == TargetId.GENRE) {\r
540                                 for ( ProgGenre genre : ProgGenre.values()) {\r
541                                         jComboBox_regex.addItem(genre.toString());\r
542                                 }\r
543                         }\r
544                         else if (target == TargetId.SUBGENRE) {\r
545                                 for ( ProgSubgenre subgenre : ProgSubgenre.values()) {\r
546                                         jComboBox_regex.addItem(subgenre.toString());\r
547                                 }\r
548                         }\r
549                         else {\r
550                                 jComboBox_regex.addItem("");\r
551                         }\r
552                 }\r
553         };\r
554         \r
555         /**\r
556          * 条件を追加する\r
557          */\r
558         private final ActionListener al_addTarget = new ActionListener() {\r
559                 @Override\r
560                 public void actionPerformed(ActionEvent e) {\r
561                         TargetId ti = (TargetId) jComboBox_target.getSelectedItem();\r
562                         String re = (String) jComboBox_regex.getSelectedItem();\r
563                         \r
564                         if ( ti.getUseKeyword() && re.length() == 0 ) {\r
565                                 // キーワードが必要なのに入力されていなければNG\r
566                                 return;\r
567                         }\r
568                         \r
569                         KDItem data = new KDItem();\r
570                         data.target = ti;\r
571                         data.regex = re;\r
572                         data.contain = (String) jComboBox_contain.getSelectedItem();\r
573                         data.fireChanged();\r
574                         jTable_keywords.getRowItemList().add(data);\r
575                         jTable_keywords.fireChanged();\r
576                         \r
577                         if (jComboBox_regex.getItemCount() <= 1) {\r
578                                 jComboBox_regex.removeAllItems();\r
579                                 jComboBox_regex.addItem("");\r
580                         }\r
581                 }\r
582         };\r
583         \r
584         /**\r
585          * 条件を削除する(コンボボックスに戻す)\r
586          */\r
587         private final ActionListener al_removeTarget = new ActionListener() {\r
588                 @Override\r
589                 public void actionPerformed(ActionEvent e) {\r
590                         int row = -1;\r
591                         if ((row = jTable_keywords.getSelectedRow()) == -1) {\r
592                                 return;\r
593                         }\r
594                         \r
595                         KDItem c = jTable_keywords.getRowItemList().get(row);\r
596                         jComboBox_target.setSelectedItem(c.target);\r
597                         if (jComboBox_target.getSelectedItem() ==  TargetId.GENRE ||\r
598                                         jComboBox_target.getSelectedItem() ==  TargetId.SUBGENRE ||\r
599                                         jComboBox_target.getSelectedItem() ==  TargetId.LENGTH ||\r
600                                         jComboBox_target.getSelectedItem() ==  TargetId.STARTA ||\r
601                                         jComboBox_target.getSelectedItem() ==  TargetId.STARTZ ) {\r
602                                 jComboBox_regex.setSelectedItem(c.regex);\r
603                         }\r
604                         else {\r
605                                 jComboBox_regex.removeAllItems();\r
606                                 jComboBox_regex.addItem(c.regex);\r
607                         }\r
608                         jComboBox_contain.setSelectedItem(c.contain);\r
609                         \r
610                         jTable_keywords.getRowItemList().remove(jTable_keywords.getSelectedRow());\r
611                         jTable_keywords.fireChanged();\r
612                 }\r
613         };\r
614         \r
615         /**\r
616          * \r
617          */\r
618         private final ActionListener al_upTarget = new ActionListener() {\r
619                 @Override\r
620                 public void actionPerformed(ActionEvent e) {\r
621                         int row = jTable_keywords.getSelectedRow();\r
622                         if ( jTable_keywords.getRowItemList().up(row, 1) ) {\r
623                                 jTable_keywords.fireChanged();\r
624                                 jTable_keywords.setRowSelectionInterval(row-1,row-1);\r
625                         }\r
626                 }\r
627         };\r
628         \r
629         /**\r
630          * \r
631          */\r
632         private final ActionListener al_downTarget = new ActionListener() {\r
633                 @Override\r
634                 public void actionPerformed(ActionEvent e) {\r
635                         int row = jTable_keywords.getSelectedRow();\r
636                         if ( jTable_keywords.getRowItemList().down(row, 1) ) {\r
637                                 jTable_keywords.fireChanged();\r
638                                 jTable_keywords.setRowSelectionInterval(row+1,row+1);\r
639                         }\r
640                 }\r
641         };\r
642 \r
643         /*******************************************************************************\r
644          * コンポーネント\r
645          ******************************************************************************/\r
646         \r
647         private JPanel getJPanel() {\r
648                 if (jPanel == null) {\r
649                         jPanel = new JPanel();\r
650 \r
651                         jPanel.setLayout(new SpringLayout());\r
652                         \r
653                         int y = SEP_HEIGHT;\r
654                         int x = SEP_WIDTH;\r
655                         \r
656                         x = SEP_WIDTH;\r
657                         CommonSwingUtils.putComponentOn(jPanel, getJLabel_label("設定名"), LABEL_WIDTH_S, PARTS_HEIGHT, x, y);\r
658                         CommonSwingUtils.putComponentOn(jPanel, getJTextField_label(), TEXT_WIDTH, PARTS_HEIGHT, x+=LABEL_WIDTH_S, y);\r
659                         CommonSwingUtils.putComponentOn(jPanel, getJButton_label("登録"), BUTTON_WIDTH_S, PARTS_HEIGHT, x+=TEXT_WIDTH+SEP_WIDTH, y);\r
660                         CommonSwingUtils.putComponentOn(jPanel, getJButton_cancel("キャンセル"), BUTTON_WIDTH_S, PARTS_HEIGHT, x+=BUTTON_WIDTH_S+SEP_WIDTH, y);\r
661                         CommonSwingUtils.putComponentOn(jPanel, getJButton_preview("プレビュー"), BUTTON_WIDTH_S, PARTS_HEIGHT, PANEL_WIDTH-BUTTON_WIDTH_S-SEP_WIDTH, y);\r
662                         \r
663                         y += PARTS_HEIGHT+SEP_HEIGHT;\r
664                         x = SEP_WIDTH;\r
665                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_target(), TARGET_WIDTH, PARTS_HEIGHT, x, y);\r
666                         CommonSwingUtils.putComponentOn(jPanel, getJTextField_regex(), REGEX_WIDTH, PARTS_HEIGHT, x+=TARGET_WIDTH+SEP_WIDTH, y);\r
667                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_contain(), TARGET_WIDTH, PARTS_HEIGHT, x+=REGEX_WIDTH+SEP_WIDTH, y);\r
668                         \r
669                         y += PARTS_HEIGHT+SEP_HEIGHT_NARROW;\r
670                         x = (TABLE_WIDTH/2-(BUTTON_WIDTH_L+SEP_WIDTH/2))+SEP_WIDTH;\r
671                         CommonSwingUtils.putComponentOn(jPanel, getJButton_add("追加↓"), BUTTON_WIDTH_L, PARTS_HEIGHT, x , y);\r
672                         CommonSwingUtils.putComponentOn(jPanel, getJButton_remove("↑削除"), BUTTON_WIDTH_L, PARTS_HEIGHT, x+=BUTTON_WIDTH_L+SEP_WIDTH, y);\r
673                         \r
674                         CommonSwingUtils.putComponentOn(jPanel, getJCheckBox_caseSensitive("文字列比較は完全一致で",CHECKLABEL_WIDTH,false), CHECKBOX_WIDTH, PARTS_HEIGHT, PANEL_WIDTH-CHECKBOX_WIDTH-SEP_WIDTH, y);\r
675                         \r
676                         y += PARTS_HEIGHT+SEP_HEIGHT_NARROW;\r
677                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_condition(), CONDITION_WIDTH, PARTS_HEIGHT, SEP_WIDTH, y);\r
678                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_infection(), CONDITION_WIDTH, PARTS_HEIGHT, TABLE_WIDTH-CONDITION_WIDTH+SEP_WIDTH, y);\r
679                         \r
680                         y += PARTS_HEIGHT+SEP_HEIGHT_NARROW;\r
681                         CommonSwingUtils.putComponentOn(jPanel, getJScrollPane_keywords(), TABLEPANE_WIDTH, TABLE_HEIGHT, SEP_WIDTH, y);\r
682                         int yz = y + (TABLE_HEIGHT/2-(PARTS_HEIGHT+SEP_HEIGHT/2));\r
683                         CommonSwingUtils.putComponentOn(jPanel, getJButton_up("↑"), UPDOWN_WIDTH, PARTS_HEIGHT, TABLEPANE_WIDTH+SEP_WIDTH*2, yz);\r
684                         CommonSwingUtils.putComponentOn(jPanel, getJButton_down("↓"), UPDOWN_WIDTH, PARTS_HEIGHT, TABLEPANE_WIDTH+SEP_WIDTH*2, yz+=SEP_HEIGHT+PARTS_HEIGHT);\r
685 \r
686                         y += TABLE_HEIGHT+SEP_HEIGHT;\r
687                         x = SEP_WIDTH;\r
688                         CommonSwingUtils.putComponentOn(jPanel, getJLabel_okiniiri("お気に入り度"), LABEL_WIDTH_L, PARTS_HEIGHT, x, y);\r
689                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_okiniiri(), SELECTION_WIDTH, PARTS_HEIGHT, x+=LABEL_WIDTH_L+SEP_WIDTH, y);\r
690                         CommonSwingUtils.putComponentOn(jPanel, getJLabel_group("グループ"), LABEL_WIDTH_L, PARTS_HEIGHT, x+=SELECTION_WIDTH+SEP_WIDTH, y);\r
691                         CommonSwingUtils.putComponentOn(jPanel, getJComboBox_group(), SELECTION_WIDTH, PARTS_HEIGHT, x+=LABEL_WIDTH_L+SEP_WIDTH, y);\r
692                         \r
693                         CommonSwingUtils.putComponentOn(jPanel, getJCheckBox_showInStandby("予約待機に表示する",CHECKLABEL_WIDTH,true), CHECKBOX_WIDTH, PARTS_HEIGHT, PANEL_WIDTH-CHECKBOX_WIDTH-SEP_WIDTH, y);\r
694 \r
695                         y += PARTS_HEIGHT+SEP_HEIGHT*2;\r
696                         \r
697                         jPanel.setPreferredSize(new Dimension(PANEL_WIDTH, y));\r
698                 }\r
699                 return jPanel;\r
700         }\r
701         \r
702         //\r
703         private JLabel getJLabel_label(String s) {\r
704                 if (jLabel_label == null) {\r
705                         jLabel_label = new JLabel(s);\r
706                 }\r
707                 return(jLabel_label);\r
708         }\r
709         \r
710         //\r
711         private JTextField getJTextField_label() {\r
712                 if (jTextField_label == null) {\r
713                         jTextField_label = new JTextFieldWithPopup();\r
714                 }\r
715                 return(jTextField_label);\r
716         }\r
717         \r
718         //\r
719         private JButton getJButton_label(String s) {\r
720                 if (jButton_label == null) {\r
721                         jButton_label = new JButton();\r
722                         jButton_label.setText(s);\r
723                         \r
724                         jButton_label.addActionListener(al_save);\r
725                 }\r
726                 return(jButton_label);\r
727         }\r
728         \r
729         //\r
730         private JButton getJButton_cancel(String s) {\r
731                 if (jButton_cancel == null) {\r
732                         jButton_cancel = new JButton();\r
733                         jButton_cancel.setText(s);\r
734                         \r
735                         jButton_cancel.addActionListener(al_cancel);\r
736                 }\r
737                 return jButton_cancel;\r
738         }\r
739         \r
740         //\r
741         private JButton getJButton_preview(String s) {\r
742                 if (jButton_preview == null) {\r
743                         jButton_preview = new JButton();\r
744                         jButton_preview.setText(s);\r
745                         \r
746                         jButton_preview.addActionListener(al_preview);\r
747                 }\r
748                 return jButton_preview;\r
749         }\r
750                         \r
751         \r
752         //\r
753         private JComboBox getJComboBox_target() {\r
754                 if (jComboBox_target == null) {\r
755                         jComboBox_target = new JComboBox();\r
756                         \r
757                         DefaultComboBoxModel aModel = new DefaultComboBoxModel();\r
758                         jComboBox_target.setModel(aModel);\r
759                         for (TargetId k : target_items) {\r
760                                 aModel.addElement(k);\r
761                         }\r
762                         \r
763                         jComboBox_target.addItemListener(il_targetChanged);\r
764                 }\r
765                 return(jComboBox_target);\r
766         }\r
767         \r
768         //\r
769         private JComboBox getJTextField_regex() {\r
770                 if (jComboBox_regex == null) {\r
771                         jComboBox_regex = new JComboBoxWithPopup();\r
772                         jComboBox_regex.setEditable(true);\r
773                 }\r
774                 return(jComboBox_regex);\r
775         }\r
776         \r
777         //\r
778         private JComboBox getJComboBox_contain() {\r
779                 if (jComboBox_contain == null) {\r
780                         jComboBox_contain = new JComboBox();\r
781                         \r
782                         DefaultComboBoxModel aModel = new DefaultComboBoxModel();\r
783                         jComboBox_contain.setModel(aModel);\r
784                         for (String k : contain_items) {\r
785                                 aModel.addElement(k);\r
786                         }\r
787                 }\r
788                 return(jComboBox_contain);\r
789         }\r
790         \r
791         //\r
792         private JComboBox getJComboBox_condition() {\r
793                 if (jComboBox_condition == null) {\r
794                         jComboBox_condition = new JComboBox();\r
795                         \r
796                         DefaultComboBoxModel aModel = new DefaultComboBoxModel();\r
797                         jComboBox_condition.setModel(aModel);\r
798                         for (String k : condition_items) {\r
799                                 aModel.addElement(k);\r
800                         }\r
801                 }\r
802                 return(jComboBox_condition);\r
803         }\r
804         \r
805         //\r
806         private JComboBox getJComboBox_infection() {\r
807                 if (jComboBox_infection == null) {\r
808                         jComboBox_infection = new JComboBox();\r
809                         \r
810                         if (infection_items.size() > 0) {\r
811                         DefaultComboBoxModel aModel = new DefaultComboBoxModel();\r
812                         jComboBox_infection.setModel(aModel);\r
813                         for (String k : infection_items) {\r
814                                 aModel.addElement(k);\r
815                         }\r
816                         }\r
817                         else {\r
818                                 jComboBox_infection.setEnabled(false);\r
819                         }\r
820                 }\r
821                 return(jComboBox_infection);\r
822         }\r
823         \r
824         //\r
825         private JLabel getJLabel_okiniiri(String s) {\r
826                 if (jLabel_okiniiri == null) {\r
827                         jLabel_okiniiri = new JLabel(s,SwingConstants.RIGHT);\r
828                 }\r
829                 return(jLabel_okiniiri);\r
830         }\r
831         private JComboBox getJComboBox_okiniiri() {\r
832                 if (jComboBox_okiniiri == null) {\r
833                         jComboBox_okiniiri = new JComboBox();\r
834                         \r
835                         DefaultComboBoxModel aModel = new DefaultComboBoxModel();\r
836                         jComboBox_okiniiri.setModel(aModel);\r
837                         for (String k : okiniiri_items) {\r
838                                 aModel.addElement(k);\r
839                         }\r
840                 }\r
841                 return(jComboBox_okiniiri);\r
842         }\r
843 \r
844         \r
845         //\r
846         private JLabel getJLabel_group(String s) {\r
847                 if (jLabel_group == null) {\r
848                         jLabel_group = new JLabel(s,SwingConstants.RIGHT);\r
849                 }\r
850                 return(jLabel_group);\r
851         }\r
852         private JComboBox getJComboBox_group() {\r
853                 if (jComboBox_group == null) {\r
854                         jComboBox_group = new JComboBox();\r
855                         \r
856                         jComboBox_group.setEnabled(false);\r
857                 }\r
858                 return(jComboBox_group);\r
859         }\r
860         \r
861         //\r
862         private JCheckBoxPanel getJCheckBox_caseSensitive(String s,int labelWidth, boolean b) {\r
863                 if (jCheckBox_caseSensitive == null) {\r
864                         jCheckBox_caseSensitive = new JCheckBoxPanel(s,labelWidth,true);\r
865                         jCheckBox_caseSensitive.setSelected(b);\r
866                 }\r
867                 return(jCheckBox_caseSensitive);\r
868         }\r
869         \r
870         //\r
871         private JCheckBoxPanel getJCheckBox_showInStandby(String s,int labelWidth, boolean b) {\r
872                 if (jCheckBox_showInStandby == null) {\r
873                         jCheckBox_showInStandby = new JCheckBoxPanel(s,labelWidth,true);\r
874                         jCheckBox_showInStandby.setSelected(b);\r
875                 }\r
876                 return(jCheckBox_showInStandby);\r
877         }\r
878         \r
879         // 条件追加のボタン\r
880         private JButton getJButton_add(String s) {\r
881                 if (jButton_add == null) {\r
882                         jButton_add = new JButton();\r
883                         jButton_add.setText(s);\r
884                         \r
885                         jButton_add.addActionListener(al_addTarget);\r
886                 }\r
887                 return(jButton_add);\r
888         }\r
889         \r
890         // 条件削除のボタン\r
891         private JButton getJButton_remove(String s) {\r
892                 if (jButton_remove == null) {\r
893                         jButton_remove = new JButton();\r
894                         jButton_remove.setText(s);\r
895                         \r
896                         jButton_remove.addActionListener(al_removeTarget);\r
897                 }\r
898                 return(jButton_remove);\r
899         }\r
900         \r
901         private JButton getJButton_up(String s) {\r
902                 if (jButton_up == null) {\r
903                         jButton_up = new JButton();\r
904                         jButton_up.setText(s);\r
905                         \r
906                         jButton_up.addActionListener(al_upTarget);\r
907                 }\r
908                 return(jButton_up);\r
909         }\r
910         \r
911         private JButton getJButton_down(String s) {\r
912                 if (jButton_down == null) {\r
913                         jButton_down = new JButton();\r
914                         jButton_down.setText(s);\r
915                         \r
916                         jButton_down.addActionListener(al_downTarget);\r
917                 }\r
918                 return(jButton_down);\r
919         }\r
920         \r
921         //\r
922         private JScrollPane getJScrollPane_keywords() {\r
923                 if (jScrollPane_keywords == null) {\r
924                         jScrollPane_keywords = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);\r
925                         jScrollPane_keywords.setViewportView(getJTable_keywords());\r
926                 }\r
927                 return jScrollPane_keywords;\r
928         }\r
929         \r
930         //\r
931         private KDTable getJTable_keywords() {\r
932                 if (jTable_keywords == null) {\r
933                         \r
934                         jTable_keywords = new KDTable(false, new RowItemList<KDItem>());\r
935                         \r
936                         // テーブルの基本的な設定\r
937                         ArrayList<String> cola = new ArrayList<String>();\r
938                         for ( KDColumn rc : KDColumn.values() ) {\r
939                                 if ( rc.getIniWidth() >= 0 ) {\r
940                                         cola.add(rc.getName());\r
941                                 }\r
942                         }\r
943                         jTable_keywords.setModel(new DefaultTableModel(cola.toArray(new String[0]), 0));\r
944                         \r
945                         jTable_keywords.setAutoResizeMode(JNETable.AUTO_RESIZE_OFF);\r
946                         jTable_keywords.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
947                         jTable_keywords.getTableHeader().setReorderingAllowed(false);\r
948                         \r
949                         // 各カラムの幅\r
950                         DefaultTableColumnModel columnModel = (DefaultTableColumnModel)jTable_keywords.getColumnModel();\r
951                         //TableColumn column = null;\r
952                         for ( KDColumn rc : KDColumn.values() ) {\r
953                                 if ( rc.getIniWidth() < 0 ) {\r
954                                         continue;\r
955                                 }\r
956                                 columnModel.getColumn(rc.ordinal()).setPreferredWidth(rc.getIniWidth());;\r
957                         }\r
958 \r
959                 }\r
960                 return(jTable_keywords);\r
961         }\r
962         \r
963         /*******************************************************************************\r
964          * 独自コンポーネント\r
965          ******************************************************************************/\r
966         \r
967         private class KDItem extends RowItem implements Cloneable {\r
968                 TargetId target;\r
969                 String regex;\r
970                 String contain;\r
971                 \r
972                 @Override\r
973                 protected void myrefresh(RowItem o) {\r
974                         KDItem c = (KDItem) o;\r
975                         c.addData(target);\r
976                         c.addData(regex);\r
977                         c.addData(contain);\r
978                 }\r
979                 \r
980                 @Override\r
981                 public KDItem clone() {\r
982                         return (KDItem) super.clone();\r
983                 }\r
984         }\r
985         \r
986         private class KDTable extends JNETable {\r
987 \r
988                 private static final long serialVersionUID = 1L;\r
989                 \r
990                 RowItemList<KDItem> rowdata = null;\r
991                 \r
992                 public KDTable(boolean b, RowItemList<KDItem> rowdata) {\r
993                         super(b);\r
994                         this.rowdata = rowdata;\r
995                 }\r
996                 \r
997                 public RowItemList<KDItem> getRowItemList() { return rowdata; }\r
998                 \r
999                 public void fireChanged() { ((DefaultTableModel) this.getModel()).fireTableDataChanged(); }\r
1000                 \r
1001                 @Override\r
1002                 public int getRowCount() { return rowdata.size(); }\r
1003                 \r
1004                 @Override\r
1005                 public Object getValueAt(int row, int column) {\r
1006                         return rowdata.get(row).get(column);\r
1007                 }\r
1008                 \r
1009                 @Override\r
1010                 public void setValueAt(Object aValue, int row, int column) {\r
1011                         KDItem c = rowdata.get(row);\r
1012                         if ( column == KDColumn.TARGET.getColumn() ) {\r
1013                                 c.target = (TargetId) aValue;\r
1014                         }\r
1015                         else if ( column == KDColumn.REGEX.getColumn() ) {\r
1016                                 c.regex = (String) aValue;\r
1017                         }\r
1018                         else if ( column == KDColumn.CONTAIN.getColumn() ) {\r
1019                                 c.contain = (String) aValue;\r
1020                         }\r
1021                         c.fireChanged();\r
1022                 }\r
1023                 \r
1024         }\r
1025 \r
1026         /*******************************************************************************\r
1027          * 延長警告管理では以下をオーバーライドしてください\r
1028          ******************************************************************************/\r
1029         \r
1030         protected void setItems() {\r
1031                 setWindowTitle("キーワード検索の設定");\r
1032                 \r
1033                 clean_target_items();\r
1034                 add_target_item(TargetId.TITLEANDDETAIL);\r
1035                 add_target_item(TargetId.TITLE);\r
1036                 add_target_item(TargetId.DETAIL);\r
1037                 add_target_item(TargetId.CHANNEL);\r
1038                 add_target_item(TargetId.GENRE);\r
1039                 add_target_item(TargetId.SUBGENRE);\r
1040                 add_target_item(TargetId.NEW);\r
1041                 add_target_item(TargetId.LAST);\r
1042                 add_target_item(TargetId.REPEAT);\r
1043                 add_target_item(TargetId.FIRST);\r
1044                 add_target_item(TargetId.SPECIAL);\r
1045                 add_target_item(TargetId.RATING);\r
1046                 add_target_item(TargetId.NOSCRUMBLE);\r
1047                 add_target_item(TargetId.LIVE);\r
1048                 add_target_item(TargetId.BILINGUAL);\r
1049                 add_target_item(TargetId.STANDIN);\r
1050                 add_target_item(TargetId.MULTIVOICE);\r
1051                 add_target_item(TargetId.LENGTH);\r
1052                 add_target_item(TargetId.STARTA);\r
1053                 add_target_item(TargetId.STARTZ);\r
1054                 add_target_item(TargetId.STARTDATETIME);\r
1055 \r
1056                 clean_contain_items();\r
1057                 add_contain_item("を含む番組");\r
1058                 add_contain_item("を含む番組を除く");\r
1059                 \r
1060                 clean_condition_items();\r
1061                 add_condition_item("次のすべての条件に一致");\r
1062                 add_condition_item("次のいずれかの条件に一致");\r
1063         \r
1064                 clean_infection_items();\r
1065         //add_infection_item();\r
1066 \r
1067                 clean_okiniiri_items();\r
1068                 for (String okini : TVProgram.OKINIIRI) {\r
1069                         add_okiniiri_item(okini);\r
1070                 }\r
1071         }\r
1072 }\r