blob: cd3092fdb35f36d53d5197555862c5927288d330 [file] [log] [blame]
/**
* @author cdr
*/
package com.intellij.packaging.impl.ui.actions;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.compiler.CompilerBundle;
import com.intellij.openapi.compiler.CompilerManager;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.Clock;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.StatusBar;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactManager;
import com.intellij.packaging.impl.artifacts.ArtifactBySourceFileFinder;
import com.intellij.util.text.SyncDateFormat;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class PackageFileAction extends AnAction {
private static final SyncDateFormat TIME_FORMAT = new SyncDateFormat(new SimpleDateFormat("h:mm:ss a"));
public PackageFileAction() {
super(CompilerBundle.message("action.name.package.file"), CompilerBundle.message("action.description.package.file"), null);
}
@Override
public void update(AnActionEvent e) {
boolean visible = false;
final Project project = e.getData(CommonDataKeys.PROJECT);
if (project != null) {
final List<VirtualFile> files = getFilesToPackage(e, project);
if (!files.isEmpty()) {
visible = true;
e.getPresentation().setText(files.size() == 1 ? CompilerBundle.message("action.name.package.file") : CompilerBundle.message("action.name.package.files"));
}
}
e.getPresentation().setVisible(visible);
}
@NotNull
private static List<VirtualFile> getFilesToPackage(@NotNull AnActionEvent e, @NotNull Project project) {
final VirtualFile[] files = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY);
if (files == null) return Collections.emptyList();
List<VirtualFile> result = new ArrayList<VirtualFile>();
ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
final CompilerManager compilerManager = CompilerManager.getInstance(project);
for (VirtualFile file : files) {
if (file == null || file.isDirectory() ||
fileIndex.isUnderSourceRootOfType(file, JavaModuleSourceRootTypes.SOURCES) && compilerManager.isCompilableFileType(file.getFileType())) {
return Collections.emptyList();
}
final Collection<? extends Artifact> artifacts = ArtifactBySourceFileFinder.getInstance(project).findArtifacts(file);
for (Artifact artifact : artifacts) {
if (!StringUtil.isEmpty(artifact.getOutputPath())) {
result.add(file);
break;
}
}
}
return result;
}
@Override
public void actionPerformed(AnActionEvent event) {
final Project project = event.getData(CommonDataKeys.PROJECT);
if (project == null) return;
FileDocumentManager.getInstance().saveAllDocuments();
final List<VirtualFile> files = getFilesToPackage(event, project);
Artifact[] allArtifacts = ArtifactManager.getInstance(project).getArtifacts();
PackageFileWorker.startPackagingFiles(project, files, allArtifacts, new Runnable() {
public void run() {
setStatusText(project, files);
}
});
}
private static void setStatusText(Project project, List<VirtualFile> files) {
if (!files.isEmpty()) {
StringBuilder fileNames = new StringBuilder();
for (VirtualFile file : files) {
if (fileNames.length() != 0) fileNames.append(", ");
fileNames.append("'").append(file.getName()).append("'");
}
String time = TIME_FORMAT.format(Clock.getTime());
final String statusText = CompilerBundle.message("status.text.file.has.been.packaged", files.size(), fileNames, time);
final StatusBar statusBar = WindowManager.getInstance().getStatusBar(project);
if (statusBar != null) {
statusBar.setInfo(statusText);
}
}
}
}