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