OSDN Git Service

番組追跡、キーワード検索の重複登録問題の改善
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / VWTraceKeyDialog.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.util.ArrayList;\r
7 \r
8 import javax.swing.DefaultComboBoxModel;\r
9 import javax.swing.JButton;\r
10 import javax.swing.JCheckBox;\r
11 import javax.swing.JComboBox;\r
12 import javax.swing.JComponent;\r
13 import javax.swing.JDialog;\r
14 import javax.swing.JLabel;\r
15 import javax.swing.JOptionPane;\r
16 import javax.swing.JPanel;\r
17 import javax.swing.JSlider;\r
18 import javax.swing.JTextField;\r
19 import javax.swing.SpringLayout;\r
20 import javax.swing.event.ChangeEvent;\r
21 import javax.swing.event.ChangeListener;\r
22 \r
23 /***\r
24  * \r
25  * 番組追跡検索の設定のクラス\r
26  * \r
27  */\r
28 \r
29 public class VWTraceKeyDialog extends JDialog {\r
30 \r
31         private static final long serialVersionUID = 1L;\r
32 \r
33         private TraceProgram xKeys = null;\r
34         private TraceKey xKey = null;\r
35         private ProgDetailList xTvd = null;\r
36         \r
37         private boolean reg = false;\r
38         \r
39         public String getNewLabel() { return getNewLabel(jTextField_title.getText(),jTextField_channel.getText()); }\r
40         \r
41         public static String getNewLabel(String title, String center) { return title+" ("+center+")"; }\r
42         \r
43         private ArrayList<String> okiniiri_items = new ArrayList<String>(); \r
44         public void clean_okiniiri_items() { okiniiri_items.clear(); }\r
45         public void add_okiniiri_item(String s) { okiniiri_items.add(s); }\r
46 \r
47         // キーワード検索の設定ウィンドウのコンポーネント\r
48         \r
49         private JPanel jPanel = null;\r
50         \r
51         private JButton jButton_title = null;\r
52         private JTextField jTextField_title = null;\r
53         private JLabel jLabel_channel = null;\r
54         private JTextField jTextField_channel = null;\r
55         private JLabel jLabel_fazzyThreshold = null;\r
56         private JSlider jSlider_fazzyThreshold = null;\r
57         private JLabel jLabel_okiniiri = null;\r
58         private JComboBox jComboBox_okiniiri = null;\r
59         private JLabel jLabel_disableRepeat = null;\r
60         private JCheckBox jCheckBox_disableRepeat = null;\r
61         private JLabel jLabel_showLatestOnly = null;\r
62         private JCheckBox jCheckBox_showLatestOnly = null;\r
63         private JButton jButton_label = null;\r
64         private JButton jButton_cancel = null;\r
65 \r
66         // ほげほげ\r
67 \r
68         public boolean isRegistered() { return reg; }\r
69         \r
70         public void open(TraceProgram sKeys, ProgDetailList tvd, int threshold) {\r
71                 \r
72                 xKeys = sKeys;\r
73                 xKey = null;\r
74                 xTvd = tvd;\r
75                 \r
76                 jTextField_title.setText(tvd.title);\r
77                 jTextField_title.setCaretPosition(0);\r
78                 jTextField_channel.setText(tvd.center);\r
79                 jSlider_fazzyThreshold.setValue(threshold);\r
80                 jComboBox_okiniiri.setSelectedItem(TVProgram.OKINIIRI[0]);\r
81                 jCheckBox_disableRepeat.setSelected(false);\r
82                 jCheckBox_showLatestOnly.setSelected(false);\r
83                 \r
84                 jButton_title.setEnabled(true);\r
85         }\r
86         \r
87         public void reopen(String label, TraceProgram sKeys) {\r
88                 \r
89                 xKeys = sKeys;\r
90                 xKey = null;\r
91                 xTvd = null;\r
92                 \r
93                 for (TraceKey k : xKeys.getTraceKeys()) {\r
94                         if (k.getLabel().equals(label)) {\r
95                                 // 操作対象をみつけた\r
96                                 xKey = k;\r
97                                 break;\r
98                         }\r
99                 }\r
100                 \r
101                 int index = xKey.getLabel().indexOf("("+xKey.getCenter()+")");\r
102                 if ( index > 0 ) {\r
103                         jTextField_title.setText(xKey.getLabel().substring(0,index));\r
104                 }\r
105                 else {\r
106                         jTextField_title.setText(xKey.getLabel());\r
107                 }\r
108                 jTextField_title.setCaretPosition(0);\r
109                 jTextField_channel.setText(xKey.getCenter());\r
110                 jSlider_fazzyThreshold.setValue(xKey.getFazzyThreshold());\r
111                 jComboBox_okiniiri.setSelectedItem(xKey.getOkiniiri());\r
112                 jCheckBox_disableRepeat.setSelected(xKey.getDisableRepeat());\r
113                 jCheckBox_showLatestOnly.setSelected(xKey.getShowLatestOnly());\r
114                 \r
115                 jButton_title.setEnabled(false);\r
116         }\r
117         \r
118         //\r
119         private JPanel getJPanel() {\r
120                 if (jPanel == null) {\r
121                         jPanel = new JPanel();\r
122 \r
123                         jPanel.setLayout(new SpringLayout());\r
124                         \r
125                         int lw = 90;\r
126                         int iw = 200;\r
127                         int ix = 10+lw+10;\r
128                         int y = 10;\r
129                         _getJComponent(jPanel, getJButton_title("番組タイトル"), lw, 25, 10, y);\r
130                         _getJComponent(jPanel, getJTextField_title(), iw, 25, ix, y);\r
131                         \r
132                         y += 30;\r
133                         _getJComponent(jPanel, getJLabel_channel("チャンネル名"), lw, 25, 10, y);\r
134                         _getJComponent(jPanel, getJTextField_channel(), iw, 25, ix, y);\r
135                         \r
136                         y += 30;\r
137                         _getJComponent(jPanel, getJLabel_fazzyThreshold("あいまい閾値"), lw, 25, 10, y);\r
138                         _getJComponent(jPanel, getJSlider_fazzyThreshold(), iw, 25, ix, y);\r
139                         \r
140                         y += 30;\r
141                         _getJComponent(jPanel, getJLabel_okiniiri("お気に入り度"), lw, 25, 10, y);\r
142                         _getJComponent(jPanel, getJComboBox_okiniiri(), iw, 25, ix, y);\r
143                         \r
144                         y += 30;\r
145                         _getJComponent(jPanel, getJLabel_disableRepeat("再放送を除く"), lw, 25, 10, y);\r
146                         _getJComponent(jPanel, getJCheckBox_disableRepeat(), iw, 25, ix, y);\r
147                         \r
148                         y += 30;\r
149                         _getJComponent(jPanel, getJLabel_showLatestOnly("リピート放送を検出"), lw, 25, 10, y);\r
150                         _getJComponent(jPanel, getJCheckBox_showLatestOnly(), iw, 25, ix, y);\r
151                         \r
152                         int wd = 10+lw+10+iw+20;\r
153                         \r
154                         y += 50;\r
155                         int bw = 75;\r
156                         _getJComponent(jPanel, getJButton_label("登録"), bw, 25, (wd/2)-bw-5, y);\r
157                         _getJComponent(jPanel, getJButton_cancel("キャンセル"), bw, 25, (wd/2)+5, y);\r
158                         \r
159                         y += 30;\r
160                         \r
161                         Dimension d = new Dimension(wd,y+10);\r
162                         jPanel.setPreferredSize(d);\r
163                 }\r
164                 return jPanel;\r
165         }\r
166         \r
167         private void _getJComponent(JPanel p, JComponent c, int width, int height, int x, int y) {\r
168             c.setPreferredSize(new Dimension(width, height));\r
169             ((SpringLayout)p.getLayout()).putConstraint(SpringLayout.NORTH, c, y, SpringLayout.NORTH, p);\r
170             ((SpringLayout)p.getLayout()).putConstraint(SpringLayout.WEST, c, x, SpringLayout.WEST, p);\r
171             p.add(c);\r
172         }\r
173         \r
174         \r
175         \r
176         //\r
177         private JButton getJButton_title(String s) {\r
178                 if (jButton_title == null) {\r
179                         jButton_title = new JButton(s);\r
180                         \r
181                         jButton_title.addActionListener(new ActionListener() {\r
182                                 @Override\r
183                                 public void actionPerformed(ActionEvent e) {\r
184                                         jTextField_title.setText(jTextField_title.getText().equals(xTvd.title) ? xTvd.splitted_title : xTvd.title);\r
185                                         jTextField_title.setCaretPosition(jTextField_title.getText().length());\r
186                                         jTextField_title.requestFocusInWindow();\r
187                                 }\r
188                         });\r
189                 }\r
190                 return(jButton_title);\r
191         }\r
192         \r
193         //\r
194         private JTextField getJTextField_title() {\r
195                 if (jTextField_title == null) {\r
196                         jTextField_title = new JTextField();\r
197                 }\r
198                 return(jTextField_title);\r
199         }\r
200         \r
201         //\r
202         private JLabel getJLabel_channel(String s) {\r
203                 if (jLabel_channel == null) {\r
204                         jLabel_channel = new JLabel(s);\r
205                 }\r
206                 return(jLabel_channel);\r
207         }\r
208         private JTextField getJTextField_channel() {\r
209                 if (jTextField_channel == null) {\r
210                         jTextField_channel = new JTextField();\r
211                         jTextField_channel.setEnabled(false);\r
212                 }\r
213                 return(jTextField_channel);\r
214         }\r
215         \r
216         //\r
217         private JLabel getJLabel_fazzyThreshold(String s) {\r
218                 if (jLabel_fazzyThreshold == null) {\r
219                         jLabel_fazzyThreshold = new JLabel(s);\r
220                 }\r
221                 return(jLabel_fazzyThreshold);\r
222         }\r
223         private JSlider getJSlider_fazzyThreshold() {\r
224                 if (jSlider_fazzyThreshold == null) {\r
225                         jSlider_fazzyThreshold = new JSlider(1,99);\r
226                         \r
227                         jSlider_fazzyThreshold.addChangeListener(new ChangeListener() {\r
228                                 @Override\r
229                                 public void stateChanged(ChangeEvent e) {\r
230                                         \r
231                                         jLabel_fazzyThreshold.setText("あいまい閾値"+jSlider_fazzyThreshold.getValue());\r
232                                 }\r
233                         });\r
234                 }\r
235                 return(jSlider_fazzyThreshold);\r
236         }\r
237         \r
238         //\r
239         private JLabel getJLabel_okiniiri(String s) {\r
240                 if (jLabel_okiniiri == null) {\r
241                         jLabel_okiniiri = new JLabel(s);\r
242                 }\r
243                 return(jLabel_okiniiri);\r
244         }\r
245         private JComboBox getJComboBox_okiniiri() {\r
246                 if (jComboBox_okiniiri == null) {\r
247                         jComboBox_okiniiri = new JComboBox();\r
248                         jComboBox_okiniiri.setEditable(false);\r
249                         \r
250                         DefaultComboBoxModel aModel = new DefaultComboBoxModel();\r
251                         jComboBox_okiniiri.setModel(aModel);\r
252                         for (String k : okiniiri_items) {\r
253                                 aModel.addElement(k);\r
254                         }\r
255                 }\r
256                 return(jComboBox_okiniiri);\r
257         }\r
258         \r
259         //\r
260         private JLabel getJLabel_disableRepeat(String s) {\r
261                 if (jLabel_disableRepeat == null) {\r
262                         jLabel_disableRepeat = new JLabel(s);\r
263                 }\r
264                 return(jLabel_disableRepeat);\r
265         }\r
266         private JCheckBox getJCheckBox_disableRepeat() {\r
267                 if (jCheckBox_disableRepeat == null) {\r
268                         jCheckBox_disableRepeat = new JCheckBox();\r
269                 }\r
270                 return(jCheckBox_disableRepeat);\r
271         }\r
272         \r
273         //\r
274         private JLabel getJLabel_showLatestOnly(String s) {\r
275                 if (jLabel_showLatestOnly == null) {\r
276                         jLabel_showLatestOnly = new JLabel(s);\r
277                 }\r
278                 return(jLabel_showLatestOnly);\r
279         }\r
280         private JCheckBox getJCheckBox_showLatestOnly() {\r
281                 if (jCheckBox_showLatestOnly == null) {\r
282                         jCheckBox_showLatestOnly = new JCheckBox();\r
283                 }\r
284                 return(jCheckBox_showLatestOnly);\r
285         }\r
286         \r
287         //\r
288         private JButton getJButton_label(String s) {\r
289                 if (jButton_label == null) {\r
290                         jButton_label = new JButton();\r
291                         jButton_label.setText(s);\r
292                         \r
293                         jButton_label.addActionListener(new ActionListener() {\r
294                                 @Override\r
295                                 public void actionPerformed(ActionEvent e) {\r
296                                         if ( addToTraceKeyList() ) {\r
297                                                 // ウィンドウを閉じる\r
298                                                 dispose();\r
299                                         }\r
300                                 }\r
301                         });\r
302                 }\r
303                 return(jButton_label);\r
304         }\r
305         \r
306         private boolean addToTraceKeyList() {\r
307                 if (jTextField_title.getText().equals("")) {\r
308                         return false;\r
309                 }\r
310                 \r
311                 // 重複登録を許さない\r
312                 for (TraceKey k : xKeys.getTraceKeys()) {\r
313                         if ( k != xKey && k.getLabel().equals(getNewLabel()) ) {\r
314                                 JOptionPane.showConfirmDialog(this, "既に登録されています:"+getNewLabel(), "警告", JOptionPane.CLOSED_OPTION);                                                      // キーワード検索の追加ではダイアログで修正できるので止めない\r
315                                 return false;\r
316                         }\r
317                 }\r
318                 \r
319                 if ( xKey == null ) {\r
320                         // 新規登録の場合はエントリがないので作成する\r
321                         xKey = new TraceKey();\r
322                         xKeys.add(xKey);\r
323                 }\r
324                 \r
325                 xKey.setLabel(getNewLabel());\r
326                 xKey.setCenter(jTextField_channel.getText());\r
327                 xKey.setTitlePop(TraceProgram.replacePop(jTextField_title.getText()));\r
328                 xKey.setSearchStrKeys(TraceProgram.splitKeys(xKey.getTitlePop()));\r
329                 xKey.setFazzyThreshold(jSlider_fazzyThreshold.getValue());\r
330                 xKey.setOkiniiri((String) jComboBox_okiniiri.getSelectedItem());\r
331                 xKey.setDisableRepeat(jCheckBox_disableRepeat.isSelected());\r
332                 xKey.setShowLatestOnly(jCheckBox_showLatestOnly.isSelected());\r
333                 \r
334                 reg = xKeys.save();\r
335                 \r
336                 return reg;\r
337         }\r
338         \r
339         //\r
340         private JButton getJButton_cancel(String s) {\r
341                 if (jButton_cancel == null) {\r
342                         jButton_cancel = new JButton();\r
343                         jButton_cancel.setText(s);\r
344                         \r
345                         jButton_cancel.addActionListener(new ActionListener() {\r
346 \r
347                                 @Override\r
348                                 public void actionPerformed(ActionEvent e) {\r
349                                         dispose();\r
350                                 }\r
351                         });\r
352                 }\r
353                 return jButton_cancel;\r
354         }\r
355         \r
356         \r
357         // コンストラクタ\r
358         public VWTraceKeyDialog(int x, int y) {\r
359                 \r
360                 super();\r
361 \r
362                 //\r
363                 reg = false;\r
364                 \r
365                 // 初期設定\r
366                 clean_okiniiri_items();\r
367                 for (String okini : TVProgram.OKINIIRI) {\r
368                         add_okiniiri_item(okini);\r
369                 }\r
370                 \r
371                 //\r
372                 this.setModal(true);\r
373                 this.setContentPane(getJPanel());\r
374                 // タイトルバーの高さも考慮する必要がある\r
375                 Dimension d = getJPanel().getPreferredSize();\r
376                 this.pack();\r
377                 this.setBounds(\r
378                                 x,\r
379                                 y, \r
380                                 d.width+(this.getInsets().left+this.getInsets().right),\r
381                                 d.height+(this.getInsets().top+this.getInsets().bottom));\r
382                 this.setResizable(false);\r
383                 //\r
384                 this.setTitle("番組追跡の設定");\r
385         }\r
386 }\r