Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }