package org.jetbrains.plugins.ruby.motion;
import com.intellij.facet.ui.ValidationResult;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.platform.DirectoryProjectGenerator;
import com.intellij.platform.HideableProjectGenerator;
import icons.RubyIcons;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.ruby.RBundle;
import org.jetbrains.plugins.ruby.motion.ui.RubyMotionGeneratorTabBase;
import org.jetbrains.plugins.ruby.motion.ui.RubyMotionSettingsHolder;
import org.jetbrains.plugins.ruby.ruby.RModuleUtil;
import org.jetbrains.plugins.ruby.wizard.RubyFrameworkProjectGenerator;
import javax.swing.*;
/**
* @author Dennis.Ushakov
*/
public class RubyMotionGenerator extends RubyFrameworkProjectGenerator<RubyMotionSettingsHolder>
implements DirectoryProjectGenerator<RubyMotionSettingsHolder>, HideableProjectGenerator {
private static final String TITLE = RBundle.message("ruby.motion.application.settings");
private RubyMotionSettingsHolder mySettings;
private RubyMotionGeneratorTabBase myGeneratorTab;
@NotNull
@Nls
@Override
public String getName() {
return RBundle.message("ruby.motion.wizard.tab.project.generator.title");
}
@Nullable
@Override
public Icon getLogo() {
return RubyIcons.RubyMotion.RubyMotion;
}
@Override
public void generateProjectInner(
@NotNull final Project project,
@NotNull final VirtualFile baseDir,
@NotNull final RubyMotionSettingsHolder settings,
@NotNull final Module module) {
final RubyMotionUtilImpl.ProjectType projectType = settings.getProjectType();
module.putUserData(RubyMotionUtilImpl.PROJECT_TYPE, projectType);
RubyMotionFacetConfigurator.configure(baseDir, module);
StartupManager.getInstance(project).runWhenProjectIsInitialized(() -> {
((RubyMotionUtilImpl)RubyMotionUtil.getInstance())
.generateApp(baseDir, module, ModuleRootManager.getInstance(module).getSdk(), projectType);
RModuleUtil.getInstance().refreshRubyModuleTypeContent(module);
});
}
@NotNull
@Override
public ValidationResult doValidate(@NotNull String baseDirPath) {
return RubyMotionUtil.getInstance().rubyMotionPresent() ? ValidationResult.OK : new ValidationResult("RubyMotion is not installed");
}
@Override
public boolean isHidden() {
return !SystemInfo.isMac;
}
@NotNull
@Override
public RubyMotionSettingsHolder createSettings() {
return new RubyMotionSettingsHolder();
}
@NotNull
@Override
public JPanel getSettingsPanel(@NotNull RubyMotionSettingsHolder settings, @NotNull Disposable parentDisposable) {
if (myGeneratorTab == null) {
myGeneratorTab = new RubyMotionGeneratorTabBase(settings);
Disposer.register(parentDisposable, () -> myGeneratorTab = null);
}
mySettings = settings;
final JComponent generatorTabComponent = myGeneratorTab.createComponent();
return (JPanel)generatorTabComponent;
}
@NotNull
@Override
public String getParentGroupName() {
return "Mobile";
}
}