package jetbrains.mps.build.mps.pluginSolution.plugin;
/*Generated by MPS */
import jetbrains.mps.workbench.action.BaseAction;
import javax.swing.Icon;
import jetbrains.mps.icons.MPSIcons;
import com.intellij.openapi.actionSystem.AnActionEvent;
import java.util.Map;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.ide.actions.MPSCommonDataKeys;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import java.awt.Frame;
import jetbrains.mps.project.MPSProject;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.ide.ui.filechoosers.treefilechooser.TreeFileChooser;
import com.intellij.openapi.vfs.VirtualFile;
import jetbrains.mps.vfs.IFile;
import jetbrains.mps.ide.vfs.VirtualFileUtils;
import org.jetbrains.mps.openapi.module.ModelAccess;
import java.util.Collection;
import jetbrains.mps.library.ModulesMiner;
import jetbrains.mps.build.mps.util.VisibleModules;
import java.util.List;
import java.util.ArrayList;
import org.jetbrains.mps.openapi.module.SModuleReference;
public class ImportAllModulesFromFolder_Action extends BaseAction {
private static final Icon ICON = MPSIcons.Actions.ImportModulesFromFolder;
public ImportAllModulesFromFolder_Action() {
super("Import All Modules from Folder", "", ICON);
this.setIsAlwaysVisible(false);
this.setExecuteOutsideCommand(true);
}
@Override
public boolean isDumbAware() {
return true;
}
@Override
protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) {
if (!(super.collectActionData(event, _params))) {
return false;
}
{
SNode node = event.getData(MPSCommonDataKeys.NODE);
if (node != null && !(SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x4df58c6f18f84a13L, "jetbrains.mps.build.structure.BuildProject")))) {
node = null;
}
MapSequence.fromMap(_params).put("node", node);
if (node == null) {
return false;
}
}
{
Frame p = event.getData(MPSCommonDataKeys.FRAME);
MapSequence.fromMap(_params).put("frame", p);
if (p == null) {
return false;
}
}
{
MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT);
MapSequence.fromMap(_params).put("project", p);
if (p == null) {
return false;
}
}
return true;
}
@Override
public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) {
TreeFileChooser chooser = new TreeFileChooser();
chooser.setMode(TreeFileChooser.MODE_DIRECTORIES);
// Resort to IDEA Project's file due to:
// (a) don't want to use deprecated MPSProject.getProjectFile()
// (b) don't want to know whether I need to take (grand-)parent of MPSProject's file to access project root
VirtualFile baseDir = ((MPSProject) MapSequence.fromMap(_params).get("project")).getProject().getBaseDir();
IFile projectFolder = (baseDir == null ? null : VirtualFileUtils.toIFile(baseDir));
if (projectFolder != null) {
chooser.setInitialFile(projectFolder);
}
final IFile dir = chooser.showDialog(((Frame) MapSequence.fromMap(_params).get("frame")));
if (dir == null || !(dir.isDirectory())) {
return;
}
ModelAccess modelAccess = ((MPSProject) MapSequence.fromMap(_params).get("project")).getRepository().getModelAccess();
modelAccess.executeCommandInEDT(new Runnable() {
public void run() {
Collection<ModulesMiner.ModuleHandle> modules = new ModulesMiner().collectModules(dir).getCollectedModules();
VisibleModules visible = new VisibleModules(((SNode) MapSequence.fromMap(_params).get("node")));
visible.collect();
List<ImportModuleHelper> helpers = new ArrayList<ImportModuleHelper>();
for (ModulesMiner.ModuleHandle handle : modules) {
SModuleReference modRef = handle.getDescriptor().getModuleReference();
if (visible.resolve(modRef) != null) {
continue;
}
ImportModuleHelper helper = new ImportModuleHelper(((SNode) MapSequence.fromMap(_params).get("node")), handle.getFile(), handle.getDescriptor());
helper.create();
helpers.add(helper);
}
visible = new VisibleModules(((SNode) MapSequence.fromMap(_params).get("node")));
visible.collect();
for (ImportModuleHelper helper : helpers) {
helper.update(visible);
}
}
});
}
}