/* * Copyright 2006-2017 ICEsoft Technologies Canada Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.icepdf.ri.common; import org.icepdf.ri.common.views.AbstractDocumentView; import javax.swing.*; import java.awt.event.KeyAdapter; /** * This intercepts KeyEvents for a JScrollPane, and determines if * they qualify to initiate a page change request for the SwingController. * * @author Mark Collette * @since 2.0 */ public class KeyListenerPageChanger extends KeyAdapter { private SwingController controller; private JScrollPane scroll; private AbstractDocumentView documentView; /** * KeyEvents can queue up, if the user holds down a key, * causing us to do several page changes, unless we use * flagging to ignore the extraneous KeyEvents */ private boolean changingPage; /** * Install a KeyListenerPageChanger as a KeyListener * * @param c SwingController that can change pages * @param s JScrollPane that has a vertical JScrollBar, and where events come from */ public static KeyListenerPageChanger install(SwingController c, JScrollPane s, AbstractDocumentView documentView) { KeyListenerPageChanger listener = null; if (c != null && s != null) { listener = new KeyListenerPageChanger(c, s, documentView); s.addKeyListener(listener); } return listener; } public void uninstall() { if (scroll != null) { scroll.removeKeyListener(this); } } protected KeyListenerPageChanger(SwingController c, JScrollPane s, AbstractDocumentView documentView) { controller = c; scroll = s; this.documentView = documentView; changingPage = false; } public void keyPressed(java.awt.event.KeyEvent e) { //if( !pageView.changePageWhenKeyOverscrolling() ) // return; if (changingPage) return; int deltaPage = 0; JScrollBar visibleVerticalScrollBar = (scroll.getVerticalScrollBar() != null && scroll.getVerticalScrollBar().isVisible()) ? scroll.getVerticalScrollBar() : null; int keyCode = e.getKeyCode(); if (keyCode == java.awt.event.KeyEvent.VK_PAGE_DOWN || keyCode == java.awt.event.KeyEvent.VK_DOWN) { if (visibleVerticalScrollBar != null) { int value = visibleVerticalScrollBar.getModel().getValue(); int extent = visibleVerticalScrollBar.getModel().getExtent(); int max = visibleVerticalScrollBar.getModel().getMaximum(); if (value + extent >= max) deltaPage = documentView.getNextPageIncrement(); } else deltaPage = documentView.getNextPageIncrement(); } else if (keyCode == java.awt.event.KeyEvent.VK_PAGE_UP || keyCode == java.awt.event.KeyEvent.VK_UP) { if (visibleVerticalScrollBar != null) { int value = visibleVerticalScrollBar.getModel().getValue(); if (value <= 0) deltaPage = -documentView.getPreviousPageIncrement(); } else deltaPage = -documentView.getPreviousPageIncrement(); } else if (keyCode == java.awt.event.KeyEvent.VK_HOME) { deltaPage = -controller.getCurrentPageNumber(); } else if (keyCode == java.awt.event.KeyEvent.VK_END) { deltaPage = controller.getDocument().getNumberOfPages() - controller.getCurrentPageNumber() - 1; } if (deltaPage == 0) return; int newPage = controller.getCurrentPageNumber() + deltaPage; if (controller.getDocument() == null) { return; } if (newPage < 0) { deltaPage = -controller.getCurrentPageNumber(); } if (newPage >= controller.getDocument().getNumberOfPages()) { deltaPage = controller.getDocument().getNumberOfPages() - controller.getCurrentPageNumber() - 1; } if (deltaPage == 0) { return; } changingPage = true; final int dp = deltaPage; SwingUtilities.invokeLater(new Runnable() { public void run() { changingPage = false; controller.goToDeltaPage(dp); } }); } }