allow to print arbitrary number of selected files (IDEA-164472)

This commit is contained in:
Dmitry Batrak
2016-12-19 11:04:09 +03:00
parent 0880fab771
commit 376ca21484
4 changed files with 52 additions and 32 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* 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.
@@ -24,25 +24,20 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
public class PrintAction extends AnAction implements DumbAware {
public PrintAction() {
super();
}
@Override
public void actionPerformed(AnActionEvent e) {
DataContext dataContext = e.getDataContext();
Project project = CommonDataKeys.PROJECT.getData(dataContext);
if (project == null) {
return;
}
PrintManager.executePrint(dataContext);
PrintManager.executePrint(e.getDataContext());
}
@Override
public void update(AnActionEvent event){
Presentation presentation = event.getPresentation();
DataContext dataContext = event.getDataContext();
Project project = CommonDataKeys.PROJECT.getData(dataContext);
if (project == null) {
presentation.setEnabled(false);
return;
}
VirtualFile file = CommonDataKeys.VIRTUAL_FILE.getData(dataContext);
if(file != null && file.isDirectory()) {
presentation.setEnabled(true);
@@ -50,7 +45,7 @@ public class PrintAction extends AnAction implements DumbAware {
}
Editor editor = CommonDataKeys.EDITOR.getData(dataContext);
PsiFile psiFile = CommonDataKeys.PSI_FILE.getData(dataContext);
presentation.setEnabled(psiFile != null || editor != null);
presentation.setEnabled(psiFile != null || editor != null || !PrintManager.getSelectedPsiFiles(dataContext).isEmpty());
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* 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.
@@ -31,7 +31,8 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import java.util.HashMap;
import java.util.Map;
class PrintDialog extends DialogWrapper {
private JRadioButton myRbCurrentFile = null;
@@ -74,6 +75,7 @@ class PrintDialog extends DialogWrapper {
private String myFileName = null;
private String myDirectoryName = null;
private final boolean isSelectedTextEnabled;
private final int mySelectedFileCount;
private static final Map<Object, String> PLACEMENT_MAP = new HashMap<>();
private static final Map<Object, String> ALIGNMENT_MAP = new HashMap<>();
@@ -89,13 +91,14 @@ class PrintDialog extends DialogWrapper {
}
public PrintDialog(String fileName, String directoryName, String selectedText, Project project) {
public PrintDialog(String fileName, String directoryName, String selectedText, int selectedFileCount, Project project) {
super(project, true);
mySelectedText = selectedText;
setOKButtonText(CodeEditorBundle.message("print.print.button"));
myFileName = fileName;
myDirectoryName = directoryName;
this.isSelectedTextEnabled = selectedText != null;
isSelectedTextEnabled = selectedText != null;
mySelectedFileCount = selectedFileCount;
setTitle(CodeEditorBundle.message("print.title"));
init();
}
@@ -115,7 +118,9 @@ class PrintDialog extends DialogWrapper {
gbConstraints.fill = GridBagConstraints.BOTH;
gbConstraints.insets = new Insets(0,0,0,0);
myRbCurrentFile = new JRadioButton(CodeEditorBundle.message("print.file.name.radio", (myFileName != null ? myFileName : "")));
myRbCurrentFile = new JRadioButton(mySelectedFileCount > 1 ? CodeEditorBundle.message("print.files.radio", mySelectedFileCount)
: CodeEditorBundle.message("print.file.name.radio",
(myFileName != null ? myFileName : "")));
panel.add(myRbCurrentFile, gbConstraints);
myRbSelectedText = new JRadioButton(mySelectedText != null ? mySelectedText : CodeEditorBundle.message("print.selected.text.radio"));
@@ -504,8 +509,8 @@ class PrintDialog extends DialogWrapper {
myRbSelectedText.setEnabled(isSelectedTextEnabled);
myRbSelectedText.setSelected(isSelectedTextEnabled);
myRbCurrentFile.setEnabled(myFileName != null);
myRbCurrentFile.setSelected(myFileName != null && !isSelectedTextEnabled);
myRbCurrentFile.setEnabled(myFileName != null || mySelectedFileCount > 1);
myRbCurrentFile.setSelected(myFileName != null && !isSelectedTextEnabled || mySelectedFileCount > 1);
myRbCurrentPackage.setEnabled(myDirectoryName != null);
myRbCurrentPackage.setSelected(myDirectoryName != null && !isSelectedTextEnabled && myFileName == null);
@@ -32,10 +32,7 @@ import com.intellij.openapi.progress.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.*;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -44,6 +41,7 @@ import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -86,7 +84,9 @@ class PrintManager {
}
}
PrintDialog printDialog = new PrintDialog(shortFileName, directoryName, text, project);
List<PsiFile> psiFiles = getSelectedPsiFiles(dataContext);
PrintDialog printDialog = new PrintDialog(shortFileName, directoryName, text, psiFiles.size(), project);
printDialog.reset();
if (!printDialog.showAndGet()) {
return;
@@ -97,7 +97,16 @@ class PrintManager {
final BasePainter painter;
PrintSettings printSettings = PrintSettings.getInstance();
if (printSettings.getPrintScope() != PrintSettings.PRINT_DIRECTORY) {
if (printSettings.getPrintScope() == PrintSettings.PRINT_FILE && psiFiles.size() > 1) {
painter = new MultiFilePainter(psiFiles);
}
else if (printSettings.getPrintScope() == PrintSettings.PRINT_DIRECTORY) {
List<PsiFile> filesList = ContainerUtil.newArrayList();
boolean isRecursive = printSettings.isIncludeSubdirectories();
addToPsiFileList(psiDirectory, filesList, isRecursive);
painter = new MultiFilePainter(filesList);
}
else {
if (psiFile == null && editor == null) return;
TextPainter textPainter =
psiFile != null ? initTextPainter(psiFile) : initTextPainter((DocumentEx)editor.getDocument(), project);
@@ -110,12 +119,6 @@ class PrintManager {
}
painter = textPainter;
}
else {
List<PsiFile> filesList = ContainerUtil.newArrayList();
boolean isRecursive = printSettings.isIncludeSubdirectories();
addToPsiFileList(psiDirectory, filesList, isRecursive);
painter = new MultiFilePainter(filesList);
}
final PrinterJob printerJob = PrinterJob.getPrinterJob();
try {
@@ -169,6 +172,22 @@ class PrintManager {
}
}
static List<PsiFile> getSelectedPsiFiles(DataContext dataContext) {
Project project = CommonDataKeys.PROJECT.getData(dataContext);
if (project == null) return Collections.emptyList();
VirtualFile[] virtualFiles = CommonDataKeys.VIRTUAL_FILE_ARRAY.getData(dataContext);
if (virtualFiles == null) return Collections.emptyList();
PsiManager psiManager = PsiManager.getInstance(project);
List<PsiFile> psiFiles = new ArrayList<>(virtualFiles.length);
for (VirtualFile virtualFile : virtualFiles) {
if (virtualFile.isDirectory()) return Collections.emptyList();
PsiFile psiFile = psiManager.findFile(virtualFile);
if (psiFile == null) return Collections.emptyList();
psiFiles.add(psiFile);
}
return psiFiles;
}
private static PageFormat createPageFormat() {
PrintSettings printSettings = PrintSettings.getInstance();
PageFormat pageFormat = new PageFormat();
@@ -17,6 +17,7 @@ print.page.size.unit.mm=mm
print.page.size.unit.in=in
print.print.button=Print
print.title=Print
print.files.radio=Selected files ({0})
print.file.name.radio=File {0}
print.selected.text.radio=Selected text
print.all.files.in.directory.radio=All files in directory {0}