Fix for IDEADEV-30031
[fedora-idea.git] / platform-api / src / com / intellij / ui / UserActivityWatcher.java
blobb22e76da292398593d0096a8536a212bf2e52577
1 /*
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;
22 import javax.swing.*;
23 import javax.swing.event.*;
24 import javax.swing.table.TableModel;
25 import javax.swing.text.JTextComponent;
26 import java.awt.*;
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) {
38 fireUIChanged();
42 private com.intellij.openapi.editor.event.DocumentListener myIdeaDocumentListener = new com.intellij.openapi.editor.event.DocumentAdapter() {
43 @Override
44 public void documentChanged(final com.intellij.openapi.editor.event.DocumentEvent e) {
45 fireUIChanged();
49 private TableModelListener myTableModelListener = new TableModelListener() {
50 public void tableChanged(TableModelEvent e) {
51 fireUIChanged();
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) {
67 fireUIChanged();
71 private ChangeListener myChangeListener = new ChangeListener() {
72 public void stateChanged(final ChangeEvent e) {
73 fireUIChanged();
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() {
90 myIsModified = true;
91 myListeners.getMulticaster().stateChanged();
94 private final ItemListener myItemListener = new ItemListener() {
95 public void itemStateChanged(ItemEvent e) {
96 fireUIChanged();
100 private final ListDataListener myListDataListener = new ListDataListener() {
101 public void intervalAdded(ListDataEvent e) {
102 fireUIChanged();
105 public void intervalRemoved(ListDataEvent e) {
106 fireUIChanged();
109 public void contentsChanged(ListDataEvent e) {
110 fireUIChanged();
114 private final TreeModelListener myTreeModelListener = new TreeModelListener() {
115 public void treeNodesChanged(final TreeModelEvent e) {
116 fireUIChanged();
119 public void treeNodesInserted(final TreeModelEvent e) {
120 fireUIChanged();
123 public void treeNodesRemoved(final TreeModelEvent e) {
124 fireUIChanged();
127 public void treeStructureChanged(final TreeModelEvent e) {
128 fireUIChanged();
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();
168 if (model != null) {
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();
193 if (model != null) {
194 model.removeTableModelListener(myTableModelListener);
198 if (component instanceof JSlider){
199 ((JSlider)component).removeChangeListener(myChangeListener);
203 public boolean isModified() {
204 return myIsModified;
207 public void commit() {
208 myIsModified = false;