package org.angularjs.codeInsight.router;
import com.intellij.diagram.DiagramDataModel;
import com.intellij.diagram.DiagramNode;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* @author Irina.Chernushina on 3/23/2016.
*/
public class AngularUiRouterDiagramModel extends DiagramDataModel<DiagramObject> {
private final VirtualFile myRootFile;
@NotNull private final List<AngularUiRouterNode> myNodes;
@NotNull private final List<AngularUiRouterEdge> myEdges;
public AngularUiRouterDiagramModel(@NotNull final Project project,
VirtualFile rootFile, @NotNull final AngularUiRouterDiagramProvider provider,
@NotNull final List<AngularUiRouterNode> nodes,
@NotNull final List<AngularUiRouterEdge> edges) {
super(project, provider);
myRootFile = rootFile;
myNodes = new ArrayList<>(nodes);
myEdges = edges;
}
@NotNull
@Override
public Collection<AngularUiRouterNode> getNodes() {
return myNodes;
}
@NotNull
@Override
public Collection<AngularUiRouterEdge> getEdges() {
return myEdges;
}
@NotNull
@Override
public String getNodeName(DiagramNode<DiagramObject> n) {
return n.getTooltip();
}
@Nullable
@Override
public DiagramNode<DiagramObject> addElement(DiagramObject element) {
return null;
}
@Override
public void refreshDataModel() {
final AngularUiRouterDiagramBuilder builder = new AngularUiRouterDiagramBuilder(getProject());
builder.build();
final Map<VirtualFile, RootTemplate> rootTemplates = builder.getRootTemplates();
final RootTemplate template = rootTemplates.get(myRootFile);
if (template != null) {
Map<String, UiRouterState> map = builder.getDefiningFiles2States().get(myRootFile);
final AngularUiRouterGraphBuilder graphBuilder;
if (map == null) {
map = builder.getRootTemplates2States().get(myRootFile);
if (map == null) return;
graphBuilder = new AngularUiRouterGraphBuilder(getProject(), map, builder.getTemplatesMap(),
rootTemplates.get(myRootFile), myRootFile);
} else {
graphBuilder = new AngularUiRouterGraphBuilder(getProject(), map, builder.getTemplatesMap(), null, myRootFile);
}
final AngularUiRouterDiagramProvider diagramProvider = (AngularUiRouterDiagramProvider)getProvider();
final AngularUiRouterGraphBuilder.GraphNodesBuilder model = graphBuilder.createDataModel(diagramProvider);
if (myNodes.equals(model.getAllNodes()) && myEdges.equals(model.getEdges())) return;
myNodes.clear();
myEdges.clear();
final AngularUiRouterProviderContext context = AngularUiRouterProviderContext.getInstance(getProject());
context.reset();
context.registerNodesBuilder(model);
myNodes.addAll(model.getAllNodes());
myEdges.addAll(model.getEdges());
ApplicationManager.getApplication().invokeLater(() -> getBuilder().update(true, true));
}
}
@NotNull
@Override
public ModificationTracker getModificationTracker() {
return PsiManager.getInstance(getProject()).getModificationTracker();
}
@Override
public void dispose() {
}
}