package nl.siegmann.epublib.viewer; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Event; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Collections; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.filechooser.FileNameExtensionFilter; import nl.siegmann.epublib.browsersupport.NavigationHistory; import nl.siegmann.epublib.browsersupport.Navigator; import nl.siegmann.epublib.domain.Book; import nl.siegmann.epublib.epub.BookProcessor; import nl.siegmann.epublib.epub.BookProcessorPipeline; import nl.siegmann.epublib.epub.EpubReader; import nl.siegmann.epublib.epub.EpubWriter; import org.apache.commons.lang.StringUtils; public class Viewer { private static final long serialVersionUID = 1610691708767665447L; static final Logger log = Logger.getLogger(Viewer.class.getName()); private final JFrame mainWindow; private BrowseBar browseBar; private JSplitPane mainSplitPane; private JSplitPane leftSplitPane; private JSplitPane rightSplitPane; private Navigator navigator = new Navigator(); NavigationHistory browserHistory; private BookProcessorPipeline epubCleaner = new BookProcessorPipeline(Collections.<BookProcessor>emptyList()); public Viewer(InputStream bookStream) { mainWindow = createMainWindow(); Book book; try { book = (new EpubReader()).readEpub(bookStream, ""); gotoBook(book); } catch (IOException e) { log.log(Level.WARNING, e.getMessage(), e); } } public Viewer(Book book) { mainWindow = createMainWindow(); gotoBook(book); } private JFrame createMainWindow() { JFrame result = new JFrame(); result.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); result.setJMenuBar(createMenuBar()); JPanel mainPanel = new JPanel(new BorderLayout()); leftSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); leftSplitPane.setTopComponent(new TableOfContentsPane(navigator)); leftSplitPane.setBottomComponent(new GuidePane(navigator)); leftSplitPane.setOneTouchExpandable(true); leftSplitPane.setContinuousLayout(true); leftSplitPane.setResizeWeight(0.8); rightSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); rightSplitPane.setOneTouchExpandable(true); rightSplitPane.setContinuousLayout(true); rightSplitPane.setResizeWeight(1.0); ContentPane htmlPane = new ContentPane(navigator); JPanel contentPanel = new JPanel(new BorderLayout()); contentPanel.add(htmlPane, BorderLayout.CENTER); this.browseBar = new BrowseBar(navigator, htmlPane); contentPanel.add(browseBar, BorderLayout.SOUTH); rightSplitPane.setLeftComponent(contentPanel); rightSplitPane.setRightComponent(new MetadataPane(navigator)); mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); mainSplitPane.setLeftComponent(leftSplitPane); mainSplitPane.setRightComponent(rightSplitPane); mainSplitPane.setOneTouchExpandable(true); mainSplitPane.setContinuousLayout(true); mainSplitPane.setResizeWeight(0.0); mainPanel.add(mainSplitPane, BorderLayout.CENTER); mainPanel.setPreferredSize(new Dimension(1000, 750)); mainPanel.add(new NavigationBar(navigator), BorderLayout.NORTH); result.add(mainPanel); result.pack(); setLayout(Layout.TocContentMeta); result.setVisible(true); return result; } private void gotoBook(Book book) { mainWindow.setTitle(book.getTitle()); navigator.gotoBook(book, this); } private static String getText(String text) { return text; } private static JFileChooser createFileChooser(File startDir) { if (startDir == null) { startDir = new File(System.getProperty("user.home")); if (! startDir.exists()) { startDir = null; } } JFileChooser fileChooser = new JFileChooser(startDir); fileChooser.setAcceptAllFileFilterUsed(true); fileChooser.setFileFilter(new FileNameExtensionFilter("EPub files", "epub")); return fileChooser; } private JMenuBar createMenuBar() { final JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu(getText("File")); menuBar.add(fileMenu); JMenuItem openFileMenuItem = new JMenuItem(getText("Open")); openFileMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK)); openFileMenuItem.addActionListener(new ActionListener() { private File previousDir; public void actionPerformed(ActionEvent e) { JFileChooser fileChooser = createFileChooser(previousDir); int returnVal = fileChooser.showOpenDialog(mainWindow); if(returnVal != JFileChooser.APPROVE_OPTION) { return; } File selectedFile = fileChooser.getSelectedFile(); if (selectedFile == null) { return; } if (! selectedFile.isDirectory()) { previousDir = selectedFile.getParentFile(); } try { Book book = (new EpubReader()).readEpub(new FileInputStream(selectedFile), selectedFile.getName()); gotoBook(book); } catch (Exception e1) { log.log(Level.WARNING, e1.getMessage(), e1); } } }); fileMenu.add(openFileMenuItem); JMenuItem saveFileMenuItem = new JMenuItem(getText("Save as ...")); saveFileMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK | Event.SHIFT_MASK)); saveFileMenuItem.addActionListener(new ActionListener() { private File previousDir; public void actionPerformed(ActionEvent e) { if (navigator.getBook() == null) { return; } JFileChooser fileChooser = createFileChooser(previousDir); int returnVal = fileChooser.showOpenDialog(mainWindow); if(returnVal != JFileChooser.APPROVE_OPTION) { return; } File selectedFile = fileChooser.getSelectedFile(); if (selectedFile == null) { return; } if (! selectedFile.isDirectory()) { previousDir = selectedFile.getParentFile(); } try { (new EpubWriter()).write(navigator.getBook(), new FileOutputStream(selectedFile)); } catch (Exception e1) { log.log(Level.WARNING, e1.getMessage(), e1); } } }); fileMenu.add(saveFileMenuItem); JMenuItem reloadMenuItem = new JMenuItem(getText("Reload")); reloadMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, Event.CTRL_MASK)); reloadMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { gotoBook(navigator.getBook()); } }); fileMenu.add(reloadMenuItem); JMenuItem exitMenuItem = new JMenuItem(getText("Exit")); exitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK)); exitMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); fileMenu.add(exitMenuItem); JMenu viewMenu = new JMenu(getText("View")); menuBar.add(viewMenu); JMenuItem viewTocContentMenuItem = new JMenuItem(getText("TOCContent"), ViewerUtil.createImageIcon("layout-toc-content")); viewTocContentMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, Event.CTRL_MASK)); viewTocContentMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setLayout(Layout.TocContent); } }); viewMenu.add(viewTocContentMenuItem); JMenuItem viewContentMenuItem = new JMenuItem(getText("Content"), ViewerUtil.createImageIcon("layout-content")); viewContentMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, Event.CTRL_MASK)); viewContentMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setLayout(Layout.Content); } }); viewMenu.add(viewContentMenuItem); JMenuItem viewTocContentMetaMenuItem = new JMenuItem(getText("TocContentMeta"), ViewerUtil.createImageIcon("layout-toc-content-meta")); viewTocContentMetaMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_3, Event.CTRL_MASK)); viewTocContentMetaMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setLayout(Layout.TocContentMeta); } }); viewMenu.add(viewTocContentMetaMenuItem); JMenu helpMenu = new JMenu(getText("Help")); menuBar.add(helpMenu); JMenuItem aboutMenuItem = new JMenuItem(getText("About")); aboutMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { new AboutDialog(Viewer.this.mainWindow); } }); helpMenu.add(aboutMenuItem); return menuBar; } private enum Layout { TocContentMeta, TocContent, Content } private class LayoutX { private boolean tocPaneVisible; private boolean contentPaneVisible; private boolean metaPaneVisible; } private void setLayout(Layout layout) { switch (layout) { case Content: mainSplitPane.setDividerLocation(0.0d); rightSplitPane.setDividerLocation(1.0d); break; case TocContent: mainSplitPane.setDividerLocation(0.2d); rightSplitPane.setDividerLocation(1.0d); break; case TocContentMeta: mainSplitPane.setDividerLocation(0.2d); rightSplitPane.setDividerLocation(0.6d); break; } } private static InputStream getBookInputStream(String[] args) { // jquery-fundamentals-book.epub // final Book book = (new EpubReader()).readEpub(new FileInputStream("/home/paul/test2_book1.epub")); // final Book book = (new EpubReader()).readEpub(new FileInputStream("/home/paul/three_men_in_a_boat_jerome_k_jerome.epub")); // String bookFile = "/home/paul/test2_book1.epub"; // bookFile = "/home/paul/project/private/library/epub/this_dynamic_earth-AAH813.epub"; String bookFile = null; if (args.length > 0) { bookFile = args[0]; } InputStream result = null; if (! StringUtils.isBlank(bookFile)) { try { result = new FileInputStream(bookFile); } catch (Exception e) { log.log(Level.WARNING, "Unable to open " + bookFile, e); } } if (result == null) { result = Viewer.class.getResourceAsStream("/viewer/epublibviewer-help.epub"); } return result; } public static void main(String[] args) throws FileNotFoundException, IOException { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { log.log(Level.WARNING, "Unable to set native look and feel", e); } final InputStream bookStream = getBookInputStream(args); // final Book book = readBook(args); // Schedule a job for the event dispatch thread: // creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new Viewer(bookStream); } }); } }