Source code: com/fm/gui/fmEditChannelDialog.java
1 /****************************************************************************
2 * Copyright (c) 2003 Andrew Duka | aduka@users.sourceforge.net
3 * All right reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 ****************************************************************************/
11 package com.fm.gui;
12
13 import com.fm.rss.rssChannel;
14 import com.fm.rss.rssChannelCategory;
15 import com.fm.update.fmEvent;
16
17 import javax.swing.*;
18 import javax.swing.event.TreeSelectionListener;
19 import javax.swing.event.TreeSelectionEvent;
20 import javax.swing.tree.DefaultTreeModel;
21 import javax.swing.tree.TreePath;
22 import java.awt.event.*;
23 import java.awt.*;
24 import java.util.Vector;
25
26 /**
27 * Edit channel dialog
28 */
29 public class fmEditChannelDialog extends JDialog implements ActionListener {
30
31
32 JPanel locationAndTitlePanel;
33
34
35
36 public fmEditChannelDialog (rssChannel sourceChannel,
37 fmCategoryTree parentTree,
38 Vector aListeners)
39 {
40
41 super();
42 final rssChannel updatedChannel = sourceChannel;
43 final Vector listeners = aListeners;
44
45 // start notification
46 fmEvent resultEvent = new fmEvent(updatedChannel,
47 fmEvent.UPDATE_STARTED, fmEvent.SUCCESS_STATUS);
48
49 for (int i=0, n = listeners.size(); i < n; i++)
50 ((ActionListener) listeners.get(i)).actionPerformed(resultEvent);
51
52 // TITLE
53 setDialogTitle(fmUITheme.getString("button.edit_location.label"));
54
55 // CONTENT PANE
56 Container contentPane = getContentPane();
57 contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
58
59 // SETTINGS PANE
60 final JPanel settingsPanel = new JPanel();
61 settingsPanel.setLayout(new BoxLayout(settingsPanel, BoxLayout.X_AXIS));
62 settingsPanel.setBorder(BorderFactory.createEtchedBorder());
63
64
65 final JPanel cardPane = new JPanel();
66 cardPane.setLayout(new CardLayout());
67 cardPane.setAlignmentY(TOP_ALIGNMENT);
68 cardPane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
69
70 ///////////////////////////////////////////////////
71 // ESCAPE KEY LISTENER
72 KeyListener escapeListener = new KeyAdapter() {
73 public void keyPressed(KeyEvent e) {
74 if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
75 fmEvent resultEvent = new fmEvent(updatedChannel,
76 fmEvent.UPDATE_FINISHED, fmEvent.SUCCESS_STATUS);
77
78 for (int i=0, n = listeners.size(); i < n; i++)
79 ((ActionListener) listeners.get(i)).actionPerformed(resultEvent);
80 dispose();
81 }
82 }
83 };
84
85
86 ///////////////////////////////////////////////////
87 // LOCATION AND TITLE PANEL
88
89 JPanel locationPane = new JPanel();
90 locationPane.setLayout(new BoxLayout(locationPane, BoxLayout.Y_AXIS));
91 JLabel label = new JLabel(fmUITheme.getString("label.feed_source"));
92 label.setAlignmentX(Component.LEFT_ALIGNMENT);
93
94 final JTextField channelURL = new JTextField(45);
95 channelURL.setText(updatedChannel.getSource());
96 channelURL.setAlignmentX(LEFT_ALIGNMENT);
97 channelURL.setMaximumSize(channelURL.getPreferredSize());
98 channelURL.setBorder(fmUITheme.TEXT_FIELD_BORDER);
99 channelURL.addKeyListener(escapeListener);
100
101 locationPane.add(label);
102 locationPane.add(Box.createRigidArea(new Dimension(0,3)));
103
104 locationPane.add(channelURL);
105 locationPane.add(Box.createRigidArea(new Dimension(0,20)));
106
107 label = new JLabel(fmUITheme.getString("label.title"));
108 label.setAlignmentX(LEFT_ALIGNMENT);
109
110 final JTextField channelTitle = new JTextField(45);
111 channelTitle.setText(updatedChannel.getTitle());
112 channelTitle.setAlignmentX(Component.LEFT_ALIGNMENT);
113 channelTitle.setMaximumSize(channelTitle.getPreferredSize());
114 channelTitle.setBorder(fmUITheme.TEXT_FIELD_BORDER);
115 channelTitle.addKeyListener(escapeListener);
116
117 locationPane.add(label);
118 locationPane.add(Box.createRigidArea(new Dimension(0,3)));
119
120 locationPane.add(channelTitle);
121 locationPane.add(Box.createRigidArea(new Dimension(0,10)));
122
123 cardPane.add(locationPane, "Location");
124
125 /////////////////////////////////////////////////////////////
126 // STORAGE PANE
127 JPanel storagePanel = new JPanel();
128 storagePanel.setLayout(new FlowLayout(FlowLayout.LEFT));
129 storagePanel.setAlignmentX(TOP_ALIGNMENT);
130
131 final JComboBox daysComboBox= new JComboBox(new Integer[]{new Integer(1),
132 new Integer(3),
133 new Integer(5),
134 new Integer(7),
135 new Integer(14),
136 new Integer(30),
137 new Integer(60),
138 new Integer(365)});
139 final JCheckBox useAutoremove = new JCheckBox(fmUITheme.getString("label.storepolicy.remove"),
140 false);
141 useAutoremove.setToolTipText(fmUITheme.getString("box.storepolicy.tooltip"));
142
143 int keep = updatedChannel.getKeepPeriod();
144
145 if (keep > 0 && keep < rssChannel.MAX_KEEP_PERIOD) {
146 daysComboBox.setSelectedItem(new Integer(keep));
147 useAutoremove.setSelected(true);
148 }
149 else {
150 daysComboBox.setEnabled(false);
151 useAutoremove.setSelected(false);
152 }
153
154 daysComboBox.setMaximumSize(daysComboBox.getPreferredSize());
155
156
157 useAutoremove.addItemListener(new ItemListener() {
158 public void itemStateChanged(ItemEvent e)
159 {
160 daysComboBox.setEnabled(!daysComboBox.isEnabled());
161 }
162 });
163
164 useAutoremove.setMaximumSize(useAutoremove.getPreferredSize());
165 storagePanel.add(useAutoremove);
166 storagePanel.add(daysComboBox);
167 storagePanel.add(new JLabel(fmUITheme.getString("label.storepolicy.days")));
168
169 cardPane.add(storagePanel,"Storage");
170
171 // REFRESH PANE
172 JPanel refreshPanel = new JPanel();
173 refreshPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
174 refreshPanel.setAlignmentY(TOP_ALIGNMENT);
175
176 final JTextField autoUpdateMinutes = new JTextField(3);
177 final JCheckBox useAutoCheck = new JCheckBox(fmUITheme.getString("box.auto_check_enable.label"),
178 false);
179 useAutoCheck.setToolTipText(fmUITheme.getString("box.auto_check_enable.tooltip"));
180
181 if (updatedChannel.getTtl() != -1) {
182 autoUpdateMinutes.setText((new Integer(updatedChannel.getTtl())).toString());
183 useAutoCheck.setSelected(true);
184 }
185 else {
186 autoUpdateMinutes.setText("60");
187 autoUpdateMinutes.setEditable(false);
188 }
189
190 autoUpdateMinutes.setMaximumSize(autoUpdateMinutes.getPreferredSize());
191 useAutoCheck.addItemListener(new ItemListener() {
192 public void itemStateChanged(ItemEvent e)
193 {
194 autoUpdateMinutes.setEditable(!autoUpdateMinutes.isEditable());
195 }
196 });
197
198 refreshPanel.add(useAutoCheck);
199 refreshPanel.add(autoUpdateMinutes);
200 refreshPanel.add(new JLabel(" " + fmUITheme.getString("label.autoupdate.minutes")), BorderLayout.EAST);
201
202 cardPane.add(refreshPanel,"Refresh");
203
204
205 ///////////////////////////////////////////////////////////////////////
206 // TREE PANEL
207 JPanel folderPanel = new JPanel();
208 folderPanel.setLayout(new BoxLayout(folderPanel, BoxLayout.Y_AXIS));
209
210 label = new JLabel(fmUITheme.getString("label.folder"));
211 label.setAlignmentX(LEFT_ALIGNMENT);
212
213 final fmCategoryTree categoryTree = fmCategoryTree.getInstance(parentTree.getCategories(),
214 false); // using common data
215
216 // SELECT ORIGINAL CATEGORY
217 final fmCategoryTree originalTree = parentTree;
218 final TreePath parentPath = parentTree.getSelectionPath();
219 final fmTreeNode originalNode;
220 final fmTreeNode originalParentNode;
221
222 // If path not null select node which corresponds to the parent area
223 //if (parentPath != null)
224 //{
225 originalNode = (fmTreeNode)parentPath.getLastPathComponent();
226 originalParentNode = (fmTreeNode)originalNode.getParent();
227
228 fmTreeNode pN = categoryTree.findCategoryNode(categoryTree.getRootNode(),
229 originalParentNode.getID());
230
231 if (pN != null)
232 categoryTree.setSelectionPath(new TreePath(pN.getPath()));
233 //}
234
235 JScrollPane treeScroll = new JScrollPane(categoryTree);
236 categoryTree.addKeyListener(escapeListener);
237 //categoryTree.repaint();
238
239 treeScroll.setPreferredSize(new Dimension(250,150));
240 treeScroll.setMaximumSize(treeScroll.getPreferredSize());
241 treeScroll.setAlignmentX(LEFT_ALIGNMENT);
242
243 // TREE LISTENER IS LOCATED BELOW APPLY BUTTON DECLARATION
244
245
246 folderPanel.add(label);
247 folderPanel.add(Box.createRigidArea(new Dimension(0,3)));
248
249 folderPanel.add(treeScroll);
250 folderPanel.add(Box.createRigidArea(new Dimension(0,15)));
251
252 final JLabel selectParentLabel = new JLabel(fmUITheme.getString("label.select_parent"));
253 selectParentLabel.setFont(selectParentLabel.getFont().deriveFont(Font.BOLD));
254 selectParentLabel.setForeground(new Color(204,0,0));
255
256 selectParentLabel.setVisible(false);
257
258 folderPanel.add(selectParentLabel);
259
260 cardPane.add(folderPanel,"Folder");
261
262 //////////////////////////
263 // LEFT SIDE BUTTONS PANEL
264 JPanel leftSideButtonsPanel = new JPanel();
265 leftSideButtonsPanel.setLayout(new GridLayout(4,0));
266 leftSideButtonsPanel.setAlignmentX(LEFT_ALIGNMENT);
267 leftSideButtonsPanel.setAlignmentY(TOP_ALIGNMENT);
268 leftSideButtonsPanel.setBackground(fmUITheme.LIGHT_BACKGROUND_COLOR);
269
270
271
272 Color leftSideBgColor = leftSideButtonsPanel.getBackground();
273
274 JButton editLocationButton = fmUITheme.getButtonInstance(fmUITheme.EDIT_LOCATION_ICON,
275 "button.edit_location.tooltip",
276 leftSideBgColor,
277 LEFT_ALIGNMENT);
278
279 editLocationButton.setHorizontalTextPosition(SwingConstants.CENTER);
280 editLocationButton.setVerticalTextPosition(SwingConstants.BOTTOM);
281 editLocationButton.setText(fmUITheme.getString("button.edit_location.label"));
282
283 editLocationButton.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
284 editLocationButton.setMaximumSize(editLocationButton.getPreferredSize());
285 editLocationButton.addKeyListener(escapeListener);
286 editLocationButton.addActionListener(new ActionListener() {
287 public void actionPerformed(ActionEvent e) {
288 ((CardLayout)cardPane.getLayout()).show(cardPane,"Location");
289 setDialogTitle(fmUITheme.getString("button.edit_location.label"));
290 }
291 });
292
293 //editLocationButton.setText(fmUITheme.getString("button.edit_location.tooltip"));
294
295 JButton editStorageButton = fmUITheme.getButtonInstance(fmUITheme.EDIT_STORAGE_ICON,
296 "button.edit_storage.tooltip",
297 leftSideBgColor,
298 LEFT_ALIGNMENT);
299
300 editStorageButton.setHorizontalTextPosition(SwingConstants.CENTER);
301 editStorageButton.setVerticalTextPosition(SwingConstants.BOTTOM);
302 editStorageButton.setText(fmUITheme.getString("button.edit_storage.label"));
303
304 editStorageButton.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
305 editStorageButton.setMaximumSize(editStorageButton.getPreferredSize());
306 editStorageButton.addKeyListener(escapeListener);
307 editStorageButton.addActionListener(new ActionListener() {
308 public void actionPerformed(ActionEvent e) {
309 ((CardLayout)cardPane.getLayout()).show(cardPane,"Storage");
310 setDialogTitle(fmUITheme.getString("button.edit_storage.label"));
311 }
312 });
313
314 JButton editRefreshButton = fmUITheme.getButtonInstance(fmUITheme.EDIT_REFRESH_ICON,
315 "button.edit_refresh.tooltip",
316 leftSideBgColor,
317 LEFT_ALIGNMENT);
318 editRefreshButton.setAlignmentY(TOP_ALIGNMENT);
319 editRefreshButton.setHorizontalTextPosition(SwingConstants.CENTER);
320 editRefreshButton.setVerticalTextPosition(SwingConstants.BOTTOM);
321 editRefreshButton.setText(fmUITheme.getString("button.edit_refresh.label"));
322
323 editRefreshButton.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
324 editRefreshButton.setMaximumSize(editStorageButton.getPreferredSize());
325 editRefreshButton.addKeyListener(escapeListener);
326
327 editRefreshButton.addActionListener(new ActionListener() {
328 public void actionPerformed(ActionEvent e) {
329 ((CardLayout)cardPane.getLayout()).show(cardPane,"Refresh");
330 setDialogTitle(fmUITheme.getString("button.edit_refresh.label"));
331 }
332 });
333
334
335 JButton editFolderButton = fmUITheme.getButtonInstance(fmUITheme.EDIT_FOLDER_ICON,
336 "button.edit_folder.tooltip",
337 leftSideBgColor,
338 LEFT_ALIGNMENT);
339 editFolderButton.setHorizontalTextPosition(SwingConstants.CENTER);
340 editFolderButton.setVerticalTextPosition(SwingConstants.BOTTOM);
341 editFolderButton.setText(fmUITheme.getString("button.edit_folder.label"));
342
343 editFolderButton.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
344 editFolderButton.setBorderPainted(false);
345 editFolderButton.setMaximumSize(editStorageButton.getPreferredSize());
346 editFolderButton.addKeyListener(escapeListener);
347 editFolderButton.addActionListener(new ActionListener() {
348 public void actionPerformed(ActionEvent e) {
349 ((CardLayout)cardPane.getLayout()).show(cardPane,"Folder");
350 setDialogTitle(fmUITheme.getString("button.edit_folder.label"));
351 }
352 });
353
354
355 leftSideButtonsPanel.add(editLocationButton);
356 leftSideButtonsPanel.add(editStorageButton);
357 leftSideButtonsPanel.add(editRefreshButton);
358 leftSideButtonsPanel.add(editFolderButton);
359 /*Dimension d = leftSideButtonsPanel.getPreferredSize();
360 d.width = 70;
361 leftSideButtonsPanel.setPreferredSize(d);*/
362
363
364 settingsPanel.add(leftSideButtonsPanel);
365 settingsPanel.add(new JSeparator(JSeparator.VERTICAL));
366 settingsPanel.add(Box.createHorizontalStrut(10));
367 settingsPanel.add(cardPane);
368
369
370
371
372
373
374 // BOTTOM BUTTONS
375 GridBagLayout navGridBag = new GridBagLayout();
376 GridBagConstraints c = new GridBagConstraints();
377 JPanel bottomPane = new JPanel(navGridBag);
378
379 final JButton applyButton = fmUITheme.getButtonInstance("button.apply.label",
380 "button.apply.tooltip",
381 KeyEvent.VK_P);
382 applyButton.addKeyListener(escapeListener);
383
384 ///////////////////////////////////////////////////////////////////////////////
385 // APPLY BUTTON LISTENER
386 applyButton.addActionListener(new ActionListener() {
387 public void actionPerformed(ActionEvent e)
388 {
389 String t = channelURL.getText();
390
391 String oldT = updatedChannel.getTitle();
392 String oldS = updatedChannel.getSource();
393 int oldK = updatedChannel.getKeepPeriod();
394 int oldTtl = updatedChannel.getTtl();
395
396
397 if ((t != null) && (t.length() > 0))
398 updatedChannel.setSource(t);
399
400 t = channelTitle.getText();
401
402 if ((t != null) && (t.length() > 0))
403 updatedChannel.setTitle(t);
404
405 if (useAutoremove.isSelected())
406 updatedChannel.setKeepPeriod(((Integer)(daysComboBox.getSelectedItem())).intValue());
407 else
408 updatedChannel.setKeepPeriod(-1);
409
410 if (useAutoCheck.isSelected()) {
411 String ttls = autoUpdateMinutes.getText();
412
413 if ((ttls.length() > 0) && (ttls.matches("[^0-9]") == false))
414 updatedChannel.setTtl(Integer.parseInt(ttls));
415 }
416 else
417 updatedChannel.setTtl(-1);
418
419 // FOLDER
420
421 TreePath curPath = categoryTree.getSelectionPath();
422 if ((curPath != null)) {
423 fmTreeNode selectedNode = (fmTreeNode)curPath.getLastPathComponent();
424 if (selectedNode != categoryTree.getRootNode()) {
425 if (selectedNode.getID() != originalParentNode.getID()) {
426 fmTreeNode newParentNode = originalTree.findCategoryNode(originalTree.getRootNode(),
427 selectedNode.getID());
428
429 if (newParentNode != null) {
430 // moving to another folder
431 int result = originalTree.insertNode((rssChannelCategory)newParentNode.getUserObject(),
432 updatedChannel, true);
433 // Node with same title
434 if (result == fmCategoryTree.NODE_EXISTS) {
435 JOptionPane.showMessageDialog(null,
436 fmUITheme.getString("msg.channel_exists_warning.update"),
437 fmUITheme.getString("label.error"),
438 JOptionPane.ERROR_MESSAGE);
439 // rolling back
440 updatedChannel.setTitle(oldT);
441 updatedChannel.setSource(oldS);
442 updatedChannel.setTtl(oldTtl);
443 updatedChannel.setKeepPeriod(oldK);
444 return;
445 }
446 else if (result == fmCategoryTree.NODE_NOT_FOUND) {
447 JOptionPane.showMessageDialog(null,
448 fmUITheme.getString("msg.cant_find_folder"),
449 fmUITheme.getString("label.error"),
450 JOptionPane.ERROR_MESSAGE);
451 // rolling back
452 updatedChannel.setTitle(oldT);
453 updatedChannel.setSource(oldS);
454 updatedChannel.setTtl(oldTtl);
455 updatedChannel.setKeepPeriod(oldK);
456 return;
457 }
458
459 originalTree.removeNode(originalNode);
460 }
461 }
462 }
463 }
464 // NOTIFICATION
465 fmEvent resultEvent = new fmEvent(updatedChannel,
466 fmEvent.UPDATE_FINISHED, fmEvent.SUCCESS_STATUS);
467
468 for (int i=0, n = listeners.size(); i < n; i++)
469 ((ActionListener) listeners.get(i)).actionPerformed(resultEvent);
470 dispose();
471 }
472 });
473
474 // APPLY BUTTON SETTINGS
475 c.anchor = GridBagConstraints.SOUTHEAST;
476 c.gridx = 0;
477 c.gridy = 1;
478 c.weightx = 0.15;
479 c.gridwidth = 2;
480 c.insets = new Insets(15,2,6,0);
481 c.ipadx = 15;
482 navGridBag.setConstraints(applyButton, c);
483 bottomPane.add(applyButton);
484
485 JButton button = fmUITheme.getButtonInstance("button.cancel.label",
486 "button.cancel.label",
487 KeyEvent.VK_C);
488 c.insets = new Insets(15,2,6,0);
489 c.fill = GridBagConstraints.HORIZONTAL;
490 c.gridx = GridBagConstraints.RELATIVE;
491 c.weightx = GridBagConstraints.RELATIVE;
492 navGridBag.setConstraints(button, c);
493 button.addKeyListener(escapeListener);
494
495 // CANCEL ACTION LISTENER
496 button.addActionListener(new ActionListener() {
497 public void actionPerformed(ActionEvent e)
498 {
499 fmEvent resultEvent = new fmEvent(updatedChannel,
500 fmEvent.UPDATE_FINISHED, fmEvent.SUCCESS_STATUS);
501
502 for (int i=0, n = listeners.size(); i < n; i++)
503 ((ActionListener) listeners.get(i)).actionPerformed(resultEvent);
504 dispose();
505 }
506 });
507 bottomPane.add(button);
508
509 ///////////////////////////////////////////////////////////////////
510 // TREE LISTENER
511 categoryTree.addTreeSelectionListener(new TreeSelectionListener() {
512 public void valueChanged(TreeSelectionEvent e)
513 {
514 if (categoryTree.getSelectionPath() == null) {
515 applyButton.setEnabled(false);
516 selectParentLabel.setVisible(true);
517 }
518 else {
519 applyButton.setEnabled(true);
520 selectParentLabel.setVisible(false);
521 }
522 }
523 });
524
525 contentPane.add(settingsPanel);
526 contentPane.add(Box.createVerticalStrut(10));
527 contentPane.add(bottomPane);
528 }
529
530
531 /**
532 * Perfomrs action events handling
533 *
534 * @param e
535 */
536 public void actionPerformed(ActionEvent e) {
537
538 // RESERVED
539
540
541 }
542
543 /**
544 * Set dialog title
545 *
546 * @param addt String which sould be added after common title
547 */
548 private void setDialogTitle(String addt) {
549 setTitle(fmUITheme.getString("dialog.edit_channel.title") +
550 " :: " + addt);
551 }
552
553 }