From cca7a1bd435e59a1cc14df8903dcc14ff995a9d7 Mon Sep 17 00:00:00 2001 From: Olesya Smirnova Date: Thu, 10 Feb 2005 23:07:30 +0300 Subject: [PATCH] StructureView ModelListener added --- .../ide/structureView/ModelListener.java | 36 +++++++++++++++++++ .../ide/structureView/StructureViewModel.java | 4 +++ .../TextEditorBasedStructureViewModel.java | 8 +++++ .../StructureTreeBuilder.java | 15 +++++++- .../StructureViewComponent.java | 2 +- .../newStructureView/TreeModelWrapper.java | 9 +++++ 6 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 openapi/src/com/intellij/ide/structureView/ModelListener.java diff --git a/openapi/src/com/intellij/ide/structureView/ModelListener.java b/openapi/src/com/intellij/ide/structureView/ModelListener.java new file mode 100644 index 000000000000..f9c86fc9707e --- /dev/null +++ b/openapi/src/com/intellij/ide/structureView/ModelListener.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2004 JetBrains s.r.o. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * -Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * -Redistribution in binary form must reproduct the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the distribution. + * + * Neither the name of JetBrains or IntelliJ IDEA + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. JETBRAINS AND ITS LICENSORS SHALL NOT + * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT + * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL JETBRAINS OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN + * IF JETBRAINS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + */ +package com.intellij.ide.structureView; + +public interface ModelListener { + void onModelChanged(); +} diff --git a/openapi/src/com/intellij/ide/structureView/StructureViewModel.java b/openapi/src/com/intellij/ide/structureView/StructureViewModel.java index d8de7080bf87..5329b7eae01b 100644 --- a/openapi/src/com/intellij/ide/structureView/StructureViewModel.java +++ b/openapi/src/com/intellij/ide/structureView/StructureViewModel.java @@ -40,6 +40,10 @@ public interface StructureViewModel extends TreeModel{ void removeEditorPositionListener(FileEditorPositionListener listener); + void addModelListener(ModelListener modelListener); + + void removeModelListener(ModelListener modelListener); + StructureViewTreeElement getRoot(); void dispose(); diff --git a/openapi/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java b/openapi/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java index 1c165ad6325a..4101e83cc4bb 100644 --- a/openapi/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java +++ b/openapi/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java @@ -124,5 +124,13 @@ public abstract class TextEditorBasedStructureViewModel implements StructureView return false; } + public void addModelListener(ModelListener modelListener) { + + } + + public void removeModelListener(ModelListener modelListener) { + + } + protected abstract Class[] getSuitableClasses(); } diff --git a/source/com/intellij/ide/structureView/newStructureView/StructureTreeBuilder.java b/source/com/intellij/ide/structureView/newStructureView/StructureTreeBuilder.java index 6bdee93d54be..fd7de3162a0a 100644 --- a/source/com/intellij/ide/structureView/newStructureView/StructureTreeBuilder.java +++ b/source/com/intellij/ide/structureView/newStructureView/StructureTreeBuilder.java @@ -1,5 +1,7 @@ package com.intellij.ide.structureView.newStructureView; +import com.intellij.ide.structureView.ModelListener; +import com.intellij.ide.structureView.StructureViewModel; import com.intellij.ide.util.treeView.*; import com.intellij.ide.util.treeView.smartTree.SmartTreeStructure; import com.intellij.openapi.ide.CopyPasteManager; @@ -13,14 +15,17 @@ import javax.swing.tree.DefaultTreeModel; final class StructureTreeBuilder extends AbstractTreeBuilder { private final Project myProject; + private final StructureViewModel myStructureModel; private final MyCopyPasteListener myCopyPasteListener; private final PsiTreeChangeListener myPsiTreeChangeListener; + private final ModelListener myModelListener; public StructureTreeBuilder(Project project, JTree tree, DefaultTreeModel treeModel, - AbstractTreeStructure treeStructure) { + AbstractTreeStructure treeStructure, + StructureViewModel structureModel) { super( tree, treeModel, @@ -28,18 +33,26 @@ final class StructureTreeBuilder extends AbstractTreeBuilder { ); myProject = project; + myStructureModel = structureModel; myPsiTreeChangeListener = new MyPsiTreeChangeListener(); + myModelListener = new ModelListener() { + public void onModelChanged() { + myUpdater.addSubtreeToUpdate(myRootNode); + } + }; PsiManager.getInstance(myProject).addPsiTreeChangeListener(myPsiTreeChangeListener); myCopyPasteListener = new MyCopyPasteListener(); CopyPasteManager.getInstance().addContentChangedListener(myCopyPasteListener); initRootNode(); + myStructureModel.addModelListener(myModelListener); } public void dispose() { PsiManager.getInstance(myProject).removePsiTreeChangeListener(myPsiTreeChangeListener); CopyPasteManager.getInstance().removeContentChangedListener(myCopyPasteListener); + myStructureModel.removeModelListener(myModelListener); super.dispose(); } diff --git a/source/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java b/source/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java index 561bd5fcea9b..4953187d2374 100644 --- a/source/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java +++ b/source/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java @@ -71,7 +71,7 @@ public class StructureViewComponent extends JPanel implements TreeActionsOwner, SmartTreeStructure treeStructure = new SmartTreeStructure(project, myTreeModelWrapper); JTree tree = new JTree(new DefaultTreeModel(new DefaultMutableTreeNode(treeStructure.getRootElement()))); myAbstractTreeBuilder = new StructureTreeBuilder(project, tree, - (DefaultTreeModel)tree.getModel(),treeStructure); + (DefaultTreeModel)tree.getModel(),treeStructure,myTreeModelWrapper); myAbstractTreeBuilder.updateFromRoot(); add(new JScrollPane(myAbstractTreeBuilder.getTree()), BorderLayout.CENTER); diff --git a/source/com/intellij/ide/structureView/newStructureView/TreeModelWrapper.java b/source/com/intellij/ide/structureView/newStructureView/TreeModelWrapper.java index 859ed20de0e0..1d0825b05fa7 100644 --- a/source/com/intellij/ide/structureView/newStructureView/TreeModelWrapper.java +++ b/source/com/intellij/ide/structureView/newStructureView/TreeModelWrapper.java @@ -4,6 +4,7 @@ import com.intellij.ide.util.treeView.smartTree.*; import com.intellij.ide.structureView.StructureViewModel; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.structureView.FileEditorPositionListener; +import com.intellij.ide.structureView.ModelListener; import java.util.ArrayList; @@ -67,4 +68,12 @@ public class TreeModelWrapper implements StructureViewModel { public void dispose() { myModel.dispose(); } + + public void addModelListener(ModelListener modelListener) { + myModel.addModelListener(modelListener); + } + + public void removeModelListener(ModelListener modelListener) { + myModel.removeModelListener(modelListener); + } }