package com.cfsoft.ofbiz.reference; import com.cfsoft.ofbiz.OfbizUtils; import com.cfsoft.ofbiz.dom.component.ComponentManager; import com.cfsoft.ofbiz.dom.component.ComponentUrl; import com.cfsoft.ofbiz.dom.component.api.Component; import com.cfsoft.ofbiz.dom.controller.api.ViewMap; import com.cfsoft.ofbiz.dom.screen.api.Screen; import com.cfsoft.ofbiz.dom.screen.api.Screens; import com.cfsoft.ofbiz.facet.OfbizFacet; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.openapi.util.Condition; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomUtil; import com.intellij.util.xml.ui.DomEditorManager; import org.jetbrains.annotations.NotNull; import java.util.List; /** * Class ComponentUrlReference ... * * @author Administrator * Created on 10/7/11 */ public class ComponentUrlReference<T extends DomElement> extends PsiReferenceBase<XmlAttribute> { private Class<T> clazz = null; public ComponentUrlReference(@NotNull final XmlAttribute xmlAttribute, Class<T> clazz) { super(xmlAttribute, false); this.clazz = clazz; } public ComponentUrlReference(@NotNull final XmlAttribute xmlAttribute) { super(xmlAttribute, false); } @SuppressWarnings({"unchecked"}) public PsiElement resolve() { if (OfbizFacet.getInstance(myElement) == null) { return myElement; } final ComponentUrl componentUrl = new ComponentUrl(myElement.getValue()); PsiFile psiFile = OfbizUtils.findPsiFileByComponentUrl(myElement, componentUrl); if (psiFile != null) { return psiFile; } return null; } @NotNull @SuppressWarnings({"unchecked"}) public Object[] getVariants() { if (OfbizFacet.getInstance(myElement) == null) { return new Object[0]; } String location = OfbizUtils.removeIdeaPostFix(myElement.getValue()); if (location != null) { final ComponentUrl url = new ComponentUrl(location); final ComponentManager manager = ComponentManager.getInstance(myElement.getProject()); final Component[] components = manager.getAllComponents(); if (url.getComponentName() != null) { final Component component = manager.getComponent(url.getComponentName(), components); if (component != null) { PsiDirectory psiDir = OfbizUtils.findPsiDirectoryByComponentUrl(myElement, url); if (psiDir != null) { if (clazz == null) { Object[] lookups = ContainerUtil.map2Array(psiDir.getChildren(), new Function<PsiElement, Object>() { @Override public Object fun(PsiElement psiElement) { PsiFileSystemItem item = (PsiFileSystemItem) psiElement; String componentPath = manager.getComponentUrl(item.getVirtualFile().getPath(), component); if (item.isDirectory()) { componentPath += "/"; } return LookupElementBuilder.create(componentPath).setTypeText(component.getName().getValue()); } }); return lookups; } else { List<T> list = OfbizUtils.getDomFileElements(clazz, myElement.getProject(), GlobalSearchScope.allScope(myElement.getProject())); // GlobalSearchScope.fileScope(myElement.getProject(), psiDir.getVirtualFile())); Object[] lookups = ContainerUtil.map2Array(list, new Function<T, Object>() { @Override public Object fun(T psiElement) { String componentPath = manager.getComponentUrl(psiElement.getXmlElement().getContainingFile().getVirtualFile().getPath(), component); return LookupElementBuilder.create(componentPath).setTypeText(component.getName().getValue()); } }); return lookups; } } } } else { return ContainerUtil.map(components, new Function<Component, Object>() { @Override public Object fun(Component component) { String lookup = String.format("component://" + component.getName().getValue() + "/"); return LookupElementBuilder.create(lookup).setPresentableText(component.getName().getValue()); } }).toArray(); } } return new Object[0]; } }