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
45
46
47
48
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
71
72
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
110
111 public void actionPerformed(ActionEvent aEvent) {
112 if (filterButton.isSelected()) {
113 LOG.debug("Filter changed");
114 applyFilter();
115 }
116 }
117
118
119
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
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
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
188
189
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
212
213
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 }