/* * Copyright 2013-2016 consulo.io * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package consulo.unity3d.module; import java.io.File; import java.util.List; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkType; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.Version; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; import com.intellij.util.SmartList; import consulo.annotations.RequiredReadAction; import consulo.dotnet.module.DotNetNamespaceGeneratePolicy; import consulo.dotnet.module.extension.BaseDotNetSimpleModuleExtension; import consulo.roots.ModuleRootLayer; import consulo.unity3d.bundle.Unity3dBundleType; import consulo.unity3d.projectImport.Unity3dProjectUtil; /** * @author VISTALL * @since 28.09.14 */ public class Unity3dRootModuleExtension extends BaseDotNetSimpleModuleExtension<Unity3dRootModuleExtension> { public static final String FILE_NAME = "$ModuleName$"; protected String myNamespacePrefix = null; public Unity3dRootModuleExtension(@NotNull String id, @NotNull ModuleRootLayer rootModel) { super(id, rootModel); } @NotNull @Override public DotNetNamespaceGeneratePolicy getNamespaceGeneratePolicy() { return UnityNamespaceGeneratePolicy.createOrGet(this); } @Override public void commit(@NotNull Unity3dRootModuleExtension mutableModuleExtension) { super.commit(mutableModuleExtension); myNamespacePrefix = mutableModuleExtension.myNamespacePrefix; } @Override protected void getStateImpl(@NotNull Element element) { super.getStateImpl(element); if(myNamespacePrefix != null) { element.setAttribute("namespace-prefix", myNamespacePrefix); } } @RequiredReadAction @Override protected void loadStateImpl(@NotNull Element element) { super.loadStateImpl(element); myNamespacePrefix = element.getAttributeValue("namespace-prefix"); } @Nullable public String getNamespacePrefix() { return myNamespacePrefix; } @Override public boolean isSupportCompilation() { return false; } @NotNull @Override public File[] getFilesForLibraries() { Sdk sdk = getSdk(); if(sdk == null) { return EMPTY_FILE_ARRAY; } String homePath = sdk.getHomePath(); if(homePath == null) { return EMPTY_FILE_ARRAY; } List<String> pathsForLibraries = getPathsForLibraries(homePath, sdk); File[] array = EMPTY_FILE_ARRAY; for(String pathsForLibrary : pathsForLibraries) { File dir = new File(pathsForLibrary); if(dir.exists()) { File[] files = dir.listFiles(); if(files != null) { array = ArrayUtil.mergeArrays(array, files); } } } return array; } @NotNull private List<String> getPathsForLibraries(String homePath, @NotNull Sdk sdk) { Version version = Unity3dProjectUtil.parseVersion(sdk.getVersionString()); List<String> list = new SmartList<String>(); if(SystemInfo.isMac) { list.add(homePath + "/Contents/Frameworks/Managed"); list.add(homePath + "/Contents/Frameworks/Mono/lib/mono/2.0"); // actual at unity5.4 beta list.add(homePath + "/Contents/Managed"); list.add(homePath + "/Contents/Mono/lib/mono/2.0"); // dead path? addUnityExtensions(list, version, homePath + "/Contents/Frameworks/UnityExtensions/Unity"); // actual mac path addUnityExtensions(list, version, homePath + "/Contents/UnityExtensions/Unity"); } else if(SystemInfo.isWindows || SystemInfo.isLinux) { list.add(homePath + "/Editor/Data/Managed"); list.add(homePath + "/Editor/Data/Mono/lib/mono/2.0"); addUnityExtensions(list, version, homePath + "/Editor/Data/UnityExtensions/Unity"); } return list; } private static void addUnityExtensions(List<String> list, @NotNull Version version, String baseDir) { VirtualFile dir = LocalFileSystem.getInstance().findFileByPath(baseDir); if(dir == null) { return; } for(VirtualFile virtualFile : dir.getChildren()) { if(virtualFile.isDirectory()) { addUnityExtension(list, virtualFile, version); } } } private static void addUnityExtension(List<String> list, @NotNull VirtualFile dir, @NotNull Version version) { // UnityUI 4.6.X specific // {EXTENSION_NAME}/{VERSION}/{LIBRARY} // UnityUI 5.0 specific // {EXTENSION_NAME}/{LIBRARY} if(version.isOrGreaterThan(5, 0, 0)) { list.add(dir.getPath()); VirtualFile editorDir = dir.findChild("Editor"); if(editorDir != null) { list.add(editorDir.getPath()); } editorDir = dir.findChild("Runtime"); if(editorDir != null) { list.add(editorDir.getPath()); } } else { for(VirtualFile child : dir.getChildren()) { if(child.isDirectory()) { list.add(child.getPath()); VirtualFile editorDir = child.findChild("Editor"); if(editorDir != null) { list.add(editorDir.getPath()); } } } } } @NotNull @Override public Class<? extends SdkType> getSdkTypeClass() { return Unity3dBundleType.class; } }