package com.intellij.lang.javascript.uml; import com.intellij.diagram.*; import com.intellij.diagram.actions.DiagramCreateNewNodeElementAction; import com.intellij.lang.javascript.JSBundle; import com.intellij.lang.javascript.JavaScriptSupportLoader; import com.intellij.lang.javascript.psi.ecmal4.XmlBackedJSClassFactory; import com.intellij.lang.javascript.uml.actions.*; import com.intellij.lang.javascript.uml.actions.NewFlexComponentUmlAction; import com.intellij.lang.javascript.psi.JSFile; import com.intellij.lang.javascript.psi.impl.JSPsiImplUtils; import com.intellij.lang.javascript.psi.resolve.JSResolveUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlFile; import com.intellij.diagram.actions.DiagramCreateNewElementAction; import org.intellij.lang.annotations.Pattern; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * @author Kirill Safonov * @author Konstantin Bulenkov */ public class FlashUmlProvider extends DiagramProvider<Object> { public static final String ID = "Flash"; private final FlashUmlVisibilityManager myVisibilityManager = new FlashUmlVisibilityManager(); private final FlashUmlNodeContentManager myNodeContentManager = new FlashUmlNodeContentManager(); private final FlashUmlElementManager myElementManager = new FlashUmlElementManager(this); private final FlashUmlVfsResolver myVfsResolver = new FlashUmlVfsResolver(); private final FlashUmlRelationshipManager myRelationshipManager = new FlashUmlRelationshipManager(); private final FlashUmlColorManager myColorManager = new FlashUmlColorManager(); private final FlashUmlExtras myExtras = new FlashUmlExtras(); @Pattern("[a-zA-Z0-9_-]*") @Override public String getID() { return ID; } public FlashUmlVisibilityManager createVisibilityManager() { return myVisibilityManager; } public FlashUmlNodeContentManager getNodeContentManager() { return myNodeContentManager; } public FlashUmlElementManager getElementManager() { return myElementManager; } public FlashUmlVfsResolver getVfsResolver() { return myVfsResolver; } public FlashUmlRelationshipManager getRelationshipManager() { return myRelationshipManager; } public FlashUmlDataModel createDataModel(@NotNull Project project, @Nullable Object element, @Nullable VirtualFile file, DiagramPresentationModel presentationModel) { if (element instanceof JSFile) { element = JSPsiImplUtils.findQualifiedElement((JSFile)element); } else if (element instanceof XmlFile && JavaScriptSupportLoader.isFlexMxmFile((PsiFile)element)) { element = XmlBackedJSClassFactory.getXmlBackedClass((XmlFile)element); } else if (element instanceof PsiDirectory) { PsiDirectory directory = (PsiDirectory)element; element = JSResolveUtil.getExpectedPackageNameFromFile(directory.getVirtualFile(), directory.getProject()); } return new FlashUmlDataModel(project, element, file, this); } @Override public DiagramScopeManager<Object> createScopeManager(Project project) { return new DiagramPsiScopeManager<>(project); } @Override public DiagramColorManager getColorManager() { return myColorManager; } @NotNull @Override public FlashUmlExtras getExtras() { return myExtras; } public static final DiagramCreateNewElementAction[] ELEMENT_ACTIONS = { new NewActionScriptClassUmlAction(), new NewFlexComponentUmlAction() }; public static final DiagramCreateNewNodeElementAction[] NODE_ACTIONS = { new FlexCreateFieldFromDiagramAction(), new FlexCreateMethodFromDiagramAction(), new FlexCreateConstructorFromDiagramAction() }; @Override public DiagramCreateNewElementAction<Object, ?>[] getCreateNewActions() { //noinspection unchecked return ELEMENT_ACTIONS; } @Override public DiagramCreateNewNodeElementAction<Object, ?>[] getCreateNewNodeElementActions() { //noinspection unchecked return NODE_ACTIONS; } @Override public String getPresentableName() { return JSBundle.message("js.uml.presentable.name"); } @Override public DiagramEdgeCreationPolicy<Object> getEdgeCreationPolicy() { return new FlashUmlEdgeCreationPolicy(); } }