package nl.siegmann.epublib.viewer;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import nl.siegmann.epublib.browsersupport.NavigationEvent;
import nl.siegmann.epublib.browsersupport.NavigationEventListener;
import nl.siegmann.epublib.browsersupport.NavigationHistory;
import nl.siegmann.epublib.browsersupport.Navigator;
import nl.siegmann.epublib.domain.Book;
import nl.siegmann.epublib.search.SearchIndex;
import nl.siegmann.epublib.search.SearchResult;
import nl.siegmann.epublib.search.SearchResults;
import nl.siegmann.epublib.util.ToolsResourceUtil;
/**
* A toolbar that contains the history back and forward buttons and the page title.
*
* @author paul.siegmann
*
*/
public class NavigationBar extends JToolBar implements NavigationEventListener {
/**
*
*/
private static final long serialVersionUID = 1166410773448311544L;
private JTextField titleField;
private JTextField searchField;
private final NavigationHistory navigationHistory;
private Navigator navigator;
private SearchIndex searchIndex = new SearchIndex();
private String previousSearchTerm = null;
private int searchResultIndex = -1;
private SearchResults searchResults;
public NavigationBar(Navigator navigator) {
this.navigationHistory = new NavigationHistory(navigator);
this.navigator = navigator;
navigator.addNavigationEventListener(this);
addHistoryButtons();
titleField = (JTextField) add(new JTextField());
addSearchButtons();
initBook(navigator.getBook());
}
private void initBook(Book book) {
if (book == null) {
return;
}
searchIndex.initBook(book);
}
private void addHistoryButtons() {
Font historyButtonFont = new Font("SansSerif", Font.BOLD, 24);
JButton previousButton = ViewerUtil.createButton("history-previous", "<=");
previousButton.setFont(historyButtonFont);
// previousButton.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, Event.CTRL_MASK));
previousButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
navigationHistory.move(-1);
}
});
add(previousButton);
JButton nextButton = ViewerUtil.createButton("history-next", "=>");
nextButton.setFont(historyButtonFont);
nextButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
navigationHistory.move(1);
}
});
add(nextButton);
}
private void doSearch(int move) {
String searchTerm = searchField.getText();
if (searchTerm.equals(previousSearchTerm)) {
searchResultIndex += move;
} else {
searchResults = searchIndex.doSearch(searchTerm);
previousSearchTerm = searchTerm;
searchResultIndex = 0;
}
if (searchResultIndex < 0) {
searchResultIndex = searchResults.size() - 1;
} else if (searchResultIndex >= searchResults.size()) {
searchResultIndex = 0;
}
if (! searchResults.isEmpty()) {
SearchResult searchResult = searchResults.getHits().get(searchResultIndex);
navigator.gotoResource(searchResult.getResource(), searchResult.getPagePos(), NavigationBar.this);
}
}
private void addSearchButtons() {
JPanel searchForm = new JPanel(new BorderLayout());
searchForm.setPreferredSize(new Dimension(200, 28));
Font historyButtonFont = new Font("SansSerif", Font.BOLD, 20);
JButton previousButton = ViewerUtil.createButton("search-previous", "<");
previousButton.setFont(historyButtonFont);
// previousButton.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, Event.CTRL_MASK));
previousButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doSearch(-1);
}
});
searchForm.add(previousButton, BorderLayout.WEST);
searchField = new JTextField();
// JPanel searchInput = new JPanel();
// searchInput.add(new JLabel(ViewerUtil.createImageIcon("search-icon")));
// searchInput.add(searchField);
searchField.setMinimumSize(new Dimension(100, 20));
searchField.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent keyEvent) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent keyEvent) {
if (keyEvent.getKeyCode() == KeyEvent.VK_ENTER) {
doSearch(1);
}
}
});
// searchInput.setMinimumSize(new Dimension(140, 20));
searchForm.add(searchField, BorderLayout.CENTER);
JButton nextButton = ViewerUtil.createButton("search-next", ">");
nextButton.setFont(historyButtonFont);
nextButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doSearch(1);
}
});
searchForm.add(nextButton, BorderLayout.EAST);
add(searchForm);
}
@Override
public void navigationPerformed(NavigationEvent navigationEvent) {
if (navigationEvent.isBookChanged()) {
initBook(navigationEvent.getCurrentBook());
}
if (navigationEvent.getCurrentResource() != null) {
String title = ToolsResourceUtil.getTitle(navigationEvent.getCurrentResource());
titleField.setText(title);
}
}
}