/* * Copyright 2000-2016 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 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<>(); 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, () -> 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); } } } }