2 * Copyright 2000-2007 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.intellij
.ui
;
18 import com
.intellij
.openapi
.Disposable
;
19 import com
.intellij
.util
.ArrayUtil
;
20 import com
.intellij
.util
.EventDispatcher
;
23 import javax
.swing
.event
.*;
24 import javax
.swing
.table
.TableModel
;
25 import javax
.swing
.text
.JTextComponent
;
27 import java
.awt
.event
.ItemEvent
;
28 import java
.awt
.event
.ItemListener
;
29 import java
.beans
.PropertyChangeEvent
;
30 import java
.beans
.PropertyChangeListener
;
32 public class UserActivityWatcher
extends ComponentTreeWatcher
{
33 private boolean myIsModified
= false;
34 private EventDispatcher
<UserActivityListener
> myListeners
= EventDispatcher
.create(UserActivityListener
.class);
36 private final DocumentListener myDocumentListener
= new DocumentAdapter() {
37 public void textChanged(DocumentEvent event
) {
42 private com
.intellij
.openapi
.editor
.event
.DocumentListener myIdeaDocumentListener
= new com
.intellij
.openapi
.editor
.event
.DocumentAdapter() {
44 public void documentChanged(final com
.intellij
.openapi
.editor
.event
.DocumentEvent e
) {
49 private TableModelListener myTableModelListener
= new TableModelListener() {
50 public void tableChanged(TableModelEvent e
) {
54 private PropertyChangeListener myTableListener
= new PropertyChangeListener() {
55 public void propertyChange(PropertyChangeEvent evt
) {
56 TableModel oldModel
= (TableModel
)evt
.getOldValue();
57 if (oldModel
!= null) {
58 oldModel
.removeTableModelListener(myTableModelListener
);
61 TableModel newModel
= (TableModel
)evt
.getNewValue();
62 if (newModel
!= null) {
63 newModel
.addTableModelListener(myTableModelListener
);
66 if (oldModel
!= null) {
71 private ChangeListener myChangeListener
= new ChangeListener() {
72 public void stateChanged(final ChangeEvent e
) {
77 public void addUserActivityListener(UserActivityListener listener
) {
78 myListeners
.addListener(listener
);
81 public void addUserActivityListener(UserActivityListener listener
, Disposable parentDisposable
) {
82 myListeners
.addListener(listener
, parentDisposable
);
85 public void removeUserActivityListener(UserActivityListener listener
) {
86 myListeners
.removeListener(listener
);
89 protected final void fireUIChanged() {
91 myListeners
.getMulticaster().stateChanged();
94 private final ItemListener myItemListener
= new ItemListener() {
95 public void itemStateChanged(ItemEvent e
) {
100 private final ListDataListener myListDataListener
= new ListDataListener() {
101 public void intervalAdded(ListDataEvent e
) {
105 public void intervalRemoved(ListDataEvent e
) {
109 public void contentsChanged(ListDataEvent e
) {
114 private final TreeModelListener myTreeModelListener
= new TreeModelListener() {
115 public void treeNodesChanged(final TreeModelEvent e
) {
119 public void treeNodesInserted(final TreeModelEvent e
) {
123 public void treeNodesRemoved(final TreeModelEvent e
) {
127 public void treeStructureChanged(final TreeModelEvent e
) {
133 public UserActivityWatcher(Class
[] controlsToIgnore
) {
134 super(controlsToIgnore
);
137 public UserActivityWatcher() {
138 this(ArrayUtil
.EMPTY_CLASS_ARRAY
);
142 protected void processComponent(final Component parentComponent
) {
143 if (parentComponent
instanceof JTextComponent
) {
144 ((JTextComponent
)parentComponent
).getDocument().addDocumentListener(myDocumentListener
);
146 else if (parentComponent
instanceof ItemSelectable
) {
147 ((ItemSelectable
)parentComponent
).addItemListener(myItemListener
);
149 else if (parentComponent
instanceof JList
) {
150 ((JList
)parentComponent
).getModel().addListDataListener(myListDataListener
);
151 } else if (parentComponent
instanceof JTree
) {
152 ((JTree
)parentComponent
).getModel().addTreeModelListener(myTreeModelListener
);
153 } else if (parentComponent
instanceof DocumentBasedComponent
) {
154 ((DocumentBasedComponent
)parentComponent
).getDocument().addDocumentListener(myIdeaDocumentListener
);
157 if (parentComponent
instanceof JComboBox
) {
158 ComboBoxEditor editor
= ((JComboBox
)parentComponent
).getEditor();
159 if (editor
!= null) {
160 register(editor
.getEditorComponent());
164 if (parentComponent
instanceof JTable
) {
165 JTable table
= (JTable
)parentComponent
;
166 table
.addPropertyChangeListener("model", myTableListener
);
167 TableModel model
= table
.getModel();
169 model
.addTableModelListener(myTableModelListener
);
173 if (parentComponent
instanceof JSlider
) {
174 ((JSlider
)parentComponent
).addChangeListener(myChangeListener
);
178 protected void unprocessComponent(final Component component
) {
179 if (component
instanceof JTextComponent
) {
180 ((JTextComponent
)component
).getDocument().removeDocumentListener(myDocumentListener
);
182 else if (component
instanceof ItemSelectable
) {
183 ((ItemSelectable
)component
).removeItemListener(myItemListener
);
184 } else if (component
instanceof JTree
) {
185 ((JTree
)component
).getModel().removeTreeModelListener(myTreeModelListener
);
186 } else if (component
instanceof DocumentBasedComponent
) {
187 ((DocumentBasedComponent
)component
).getDocument().removeDocumentListener(myIdeaDocumentListener
);
190 if (component
instanceof JTable
) {
191 component
.removePropertyChangeListener(myTableListener
);
192 TableModel model
= ((JTable
)component
).getModel();
194 model
.removeTableModelListener(myTableModelListener
);
198 if (component
instanceof JSlider
){
199 ((JSlider
)component
).removeChangeListener(myChangeListener
);
203 public boolean isModified() {
207 public void commit() {
208 myIsModified
= false;