package com.intellij.flex.uiDesigner; import com.intellij.ide.SelectInContext; import com.intellij.ide.SelectInTarget; import com.intellij.internal.statistic.UsageTrigger; import com.intellij.javascript.flex.mxml.schema.ClassBackedElementDescriptor; import com.intellij.psi.PsiElement; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import org.jetbrains.annotations.Nullable; public class SelectInDesigner implements SelectInTarget { @Override public boolean canSelect(SelectInContext context) { PsiElement element = getPsiElement(context); return element != null && DesignerApplicationManager.isApplicable(context.getProject(), element.getContainingFile()); } @Nullable private static PsiElement getPsiElement(SelectInContext context) { Object selectorInFile = context.getSelectorInFile(); if (selectorInFile instanceof PsiElement) { PsiElement element = (PsiElement)selectorInFile; return element.getContainingFile() instanceof XmlFile ? element : null; } return null; } @Override public void selectIn(SelectInContext context, boolean requestFocus) { UsageTrigger.trigger("FlashUIDesigner.selectIn"); final PsiElement element = getPsiElement(context); if (element == null) { return; } DesignerApplicationManager.getInstance().renderIfNeed((XmlFile)element.getContainingFile(), info -> { int componentId = 0; if (!(element instanceof XmlFile)) { PsiElement effectiveElement = element; do { if (effectiveElement instanceof XmlTag && ((XmlTag)effectiveElement).getDescriptor() instanceof ClassBackedElementDescriptor) { componentId = info.rangeMarkerIndexOf(effectiveElement); if (componentId != -1) { break; } } effectiveElement = effectiveElement.getContext(); } while (effectiveElement != null); if (componentId == -1) { componentId = 0; // select root LogMessageUtil.LOG.warn("Can't find target component"); } } Client.getInstance().selectComponent(info.getId(), componentId); }); } @Override public String toString() { return FlashUIDesignerBundle.message("select.in.designer"); } }