diff --git a/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintAction.java b/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintAction.java index 6e32fb0b98f1..c181f59a9cd6 100644 --- a/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintAction.java +++ b/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintAction.java @@ -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()); } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintDialog.java b/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintDialog.java index 47dc9246a0c2..79d05866df61 100644 --- a/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintDialog.java +++ b/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintDialog.java @@ -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 PLACEMENT_MAP = new HashMap<>(); private static final Map 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); diff --git a/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintManager.java b/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintManager.java index 670270666b07..84d41922548f 100644 --- a/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintManager.java +++ b/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintManager.java @@ -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 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 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 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 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 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(); diff --git a/platform/platform-resources-en/src/messages/CodeEditorBundle.properties b/platform/platform-resources-en/src/messages/CodeEditorBundle.properties index bf6fa5ebef76..1146885224df 100644 --- a/platform/platform-resources-en/src/messages/CodeEditorBundle.properties +++ b/platform/platform-resources-en/src/messages/CodeEditorBundle.properties @@ -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}