/* * PrintPreview.java * :tabSize=4:indentSize=4:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2016 Dale Anson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.gjt.sp.jedit.print; import java.awt.*; import java.awt.event.*; import java.awt.print.*; import java.util.*; import javax.print.PrintService; import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.standard.*; import javax.swing.*; import org.gjt.sp.jedit.Buffer; import org.gjt.sp.jedit.GUIUtilities; import org.gjt.sp.jedit.View; import org.gjt.sp.jedit.gui.EnhancedDialog; import org.gjt.sp.jedit.jEdit; import org.gjt.sp.util.Log; public class PrintPreview extends EnhancedDialog { private View view; private Buffer buffer; private JComboBox<Integer> pages; private JButton nextPage; private JButton prevPage; private JButton zoomIn; private JButton zoomOut; private JButton fullWidth; private JButton fullPage; private PrintPreviewPane printPreviewPane; private JButton cancelButton; private HashMap<Integer, Range> pageRanges; private PrintRequestAttributeSet attributes; private PrintService printService; private PrintPreviewModel model; private float zoomLevel = 1.0f; public PrintPreview( View view, Buffer buffer, PrintService printService, PrintRequestAttributeSet attributes ) { super( view, jEdit.getProperty( "printpreview.dialog.title" ), true ); this.view = view; this.buffer = buffer; this.printService = printService; this.attributes = attributes; installComponents(); installListeners(); init(); pack(); setLocationRelativeTo( jEdit.getActiveView().getTextArea() ); setVisible( true ); // TODO: this repaint shouldn't be necessary, but sometimes the first // page isn't drawn when the preview is first displayed. This fixes that // problem, but this feels like the wrong way to do it. repaint(); } private void installComponents() { // toolbar components pages = new JComboBox<Integer>(); nextPage = new JButton( GUIUtilities.loadIcon( "22x22/actions/go-next.png" ) ); nextPage.setToolTipText( jEdit.getProperty( "printpreview.dialog.nextPage", "Next Page" ) ); prevPage = new JButton( GUIUtilities.loadIcon( "22x22/actions/go-previous.png" ) ); prevPage.setToolTipText( jEdit.getProperty( "printpreview.dialog.prevPage", "Previous Page" ) ); zoomIn = new JButton( GUIUtilities.loadIcon( "22x22/actions/zoom-in.png" ) ); zoomIn.setToolTipText( jEdit.getProperty( "printpreview.dialog.zoomin", "Zoom In" ) ); zoomOut = new JButton( GUIUtilities.loadIcon( "22x22/actions/zoom-out.png" ) ); zoomOut.setToolTipText( jEdit.getProperty( "printpreview.dialog.zoomout", "Zoom Out" ) ); // horisontal! yes, that's right fullWidth = new JButton( GUIUtilities.loadIcon( "22x22/actions/resize-horisontal.png" ) ); fullWidth.setToolTipText( jEdit.getProperty( "printpreview.dialog.pageWidth", "Show page full width" ) ); fullPage = new JButton( GUIUtilities.loadIcon( "22x22/actions/resize-vertical.png" ) ); fullPage.setToolTipText( jEdit.getProperty( "printpreview.dialog.fullPage", "Show full page" ) ); // create toolbar JPanel toolbar = new JPanel(); toolbar.setLayout( new FlowLayout( FlowLayout.LEFT, 6, 6 ) ); toolbar.add( new JLabel( "Page " ) ); toolbar.add( pages ); toolbar.add( prevPage ); toolbar.add( nextPage ); // TODO: these need to be finished // toolbar.add( zoomIn ); // toolbar.add( zoomOut ); // toolbar.add( fullWidth ); // toolbar.add( fullPage ); // main area to see print preview printPreviewPane = new PrintPreviewPane(); // print/close buttons cancelButton = new JButton( jEdit.getProperty( "common.cancel" ) ); // create bottom panel JPanel bottomPanel = new JPanel(); bottomPanel.setLayout( new FlowLayout( FlowLayout.RIGHT, 6, 11 ) ); bottomPanel.add( cancelButton ); // main content holder JPanel content = new JPanel(); content.setLayout( new BorderLayout() ); content.setBorder( BorderFactory.createEmptyBorder( 6, 6, 6, 6 ) ); // add all the pieces content.add( toolbar, BorderLayout.NORTH ); content.add( printPreviewPane, BorderLayout.CENTER ); content.add( bottomPanel, BorderLayout.SOUTH ); setContentPane( content ); } private void installListeners() { cancelButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent ae ) { PrintPreview.this.cancel(); } } ); // as suggested by Alan, set the keystrokes so that up, down, left, right, // and page up and down go to the next or previous page as appropriate. // First remove the default key map: pages.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put( KeyStroke.getKeyStroke( KeyEvent.VK_DOWN, 0, false ), "none" ); pages.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put( KeyStroke.getKeyStroke( KeyEvent.VK_UP, 0, false ), "none" ); pages.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put( KeyStroke.getKeyStroke( KeyEvent.VK_RIGHT, 0, false ), "none" ); pages.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put( KeyStroke.getKeyStroke( KeyEvent.VK_LEFT, 0, false ), "none" ); pages.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put( KeyStroke.getKeyStroke( KeyEvent.VK_KP_DOWN, 0, false ), "none" ); pages.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put( KeyStroke.getKeyStroke( KeyEvent.VK_KP_UP, 0, false ), "none" ); pages.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put( KeyStroke.getKeyStroke( KeyEvent.VK_KP_RIGHT, 0, false ), "none" ); pages.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put( KeyStroke.getKeyStroke( KeyEvent.VK_KP_LEFT, 0, false ), "none" ); pages.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put( KeyStroke.getKeyStroke( KeyEvent.VK_PAGE_DOWN, 0, false ), "none" ); pages.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put( KeyStroke.getKeyStroke( KeyEvent.VK_PAGE_UP, 0, false ), "none" ); // then handle the keystrokes: pages.addKeyListener( new KeyAdapter() { public void keyPressed( KeyEvent ke ) { int selectedIndex = pages.getSelectedIndex(); switch ( ke.getKeyCode() ) { case KeyEvent.VK_DOWN: case KeyEvent.VK_KP_DOWN: case KeyEvent.VK_RIGHT: case KeyEvent.VK_KP_RIGHT: case KeyEvent.VK_PAGE_DOWN: selectedIndex += 1; selectedIndex = selectedIndex >= pages.getItemCount() ? 0 : selectedIndex; break; case KeyEvent.VK_UP: case KeyEvent.VK_KP_UP: case KeyEvent.VK_LEFT: case KeyEvent.VK_KP_LEFT: case KeyEvent.VK_PAGE_UP: selectedIndex -= 1; selectedIndex = selectedIndex < 0 ? pages.getItemCount() - 1 : selectedIndex; break; // pressing the 1 thru 9 keys jumps directly to that page case KeyEvent.VK_1: selectedIndex = 0; break; case KeyEvent.VK_2: selectedIndex = 1; break; case KeyEvent.VK_3: selectedIndex = 2; break; case KeyEvent.VK_4: selectedIndex = 3; break; case KeyEvent.VK_5: selectedIndex = 4; break; case KeyEvent.VK_6: selectedIndex = 5; break; case KeyEvent.VK_7: selectedIndex = 6; break; case KeyEvent.VK_8: selectedIndex = 7; break; case KeyEvent.VK_9: selectedIndex = 8; break; default: return; } pages.setSelectedIndex( selectedIndex ); int selectedPage = ( Integer )pages.getSelectedItem(); model.setPageNumber( selectedPage - 1 ); model.setPageRanges( pageRanges ); model.setZoomLevel( zoomLevel ); attributes.add( new PageRanges( selectedPage ) ); printPreviewPane.setModel( model ); } } ); prevPage.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent ae ) { int selectedIndex = pages.getSelectedIndex(); if ( selectedIndex <= 0 ) { selectedIndex = pages.getItemCount() - 1; } else { selectedIndex = selectedIndex - 1; } pages.setSelectedIndex( selectedIndex ); } } ); nextPage.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent ae ) { int selectedIndex = pages.getSelectedIndex(); if ( selectedIndex + 1 == pages.getItemCount() ) { selectedIndex = 0; } else { selectedIndex = selectedIndex + 1; } pages.setSelectedIndex( selectedIndex ); } } ); zoomIn.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent ae ) { zoomLevel += 0.1f; int selectedPage = ( Integer )pages.getSelectedItem(); model.setZoomLevel( zoomLevel ); model.setPageNumber( selectedPage - 1 ); model.setPageRanges( pageRanges ); model.setZoom( PrintPreviewModel.Zoom.IN ); attributes.add( new PageRanges( selectedPage ) ); printPreviewPane.setModel( model ); } } ); zoomOut.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent ae ) { zoomLevel -= 0.1f; if ( zoomLevel <= 0.0f ) { zoomLevel = 0.1f; } int selectedPage = ( Integer )pages.getSelectedItem(); model.setZoomLevel( zoomLevel ); model.setPageNumber( selectedPage - 1 ); model.setPageRanges( pageRanges ); model.setZoom( PrintPreviewModel.Zoom.OUT ); attributes.add( new PageRanges( selectedPage ) ); printPreviewPane.setModel( model ); } } ); fullWidth.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent ae ) { int selectedPage = ( Integer )pages.getSelectedItem(); model.setPageNumber( selectedPage ); model.setPageRanges( pageRanges ); model.setZoom( PrintPreviewModel.Zoom.WIDTH ); attributes.add( new PageRanges( selectedPage ) ); printPreviewPane.setModel( model ); } } ); fullPage.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent ae ) { int selectedPage = ( Integer )pages.getSelectedItem(); model.setPageNumber( selectedPage ); model.setPageRanges( pageRanges ); model.setZoom( PrintPreviewModel.Zoom.PAGE ); attributes.add( new PageRanges( selectedPage ) ); printPreviewPane.setModel( model ); } } ); } private void init() { pageRanges = BufferPrinter1_7.getPageRanges( view, buffer, attributes ); DefaultComboBoxModel<Integer> pagesModel = new DefaultComboBoxModel<Integer>(); for ( Integer i : pageRanges.keySet() ) { pagesModel.addElement( i ); // Log.log(Log.DEBUG, this, "init, i = " + i + ", range = " + pageRanges.get(i)); } pages.setModel( pagesModel ); nextPage.setEnabled( pagesModel.getSize() > 1 ); prevPage.setEnabled( pagesModel.getSize() > 1 ); model = new PrintPreviewModel( view, buffer, printService, attributes, pageRanges ); model.setPageNumber( 0 ); printPreviewPane.setModel( model ); } public void ok() { } public void cancel() { PrintPreview.this.setVisible( false ); PrintPreview.this.dispose(); } }