convenience option for duplex printing of multiple files (IDEA-164472)

This commit is contained in:
Dmitry Batrak
2016-12-19 11:04:09 +03:00
parent 376ca21484
commit 5cbcf18d96
5 changed files with 30 additions and 11 deletions
@@ -26,12 +26,15 @@ import java.util.List;
class MultiFilePainter extends BasePainter {
private final List<PsiFile> myFilesList;
private final boolean myEvenNumberOfPagesPerFile;
private int myFileIndex = 0;
private int myStartPageIndex = 0;
private TextPainter myTextPainter = null;
private int myLargestPrintedPage = -1;
public MultiFilePainter(List<PsiFile> filesList) {
public MultiFilePainter(List<PsiFile> 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;
}
@@ -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();
@@ -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<PsiFile> 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;
@@ -47,6 +47,8 @@ public class PrintSettings implements PersistentStateComponent<PrintSettings> {
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;
@@ -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