77import java .util .ArrayList ;
88import java .util .Collections ;
99import java .util .EnumSet ;
10- import java .util .HashSet ;
1110import java .util .List ;
1211import java .util .Set ;
12+ import java .util .concurrent .CopyOnWriteArraySet ;
1313
1414import org .eclipse .core .resources .IMarker ;
1515import org .eclipse .core .runtime .CoreException ;
3030 * The ViewerFilter for Priorities.
3131 * This is used for both Violation Outline and Violation Overview.
3232 *
33+ * <p>The current enabled filters are saved automatically in the preferences.
34+ * See {@link #PREFERENCE_KEY}.
35+ *
3336 * @author SebastianRaffel ( 17.05.2005 )
3437 */
3538public class PriorityFilter extends ViewerFilter {
3639 private static final PriorityFilter INSTANCE = new PriorityFilter ();
3740
41+ private static final String PREFERENCE_KEY = PriorityFilter .class .getName () + ".enabledPriorities" ;
42+
3843 private final Set <RulePriority > enabledPriorities ;
3944
40- private Set <PriorityFilterChangeListener > listeners = Collections . synchronizedSet ( new HashSet < PriorityFilterChangeListener >() );
45+ private Set <PriorityFilterChangeListener > listeners = new CopyOnWriteArraySet <>( );
4146
4247 /**
4348 * Constructor
@@ -54,6 +59,42 @@ public static PriorityFilter getInstance() {
5459 return INSTANCE ;
5560 }
5661
62+ /**
63+ * Initialize the priority filter by loading the preferences and making sure, that
64+ * any change to the filter is stored to the preferences.
65+ */
66+ public final void initialize () {
67+ addPriorityFilterChangeListener (new PriorityFilterChangeListener () {
68+ @ Override
69+ public void priorityEnabled (RulePriority priority ) {
70+ saveToPreferenceStore ();
71+ }
72+ @ Override
73+ public void priorityDisabled (RulePriority priority ) {
74+ saveToPreferenceStore ();
75+ }
76+ });
77+ loadFromPreferenceStore ();
78+ }
79+
80+ private void saveToPreferenceStore () {
81+ StringBuilder asString = new StringBuilder (50 );
82+ for (RulePriority rulePriority : enabledPriorities ) {
83+ asString .append (rulePriority .name ()).append (',' );
84+ }
85+ PMDPlugin .getDefault ().getPreferenceStore ().setValue (PREFERENCE_KEY , asString .toString ());
86+ }
87+
88+ private void loadFromPreferenceStore () {
89+ String priorities = PMDPlugin .getDefault ().getPreferenceStore ().getString (PREFERENCE_KEY );
90+ if (priorities != null && !priorities .isEmpty ()) {
91+ enabledPriorities .clear ();
92+ for (String priority : priorities .split ("," )) {
93+ enabledPriorities .add (RulePriority .valueOf (priority ));
94+ }
95+ }
96+ }
97+
5798 /*
5899 * @see
59100 * org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.
@@ -92,13 +133,13 @@ private boolean isPriorityEnabled(Integer markerPrio) {
92133 boolean isEnabled = false ;
93134 // for some unknown reasons markerPrio may be null.
94135 if (markerPrio != null ) {
95- isEnabled = enabledPriorities . contains (RulePriority .valueOf (markerPrio ));
136+ isEnabled = isPriorityEnabled (RulePriority .valueOf (markerPrio ));
96137 }
97138 return isEnabled ;
98139 }
99140
100141 public boolean isPriorityEnabled (RulePriority priority ) {
101- return isPriorityEnabled ( priority . getPriority () );
142+ return enabledPriorities . contains ( priority );
102143 }
103144
104145 private boolean hasMarkersToShow (AbstractPMDRecord record ) {
@@ -118,7 +159,9 @@ private boolean hasMarkersToShow(AbstractPMDRecord record) {
118159 *
119160 * @param newList,
120161 * an ArrayLust of Integers
162+ * @deprecated will be removed. The enabled priorities are stored in the preferences automatically now.
121163 */
164+ @ Deprecated
122165 public void setPriorityFilterList (List <Integer > newList ) {
123166 enabledPriorities .clear ();
124167 for (Integer priority : newList ) {
@@ -130,7 +173,9 @@ public void setPriorityFilterList(List<Integer> newList) {
130173 * Gets the FilterList with the Priorities
131174 *
132175 * @return an List of Integers
176+ * @deprecated will be removed. Use {@link #isPriorityEnabled(RulePriority)} instead.
133177 */
178+ @ Deprecated
134179 public List <Integer > getPriorityFilterList () {
135180 List <Integer > priorityList = new ArrayList <>();
136181 for (RulePriority priority : enabledPriorities ) {
@@ -227,18 +272,14 @@ public void removePriorityFilterChangeListener(PriorityFilterChangeListener list
227272 }
228273
229274 private void notifyPriorityEnabled (RulePriority priority ) {
230- synchronized (listeners ) {
231- for (PriorityFilterChangeListener listener : listeners ) {
232- listener .priorityEnabled (priority );
233- }
275+ for (PriorityFilterChangeListener listener : listeners ) {
276+ listener .priorityEnabled (priority );
234277 }
235278 }
236279
237280 private void notifyPriorityDisabled (RulePriority priority ) {
238- synchronized (listeners ) {
239- for (PriorityFilterChangeListener listener : listeners ) {
240- listener .priorityDisabled (priority );
241- }
281+ for (PriorityFilterChangeListener listener : listeners ) {
282+ listener .priorityDisabled (priority );
242283 }
243284 }
244285
0 commit comments