/*
* Copyright 2013-2017 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.csharp.ide.newProjectOrModule;
import java.util.HashMap;
import java.util.Map;
import org.jetbrains.annotations.NotNull;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.vfs.VirtualFile;
import consulo.csharp.module.extension.CSharpMutableModuleExtension;
import consulo.dotnet.DotNetTarget;
import consulo.dotnet.module.extension.DotNetMutableModuleExtension;
import consulo.dotnet.roots.orderEntry.DotNetLibraryOrderEntryImpl;
import consulo.ide.impl.UnzipNewModuleBuilderProcessor;
import consulo.ide.newProject.NewModuleBuilder;
import consulo.ide.newProject.NewModuleBuilderProcessor;
import consulo.ide.newProject.NewModuleContext;
import consulo.roots.ModifiableModuleRootLayer;
import consulo.roots.impl.ModuleRootLayerImpl;
/**
* @author VISTALL
* @since 05.06.14
*/
public class CSharpNewModuleBuilder implements NewModuleBuilder
{
private static final String DEBUG = "Debug";
private static final String RELEASE = "Release";
private static final String DEFAULT = "Default";
public static final Map<String, String[]> ourExtensionMapping = new HashMap<String, String[]>()
{
{
put("MONO_DOTNET_SDK", new String[]{
"mono-dotnet",
"mono-csharp"
});
put("MICROSOFT_DOTNET_SDK", new String[]{
"microsoft-dotnet",
"microsoft-csharp"
});
}
};
@Override
public void setupContext(@NotNull NewModuleContext context)
{
NewModuleContext.Group group = context.createGroup("csharp", "C#");
group.add("Empty", AllIcons.FileTypes.Any_type, new NewModuleBuilderProcessor<CSharpSdkPanel>()
{
@NotNull
@Override
public CSharpSdkPanel createConfigurationPanel()
{
return new CSharpSdkPanel();
}
@Override
public void setupModule(@NotNull CSharpSdkPanel panel, @NotNull ContentEntry contentEntry, @NotNull ModifiableRootModel modifiableRootModel)
{
defaultSetup(panel, modifiableRootModel);
}
});
group.add("Console Application", AllIcons.RunConfigurations.Application, new UnzipNewModuleBuilderProcessor<CSharpSdkPanel>("/moduleTemplates/#CSharpConsoleApplication.zip")
{
@NotNull
@Override
public CSharpSdkPanel createConfigurationPanel()
{
return new CSharpSdkPanel().disableTargetComboBox(DotNetTarget.EXECUTABLE);
}
@Override
public void setupModule(@NotNull CSharpSdkPanel panel, @NotNull final ContentEntry contentEntry, @NotNull final ModifiableRootModel modifiableRootModel)
{
unzip(modifiableRootModel);
defaultSetup(panel, modifiableRootModel);
DumbService.getInstance(modifiableRootModel.getProject()).smartInvokeLater(new Runnable()
{
@Override
public void run()
{
VirtualFile dir = contentEntry.getFile();
if(dir != null)
{
VirtualFile mainFile = dir.findFileByRelativePath("Program.cs");
if(mainFile != null)
{
FileEditorManagerEx.getInstanceEx(modifiableRootModel.getProject()).openFile(mainFile, false);
}
}
}
});
}
});
}
private static void defaultSetup(@NotNull CSharpSdkPanel panel, @NotNull ModifiableRootModel modifiableRootModel)
{
Sdk sdk = panel.getSdk();
if(sdk == null)
{
return;
}
String[] pair = ourExtensionMapping.get(sdk.getSdkType().getName());
for(String layerName : new String[]{
RELEASE,
DEBUG
})
{
ModifiableModuleRootLayer layer = modifiableRootModel.addLayer(layerName, DEFAULT, false);
// first we need enable .NET module extension
DotNetMutableModuleExtension<?> dotNetMutableModuleExtension = layer.getExtensionWithoutCheck(pair[0]);
assert dotNetMutableModuleExtension != null;
dotNetMutableModuleExtension.setEnabled(true);
boolean debug = layerName.equals(DEBUG);
if(debug)
{
dotNetMutableModuleExtension.setAllowDebugInfo(true);
dotNetMutableModuleExtension.getVariables().add("DEBUG");
}
dotNetMutableModuleExtension.getInheritableSdk().set(null, sdk);
dotNetMutableModuleExtension.setTarget(panel.getTarget());
dotNetMutableModuleExtension.getVariables().add("TRACE");
CSharpMutableModuleExtension<?> cSharpMutableModuleExtension = layer.getExtensionWithoutCheck(pair[1]);
assert cSharpMutableModuleExtension != null;
cSharpMutableModuleExtension.setEnabled(true);
if(!debug)
{
cSharpMutableModuleExtension.setOptimizeCode(true);
}
layer.addOrderEntry(new DotNetLibraryOrderEntryImpl((ModuleRootLayerImpl) layer, "mscorlib"));
layer.addOrderEntry(new DotNetLibraryOrderEntryImpl((ModuleRootLayerImpl) layer, "System"));
}
modifiableRootModel.setCurrentLayer(DEBUG);
modifiableRootModel.removeLayer(DEFAULT, false);
}
}