Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,45 +16,40 @@
package at.asit.pdfover.gui.composites;

// Imports
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Point2D;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ScrollBar;

import at.asit.pdfover.commons.Constants;
import at.asit.pdfover.gui.utils.SWTUtils;
import at.asit.pdfover.gui.workflow.states.State;
import at.asit.pdfover.signer.SignaturePosition;
import lombok.extern.slf4j.Slf4j;

/**
* Composite which allows to position the signature on a preview of the document
*/
public class PositioningComposite extends StateComposite {

SignaturePanel viewer = null;
Frame frame = null;
Composite mainArea = null;
Composite bottomBar = null;
Button btnNewPage = null;
Label lblPage = null;
ScrollBar scrollbar = null;
private final Display display;
private static final int MOUSE_WHEEL_PAGE_THRESHOLD = 3;
private int mouseWheelAccumulator = 0;

private SignaturePosition position = null;
int currentPage = 0;
Expand All @@ -69,6 +64,7 @@ public class PositioningComposite extends StateComposite {
*/
public PositioningComposite(Composite parent, int style, State state) {
super(parent, style, state);
this.display = getDisplay();
this.setLayout(new FormLayout());

this.bottomBar = new Composite(this, SWT.NONE);
Expand All @@ -85,20 +81,20 @@ public PositioningComposite(Composite parent, int style, State state) {
this.lblPage = new Label(this.bottomBar, SWT.CENTER);
SWTUtils.anchor(lblPage).left(0).right(btnNewPage, 5).bottom(100);

this.mainArea = new Composite(this, SWT.EMBEDDED | SWT.V_SCROLL);
this.mainArea = new Composite(this, SWT.V_SCROLL);
SWTUtils.anchor(mainArea).left(0).right(100).top(0).bottom(bottomBar, -5);
this.mainArea.setLayout(new FormLayout());
this.scrollbar = this.mainArea.getVerticalBar();

this.frame = SWT_AWT.new_Frame(this.mainArea);
this.frame.addKeyListener(this.keyListener);
this.frame.addMouseWheelListener(this.mouseListener);

this.viewer = new SignaturePanel();
this.viewer.setSignaturePlaceholderBorderColor(new Color(
Constants.MAINBAR_ACTIVE_BACK_DARK.getRed(),
Constants.MAINBAR_ACTIVE_BACK_DARK.getGreen(),
Constants.MAINBAR_ACTIVE_BACK_DARK.getBlue()));
this.frame.add(this.viewer, BorderLayout.CENTER);
this.viewer = new SignaturePanel(this.mainArea, SWT.NONE);
SWTUtils.anchor(viewer).left(0).right(100).top(0).bottom(100);
this.viewer.setSignaturePlaceholderBorderColor(Constants.MAINBAR_ACTIVE_BACK_DARK);
this.viewer.setSignaturePositionAvailableCallback(() -> {
if (!isDisposed() && !this.btnSign.isDisposed())
this.btnSign.setEnabled(true);
});
this.viewer.addKeyListener(this.keyListener);
this.viewer.addListener(SWT.MouseVerticalWheel, this::handleMouseWheel);

SWTUtils.addSelectionListener(btnNewPage, () -> {
if (this.currentPage > this.numPages)
Expand All @@ -125,10 +121,7 @@ public PositioningComposite(Composite parent, int style, State state) {
* document to display
*/
public void displayDocument(final PDDocument document) {
EventQueue.invokeLater(() -> {
this.viewer.setDocument(document);
getDisplay().asyncExec(() -> this.btnSign.setEnabled(true));
});
this.viewer.setDocument(document);

if (document != null)
{
Expand All @@ -138,26 +131,28 @@ public void displayDocument(final PDDocument document) {
}
}

public void clearDocument() {
if (this.viewer != null && !this.viewer.isDisposed())
this.viewer.setDocument(null);
}

@Override
public void dispose() {
this.viewer.setDocument(null);
clearDocument();
super.dispose();
}

/**
* Request focus (to enable keyboard input)
*/
public void requestFocus() {
getDisplay().asyncExec(() -> {
if (this.display.isDisposed())
return;
this.display.asyncExec(() -> {
if (!this.isDisposed() && !this.mainArea.isDisposed()) {
this.mainArea.setFocus();
EventQueue.invokeLater(() -> {
if (!this.isDisposed()) {
if (!this.frame.hasFocus()) {
this.frame.requestFocus();
}
}
});
if (!this.viewer.isDisposed())
this.viewer.setFocus();
}
});
}
Expand All @@ -173,61 +168,63 @@ public void requestFocus() {
* @param height
* height of the placeholder in page space
*/
public void setPlaceholder(final Image placeholder) {
EventQueue.invokeLater(() -> {
public void setPlaceholder(final ImageData placeholder) {
if (this.display.isDisposed())
return;
this.display.asyncExec(() -> {
if (isDisposed())
return;
if (this.viewer == null)
return;
this.viewer.setSignaturePlaceholder(placeholder);
});
}

KeyListener keyListener = new KeyAdapter() {
private KeyAdapter keyListener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int newPage = PositioningComposite.this.currentPage;
int sigXOffset = 0;
int sigYOffset = 0;

switch (e.getKeyCode()) {
case KeyEvent.VK_PAGE_DOWN:
switch (e.keyCode) {
case SWT.PAGE_DOWN:
if (PositioningComposite.this.currentPage < PositioningComposite.this.numPages)
++newPage;
break;

case KeyEvent.VK_PAGE_UP:
case SWT.PAGE_UP:
if (PositioningComposite.this.currentPage > 1)
--newPage;
break;

case KeyEvent.VK_END:
case SWT.END:
newPage = PositioningComposite.this.numPages;
break;

case KeyEvent.VK_HOME:
case SWT.HOME:
newPage = 1;
break;

case KeyEvent.VK_ENTER:
case SWT.CR:
case SWT.KEYPAD_CR:
e.doit = false;
setFinalPosition();
break;

case KeyEvent.VK_LEFT:
case KeyEvent.VK_KP_LEFT:
case SWT.ARROW_LEFT:
sigXOffset -= Constants.SIGNATURE_KEYBOARD_POSITIONING_OFFSET;
break;

case KeyEvent.VK_RIGHT:
case KeyEvent.VK_KP_RIGHT:
case SWT.ARROW_RIGHT:
sigXOffset += Constants.SIGNATURE_KEYBOARD_POSITIONING_OFFSET;
break;

case KeyEvent.VK_UP:
case KeyEvent.VK_KP_UP:
case SWT.ARROW_UP:
sigYOffset += Constants.SIGNATURE_KEYBOARD_POSITIONING_OFFSET;
break;

case KeyEvent.VK_DOWN:
case KeyEvent.VK_KP_DOWN:
case SWT.ARROW_DOWN:
sigYOffset -= Constants.SIGNATURE_KEYBOARD_POSITIONING_OFFSET;
break;
}
Expand All @@ -240,37 +237,33 @@ public void keyPressed(KeyEvent e) {
}
};

MouseWheelListener mouseListener = new MouseWheelListener() {
private long lastEventTime = 0;
private void handleMouseWheel(Event e) {
e.doit = false;

@Override
public void mouseWheelMoved(MouseWheelEvent e) {
e.consume();
// Workaround for Linux: Events fire twice
if (e.getWhen() == this.lastEventTime)
return;
this.lastEventTime = e.getWhen();

int change = e.isShiftDown() ? 5 : 1;
int newPage = PositioningComposite.this.currentPage;
int change = (e.stateMask & SWT.SHIFT) != 0 ? 5 : 1;
int newPage = PositioningComposite.this.currentPage;
this.mouseWheelAccumulator += e.count;

if (e.getWheelRotation() < 0) {
newPage = Math.max(1, newPage - change);
} else if (e.getWheelRotation() > 0) {
newPage = Math.min(newPage + change, PositioningComposite.this.numPages);
}

if (newPage != PositioningComposite.this.currentPage)
showPage(newPage);
if (this.mouseWheelAccumulator >= MOUSE_WHEEL_PAGE_THRESHOLD) {
newPage = Math.max(1, newPage - change);
this.mouseWheelAccumulator = 0;
} else if (this.mouseWheelAccumulator <= -MOUSE_WHEEL_PAGE_THRESHOLD) {
newPage = Math.min(newPage + change, PositioningComposite.this.numPages);
this.mouseWheelAccumulator = 0;
}
};

if (newPage != PositioningComposite.this.currentPage)
showPage(newPage);
}

private Button btnSign;

void showPage(final int page) {
final int previousPage = this.currentPage;
this.currentPage = page;
getDisplay().asyncExec(() -> {
if (this.display.isDisposed())
return;
this.display.asyncExec(() -> {
int currentPage = this.currentPage;
int numPages = this.numPages;
if ((previousPage > numPages) && (currentPage <= numPages)) {
Expand All @@ -289,9 +282,7 @@ void showPage(final int page) {
this.scrollbar.setSelection(currentPage);
SWTUtils.setLocalizedText(lblPage, "positioning.page", currentPage, numPages);
});
EventQueue.invokeLater(() -> {
PositioningComposite.this.viewer.showPage(page);
});
PositioningComposite.this.viewer.showPage(page);
}

/**
Expand All @@ -303,9 +294,7 @@ void showPage(final int page) {
* signature placeholder vertical position offset (negative is down)
*/
public void translateSignaturePosition(final int sigXOffset, final int sigYOffset) {
EventQueue.invokeLater(() -> {
this.viewer.translateSignaturePagePosition(sigXOffset, sigYOffset);
});
this.viewer.translateSignaturePagePosition(sigXOffset, sigYOffset);
}

/**
Expand Down
Loading
Loading