1 19 20 package org.netbeans.modules.xml.text.navigator; 21 22 import java.awt.Component ; 23 import java.awt.Dimension ; 24 import java.awt.Insets ; 25 import java.awt.event.ActionEvent ; 26 import java.awt.event.ActionListener ; 27 import java.util.ArrayList ; 28 import java.util.HashMap ; 29 import java.util.Iterator ; 30 import java.util.List ; 31 import java.util.Map ; 32 import javax.swing.Box ; 33 import javax.swing.BoxLayout ; 34 import javax.swing.Icon ; 35 import javax.swing.JComponent ; 36 import javax.swing.JToggleButton ; 37 import javax.swing.JToolBar ; 38 import javax.swing.SwingUtilities ; 39 import javax.swing.border.EmptyBorder ; 40 import javax.swing.event.ChangeEvent ; 41 import javax.swing.event.ChangeListener ; 42 43 47 public final class FiltersManager { 48 49 private FiltersComponent comp; 50 51 static FiltersManager create (FiltersDescription descr) { 52 return new FiltersManager(descr); 53 } 54 55 59 public boolean isSelected (String filterName) { 60 return comp.isSelected(filterName); 61 } 62 63 66 public void setSelected (String filterName, boolean value) { 67 comp.setFilterSelected(filterName, value); 68 } 69 70 71 public JComponent getComponent () { 72 return comp; 73 } 74 75 76 public FiltersDescription getDescription () { 77 return comp.getDescription(); 78 } 79 80 81 public void hookChangeListener (FilterChangeListener l) { 82 comp.hookFilterChangeListener(l); 83 } 84 85 87 public interface FilterChangeListener { 88 91 public void filterStateChanged(ChangeEvent e); 92 93 } 95 96 97 private FiltersManager (FiltersDescription descr) { 98 comp = new FiltersComponent(descr); 99 } 100 101 105 private class FiltersComponent extends Box implements ActionListener { 106 107 108 private List toggles; 109 110 private final FiltersDescription filtersDesc; 111 112 113 private Object L_LOCK = new Object (); 114 115 private FilterChangeListener clientL; 116 117 118 private Object STATES_LOCK = new Object (); 119 120 private Map filterStates; 121 122 124 public boolean isSelected (String filterName) { 125 Boolean result; 126 synchronized (STATES_LOCK) { 127 if (filterStates == null) { 128 int index = filterIndexForName(filterName); 130 if (index < 0) { 131 return false; 132 } else { 133 return filtersDesc.isSelected(index); 134 } 135 } 136 result = (Boolean )filterStates.get(filterName); 137 } 138 139 if (result == null) { 140 throw new IllegalArgumentException ("Filter " + filterName + " not found."); 141 } 142 return result.booleanValue(); 143 } 144 145 146 public void setFilterSelected (String filterName, boolean value) { 147 assert SwingUtilities.isEventDispatchThread(); 148 149 int index = filterIndexForName(filterName); 150 if (index < 0) { 151 throw new IllegalArgumentException ("Filter " + filterName + " not found."); 152 } 153 ((JToggleButton )toggles.get(index)).setSelected(value); 155 synchronized (STATES_LOCK) { 156 filterStates.put(filterName, Boolean.valueOf(value)); 157 } 158 fireChange(); 160 } 161 162 public void hookFilterChangeListener (FilterChangeListener l) { 163 synchronized (L_LOCK) { 164 clientL = l; 165 } 166 } 167 168 public FiltersDescription getDescription () { 169 return filtersDesc; 170 } 171 172 173 FiltersComponent(FiltersDescription descr) { 174 super(BoxLayout.X_AXIS); 175 this.filtersDesc = descr; 176 if (!SwingUtilities.isEventDispatchThread()) { 178 SwingUtilities.invokeLater(new Runnable () { 179 public void run () { 180 initPanel(); 181 } 182 }); 183 } else { 184 initPanel(); 185 } 186 } 187 188 189 private void initPanel () { 190 setBorder(new EmptyBorder (1, 2, 3, 5)); 191 192 JToolBar toolbar = new JToolBar (JToolBar.HORIZONTAL); 194 toolbar.setFloatable(false); 195 toolbar.setRollover(true); 196 toolbar.setBorderPainted(false); 197 int filterCount = filtersDesc.getFilterCount(); 199 toggles = new ArrayList (filterCount); 200 JToggleButton toggleButton = null; 201 202 Map fStates = new HashMap (filterCount * 2); 203 204 for (int i = 0; i < filterCount; i++) { 205 toggleButton = createToggle(fStates, i); 206 toggles.add(toggleButton); 207 } 208 209 JToggleButton curToggle; 211 Dimension space = new Dimension (3, 0); 212 for (int i = 0; i < toggles.size(); i++) { 213 curToggle = (JToggleButton )toggles.get(i); 214 curToggle.addActionListener(this); 215 toolbar.add(curToggle); 216 if (i != toggles.size() - 1) { 217 toolbar.addSeparator(space); 218 } 219 } 220 221 add(toolbar); 222 223 synchronized (STATES_LOCK) { 225 filterStates = fStates; 226 } 227 } 228 229 private JToggleButton createToggle (Map fStates, int index) { 230 boolean isSelected = filtersDesc.isSelected(index); 231 Icon icon = filtersDesc.getSelectedIcon(index); 232 JToggleButton result = new JToggleButton (icon, isSelected); 234 Dimension size = new Dimension (icon.getIconWidth() + 6, icon.getIconHeight() + 4); 235 result.setPreferredSize(size); 236 result.setMargin(new Insets (2,3,2,3)); 237 result.setToolTipText(filtersDesc.getTooltip(index)); 238 239 fStates.put(filtersDesc.getName(index), Boolean.valueOf(isSelected)); 240 241 return result; 242 } 243 244 247 private int filterIndexForName (String filterName) { 248 int filterCount = filtersDesc.getFilterCount(); 249 String curName; 250 for (int i = 0; i < filterCount; i++) { 251 curName = filtersDesc.getName(i); 252 if (filterName.equals(curName)) { 253 return i; 254 } 255 } 256 return -1; 257 } 258 259 260 public void actionPerformed(ActionEvent e) { 261 JToggleButton toggle = (JToggleButton )e.getSource(); 263 int index = toggles.indexOf(e.getSource()); 264 synchronized (STATES_LOCK) { 265 filterStates.put(filtersDesc.getName(index), 266 Boolean.valueOf(toggle.isSelected())); 267 } 268 fireChange(); 270 } 271 272 private void fireChange () { 273 FilterChangeListener lCopy; 274 synchronized (L_LOCK) { 275 if (clientL == null) { 277 return; 278 } 279 lCopy = clientL; 280 } 281 282 lCopy.filterStateChanged(new ChangeEvent (FiltersManager.this)); 284 } 285 286 } 288 } 289 | Popular Tags |