View Javadoc

1   package com.melloware.jukes.gui.view;
2   
3   import java.awt.BorderLayout;
4   import java.awt.event.ActionEvent;
5   import java.awt.event.ActionListener;
6   import java.text.SimpleDateFormat;
7   import java.util.Date;
8   import java.util.List;
9   import java.util.Locale;
10  
11  import javax.swing.AbstractButton;
12  import javax.swing.JCheckBox;
13  import javax.swing.JComboBox;
14  import javax.swing.JComponent;
15  import javax.swing.JPanel;
16  import javax.swing.JScrollPane;
17  import javax.swing.JTextField;
18  import javax.swing.JToggleButton;
19  import javax.swing.JToolBar;
20  
21  import org.apache.commons.lang.StringEscapeUtils;
22  import org.apache.commons.lang.StringUtils;
23  import org.apache.commons.logging.Log;
24  import org.apache.commons.logging.LogFactory;
25  
26  import com.jgoodies.forms.builder.PanelBuilder;
27  import com.jgoodies.forms.layout.CellConstraints;
28  import com.jgoodies.forms.layout.FormLayout;
29  import com.jgoodies.uif.application.Application;
30  import com.jgoodies.uif.builder.ToolBarBuilder;
31  import com.jgoodies.uifextras.util.UIFactory;
32  import com.melloware.jukes.file.tag.MusicTag;
33  import com.melloware.jukes.gui.tool.Actions;
34  import com.melloware.jukes.gui.tool.MainModule;
35  import com.melloware.jukes.gui.tool.Resources;
36  import com.melloware.jukes.gui.tool.Settings;
37  import com.melloware.jukes.gui.view.component.ComplexInternalFrame;
38  import com.melloware.jukes.gui.view.component.ComponentFactory;
39  import com.melloware.jukes.util.GuiUtil;
40  import com.melloware.jukes.util.TimeSpan;
41  import com.melloware.jukes.util.TimeSpanUnit;
42  
43  /**
44   * Th filter panel on the main Jukes window.
45   * <p>
46   * Copyright (c) 1999-2007 Melloware, Inc. <http://www.melloware.com>
47   * @author Emil A. Lefkof III <info@melloware.com>
48   * @version 4.0
49   */
50  @SuppressWarnings("unchecked")
51  public final class FilterPanel
52      extends ComplexInternalFrame
53      implements ActionListener {
54  
55      private static final Log LOG = LogFactory.getLog(FilterPanel.class);
56      private static final String GENRE_NONE = "<none>";
57      private AbstractButton filterButton;
58      private final JCheckBox newFlag;
59      private final JComboBox bitrateField;
60      private final JComboBox genreField;
61      private final JComboBox operatorBitrate;
62      private final JComboBox operatorYear;
63      private final JPanel filterPanel;
64      private final JScrollPane scrollPane;
65      private final JTextField yearField1;
66      private final JTextField yearField2;
67      private final Settings settings;
68  
69      /**
70       * Default constructor
71       * <p>
72       * @param settings the application settings.
73       */
74      public FilterPanel(Settings settings) {
75          super(Resources.getString("label.filter"));
76          LOG.debug("Filter panel created.");
77          this.settings = settings;
78          setFrameIcon(Resources.FILTER_ICON);
79          setToolBar(buildToolBar());
80  
81          final List genres = MusicTag.getGenreTypes(); 
82          genres.add(0, GENRE_NONE);
83          genreField = new JComboBox(genres.toArray());
84          genreField.setSelectedItem(GENRE_NONE);
85          genreField.addActionListener(this);
86          bitrateField = new JComboBox(Resources.BITRATES);
87          bitrateField.setSelectedItem(null);
88          bitrateField.addActionListener(this);
89          operatorBitrate = new JComboBox(Resources.OPERATOR);
90          operatorBitrate.setSelectedItem(">=");
91          operatorBitrate.addActionListener(this);
92          operatorYear = new JComboBox(Resources.OPERATOR);
93          operatorYear.setSelectedItem(">=");
94          operatorYear.addActionListener(this);
95          yearField1 = new JTextField();
96          ((JTextField)yearField1).setColumns(5);
97          yearField2 = new JTextField();
98          ((JTextField)yearField2).setColumns(5);
99          newFlag = new JCheckBox(Resources.getString("label.recentadds"), false);
100         newFlag.addActionListener(this);
101 
102         filterPanel = new JPanel(new BorderLayout());
103         filterPanel.add(buildFilter(), BorderLayout.CENTER);
104         scrollPane = UIFactory.createStrippedScrollPane(filterPanel);
105         this.add(scrollPane);
106     }
107 
108     /**
109      * When the filter is changed re apply it.
110      */
111     public void actionPerformed(ActionEvent aEvent) {
112         if (filterButton.isSelected()) {
113             LOG.debug("Filter changed");
114             applyFilter();
115         }
116     }
117 
118     /**
119      * Applies this filter to the application
120      *
121      */
122     public void applyFilter() {
123         final MainFrame mainFrame = (MainFrame)Application.getDefaultParentFrame();
124         try {
125             GuiUtil.setBusyCursor(mainFrame, true);
126             String query = "";
127             final String genre = (String)genreField.getSelectedItem();
128             if ((StringUtils.isNotBlank(genre)) && (!StringUtils.equals(genre, GENRE_NONE))) {
129                 query = query + " and disc.genre = '" + genre + "'";
130             }
131             if (StringUtils.isNotBlank(yearField1.getText())) {
132                 if (StringUtils.isBlank(yearField2.getText())) {
133                     query = query + " and disc.year " + operatorYear.getSelectedItem().toString()
134                             + StringEscapeUtils.escapeSql(yearField1.getText());
135                 } else {
136                     query = query + " and disc.year between " + StringEscapeUtils.escapeSql(yearField1.getText())
137                             + " and " + StringEscapeUtils.escapeSql(yearField2.getText());
138                 }
139             }
140             if (bitrateField.getSelectedItem() != null) {
141                 query = query + " and disc.bitrate  " + operatorBitrate.getSelectedItem().toString()
142                         + StringEscapeUtils.escapeSql((String)bitrateField.getSelectedItem());
143             }
144             if (newFlag.isSelected()) {
145                 final TimeSpan timespan = new TimeSpan(System.currentTimeMillis());
146                 timespan.subtract(TimeSpanUnit.DAYS, this.settings.getNewFileInDays());
147                 final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
148                 query = query + " and disc.createdDate > '" + format.format(new Date(timespan.getTime())) + "'";
149             }
150 
151             MainModule.SETTINGS.setFilter(query);
152             mainFrame.getMainModule().refreshTree();
153         } finally {
154             GuiUtil.setBusyCursor(mainFrame, false);
155         }
156     }
157 
158     /**
159      * Clears the current filter.
160      */
161     public void clearFilter() {
162         genreField.setSelectedItem(null);
163         yearField1.setText("");
164         yearField2.setText("");
165         bitrateField.setSelectedItem(null);
166         newFlag.setSelected(false);
167 
168         filterButton.setSelected(false);
169         removeFilter();
170     }
171 
172     /**
173      * Removes the filter from the application.
174      */
175     public void removeFilter() {
176         final MainFrame mainFrame = (MainFrame)Application.getDefaultParentFrame();
177         try {
178             GuiUtil.setBusyCursor(mainFrame, true);
179             MainModule.SETTINGS.setFilter("");
180             mainFrame.getMainModule().refreshTree();
181         } finally {
182             GuiUtil.setBusyCursor(mainFrame, false);
183         }
184     }
185 
186     /**
187     * Builds the filter panel.
188     * <p>
189     * @return the panel used to specify filters
190     */
191     private JComponent buildFilter() {
192         FormLayout layout = new FormLayout("3px, pref, pref, pref, pref, fill:pref:grow",
193                                            "4px, p, 4px, p, 4px, p, 4px, p");
194         PanelBuilder builder = new PanelBuilder(layout);
195         CellConstraints cc = new CellConstraints();
196 
197         builder.addLabel(Resources.getString("label.genre") + ": ", cc.xy(2, 2));
198         builder.add(genreField, cc.xyw(3, 2, 4));
199         builder.addLabel(Resources.getString("label.year") + ": ", cc.xy(2, 4));
200         builder.add(operatorYear, cc.xy(3, 4));
201         builder.add(yearField1, cc.xy(4, 4));
202         builder.add(yearField2, cc.xy(5, 4));
203         builder.addLabel(Resources.getString("label.bitrate") + ": ", cc.xy(2, 6));
204         builder.add(operatorBitrate, cc.xy(3, 6));
205         builder.add(bitrateField, cc.xy(4, 6));
206         builder.add(newFlag, cc.xyw(2, 8, 4));
207         return builder.getPanel();
208     }
209 
210     /**
211      * Builds the toolbar for this panel.
212      * <p>
213      * @return the toolbar to return
214      */
215     private JToolBar buildToolBar() {
216         final ToolBarBuilder bar = new ToolBarBuilder("Filter Toolbar");
217         AbstractButton button = null;
218         filterButton = (JToggleButton)ComponentFactory.createToolBarToggleButton(Actions.FILTER_APPLY_ID);
219         filterButton.putClientProperty(Resources.EDITOR_COMPONENT, this);
220         bar.add(filterButton);
221         button = (AbstractButton)ComponentFactory.createToolBarButton(Actions.FILTER_CLEAR_ID);
222         button.putClientProperty(Resources.EDITOR_COMPONENT, this);
223         bar.add(button);
224         button = (AbstractButton)ComponentFactory.createToolBarButton(Actions.FILTER_CLOSE_ID);
225         bar.add(button);
226         return bar.getToolBar();
227     }
228 
229 }