package com.cfsoft.ofbiz.gotosymbol; import com.cfsoft.ofbiz.dom.controller.api.Controller; import com.cfsoft.ofbiz.dom.controller.api.RequestMap; import com.cfsoft.ofbiz.dom.controller.api.Response; import com.cfsoft.ofbiz.dom.controller.api.ViewMap; import com.cfsoft.ofbiz.dom.controller.model.ControllerManager; import com.intellij.codeInsight.navigation.DomGotoRelatedItem; import com.intellij.navigation.GotoRelatedItem; import com.intellij.navigation.GotoRelatedProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.*; import com.intellij.util.Processor; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomManager; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; public class GoToRelateResponseProvider extends GotoRelatedProvider { @NotNull @Override public List<? extends GotoRelatedItem> getItems(@NotNull final PsiElement psiElement) { if (!(psiElement instanceof XmlToken)) { return Collections.emptyList(); } XmlElement ele = (XmlElement) psiElement.getContext(); while (!(ele instanceof XmlTag)) { ele = (XmlElement) ele.getParent(); } DomElement domEle = DomManager.getDomManager(ele.getProject()).getDomElement((XmlTag) ele); if (!(domEle instanceof ViewMap)) { return Collections.emptyList(); } final ViewMap viewMap = (ViewMap) domEle; final PsiFile containingFile = psiElement.getContainingFile().getOriginalFile(); final ControllerManager controllerManager = ControllerManager.getInstance(psiElement.getProject()); final Controller controller = controllerManager.getController((XmlFile) containingFile); if (controller == null) { return Collections.emptyList(); } Set<Controller> sets = controller.getAllIncludeBy(); final List<GotoRelatedItem> items = new ArrayList<GotoRelatedItem>(); sets.add(controller); List<Response> responses = new ArrayList<Response>(); String viewName = (viewMap.getName().getStringValue()); for (Controller c : sets) { for (RequestMap requestMap : c.getRequestMaps()) { for (Response response : requestMap.getResponse()) { if (response.getViewName().getValue() != null && response.getViewName().getStringValue().equals(viewName)) { responses.add(response); } } } } for (Response response : responses) { items.add(new DomGotoRelatedItem(response.getParent())); } return items; } public boolean processResponses(Controller controller, Processor<Response> processor) { for (final RequestMap view : controller.getRequestMaps()) { for (Response response : view.getResponse()) { processor.process(response); } } return true; } }