/*
* Copyright 2003-2011 JetBrains s.r.o.
*
* 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 jetbrains.mps.idea.core.facet;
import com.intellij.facet.Facet;
import com.intellij.facet.FacetConfiguration;
import com.intellij.facet.ui.FacetEditorContext;
import com.intellij.facet.ui.FacetEditorTab;
import com.intellij.facet.ui.FacetValidatorsManager;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.PathUtil;
import jetbrains.mps.idea.core.facet.MPSConfigurationBean.State;
import jetbrains.mps.idea.core.facet.ui.MPSFacetCommonTabUI;
import jetbrains.mps.persistence.DefaultModelRoot;
import jetbrains.mps.project.ModuleId;
import jetbrains.mps.project.structure.modules.ModuleReference;
import jetbrains.mps.smodel.BootstrapLanguages;
import org.jdom.Element;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.module.SModuleReference;
import org.jetbrains.mps.openapi.persistence.ModelRoot;
import javax.swing.JComponent;
import java.util.Collection;
/**
* evgeny, 10/26/11
*/
public class MPSFacetConfiguration implements FacetConfiguration, PersistentStateComponent<State> {
private static final String FILE_SEPARATOR = "/";
@NonNls
private static final String SOURCE_GEN = "src_gen";
private MPSConfigurationBean myConfigurationBean = new MPSConfigurationBean();
private MPSFacet myMpsFacet;
@Override
public void readExternal(Element element) throws InvalidDataException {
// ignore
}
@Override
public void writeExternal(Element element) throws WriteExternalException {
// ignore
}
@NotNull
public MPSConfigurationBean getBean() {
return myConfigurationBean;
}
@Override
public State getState() {
return myConfigurationBean.toState();
}
@Override
public void loadState(State state) {
myConfigurationBean.loadFrom(state);
}
@Override
public FacetEditorTab[] createEditorTabs(FacetEditorContext facetEditorContext, FacetValidatorsManager facetValidatorsManager) {
return new FacetEditorTab[]{new MPSFacetCommonTab(facetEditorContext)};
}
public void setFacet(MPSFacet mpsFacet) {
myMpsFacet = mpsFacet;
setConfigurationDefaults();
}
public SModuleReference createModuleReference(String moduleName) {
return new ModuleReference(moduleName, ModuleId.foreign(moduleName));
}
private void setConfigurationDefaults() {
if (!myConfigurationBean.isModuleIdSet()) {
myConfigurationBean.setIdByModuleName(myMpsFacet.getModule().getName());
}
if (myConfigurationBean.isUseTransientOutputFolder()) {
myConfigurationBean.setUseModuleSourceFolder(false);
} else if (myConfigurationBean.isUseModuleSourceFolder()) {
myConfigurationBean.setUseTransientOutputFolder(false);
}
if (myConfigurationBean.getGeneratorOutputPath() == null) {
String moduleDirPath = PathUtil.getParentPath(myMpsFacet.getModule().getModuleFilePath());
myConfigurationBean.setGeneratorOutputPath(moduleDirPath + FILE_SEPARATOR + SOURCE_GEN);
myConfigurationBean.setUseTransientOutputFolder(false);
myConfigurationBean.setUseModuleSourceFolder(false);
}
if (myConfigurationBean.getUsedLanguages() == null) {
myConfigurationBean.setUsedLanguages(new String[]{BootstrapLanguages.baseLanguageRef().toString()});
}
if (myConfigurationBean.getModelRoots().isEmpty()) {
// Create default model root pointing to source root
DefaultModelRoot mr = new DefaultModelRoot();
final VirtualFile moduleFile = myMpsFacet.getModule().getModuleFile();
if (moduleFile != null) {
mr.setContentRoot(moduleFile.getParent().getPath());
for (VirtualFile sRoot : ModuleRootManager.getInstance(myMpsFacet.getModule()).getSourceRoots()) {
mr.addFile(DefaultModelRoot.SOURCE_ROOTS, sRoot.getPath());
}
Collection<ModelRoot> modelRoots = myConfigurationBean.getModelRoots();
modelRoots.add(mr);
myConfigurationBean.setModelRoots(modelRoots);
}
}
}
public MPSFacet getFacet() {
return myMpsFacet;
}
public class MPSFacetCommonTab extends FacetEditorTab implements Disposable {
private MPSFacetCommonTabUI myForm;
private FacetEditorContext myContext;
public MPSFacetCommonTab(FacetEditorContext context) {
myContext = context;
}
@Override
@Nls
public String getDisplayName() {
return "Common";
}
@NotNull
@Override
public JComponent createComponent() {
if (myForm == null) {
myForm = new MPSFacetCommonTabUI(myContext, this);
}
return myForm.getRootPanel();
}
@Override
public boolean isModified() {
return myForm != null && myForm.isModified(myConfigurationBean);
}
@Override
public void apply() throws ConfigurationException {
if (myForm != null) {
myForm.apply(myConfigurationBean);
}
}
@Override
public void reset() {
if (myForm != null) {
myForm.reset(myConfigurationBean);
}
}
@Override
public void disposeUIResources() {
Disposer.dispose(this);
myForm = null;
}
@Override
public void onFacetInitialized(@NotNull Facet facet) {
super.onFacetInitialized(facet);
MPSFacet mpsFacet = (MPSFacet) facet;
mpsFacet.setConfiguration(myConfigurationBean);
}
@Override
public void onTabEntering() {
myForm.onTabEntering();
}
@Override
public void dispose() {
}
}
}