1 19 20 package org.netbeans.modules.tasklist.core.filter; 21 22 import java.awt.*; 23 import java.awt.event.ActionEvent ; 24 import java.awt.event.ActionListener ; 25 import java.util.ArrayList ; 26 import java.util.Iterator ; 27 import java.util.List ; 28 import java.beans.PropertyChangeListener ; 29 import java.beans.PropertyChangeEvent ; 30 import javax.swing.*; 31 32 import org.netbeans.modules.tasklist.core.TaskListView; 33 import org.netbeans.modules.tasklist.core.TaskNode; 34 import org.openide.awt.Mnemonics; 35 import org.openide.explorer.view.BeanTreeView; 36 import org.openide.nodes.FilterNode; 37 import org.openide.nodes.Node; 38 import org.openide.util.NbBundle; 39 40 48 public final class FilterPanel extends JPanel implements java.awt.event.ActionListener , java.beans.PropertyChangeListener , java.awt.event.FocusListener { 49 50 private static final long serialVersionUID = 1; 51 52 private FilteredTopComponent view; 53 private Filter filter; 54 55 private FilterSubpanel subpanel; 57 58 65 public FilterPanel(FilteredTopComponent view, Filter filter) { 66 this.view = view; 67 this.filter = filter; 68 69 initComponents(); 70 initA11y(); 71 72 JPanel topAlign = new JPanel(); 74 topAlign.setLayout(new BorderLayout()); 75 topAlign.add(conditionsPanel, BorderLayout.NORTH); 76 conditionsScrollPane.setViewportView(topAlign); 77 FontMetrics fm = getFontMetrics(getFont()); 79 int width = fm.charWidth('n') * 80; int height = fm.getHeight() * 10; 81 conditionsScrollPane.setPreferredSize(new java.awt.Dimension (width, height)); 82 83 Color background = (Color)UIManager.get("Table.background"); conditionsPanel.setBackground(background); 85 topAlign.setBackground(background); 86 87 moreButton.addActionListener(this); 88 fewerButton.addActionListener(this); 89 matchAllRadio.addActionListener(this); 90 matchAnyRadio.addActionListener(this); 91 92 showFilter(filter); 93 updateSensitivity(); 94 } 95 96 99 public void initSubpanel(FilterSubpanel next) { 100 assert subpanel == null; 101 subpanel = next; 102 } 103 104 107 private void showFilter(Filter filter) { 108 if (filter != null) { 109 if (filter.matchAll()) { 110 matchAllRadio.setSelected(true); 111 } else { 112 matchAnyRadio.setSelected(true); 113 } 114 conditionsPanel.removeAll(); 115 List conditions = filter.getConditions(); 116 if (conditions.size() > 0) { 117 Iterator it = conditions.iterator(); 118 while (it.hasNext()) { 119 AppliedFilterCondition cond = (AppliedFilterCondition) it.next(); 120 addCondition(false, cond); 121 } 122 } else { 123 addCondition(false, null); 124 } 125 filterName.setText(filter.getName()); 126 } else { 127 this.setEnabled(false); 128 namePanel.setEnabled(false); 129 filterName.setEnabled(false); 130 filterName.setText(NbBundle.getMessage(FilterPanel.class, "no-filter")); 131 matchAnyRadio.setEnabled(false); 132 matchAllRadio.setEnabled(false); 133 conditionsPanel.setEnabled(false); 134 moreButton.setEnabled(false); 135 fewerButton.setEnabled(false); 136 } 137 } 138 139 145 private void initComponents() { 147 java.awt.GridBagConstraints gridBagConstraints; 148 149 setLayout(new java.awt.GridBagLayout ()); 150 151 addFocusListener(this); 152 153 namePanel.setLayout(new java.awt.GridBagLayout ()); 154 155 filterNameLabel.setLabelFor(filterName); 156 159 filterNameLabel.setToolTipText(java.util.ResourceBundle.getBundle("org/netbeans/modules/tasklist/core/filter/Bundle").getString("LBL_Filter_Name_Hint")); 160 filterNameLabel.setAlignmentY(0.0F); 161 gridBagConstraints = new java.awt.GridBagConstraints (); 162 gridBagConstraints.gridx = 0; 163 gridBagConstraints.gridy = 0; 164 gridBagConstraints.insets = new java.awt.Insets (0, 0, 0, 5); 165 namePanel.add(filterNameLabel, gridBagConstraints); 166 filterNameLabel.getAccessibleContext().setAccessibleName("<Name>"); 167 168 filterName.setText("jTextField1"); 169 filterName.setToolTipText(java.util.ResourceBundle.getBundle("org/netbeans/modules/tasklist/core/filter/Bundle").getString("LBL_Filter_Name_Hint")); 170 filterName.setAlignmentX(0.0F); 171 filterName.setAlignmentY(0.0F); 172 filterName.setPreferredSize(new java.awt.Dimension (32767, 20)); 173 filterName.addFocusListener(this); 174 175 gridBagConstraints = new java.awt.GridBagConstraints (); 176 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 177 gridBagConstraints.ipadx = 3; 178 gridBagConstraints.ipady = 5; 179 gridBagConstraints.weightx = 1.0; 180 gridBagConstraints.insets = new java.awt.Insets (5, 0, 5, 0); 181 namePanel.add(filterName, gridBagConstraints); 182 183 gridBagConstraints = new java.awt.GridBagConstraints (); 184 gridBagConstraints.gridx = 0; 185 gridBagConstraints.gridy = 0; 186 gridBagConstraints.gridwidth = 3; 187 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 188 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 189 gridBagConstraints.insets = new java.awt.Insets (0, 0, 10, 0); 190 add(namePanel, gridBagConstraints); 191 192 matchGroup.add(matchAllRadio); 193 196 gridBagConstraints = new java.awt.GridBagConstraints (); 197 gridBagConstraints.gridx = 0; 198 gridBagConstraints.gridy = 1; 199 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 200 add(matchAllRadio, gridBagConstraints); 201 202 matchGroup.add(matchAnyRadio); 203 matchAnyRadio.setSelected(true); 204 207 gridBagConstraints = new java.awt.GridBagConstraints (); 208 gridBagConstraints.gridx = 1; 209 gridBagConstraints.gridy = 1; 210 gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; 211 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 212 add(matchAnyRadio, gridBagConstraints); 213 214 conditionsScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 215 conditionsScrollPane.setAlignmentX(0.0F); 216 conditionsScrollPane.setAlignmentY(0.0F); 217 conditionsScrollPane.setPreferredSize(new java.awt.Dimension (32767, 32767)); 218 conditionsPanel.setLayout(new java.awt.GridBagLayout ()); 219 220 conditionsScrollPane.setViewportView(conditionsPanel); 221 222 gridBagConstraints = new java.awt.GridBagConstraints (); 223 gridBagConstraints.gridx = 0; 224 gridBagConstraints.gridy = 2; 225 gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; 226 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 227 gridBagConstraints.weightx = 1.0; 228 gridBagConstraints.weighty = 1.0; 229 gridBagConstraints.insets = new java.awt.Insets (12, 0, 12, 0); 230 add(conditionsScrollPane, gridBagConstraints); 231 conditionsScrollPane.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getBundle(FilterPanel.class).getString("LBL_Conditions")); 232 conditionsScrollPane.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getBundle(FilterPanel.class).getString("HNT_Conditions")); 233 234 buttonsPanel.setLayout(new java.awt.FlowLayout (java.awt.FlowLayout.LEFT)); 235 236 239 buttonsPanel.add(moreButton); 240 241 244 buttonsPanel.add(fewerButton); 245 246 gridBagConstraints = new java.awt.GridBagConstraints (); 247 gridBagConstraints.gridx = 0; 248 gridBagConstraints.gridy = 3; 249 gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; 250 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 251 add(buttonsPanel, gridBagConstraints); 252 253 } 254 255 257 public void focusGained(java.awt.event.FocusEvent evt) { 258 if (evt.getSource() == FilterPanel.this) { 259 FilterPanel.this.formFocusGained(evt); 260 } 261 else if (evt.getSource() == filterName) { 262 FilterPanel.this.filterNameFocusGained(evt); 263 } 264 } 265 266 public void focusLost(java.awt.event.FocusEvent evt) { 267 } 269 private void filterNameFocusGained(java.awt.event.FocusEvent evt) { filterName.selectAll(); 271 } 273 private void formFocusGained(java.awt.event.FocusEvent evt) { filterName.requestFocus(); 276 } 278 private void initA11y() { 279 288 289 Mnemonics.setLocalizedText(matchAllRadio, NbBundle.getMessage( 290 FilterPanel.class, "MatchAll")); matchAllRadio.setToolTipText (NbBundle.getMessage( 292 FilterPanel.class, "HINT_MatchAll")); Mnemonics.setLocalizedText(matchAnyRadio, NbBundle.getMessage( 294 FilterPanel.class, "MatchAny")); matchAnyRadio.setToolTipText (NbBundle.getMessage( 296 FilterPanel.class, "HINT_MatchAny")); Mnemonics.setLocalizedText(moreButton, NbBundle.getMessage( 298 FilterPanel.class, "More")); moreButton.setToolTipText (NbBundle.getMessage( 300 FilterPanel.class, "HINT_More")); Mnemonics.setLocalizedText(fewerButton, NbBundle.getMessage( 302 FilterPanel.class, "Fewer")); fewerButton.setToolTipText (NbBundle.getMessage( 304 FilterPanel.class, "HINT_Fewer")); 306 Mnemonics.setLocalizedText(filterNameLabel, NbBundle.getMessage( 307 FilterPanel.class, "LBL_Filter_Name")); 308 filterNameLabel.setToolTipText(NbBundle.getMessage( 309 FilterPanel.class, "LBL_Filter_Name_Hint")); 310 311 this.getAccessibleContext().setAccessibleDescription( 313 NbBundle.getMessage(FilterPanel.class, 314 "ACSD_Filter")); conditionsPanel.getAccessibleContext().setAccessibleName( 316 NbBundle.getMessage(FilterPanel.class, 317 "ACSN_Conditions")); conditionsPanel.getAccessibleContext().setAccessibleDescription( 319 NbBundle.getMessage(FilterPanel.class, 320 "ACSD_Conditions")); } 322 323 329 private ConditionPanel addCondition(boolean revalidate, AppliedFilterCondition condition) { 330 GridBagConstraints gridBagConstraints = new GridBagConstraints(); 331 gridBagConstraints.gridwidth = GridBagConstraints.REMAINDER; 332 gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; 333 gridBagConstraints.anchor = GridBagConstraints.NORTH; 334 gridBagConstraints.insets = new Insets(6, 0, 0, 0); 335 gridBagConstraints.weightx = 1.0; 336 ConditionPanel panel = new ConditionPanel(filter, condition); 337 panel.addPropertyChangeListener(FilterCondition.PROP_VALUE_VALID, this); 338 panel.setBackground((Color)UIManager.get("Table.background")); conditionsPanel.add(panel, gridBagConstraints); 340 if (revalidate) { 341 invalidate(); 342 getParent().validate(); 343 repaint(); 344 } 345 putClientProperty(FilterCondition.PROP_VALUE_VALID, Boolean.valueOf(isValueValid())); 346 return panel; 347 } 348 349 350 public final boolean isValueValid() { 351 Component[] cps = conditionsPanel.getComponents(); 352 for (int i = 0; i < cps.length; i++) { 353 ConditionPanel condition = (ConditionPanel) cps[i]; 354 if (condition != null) { 355 if (condition.isValueValid() == false) { 356 return false; 357 } 358 } 359 } 360 return true; 361 } 362 363 public void propertyChange(PropertyChangeEvent evt) { 365 putClientProperty(FilterCondition.PROP_VALUE_VALID, Boolean.valueOf(isValueValid())); 366 } 367 368 371 public void actionPerformed(ActionEvent evt) { 372 Object source = evt.getSource(); 373 if (source == moreButton) { 374 ConditionPanel comp = addCondition(true, null); 375 JScrollBar vsb = conditionsScrollPane.getVerticalScrollBar(); 376 vsb.setValue(vsb.getMaximum()); 377 comp.focusPropertyCombo(); 378 } else if (source == fewerButton) { 379 conditionsPanel.remove(conditionsPanel.getComponentCount() - 1); 380 invalidate(); 381 getParent().validate(); 382 repaint(); 383 } 384 updateSensitivity(); 385 } 386 387 390 private void updateSensitivity() { 391 int n = conditionsPanel.getComponentCount(); 392 fewerButton.setEnabled(n > 0); 393 } 394 395 400 public Filter getFilter() { 401 if (filter != null) { 402 Component[] cps = conditionsPanel.getComponents(); 404 ArrayList conditions = new ArrayList (cps.length); 405 for (int i = 0; i < cps.length; i++) { 406 AppliedFilterCondition condition = ((ConditionPanel)cps[i]).getCondition(); 407 if (condition != null) { 408 conditions.add(condition); 409 } 410 } 411 filter.setName(filterName.getText()); 412 filter.setConditions(conditions); 413 filter.setMatchAll(matchAllRadio.isSelected()); 414 filter.setFlattened(true); 415 if (subpanel != null) { 416 subpanel.updateFilter(filter); 417 } 418 } 419 return filter; 420 421 } 422 423 public JTextField getFilterNameField() { 424 return filterName; 425 } 426 427 final javax.swing.JPanel buttonsPanel = new javax.swing.JPanel (); 429 final javax.swing.JPanel conditionsPanel = new javax.swing.JPanel (); 430 final javax.swing.JScrollPane conditionsScrollPane = new javax.swing.JScrollPane (); 431 final javax.swing.JButton fewerButton = new javax.swing.JButton (); 432 final javax.swing.JTextField filterName = new javax.swing.JTextField (); 433 final javax.swing.JLabel filterNameLabel = new javax.swing.JLabel (); 434 final javax.swing.JRadioButton matchAllRadio = new javax.swing.JRadioButton (); 435 final javax.swing.JRadioButton matchAnyRadio = new javax.swing.JRadioButton (); 436 final javax.swing.ButtonGroup matchGroup = new javax.swing.ButtonGroup (); 437 final javax.swing.JButton moreButton = new javax.swing.JButton (); 438 final javax.swing.JPanel namePanel = new javax.swing.JPanel (); 439 final javax.swing.ButtonGroup subtaskGroup = new javax.swing.ButtonGroup (); 440 442 } 443 | Popular Tags |