From 5cbcf18d96762a8409fbedc20f5476bdbfbd70ec Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Fri, 16 Dec 2016 18:40:29 +0300 Subject: [PATCH] convenience option for duplex printing of multiple files (IDEA-164472) --- .../codeEditor/printing/MultiFilePainter.java | 11 ++++++++- .../codeEditor/printing/PrintDialog.java | 23 ++++++++++++------- .../codeEditor/printing/PrintManager.java | 4 ++-- .../codeEditor/printing/PrintSettings.java | 2 ++ .../src/messages/CodeEditorBundle.properties | 1 + 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeEditor/printing/MultiFilePainter.java b/platform/lang-impl/src/com/intellij/codeEditor/printing/MultiFilePainter.java index d40f50231e34..e423a28ca22b 100644 --- a/platform/lang-impl/src/com/intellij/codeEditor/printing/MultiFilePainter.java +++ b/platform/lang-impl/src/com/intellij/codeEditor/printing/MultiFilePainter.java @@ -26,12 +26,15 @@ import java.util.List; class MultiFilePainter extends BasePainter { private final List myFilesList; + private final boolean myEvenNumberOfPagesPerFile; private int myFileIndex = 0; private int myStartPageIndex = 0; private TextPainter myTextPainter = null; + private int myLargestPrintedPage = -1; - public MultiFilePainter(List filesList) { + public MultiFilePainter(List filesList, boolean evenNumberOfPagesPerFile) { myFilesList = filesList; + myEvenNumberOfPagesPerFile = evenNumberOfPagesPerFile; } @Override @@ -57,13 +60,19 @@ class MultiFilePainter extends BasePainter { return Printable.NO_SUCH_PAGE; } if (ret == Printable.PAGE_EXISTS) { + myLargestPrintedPage = pageIndex; return Printable.PAGE_EXISTS; } + if (myEvenNumberOfPagesPerFile && pageIndex == (myLargestPrintedPage + 1) && (pageIndex % 2) == 1 && + myFileIndex < (myFilesList.size() - 1)) { + return PAGE_EXISTS; + } myTextPainter.dispose(); myTextPainter = null; myStartPageIndex = pageIndex; } myFileIndex++; + myLargestPrintedPage = -1; } return Printable.NO_SUCH_PAGE; } 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 79d05866df61..0d994b1221bd 100644 --- a/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintDialog.java +++ b/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintDialog.java @@ -63,6 +63,7 @@ class PrintDialog extends DialogWrapper { private JTextField myRightMarginField = null; private JCheckBox myCbDrawBorder = null; + private JCheckBox myCbEvenNumberOfPages = null; private JTextField myLineTextField1 = null; private JComboBox myLinePlacementCombo1 = null; @@ -144,12 +145,7 @@ class PrintDialog extends DialogWrapper { buttonGroup.add(myRbSelectedText); buttonGroup.add(myRbCurrentPackage); - ActionListener actionListener = new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - myCbIncludeSubpackages.setEnabled(myRbCurrentPackage.isSelected()); - } - }; + ActionListener actionListener = e -> updateDependentComponents(); myRbCurrentFile.addActionListener(actionListener); myRbSelectedText.addActionListener(actionListener); @@ -158,6 +154,11 @@ class PrintDialog extends DialogWrapper { return panel; } + private void updateDependentComponents() { + myCbIncludeSubpackages.setEnabled(myRbCurrentPackage.isSelected()); + myCbEvenNumberOfPages.setVisible(myRbCurrentFile.isSelected() && mySelectedFileCount > 1 || myRbCurrentPackage.isSelected()); + } + @Override protected JComponent createCenterPanel() { TabbedPaneWrapper tabbedPaneWrapper = new TabbedPaneWrapper(myDisposable); @@ -211,6 +212,10 @@ class PrintDialog extends DialogWrapper { gbConstraints.gridy++; panel.add(myCbDrawBorder, gbConstraints); + myCbEvenNumberOfPages = new JCheckBox(CodeEditorBundle.message("print.settings.even.number.of.pages")); + gbConstraints.gridy++; + panel.add(myCbEvenNumberOfPages, gbConstraints); + gbConstraints.insets = new Insets(0, 0, 6, 4); gbConstraints.gridx = 0; gbConstraints.gridwidth = 3; @@ -515,7 +520,8 @@ class PrintDialog extends DialogWrapper { myRbCurrentPackage.setSelected(myDirectoryName != null && !isSelectedTextEnabled && myFileName == null); myCbIncludeSubpackages.setSelected(printSettings.isIncludeSubdirectories()); - myCbIncludeSubpackages.setEnabled(myRbCurrentPackage.isSelected()); + + updateDependentComponents(); Object selectedPageSize = PageSizes.getItem(printSettings.PAPER_SIZE); if(selectedPageSize != null) { @@ -549,7 +555,7 @@ class PrintDialog extends DialogWrapper { myRightMarginField.setText(String.valueOf(printSettings.RIGHT_MARGIN)); myCbDrawBorder.setSelected(printSettings.DRAW_BORDER); - + myCbEvenNumberOfPages.setSelected(printSettings.EVEN_NUMBER_OF_PAGES); myLineTextField1.setText(printSettings.FOOTER_HEADER_TEXT1); myLinePlacementCombo1.setSelectedItem(printSettings.FOOTER_HEADER_PLACEMENT1); @@ -618,6 +624,7 @@ class PrintDialog extends DialogWrapper { catch(NumberFormatException ignored) { } printSettings.DRAW_BORDER = myCbDrawBorder.isSelected(); + printSettings.EVEN_NUMBER_OF_PAGES = myCbEvenNumberOfPages.isSelected(); printSettings.FOOTER_HEADER_TEXT1 = myLineTextField1.getText(); printSettings.FOOTER_HEADER_ALIGNMENT1 = (String)myLineAlignmentCombo1.getSelectedItem(); printSettings.FOOTER_HEADER_PLACEMENT1 = (String)myLinePlacementCombo1.getSelectedItem(); 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 84d41922548f..9ea449c91ba5 100644 --- a/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintManager.java +++ b/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintManager.java @@ -98,13 +98,13 @@ class PrintManager { PrintSettings printSettings = PrintSettings.getInstance(); if (printSettings.getPrintScope() == PrintSettings.PRINT_FILE && psiFiles.size() > 1) { - painter = new MultiFilePainter(psiFiles); + painter = new MultiFilePainter(psiFiles, printSettings.EVEN_NUMBER_OF_PAGES); } else if (printSettings.getPrintScope() == PrintSettings.PRINT_DIRECTORY) { List filesList = ContainerUtil.newArrayList(); boolean isRecursive = printSettings.isIncludeSubdirectories(); addToPsiFileList(psiDirectory, filesList, isRecursive); - painter = new MultiFilePainter(filesList); + painter = new MultiFilePainter(filesList, printSettings.EVEN_NUMBER_OF_PAGES); } else { if (psiFile == null && editor == null) return; diff --git a/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintSettings.java b/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintSettings.java index ee5d4ae74d4a..1f5d96ae0b35 100644 --- a/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintSettings.java +++ b/platform/lang-impl/src/com/intellij/codeEditor/printing/PrintSettings.java @@ -47,6 +47,8 @@ public class PrintSettings implements PersistentStateComponent { public boolean DRAW_BORDER = true; + public boolean EVEN_NUMBER_OF_PAGES = false; + public String FOOTER_HEADER_TEXT1 = CodeEditorBundle.message("print.header.default.line.1"); public String FOOTER_HEADER_PLACEMENT1 = HEADER; public String FOOTER_HEADER_ALIGNMENT1 = LEFT; diff --git a/platform/platform-resources-en/src/messages/CodeEditorBundle.properties b/platform/platform-resources-en/src/messages/CodeEditorBundle.properties index 1146885224df..62995621785c 100644 --- a/platform/platform-resources-en/src/messages/CodeEditorBundle.properties +++ b/platform/platform-resources-en/src/messages/CodeEditorBundle.properties @@ -29,6 +29,7 @@ print.settings.paper.size.label=Paper size print.settings.font.label=Font print.settings.show.line.numbers.checkbox=Show line numbers print.settings.draw.border.checkbox=Draw border +print.settings.even.number.of.pages=Even number of pages per file (for duplex printing) print.orientation.group=Orientation print.orientation.portrait.radio=Portrait print.orientation.landscape.radio=Landscape