blob: 0a7af0ab1d522de2d1690c40cd5c44c0948ec65c [file] [log] [blame]
package com.intellij.openapi.externalSystem.action;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.externalSystem.ExternalSystemManager;
import com.intellij.openapi.externalSystem.model.ExternalSystemDataKeys;
import com.intellij.openapi.externalSystem.model.ProjectSystemId;
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType;
import com.intellij.openapi.externalSystem.service.internal.ExternalSystemProcessingManager;
import com.intellij.openapi.externalSystem.util.ExternalSystemBundle;
import com.intellij.openapi.externalSystem.util.ExternalSystemUtil;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import java.util.List;
/**
* Forces the ide to retrieve the most up-to-date info about the linked external projects and updates project state if necessary
* (e.g. imports missing libraries).
*
* @author Denis Zhdanov
* @since 1/23/12 3:48 PM
*/
public class RefreshAllExternalProjectsAction extends AnAction implements DumbAware, AnAction.TransparentUpdate {
public RefreshAllExternalProjectsAction() {
getTemplatePresentation().setText(ExternalSystemBundle.message("action.refresh.all.projects.text", "external"));
getTemplatePresentation().setDescription(ExternalSystemBundle.message("action.refresh.all.projects.description", "external"));
}
@Override
public void update(AnActionEvent e) {
final Project project = CommonDataKeys.PROJECT.getData(e.getDataContext());
if (project == null) {
e.getPresentation().setEnabled(false);
return;
}
final List<ProjectSystemId> systemIds = getSystemIds(e);
if (systemIds.isEmpty()) {
e.getPresentation().setEnabled(false);
return;
}
final String name = StringUtil.join(systemIds, new Function<ProjectSystemId, String>() {
@Override
public String fun(ProjectSystemId projectSystemId) {
return projectSystemId.getReadableName();
}
}, ",");
e.getPresentation().setText(ExternalSystemBundle.message("action.refresh.all.projects.text", name));
e.getPresentation().setDescription(ExternalSystemBundle.message("action.refresh.all.projects.description", name));
ExternalSystemProcessingManager processingManager = ServiceManager.getService(ExternalSystemProcessingManager.class);
e.getPresentation().setEnabled(!processingManager.hasTaskOfTypeInProgress(ExternalSystemTaskType.RESOLVE_PROJECT, project));
}
@Override
public void actionPerformed(AnActionEvent e) {
final Project project = CommonDataKeys.PROJECT.getData(e.getDataContext());
if (project == null) {
e.getPresentation().setEnabled(false);
return;
}
final List<ProjectSystemId> systemIds = getSystemIds(e);
if (systemIds.isEmpty()) {
e.getPresentation().setEnabled(false);
return;
}
// We save all documents because there is a possible case that there is an external system config file changed inside the ide.
FileDocumentManager.getInstance().saveAllDocuments();
for (ProjectSystemId externalSystemId : systemIds) {
ExternalSystemUtil.refreshProjects(project, externalSystemId, true);
}
}
private static List<ProjectSystemId> getSystemIds(AnActionEvent e) {
final List<ProjectSystemId> systemIds = ContainerUtil.newArrayList();
final ProjectSystemId externalSystemId = ExternalSystemDataKeys.EXTERNAL_SYSTEM_ID.getData(e.getDataContext());
if (externalSystemId != null) {
systemIds.add(externalSystemId);
}
else {
for (ExternalSystemManager manager : ExternalSystemManager.EP_NAME.getExtensions()) {
systemIds.add(manager.getSystemId());
}
}
return systemIds;
}
}