1 package com
.intellij
.ide
.todo
;
3 import com
.intellij
.ExtensionPoints
;
4 import com
.intellij
.openapi
.application
.ApplicationManager
;
5 import com
.intellij
.openapi
.components
.ApplicationComponent
;
6 import com
.intellij
.openapi
.extensions
.Extensions
;
7 import com
.intellij
.openapi
.util
.InvalidDataException
;
8 import com
.intellij
.openapi
.util
.JDOMExternalizable
;
9 import com
.intellij
.openapi
.util
.WriteExternalException
;
10 import com
.intellij
.psi
.search
.IndexPattern
;
11 import com
.intellij
.psi
.search
.IndexPatternProvider
;
12 import com
.intellij
.psi
.search
.TodoAttributes
;
13 import com
.intellij
.psi
.search
.TodoPattern
;
14 import com
.intellij
.util
.EventDispatcher
;
15 import org
.jdom
.Element
;
16 import org
.jetbrains
.annotations
.NonNls
;
17 import org
.jetbrains
.annotations
.NotNull
;
19 import java
.beans
.PropertyChangeEvent
;
20 import java
.beans
.PropertyChangeListener
;
21 import java
.util
.ArrayList
;
22 import java
.util
.Iterator
;
25 * @author Vladimir Kondratyev
27 public class TodoConfiguration
implements ApplicationComponent
, JDOMExternalizable
, IndexPatternProvider
{
28 private TodoPattern
[] myTodoPatterns
;
29 private TodoFilter
[] myTodoFilters
;
30 private IndexPattern
[] myIndexPatterns
;
32 private final EventDispatcher
<PropertyChangeListener
> myPropertyChangeMulticaster
= EventDispatcher
.create(PropertyChangeListener
.class);
34 @NonNls public static final String PROP_TODO_PATTERNS
= "todoPatterns";
35 @NonNls public static final String PROP_TODO_FILTERS
= "todoFilters";
36 @NonNls private static final String ELEMENT_PATTERN
= "pattern";
37 @NonNls private static final String ELEMENT_FILTER
= "filter";
40 * Invoked by reflection
43 Extensions
.getRootArea().getExtensionPoint(ExtensionPoints
.INDEX_PATTERN_PROVIDER
).registerExtension(this);
44 resetToDefaultTodoPatterns();
47 public void resetToDefaultTodoPatterns() {
48 myTodoPatterns
= new TodoPattern
[]{
49 new TodoPattern("\\btodo\\b.*", TodoAttributes
.createDefault(), false)
51 myTodoFilters
= new TodoFilter
[]{};
55 private void buildIndexPatterns() {
56 myIndexPatterns
= new IndexPattern
[myTodoPatterns
.length
];
57 for(int i
=0; i
<myTodoPatterns
.length
; i
++) {
58 myIndexPatterns
[i
] = myTodoPatterns
[i
].getIndexPattern();
62 public static TodoConfiguration
getInstance() {
63 return ApplicationManager
.getApplication().getComponent(TodoConfiguration
.class);
66 public String
getComponentName() {
67 return "TodoConfiguration";
70 public void initComponent() { }
72 public void disposeComponent() {
75 public TodoPattern
[] getTodoPatterns() {
76 return myTodoPatterns
;
79 @NotNull public IndexPattern
[] getIndexPatterns() {
80 return myIndexPatterns
;
83 public void setTodoPatterns(TodoPattern
[] patterns
) {
84 TodoPattern
[] oldPatterns
= myTodoPatterns
;
85 myTodoPatterns
= patterns
;
87 myPropertyChangeMulticaster
.getMulticaster().propertyChange(new PropertyChangeEvent(this, PROP_INDEX_PATTERNS
, oldPatterns
, patterns
));
88 myPropertyChangeMulticaster
.getMulticaster().propertyChange(new PropertyChangeEvent(this, PROP_TODO_PATTERNS
, oldPatterns
, patterns
));
92 * @return <code>TodoFilter</code> with specified <code>name</code>. Method returns
93 * <code>null</code> if there is no filter with <code>name</code>.
95 public TodoFilter
getTodoFilter(String name
) {
96 for (int i
= 0; i
< myTodoFilters
.length
; i
++) {
97 TodoFilter filter
= myTodoFilters
[i
];
98 if (filter
.getName().equals(name
)) {
106 * @return all <code>TodoFilter</code>s.
108 public TodoFilter
[] getTodoFilters() {
109 return myTodoFilters
;
112 public void setTodoFilters(TodoFilter
[] filters
) {
113 TodoFilter
[] oldFilters
= myTodoFilters
;
114 myTodoFilters
= filters
;
115 myPropertyChangeMulticaster
.getMulticaster().propertyChange(new PropertyChangeEvent(this, PROP_TODO_FILTERS
, oldFilters
, filters
));
118 public void addPropertyChangeListener(PropertyChangeListener listener
) {
119 myPropertyChangeMulticaster
.addListener(listener
);
122 public void removePropertyChangeListener(PropertyChangeListener listener
) {
123 myPropertyChangeMulticaster
.removeListener(listener
);
126 public void readExternal(Element element
) throws InvalidDataException
{
127 ArrayList
<TodoPattern
> patternsList
= new ArrayList
<TodoPattern
>();
128 ArrayList
<TodoFilter
> filtersList
= new ArrayList
<TodoFilter
>();
129 for (Iterator i
= element
.getChildren().iterator(); i
.hasNext();) {
130 Element child
= (Element
)i
.next();
131 if (ELEMENT_PATTERN
.equals(child
.getName())) {
132 TodoPattern pattern
= new TodoPattern();
133 pattern
.readExternal(child
);
134 patternsList
.add(pattern
);
136 else if (ELEMENT_FILTER
.equals(child
.getName())) {
137 TodoPattern
[] patterns
= patternsList
.toArray(new TodoPattern
[patternsList
.size()]);
138 TodoFilter filter
= new TodoFilter();
139 filter
.readExternal(child
, patterns
);
140 filtersList
.add(filter
);
143 setTodoPatterns(patternsList
.toArray(new TodoPattern
[patternsList
.size()]));
144 setTodoFilters(filtersList
.toArray(new TodoFilter
[filtersList
.size()]));
147 public void writeExternal(Element element
) throws WriteExternalException
{
148 for (int i
= 0; i
< myTodoPatterns
.length
; i
++) {
149 TodoPattern pattern
= myTodoPatterns
[i
];
150 Element child
= new Element(ELEMENT_PATTERN
);
151 pattern
.writeExternal(child
);
152 element
.addContent(child
);
154 for (int i
= 0; i
< myTodoFilters
.length
; i
++) {
155 TodoFilter filter
= myTodoFilters
[i
];
156 Element child
= new Element(ELEMENT_FILTER
);
157 filter
.writeExternal(child
, myTodoPatterns
);
158 element
.addContent(child
);