PrintPreviewDemo.java
package examples;
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import java.beans.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import sos.preview.*;
public class PrintPreviewDemo
{
private JFrame frame;
private JPrintPreviewPane printPreviewPane;
private SampleBook sampleBook;
private Color pageBackground = Color.white;
public PrintPreviewDemo()
{
}
private Color chooseColor( Component parent, String title, Color initialColor )
{
return JColorChooser.showDialog( parent, title, initialColor );
}
private Pageable copyBook()
{
Book book = new Book();
int numPages = sampleBook.getNumberOfPages();
for( int i = 0; i < numPages; i++ )
{
Printable printable = sampleBook.getPrintable( i );
PageFormat pageFormat = sampleBook.getPageFormat( i );
book.append( printable, pageFormat );
}
return book;
}
private JPanel createColorTab()
{
JPanel colorPanel = new JPanel();
colorPanel.setLayout( new FlowLayout( FlowLayout.LEADING ));
final JComboBox attributeComboBox = new JComboBox();
attributeComboBox.addItem( "Background" );
attributeComboBox.addItem( "Foreground" );
attributeComboBox.addItem( "Selection Foreground" );
attributeComboBox.addItem( "Page Background" );
attributeComboBox.addItem( "Page Shadow" );
attributeComboBox.addItem( "Margins" );
attributeComboBox.setToolTipText( "<html>Choose an attribute</html>" );
colorPanel.add( attributeComboBox );
JButton editColorButton = new JButton( new AbstractAction( "Edit..." ) {
public void actionPerformed( ActionEvent event )
{
Object attribute = attributeComboBox.getSelectedItem();
if( "Background".equals( attribute ))
{
Color background = printPreviewPane.getBackground();
background = chooseColor( frame, "Pane Background Color", background );
if( background != null )
printPreviewPane.setBackground( background );
}
else if( "Foreground".equals( attribute ))
{
Color foreground = printPreviewPane.getForeground();
foreground = chooseColor( frame, "Pane Foreground Color", foreground );
if( foreground != null )
printPreviewPane.setForeground( foreground );
}
else if( "Selection Foreground".equals( attribute ))
{
Color foreground = printPreviewPane.getSelectionForeground();
foreground = chooseColor( frame, "Pane Selection Foreground Color", foreground );
if( foreground != null )
printPreviewPane.setSelectionForeground( foreground );
}
else if( "Page Background".equals( attribute ))
{
Color background = chooseColor( frame, "Page Background Color", pageBackground );
if( background != null )
{
pageBackground = background;
installPageColor();
}
}
else if( "Page Shadow".equals( attribute ))
{
Color shadow = UIManager.getColor( BasicPrintPreviewPageUI.SHADOW_COLOR_KEY );
shadow = chooseColor( frame, "Page Shadow Color", shadow );
if( shadow != null )
{
UIManager.put( BasicPrintPreviewPageUI.SHADOW_COLOR_KEY, shadow );
printPreviewPane.updateUI();
}
}
else if( "Margins".equals( attribute ))
{
Color margin = UIManager.getColor( BasicPrintPreviewPageUI.MARGIN_COLOR_KEY );
margin = chooseColor( frame, "Margin Color", margin );
if( margin != null )
{
UIManager.put( BasicPrintPreviewPageUI.MARGIN_COLOR_KEY, margin );
printPreviewPane.updateUI();
}
}
}
} );
editColorButton.setToolTipText( "<html>Change the color</html>" );
colorPanel.add( editColorButton );
return colorPanel;
}
private JPanel createPageNumberTab()
{
JPanel pageNumberPanel = new JPanel();
pageNumberPanel.setLayout( new FlowLayout( FlowLayout.LEADING ));
final JCheckBox showPageNumbers = new JCheckBox();
showPageNumbers.setSelected( true );
showPageNumbers.setAction( new AbstractAction( "Show page numbers" ) {
public void actionPerformed( ActionEvent event )
{
printPreviewPane.setPageNumbersAreShown( showPageNumbers.isSelected() );
}
} );
showPageNumbers.setToolTipText( "<html>Toggle page number rendering</html>" );
pageNumberPanel.add( showPageNumbers );
final JComboBox rendererComboBox = new JComboBox();
PageNumberRenderer initialRenderer = new CustomPageNumberRenderer1();
printPreviewPane.setPageNumberRenderer( initialRenderer );
rendererComboBox.addItem( initialRenderer );
rendererComboBox.addItem( new CustomPageNumberRenderer2() );
rendererComboBox.addItem( new CustomPageNumberRenderer3() );
rendererComboBox.addItem( new CustomPageNumberRenderer4() );
rendererComboBox.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent event )
{
PageNumberRenderer pageNumberRenderer = (PageNumberRenderer)rendererComboBox.getSelectedItem();
printPreviewPane.setPageNumberRenderer( pageNumberRenderer );
}
} );
rendererComboBox.setToolTipText( "<html>Change the page number renderer</html>" );
pageNumberPanel.add( rendererComboBox );
return pageNumberPanel;
}
private JPanel createPageTab()
{
JPanel pagePanel = new JPanel();
pagePanel.setLayout( new FlowLayout( FlowLayout.LEADING ));
JButton addButton = new JButton( new AbstractAction( "Add Page..." ) {
public void actionPerformed( ActionEvent event )
{
PageFormat pageFormat = new PageFormat();
Object[] options = { "Portrait", "Landscape" };
int response = JOptionPane.showOptionDialog(frame, "Choose a page orientation for the new page.", "Add Page",
JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE,
null, options, options[0]);
if( response == 0 )
pageFormat.setOrientation( PageFormat.PORTRAIT );
else
pageFormat.setOrientation( PageFormat.LANDSCAPE );
sampleBook.addPage( pageFormat );
Pageable book = copyBook();
printPreviewPane.setPageable( book );
SwingUtilities.invokeLater( new Runnable() {
public void run()
{
printPreviewPane.centerPage( sampleBook.getNumberOfPages() - 1 );
}
} );
}
} );
addButton.setToolTipText( "<html>Append a new page with the desired orientation</html>" );
pagePanel.add( addButton );
JButton removeButton = new JButton( new AbstractAction( "Remove Page(s)..." ) {
public void actionPerformed( ActionEvent event )
{
int response = JOptionPane.showConfirmDialog( frame, "Are you sure you want to delete the selected page(s)?" );
if( response != JOptionPane.YES_OPTION )
return;
int numPages = sampleBook.getNumberOfPages();
for( int i = numPages - 1; i >= 0; i-- )
{
if( printPreviewPane.isPageSelected( i ))
sampleBook.removePage( i );
}
Pageable book = copyBook();
printPreviewPane.setPageable( book );
}
} );
removeButton.setToolTipText( "<html>Remove the selected pages</html>" );
pagePanel.add( removeButton );
final JCheckBox showMargins = new JCheckBox();
showMargins.setAction( new AbstractAction( "Show margins" ) {
public void actionPerformed( ActionEvent event )
{
printPreviewPane.setMarginsAreShown( showMargins.isSelected() );
}
} );
showMargins.setToolTipText( "<html>Toggle page margin rendering</html>" );
pagePanel.add( showMargins );
JLabel borderThicknessLabel = new JLabel( "Page Border: " );
pagePanel.add( borderThicknessLabel );
final JSpinner borderThicknessSpinner = new JSpinner();
borderThicknessSpinner.setPreferredSize( new Dimension( 40, 24 ));
borderThicknessSpinner.setValue( UIManager.get( BasicPrintPreviewPageUI.BORDER_THICKNESS_KEY ));
borderThicknessSpinner.addChangeListener( new ChangeListener() {
public void stateChanged( ChangeEvent event )
{
Integer value = (Integer)borderThicknessSpinner.getValue();
UIManager.put( BasicPrintPreviewPageUI.BORDER_THICKNESS_KEY, value );
printPreviewPane.updateUI();
}
} );
borderThicknessSpinner.setToolTipText( "<html>Adjust the size of the page border</html>" );
pagePanel.add( borderThicknessSpinner );
JLabel shadowThicknessLabel = new JLabel( "Shadow Thickness:" );
pagePanel.add( shadowThicknessLabel );
final JSpinner shadowThicknessSpinner = new JSpinner();
shadowThicknessSpinner.setPreferredSize( new Dimension( 40, 24 ));
shadowThicknessSpinner.setValue( UIManager.get( BasicPrintPreviewPageUI.SHADOW_THICKNESS_KEY ));
shadowThicknessSpinner.addChangeListener( new ChangeListener() {
public void stateChanged( ChangeEvent event )
{
Integer value = (Integer)shadowThicknessSpinner.getValue();
UIManager.put( BasicPrintPreviewPageUI.SHADOW_THICKNESS_KEY, value );
printPreviewPane.updateUI();
}
} );
shadowThicknessSpinner.setToolTipText( "<html>Adjust the depth of the page shadow</html>" );
pagePanel.add( shadowThicknessSpinner );
return pagePanel;
}
private JPanel createSelectionTab()
{
JPanel selectionPanel = new JPanel();
selectionPanel.setLayout( new FlowLayout( FlowLayout.LEADING ));
final JCheckBox selectionAllowedCheckBox = new JCheckBox();
selectionAllowedCheckBox.setSelected( true );
selectionAllowedCheckBox.setAction( new AbstractAction( "Allow Page Selection" ) {
public void actionPerformed( ActionEvent event )
{
printPreviewPane.setPageSelectionAllowed( selectionAllowedCheckBox.isSelected() );
}
} );
selectionAllowedCheckBox.setToolTipText( "<html>Toggle page selection property</html>" );
selectionPanel.add( selectionAllowedCheckBox );
final JComboBox selectionModelComboBox = new JComboBox();
selectionModelComboBox.addItem( "Single" );
selectionModelComboBox.addItem( "Single Interval" );
selectionModelComboBox.addItem( "Multiple Interval" );
selectionModelComboBox.setSelectedItem( "Multiple Interval" );
selectionModelComboBox.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent event )
{
ListSelectionModel model = printPreviewPane.getPageSelectionModel();
String selectionType = (String)selectionModelComboBox.getSelectedItem();
if( "Single".equals( selectionType ))
model.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
else if( "Single Interval".equals( selectionType ))
model.setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION );
else
model.setSelectionMode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
}
} );
selectionModelComboBox.setToolTipText( "<html>Change the page selection model</html>" );
selectionPanel.add( selectionModelComboBox );
return selectionPanel;
}
private JPanel createZoomTab( PrintPreviewSupport support )
{
JPanel zoomingPanel = new JPanel();
zoomingPanel.setLayout( new FlowLayout( FlowLayout.LEADING ));
JToggleButton selectionButton = new JToggleButton( new AbstractAction( "Selection Mode" ) {
public void actionPerformed( ActionEvent event )
{
printPreviewPane.setMode( JPrintPreviewPane.SELECTION_MODE );
}
} );
selectionButton.setSelected( true );
selectionButton.setToolTipText( "<html>Switch to selection mode<blockquote><font size=2>In selection mode, you can highlight pages by left-clicking them.</font></blockquote></html>" );
zoomingPanel.add( selectionButton );
JToggleButton zoomInButton = new JToggleButton( new AbstractAction( "Zoom-In Mode" ) {
public void actionPerformed( ActionEvent event )
{
printPreviewPane.setMode( JPrintPreviewPane.ZOOM_IN_MODE );
}
} );
zoomInButton.setToolTipText( "<html>Switch to zoom-in mode<blockquote><font size=2>In zoom-in mode, you can enlarge pages by left-clicking them.</font></blockquote></html>" );
zoomingPanel.add( zoomInButton );
JToggleButton zoomOutButton = new JToggleButton( new AbstractAction( "Zoom-Out Mode" ) {
public void actionPerformed( ActionEvent event )
{
printPreviewPane.setMode( JPrintPreviewPane.ZOOM_OUT_MODE );
}
} );
zoomOutButton.setToolTipText( "<html>Switch to zoom-out mode<blockquote><font size=2>In zoom-out mode, you can shrink pages by left-clicking them.</font></blockquote></html>" );
zoomingPanel.add( zoomOutButton );
JToggleButton zoomButton = new JToggleButton( new AbstractAction( "Zoom Mode" ) {
public void actionPerformed( ActionEvent event )
{
printPreviewPane.setMode( JPrintPreviewPane.ZOOM_MODE );
}
} );
zoomButton.setToolTipText( "<html>Switch to zoom mode<blockquote><font size=2>In zoom mode, left-clicking enlarges pages and right-clicking shrinks pages.</font></blockquote></html>" );
zoomingPanel.add( zoomButton );
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add( selectionButton );
buttonGroup.add( zoomInButton );
buttonGroup.add( zoomOutButton );
buttonGroup.add( zoomButton );
JComboBox zoomComboBox = support.getZoomComboBox( true, true );
zoomingPanel.add( zoomComboBox );
return zoomingPanel;
}
private void installPageColor()
{
Pageable pageable = printPreviewPane.getPageable();
int numPages = pageable.getNumberOfPages();
for( int i = 0; i < numPages; i++ )
{
Component page = printPreviewPane.getPageComponent( i );
page.setBackground( pageBackground );
}
}
public static void main( String[] args )
{
SwingUtilities.invokeLater( new Runnable() {
public void run()
{
try
{
PrintPreviewDemo demo = new PrintPreviewDemo();
demo.run();
}
catch( IOException ioe )
{
ioe.printStackTrace();
}
}
} );
}
public void run() throws IOException
{
frame = new JFrame( "Print Preview Demo by Side of Software" );
frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
sampleBook = new SampleBook( "Earnest.txt" );
PageFormat pageFormat = new PageFormat();
for( int i = 0; i < 7; i++ )
sampleBook.addPage( pageFormat );
Pageable book = copyBook();
printPreviewPane = new JPrintPreviewPane( book );
installPageColor();
printPreviewPane.addPropertyChangeListener( JPrintPreviewPane.PAGEABLE_PROPERTY, new PropertyChangeListener() {
public void propertyChange( PropertyChangeEvent event )
{
installPageColor();
}
} );
JScrollPane scrollPane = new JScrollPane( printPreviewPane );
PrintPreviewSupport support = new PrintPreviewSupport( printPreviewPane, false );
JToolBar toolbar = new JToolBar();
JTabbedPane tabbedPane = new JTabbedPane();
JPanel zoomingPanel = createZoomTab( support );
tabbedPane.addTab( "Zooming", zoomingPanel );
JPanel pagePanel = createPageTab();
tabbedPane.addTab( "Pages", pagePanel );
JPanel selectionPanel = createSelectionTab();
tabbedPane.addTab( "Selection", selectionPanel );
JPanel pageNumberPanel = createPageNumberTab();
tabbedPane.addTab( "Page Numbers", pageNumberPanel );
JPanel colorPanel = createColorTab();
tabbedPane.addTab( "Colors", colorPanel );
toolbar.add( tabbedPane );
frame.getContentPane().setLayout( new BorderLayout() );
frame.getContentPane().add( scrollPane, BorderLayout.CENTER );
frame.getContentPane().add( toolbar, BorderLayout.NORTH );
frame.setSize( 800, 500 );
Locale locale = Locale.getDefault();
ComponentOrientation componentOrientation = ComponentOrientation.getOrientation( locale );
frame.applyComponentOrientation( componentOrientation );
frame.show();
}
}
class CustomPageNumberRenderer1 extends DefaultPageNumberRenderer
{
protected String pageNumberToString( int pageNumber )
{
return "- " + pageNumber + " -";
}
public String toString()
{
return "- N - (centered)";
}
}
class CustomPageNumberRenderer2 extends DefaultPageNumberRenderer
{
protected String pageNumberToString( int pageNumber )
{
return "Page " + pageNumber;
}
protected void prepareLabel( JLabel label, JPrintPreviewPane printPreviewPane, int pageNumber, boolean isSelected, boolean pageHasFocus )
{
super.prepareLabel( label, printPreviewPane, pageNumber, isSelected, pageHasFocus );
label.setHorizontalAlignment( JLabel.TRAILING );
}
public String toString()
{
return "Page N (trailing)";
}
}
class CustomPageNumberRenderer3 extends DefaultPageNumberRenderer
{
protected void prepareLabel( JLabel label, JPrintPreviewPane printPreviewPane, int pageNumber, boolean isSelected, boolean pageHasFocus )
{
super.prepareLabel( label, printPreviewPane, pageNumber, isSelected, pageHasFocus );
if( pageNumber % 2 == 1 )
label.setHorizontalAlignment( JLabel.RIGHT );
else
label.setHorizontalAlignment( JLabel.LEFT );
}
public String toString()
{
return "N (opposite)";
}
}
class CustomPageNumberRenderer4 extends DefaultPageNumberRenderer
{
private Icon icon;
private Border border;
CustomPageNumberRenderer4()
{
ClassLoader classLoader = this.getClass().getClassLoader();
icon = new ImageIcon( classLoader.getResource( "examples/PrintPreviewLibrary17.gif" ));
border = BorderFactory.createEtchedBorder();
}
protected String pageNumberToString( int pageNumber )
{
return String.valueOf( pageNumber );
}
protected void prepareLabel( JLabel label, JPrintPreviewPane printPreviewPane, int pageNumber, boolean isSelected, boolean pageHasFocus )
{
super.prepareLabel( label, printPreviewPane, pageNumber, isSelected, pageHasFocus );
label.setIcon( icon );
label.setHorizontalAlignment( JLabel.LEFT );
label.setBorder( border );
}
public String toString()
{
return "N (with icon and border)";
}
}
class SampleBook implements Pageable
{
private static Font font = new Font( "Arial", Font.PLAIN, 13 );
private BufferedReader reader;
private List pages = new ArrayList();
private List pageFormats = new ArrayList();
public SampleBook( String resourceName ) throws IOException
{
ClassLoader classLoader = this.getClass().getClassLoader();
URL fileUrl = classLoader.getResource( resourceName );
InputStream inputStream = fileUrl.openStream();
Reader inputStreamReader = new InputStreamReader( inputStream );
reader = new BufferedReader( inputStreamReader );
}
public void addPage( PageFormat pageFormat )
{
try
{
pageFormats.add( pageFormat );
PagePrintable printable = new PagePrintable();
pages.add( printable );
int height = 0;
int maxHeight = (int)pageFormat.getImageableHeight() - 11;
while( height < maxHeight )
{
String line = reader.readLine();
if( line == null )
break;
printable.addLine( line );
height += 15;
}
}
catch( IOException ioe )
{
ioe.printStackTrace();
}
}
public void removePage( int pageIndex ) throws IndexOutOfBoundsException
{
pages.remove( pageIndex );
pageFormats.remove( pageIndex );
}
public int getNumberOfPages()
{
return pages.size();
}
public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException
{
return (PageFormat)pageFormats.get( pageIndex );
}
public Printable getPrintable(int pageIndex) throws IndexOutOfBoundsException
{
return (Printable)pages.get( pageIndex );
}
public void load( PageFormat pageFormat ) throws IOException
{
while( reader.ready() )
addPage( pageFormat );
}
class PagePrintable implements Printable
{
private List lines = new ArrayList();
void addLine( String line )
{
lines.add( line );
}
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException
{
Graphics2D g2 = (Graphics2D)graphics;
g2.setColor( Color.black );
g2.setFont( font );
int x = (int)pageFormat.getImageableX();
int y = (int)pageFormat.getImageableY() + 11;
Iterator iter = lines.iterator();
while( iter.hasNext() )
{
String line = (String)iter.next();
if( line.length() != 0 )
g2.drawString( line, x, y );
y += 15;
}
return PAGE_EXISTS;
}
}
}