package org.icepdf.os.examples.javafx;
/*
* 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.
*/
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
import org.icepdf.ri.common.SwingController;
import org.icepdf.ri.common.SwingViewBuilder;
import org.icepdf.ri.util.FontPropertiesManager;
import org.icepdf.ri.util.PropertiesManager;
import javax.swing.*;
import java.awt.*;
import java.lang.reflect.InvocationTargetException;
import java.util.ResourceBundle;
/**
* Example of integrating ICEpdf into a JavaFX application using Java 8 and SwingNode.
*/
public class PdfFXViewer extends Application {
private static String pdfPath;
private SwingController swingController;
private JComponent viewerPanel;
public static void main(String[] args) {
pdfPath = args[0];
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
BorderPane borderPane = new BorderPane();
Scene scene = new Scene(borderPane);
// add viewer content pane
createViewer(borderPane);
borderPane.setPrefSize(1025, 600);
createResizeListeners(scene, viewerPanel);
primaryStage.setOnCloseRequest(we -> SwingUtilities.invokeLater(() -> swingController.dispose()));
primaryStage.setTitle("JavaFX PDF Viewer Demo");
primaryStage.setScene(scene);
primaryStage.sizeToScene();
primaryStage.centerOnScreen();
primaryStage.show();
openDocument(pdfPath);
}
private void createResizeListeners(Scene scene, JComponent viewerPanel) {
scene.widthProperty().addListener((observable, oldValue, newValue) -> {
SwingUtilities.invokeLater(() -> {
viewerPanel.setSize(new Dimension(newValue.intValue(), (int) scene.getHeight()));
viewerPanel.setPreferredSize(new Dimension(newValue.intValue(), (int) scene.getHeight()));
viewerPanel.repaint();
});
});
scene.heightProperty().addListener((observable, oldValue, newValue) -> {
SwingUtilities.invokeLater(() -> {
viewerPanel.setSize(new Dimension((int) scene.getWidth(), newValue.intValue()));
viewerPanel.setPreferredSize(new Dimension((int) scene.getWidth(), newValue.intValue()));
viewerPanel.repaint();
});
});
}
private void createViewer(BorderPane borderPane) {
try {
SwingUtilities.invokeAndWait(() -> {
// create the viewer ri components.
swingController = new SwingController();
swingController.setIsEmbeddedComponent(true);
PropertiesManager properties = new PropertiesManager(System.getProperties(),
ResourceBundle.getBundle(PropertiesManager.DEFAULT_MESSAGE_BUNDLE));
// read/store the font cache.
ResourceBundle messageBundle = ResourceBundle.getBundle(PropertiesManager.DEFAULT_MESSAGE_BUNDLE);
new FontPropertiesManager(properties, System.getProperties(), messageBundle);
properties.set(PropertiesManager.PROPERTY_DEFAULT_ZOOM_LEVEL, "1.25");
properties.set(PropertiesManager.PROPERTY_SHOW_UTILITY_OPEN, "false");
properties.set(PropertiesManager.PROPERTY_SHOW_UTILITY_SAVE, "false");
properties.set(PropertiesManager.PROPERTY_SHOW_UTILITY_PRINT, "false");
// hide the status bar
properties.set(PropertiesManager.PROPERTY_SHOW_STATUSBAR, "false");
// hide a few toolbars, just to show how the prefered size of the viewer changes.
properties.set(PropertiesManager.PROPERTY_SHOW_TOOLBAR_FIT, "false");
properties.set(PropertiesManager.PROPERTY_SHOW_TOOLBAR_ROTATE, "false");
properties.set(PropertiesManager.PROPERTY_SHOW_TOOLBAR_TOOL, "false");
properties.set(PropertiesManager.PROPERTY_SHOW_TOOLBAR_FORMS, "false");
swingController.getDocumentViewController().setAnnotationCallback(
new org.icepdf.ri.common.MyAnnotationCallback(swingController.getDocumentViewController()));
SwingViewBuilder factory = new SwingViewBuilder(swingController, properties);
viewerPanel = factory.buildViewerPanel();
viewerPanel.revalidate();
SwingNode swingNode = new SwingNode();
swingNode.setContent(viewerPanel);
borderPane.setCenter(swingNode);
/*
// add toolbar to the top.
FlowPane toolBarFlow = new FlowPane();
JToolBar mainToolbar = factory.buildCompleteToolBar(true);
buildJToolBar(toolBarFlow, mainToolbar);
borderPane.setTop(toolBarFlow);
// main utility pane and viewer
SwingNode swingNode = new SwingNode();
viewerPanel = factory.buildUtilityAndDocumentSplitPane(true);
swingNode.setContent(viewerPanel);
borderPane.setCenter(swingNode);
// the page view menubar
FlowPane statusBarFlow = new FlowPane();
buildButton(statusBarFlow, factory.buildPageViewSinglePageNonConToggleButton());
buildButton(statusBarFlow, factory.buildPageViewSinglePageConToggleButton());
buildButton(statusBarFlow, factory.buildPageViewFacingPageNonConToggleButton());
buildButton(statusBarFlow, factory.buildPageViewFacingPageConToggleButton());
borderPane.setBottom(statusBarFlow);
*/
});
} catch (InterruptedException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
private void openDocument(String document) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
swingController.openDocument(document);
viewerPanel.revalidate();
}
});
}
private void buildButton(FlowPane flowPane, AbstractButton jButton){
SwingNode swingNode = new SwingNode();
swingNode.setContent(jButton);
flowPane.getChildren().add(swingNode);
}
private void buildJToolBar(FlowPane flowPane, JToolBar jToolBar){
SwingNode swingNode = new SwingNode();
swingNode.setContent(jToolBar);
flowPane.getChildren().add(swingNode);
}
}