/*
* 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.
*/
public class KeyListenerPageColumnChanger extends KeyAdapter {
private SwingController controller;
private JScrollPane scroll;
private AbstractDocumentView documentView;
private CurrentPageChanger currentPageChanger;
/**
* 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 KeyListenerPageColumnChanger install(SwingController c, JScrollPane s,
AbstractDocumentView documentView,
CurrentPageChanger currentPageChanger) {
KeyListenerPageColumnChanger listener = null;
if (c != null && s != null) {
listener = new KeyListenerPageColumnChanger(c, s, documentView, currentPageChanger);
s.addKeyListener(listener);
}
return listener;
}
public void uninstall() {
if (scroll != null) {
scroll.removeKeyListener(this);
}
}
protected KeyListenerPageColumnChanger(SwingController c, JScrollPane s,
AbstractDocumentView documentView,
CurrentPageChanger currentPageChanger) {
controller = c;
scroll = s;
this.documentView = documentView;
changingPage = false;
this.currentPageChanger = currentPageChanger;
}
public void keyPressed(java.awt.event.KeyEvent e) {
if (changingPage)
return;
int deltaPage = 0;
int keyCode = e.getKeyCode();
if (keyCode == java.awt.event.KeyEvent.VK_PAGE_DOWN) {
deltaPage = documentView.getPreviousPageIncrement();
} else if (keyCode == java.awt.event.KeyEvent.VK_PAGE_UP) {
deltaPage = -documentView.getNextPageIncrement();
} 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;
}
changingPage = true;
final int dp = deltaPage;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
changingPage = false;
controller.goToDeltaPage(dp);
}
});
}
public void keyReleased(java.awt.event.KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == java.awt.event.KeyEvent.VK_UP ||
keyCode == java.awt.event.KeyEvent.VK_DOWN) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
currentPageChanger.calculateCurrentPage();
}
});
}
}
}