Search code examples
javaintellij-ideaintellij-plugin

How to make TreeStructureProvider updatable on actionPerformed method?


I have a code, provided by example. I want PsiFileNode to change its color on click on my implemented action.

 <extensions defaultExtensionNs="com.intellij">
        <treeStructureProvider implementation="ru.softmg.highlighter.CustomTreeStructureProvider" />
      </extensions>

This is TreeStructureProvider

package ru.softmg.highlighter;

import com.intellij.ide.projectView.TreeStructureProvider;
import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.projectView.impl.nodes.PsiFileNode;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.Collection;

public class CustomTreeStructureProvider implements TreeStructureProvider {
    @NotNull
    @Override
    public Collection<AbstractTreeNode> modify(@NotNull AbstractTreeNode parent, @NotNull Collection<AbstractTreeNode> children, ViewSettings settings) {
        Project project = ProjectManager.getInstance().getOpenProjects()[0];
        ArrayList<AbstractTreeNode> nodes = new ArrayList<>();
        for(AbstractTreeNode child : children) {
            if(child instanceof PsiFileNode) {
                PsiFileNode psiFileNode = (PsiFileNode) child;
                CustomPsiFileNode customPsiFileNode = new CustomPsiFileNode(project, psiFileNode.getValue(), psiFileNode.getSettings());
                nodes.add(customPsiFileNode);
            }
            else {
                nodes.add(child);
            }
        }
        return nodes;
    }
}

And this is my action

public class ProjectHighlighter extends AnAction {
    @Override
    public void actionPerformed(AnActionEvent anActionEvent) {

    }
}

What should I do for TreeStructureProvider updating on calling actionPerformed method?


Solution

  • Try this:

    AbstractProjectViewPane currentProjectViewPane = ProjectView.getInstance(project).getCurrentProjectViewPane();
    if (currentProjectViewPane != null) {
      for (PsiFileSystemItem item : myFileGroup) {
        currentProjectViewPane.updateFrom(item, false, true);
      }
    }