From aeafe96147a9c01c05da2d8104af0ceff3bb2616 Mon Sep 17 00:00:00 2001 From: Paolo Bernardi Date: Tue, 10 Nov 2020 16:41:56 +0100 Subject: [PATCH] Initial implementation --- .gitignore | 3 + .readme-files/pdfjuggler-logo-72.png | Bin 0 -> 2304 bytes .readme-files/screenshot.png | Bin 0 -> 45833 bytes Create-Package.ps1 | 26 + LICENSE | 4 +- README.md | 32 + graphics/icon-256.png | Bin 0 -> 11652 bytes graphics/icon-32.ico | Bin 0 -> 93062 bytes graphics/icon-32.png | Bin 0 -> 1195 bytes graphics/icon.svg | 127 +++ nb-configuration.xml | 18 + nbactions.xml | 46 + pom.xml | 75 ++ .../bernardi/pdfjuggler/AboutDialog.form | 228 +++++ .../bernardi/pdfjuggler/AboutDialog.java | 213 +++++ .../cloud/bernardi/pdfjuggler/Config.java | 131 +++ .../java/cloud/bernardi/pdfjuggler/Const.java | 61 ++ .../pdfjuggler/DndTransferHandler.java | 110 +++ .../cloud/bernardi/pdfjuggler/MainFrame.form | 432 +++++++++ .../cloud/bernardi/pdfjuggler/MainFrame.java | 831 ++++++++++++++++++ .../java/cloud/bernardi/pdfjuggler/Web.java | 57 ++ .../bernardi/pdfjuggler/icons/delete.png | Bin 0 -> 1119 bytes .../bernardi/pdfjuggler/icons/icon-256.png | Bin 0 -> 9026 bytes .../bernardi/pdfjuggler/icons/icon-32.png | Bin 0 -> 1050 bytes .../cloud/bernardi/pdfjuggler/icons/open.png | Bin 0 -> 599 bytes .../bernardi/pdfjuggler/icons/rotateleft.png | Bin 0 -> 805 bytes .../bernardi/pdfjuggler/icons/rotateright.png | Bin 0 -> 874 bytes .../bernardi/pdfjuggler/icons/saveas.png | Bin 0 -> 612 bytes .../bernardi/pdfjuggler/icons/zoomin.png | Bin 0 -> 975 bytes .../bernardi/pdfjuggler/icons/zoomout.png | Bin 0 -> 967 bytes 30 files changed, 2392 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 .readme-files/pdfjuggler-logo-72.png create mode 100644 .readme-files/screenshot.png create mode 100644 Create-Package.ps1 create mode 100644 README.md create mode 100644 graphics/icon-256.png create mode 100644 graphics/icon-32.ico create mode 100644 graphics/icon-32.png create mode 100644 graphics/icon.svg create mode 100644 nb-configuration.xml create mode 100644 nbactions.xml create mode 100644 pom.xml create mode 100644 src/main/java/cloud/bernardi/pdfjuggler/AboutDialog.form create mode 100644 src/main/java/cloud/bernardi/pdfjuggler/AboutDialog.java create mode 100644 src/main/java/cloud/bernardi/pdfjuggler/Config.java create mode 100644 src/main/java/cloud/bernardi/pdfjuggler/Const.java create mode 100644 src/main/java/cloud/bernardi/pdfjuggler/DndTransferHandler.java create mode 100644 src/main/java/cloud/bernardi/pdfjuggler/MainFrame.form create mode 100644 src/main/java/cloud/bernardi/pdfjuggler/MainFrame.java create mode 100644 src/main/java/cloud/bernardi/pdfjuggler/Web.java create mode 100644 src/main/resources/cloud/bernardi/pdfjuggler/icons/delete.png create mode 100644 src/main/resources/cloud/bernardi/pdfjuggler/icons/icon-256.png create mode 100644 src/main/resources/cloud/bernardi/pdfjuggler/icons/icon-32.png create mode 100644 src/main/resources/cloud/bernardi/pdfjuggler/icons/open.png create mode 100644 src/main/resources/cloud/bernardi/pdfjuggler/icons/rotateleft.png create mode 100644 src/main/resources/cloud/bernardi/pdfjuggler/icons/rotateright.png create mode 100644 src/main/resources/cloud/bernardi/pdfjuggler/icons/saveas.png create mode 100644 src/main/resources/cloud/bernardi/pdfjuggler/icons/zoomin.png create mode 100644 src/main/resources/cloud/bernardi/pdfjuggler/icons/zoomout.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..04a70f5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.class +/target +/package \ No newline at end of file diff --git a/.readme-files/pdfjuggler-logo-72.png b/.readme-files/pdfjuggler-logo-72.png new file mode 100644 index 0000000000000000000000000000000000000000..9a223519a3b567e950eeb4d1a380ecbd60d65c36 GIT binary patch literal 2304 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 DZW(;i literal 0 HcmV?d00001 diff --git a/Create-Package.ps1 b/Create-Package.ps1 new file mode 100644 index 0000000..1fd1666 --- /dev/null +++ b/Create-Package.ps1 @@ -0,0 +1,26 @@ +# Create the Microsoft Windows installation package +# and the default self-contained Jar package + +# Change it! +$Version = "1.0" + +Remove-Item -Recurse -Force .\package +mvn clean +mvn install +jpackage ` + --input .\target ` + --dest .\package ` + --main-class cloud.bernardi.pdfjuggler.MainFrame ` + --main-jar pdfjuggler-${Version}-jar-with-dependencies.jar ` + --icon graphics/icon-32.ico ` + --description "Sort, merge and cut the pages of PDF documents." ` + --copyright "Copyright 2020 Paolo Bernardi" ` + --name "PDF Juggler" ` + --app-version "${Version}" ` + --license-file LICENSE ` + --vendor "Paolo Bernardi" ` + --win-menu ` + --win-per-user-install +Copy-Item ".\target\pdfjuggler-${Version}-jar-with-dependencies.jar" .\package +Rename-Item ".\package\pdfjuggler-${Version}-jar-with-dependencies.jar" "pdfjuggler-${Version}.jar" +Rename-Item ".\package\PDF Juggler-${Version}.exe" "pdfjuggler-${Version}.exe" \ No newline at end of file diff --git a/LICENSE b/LICENSE index f288702..55d219d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies diff --git a/README.md b/README.md new file mode 100644 index 0000000..5d71c9d --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ + + PDF Juggler logo + + +# PDF Juggler +> A desktop tool to mix, reorder and select PDF pages + +[![Java](https://img.shields.io/badge/java-v1.8-blue.svg)](https://adoptopenjdk.net/) +[![License](https://img.shields.io/github/license/bernarpa/pdfjuggler.svg)](https://opensource.org/licenses/GPL-3.0) +[![GitHub issues](https://img.shields.io/github/issues/bernarpa/pdfjuggler.svg)](https://github.com/bernarpa/pdfjuggler/issues) + +## Table of contents + +- [What is PDF Juggler](#what-is-pdf-juggler) +- [What does it look like](#what-does-it-look-like) +- [License](#license) + +## What is PDF Juggler + +PDF Juggler is a simple desktop tool to mix, reorder and select PDF pages. Drop your PDFs into the PDF Juggler window, move the pages around, delete them, rotate them, save the result and you're done! + +This tool is a clone of [PDF Shuffler](https://sourceforge.net/projects/pdfshuffler/) and [PDF Arranger](https://github.com/pdfarranger/pdfarranger/), which are a must have for anyone who deals with PDF files. Why did I build PDF Juggler, then? To pay my daily tribute to universal firstly, and to have a flawless experience on Microsoft Windows secondly. :-) + +## What does it look like + +Nothing fancy: + +![Image](.readme-files/screenshot.png) + +# License + +PDF Juggler is licensed under the terms of the GNU General Public License version 3. diff --git a/graphics/icon-256.png b/graphics/icon-256.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce66e4779e5a7bd2581b697aeb9684f54c95675 GIT binary patch literal 11652 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 E56NdXFaQ7m literal 0 HcmV?d00001 diff --git a/graphics/icon-32.ico b/graphics/icon-32.ico new file mode 100644 index 0000000000000000000000000000000000000000..de1a662b26c303f7c486920306b8b4716d8bf16b GIT binary patch literal 93062 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 Is3vUx0b*(h9smFU literal 0 HcmV?d00001 diff --git a/graphics/icon-32.png b/graphics/icon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..fa205b64d2280df9a07d0cfa9c0455d161fc8ae9 GIT binary patch literal 1195 zcmV;c1XTNpP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11UN}V zK~z|Uy_RikQ&kwp|L2^x_x5&cn;{Ig!DKILh>npIGC^mN_)Q~*pnfoDoZ?*I!!RMj zr$wFPgNaOZ#>7NpqEUw=u$V<=q$vy*jR7~;!VoGO8|_}8ExWyax%V7D%q2v&wYRdJ zkI(%-|MSapp7Y!T+=CT~gbs}j^^1|=p&!iVQnLx+aHx6g%Ae;)MuKg3gozQ2!^(M; zSwD-}1VYGa{YIqLTDp=0H~;|AufDAlF%^Q+wTliAKhga#O=Xa}Fi<)hOF3NIo$dm6 zg6qje2aqWLAVH}g5TmoPnx>{(0B)J}0sxY$FdPoO2u>fo7FWIjzia7`mZ|Cs}X$8Z0Yi*L?7@ZUAi zyvHLw@Zdf{DAj^PAJ?|GpUKB3YXwA03k_K4+mu2IpZw+Btv;U~+_h_&Twni(|2(bylNKP9{@Pbr1kpdD#=xE)!4&o)IFOKg%X)P?W2-%8Hk)B`clGRao|_ z+c~=a@R9C@`zs0wP?d>HYSaGSFKgNkb@cClYrE?y?>^>o$*I9hCbvetK+a(cMCYItA1(xFF4l2t805YRv)6+km zJbv@+ug`BfdUV0k&o0w*;E%m;))j1i^s|B|>uc_etEbOhoIZW#jhgmP{AT=2KS!=C?%s^d5nC((0y0+x^0CSjV6OeKgcT5T zyJ0hj^+Ml6=fOx>IrICKdC1fg~S;A$cvRCVSl zZnfD@dA+7z*`@(bdA$~5v&jG;5{V?&(n$cI4n>wE$+_qNk|a54fno;$kxFX>A^`wY zu`4oTg^LbgCw3=wC<*|8b4_qv`xii_PJ5AAKhtLhi*6-!=ASHd<2Kg~4FJHH;5LWp zMl=mj>+xK< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nb-configuration.xml b/nb-configuration.xml new file mode 100644 index 0000000..98cd079 --- /dev/null +++ b/nb-configuration.xml @@ -0,0 +1,18 @@ + + + + + + gpl30 + + diff --git a/nbactions.xml b/nbactions.xml new file mode 100644 index 0000000..f45478a --- /dev/null +++ b/nbactions.xml @@ -0,0 +1,46 @@ + + + + run + + jar + + + process-classes + org.codehaus.mojo:exec-maven-plugin:1.5.0:exec + + + -classpath %classpath cloud.bernardi.pdfjuggler.MainFrame + java + + + + debug + + jar + + + process-classes + org.codehaus.mojo:exec-maven-plugin:1.5.0:exec + + + -agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address} -classpath %classpath cloud.bernardi.pdfjuggler.MainFrame + java + true + + + + profile + + jar + + + process-classes + org.codehaus.mojo:exec-maven-plugin:1.5.0:exec + + + -classpath %classpath cloud.bernardi.pdfjuggler.MainFrame + java + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..3c59824 --- /dev/null +++ b/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + cloud.bernardi + pdfjuggler + 1.0 + jar + + UTF-8 + 1.8 + 1.8 + + + + org.apache.pdfbox + pdfbox + 2.0.21 + + + org.apache.pdfbox + pdfbox-tools + 2.0.21 + + + org.apache.pdfbox + jbig2-imageio + 3.0.0 + + + org.bouncycastle + bcprov-jdk15on + 1.64 + + + + org.bouncycastle + bcmail-jdk15on + 1.64 + + + + org.bouncycastle + bcpkix-jdk15on + 1.64 + + + + + + maven-assembly-plugin + + + package + + single + + + + + + + + cloud.bernardi.pdfjuggler.MainFrame + + + + + jar-with-dependencies + + + + + + pdfjuggler + \ No newline at end of file diff --git a/src/main/java/cloud/bernardi/pdfjuggler/AboutDialog.form b/src/main/java/cloud/bernardi/pdfjuggler/AboutDialog.form new file mode 100644 index 0000000..027b355 --- /dev/null +++ b/src/main/java/cloud/bernardi/pdfjuggler/AboutDialog.form @@ -0,0 +1,228 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/cloud/bernardi/pdfjuggler/AboutDialog.java b/src/main/java/cloud/bernardi/pdfjuggler/AboutDialog.java new file mode 100644 index 0000000..52f068f --- /dev/null +++ b/src/main/java/cloud/bernardi/pdfjuggler/AboutDialog.java @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2020 Paolo Bernardi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cloud.bernardi.pdfjuggler; + +/** + * About dialog window. + * + * @author rnd + */ +public class AboutDialog extends javax.swing.JDialog { + + /** + * Create the About dialog window. + * + * @param parent + * @param modal + */ + public AboutDialog(java.awt.Frame parent, boolean modal) { + super(parent, modal); + initComponents(); + setTitle("About " + Const.APPNAME); + lbProgramName.setText(Const.APPNAME); + lbVersion.setText("Version " + Const.VERSION); + lbCopyright.setText(Const.COPYRIGHT); + lbLicense.setText(Const.LICENSE); + lbWebsite.setText(Const.WEBSITE); + lbGitHub.setText(Const.GIT_HUB); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + javax.swing.JLabel jLabel1 = new javax.swing.JLabel(); + btClose = new javax.swing.JButton(); + jPanel1 = new javax.swing.JPanel(); + lbProgramName = new javax.swing.JLabel(); + lbVersion = new javax.swing.JLabel(); + lbCopyright = new javax.swing.JLabel(); + lbWebsite = new javax.swing.JLabel(); + jLabel2 = new javax.swing.JLabel(); + javax.swing.JLabel jLabel3 = new javax.swing.JLabel(); + lbGitHub = new javax.swing.JLabel(); + lbLicense = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setMaximumSize(new java.awt.Dimension(700, 400)); + setMinimumSize(new java.awt.Dimension(700, 400)); + setPreferredSize(new java.awt.Dimension(700, 400)); + setResizable(false); + + jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cloud/bernardi/pdfjuggler/icons/icon-256.png"))); // NOI18N + + btClose.setText("Close"); + btClose.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btCloseActionPerformed(evt); + } + }); + + lbProgramName.setFont(new java.awt.Font("SansSerif", 1, 36)); // NOI18N + lbProgramName.setText("PDF Juggler"); + + lbVersion.setFont(new java.awt.Font("SansSerif", 0, 13)); // NOI18N + lbVersion.setText("Version: x.y"); + + lbCopyright.setFont(new java.awt.Font("SansSerif", 0, 13)); // NOI18N + lbCopyright.setText("Copyright"); + + lbWebsite.setFont(new java.awt.Font("SansSerif", 0, 13)); // NOI18N + lbWebsite.setForeground(javax.swing.UIManager.getDefaults().getColor("textHighlight")); + lbWebsite.setText("Website"); + lbWebsite.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + lbWebsite.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + lbWebsiteMouseClicked(evt); + } + }); + + jLabel2.setFont(new java.awt.Font("SansSerif", 0, 13)); // NOI18N + jLabel2.setText("Website:"); + + jLabel3.setFont(new java.awt.Font("SansSerif", 0, 13)); // NOI18N + jLabel3.setText("GitHub:"); + + lbGitHub.setFont(new java.awt.Font("SansSerif", 0, 13)); // NOI18N + lbGitHub.setForeground(javax.swing.UIManager.getDefaults().getColor("textHighlight")); + lbGitHub.setText("GitHub"); + lbGitHub.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + lbGitHub.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + lbGitHubMouseClicked(evt); + } + }); + + lbLicense.setFont(new java.awt.Font("SansSerif", 0, 13)); // NOI18N + lbLicense.setText("License"); + + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbProgramName) + .addComponent(lbVersion) + .addComponent(lbCopyright) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbGitHub) + .addComponent(lbWebsite))) + .addComponent(lbLicense)) + .addContainerGap(140, Short.MAX_VALUE)) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addComponent(lbProgramName) + .addGap(18, 18, 18) + .addComponent(lbVersion) + .addGap(4, 4, 4) + .addComponent(lbCopyright) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbLicense) + .addGap(18, 18, 18) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbWebsite) + .addComponent(jLabel2)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel3) + .addComponent(lbGitHub)) + .addContainerGap(74, Short.MAX_VALUE)) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 256, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(btClose, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 31, Short.MAX_VALUE) + .addComponent(btClose) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void btCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btCloseActionPerformed + dispose(); + }//GEN-LAST:event_btCloseActionPerformed + + private void lbWebsiteMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lbWebsiteMouseClicked + Web.openWebsite(Const.WEBSITE); + }//GEN-LAST:event_lbWebsiteMouseClicked + + private void lbGitHubMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lbGitHubMouseClicked + Web.openWebsite(Const.GIT_HUB); + }//GEN-LAST:event_lbGitHubMouseClicked + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton btClose; + private javax.swing.JLabel jLabel2; + private javax.swing.JPanel jPanel1; + private javax.swing.JLabel lbCopyright; + private javax.swing.JLabel lbGitHub; + private javax.swing.JLabel lbLicense; + private javax.swing.JLabel lbProgramName; + private javax.swing.JLabel lbVersion; + private javax.swing.JLabel lbWebsite; + // End of variables declaration//GEN-END:variables +} diff --git a/src/main/java/cloud/bernardi/pdfjuggler/Config.java b/src/main/java/cloud/bernardi/pdfjuggler/Config.java new file mode 100644 index 0000000..043364b --- /dev/null +++ b/src/main/java/cloud/bernardi/pdfjuggler/Config.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2020 Paolo Bernardi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cloud.bernardi.pdfjuggler; + +import java.awt.Rectangle; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Persistent application configuration. + * + * @author rnd + */ +public class Config { + + private int thumbWidth = MainFrame.DEFAULT_THUMB_WIDTH; + private int thumbHeight = MainFrame.DEFAULT_THUMB_HEIGHT; + private Rectangle bounds; + private File lastOpenDir; + + private File getFile() { + String home = System.getProperty("user.home"); + return new File(home, ".pdfjuggler.properties"); + } + + /** + * Load the application configuration file (if any) and apply the settings + * to the MainFrame. + * + * @param window + */ + public void load(MainFrame window) { + File configFile = getFile(); + if (!configFile.exists()) { + return; + } + Properties prop = new Properties(); + try (InputStream input = new FileInputStream(configFile)) { + prop.load(input); + String x = prop.getProperty("x"); + String y = prop.getProperty("y"); + String width = prop.getProperty("width"); + String height = prop.getProperty("height"); + if (x != null && y != null && width != null && height != null) { + bounds = new Rectangle( + Integer.parseInt(x), + Integer.parseInt(y), + Integer.parseInt(width), + Integer.parseInt(height) + ); + window.setBounds(bounds); + } + String lastOpenDirStr = prop.getProperty("lastOpenDir"); + if (lastOpenDirStr != null) { + lastOpenDir = new File(lastOpenDirStr); + if (lastOpenDir.exists()) { + window.lastOpenDir = lastOpenDir; + } + } + String thumbWidthStr = prop.getProperty("thumbWidth"); + String thumbHeightStr = prop.getProperty("thumbHeight"); + if (thumbWidthStr != null && thumbHeightStr != null) { + window.thumbWidth = Integer.parseInt(thumbWidthStr); + window.thumbHeight = Integer.parseInt(thumbHeightStr); + } + } catch (IOException ex) { + Logger.getLogger(Config.class.getName()).log(Level.WARNING, null, ex); + } + } + + /** + * Set the in-memory configuration from the MainFrame status. + * + * @param window + */ + public void set(MainFrame window) { + if (!window.isMaximized) { + bounds = window.getBounds(); + } + lastOpenDir = window.lastOpenDir; + thumbWidth = window.thumbWidth; + thumbHeight = window.thumbHeight; + } + + /** + * Save the in-memory configuration to a file. + * + * @param window + */ + public void save(MainFrame window) { + set(window); + Properties prop = new Properties(); + if (bounds != null) { + prop.setProperty("x", "" + bounds.x); + prop.setProperty("y", "" + bounds.y); + prop.setProperty("width", "" + bounds.width); + prop.setProperty("height", "" + bounds.height); + } + if (lastOpenDir != null) { + prop.setProperty("lastOpenDir", lastOpenDir.getAbsolutePath()); + } + prop.setProperty("thumbWidth", "" + thumbWidth); + prop.setProperty("thumbHeight", "" + thumbHeight); + try (OutputStream output = new FileOutputStream(getFile())) { + prop.store(output, null); + } catch (IOException ex) { + Logger.getLogger(Config.class.getName()).log(Level.WARNING, null, ex); + } + } +} diff --git a/src/main/java/cloud/bernardi/pdfjuggler/Const.java b/src/main/java/cloud/bernardi/pdfjuggler/Const.java new file mode 100644 index 0000000..87c2165 --- /dev/null +++ b/src/main/java/cloud/bernardi/pdfjuggler/Const.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2020 Paolo Bernardi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cloud.bernardi.pdfjuggler; + +/** + * Application-level constants. + * + * @author rnd + */ +public class Const { + + /** + * Name of the application. + */ + public static final String APPNAME = "PDF Juggler"; + + /** + * Version of the application. + */ + public static final String VERSION = "1.0"; + + /** + * Copyright information. + */ + public static final String COPYRIGHT = "Copyright 2020 Paolo Bernardi"; + + /** + * Application license. + */ + public static final String LICENSE = "Licensed under the terms of the GPL 3 or any later version."; + + /** + * Application website. + */ + public static final String WEBSITE = "https://www.bernardi.cloud/pdfjuggler/"; + + /** + * Application GitHub page. + */ + public static final String GIT_HUB = "https://www.github.com/bernarpa/pdfjuggler/"; + + /** + * Online help page. + */ + public static final String ONLINE_HELP = "https://www.bernardi.cloud/pdfjuggler/help/"; + +} diff --git a/src/main/java/cloud/bernardi/pdfjuggler/DndTransferHandler.java b/src/main/java/cloud/bernardi/pdfjuggler/DndTransferHandler.java new file mode 100644 index 0000000..3df70fe --- /dev/null +++ b/src/main/java/cloud/bernardi/pdfjuggler/DndTransferHandler.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2020 Paolo Bernardi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cloud.bernardi.pdfjuggler; + +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.File; +import java.io.IOException; +import java.util.List; +import javax.swing.DefaultListModel; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.TransferHandler; +import static javax.swing.TransferHandler.MOVE; + +/** + * Drag&drop transfer handler that supports both internal item reordering and + * external files import. + * + * Adapted from + * https://stackoverflow.com/questions/16586562/reordering-jlist-with-drag-and-drop + * + * @author rnd + */ +public class DndTransferHandler extends TransferHandler { + + private final JList dndList; + private final DefaultListModel strings; + private int index; + private boolean beforeIndex = false; // Start with `false` therefore if it is removed from or added to the list it still works + private MainFrame mainFrame; + + /** + * Create a new drag&drop transfer handler. + * + * @param dndList + * @param strings + * @param mainFrame + */ + public DndTransferHandler(JList dndList, DefaultListModel strings, MainFrame mainFrame) { + this.dndList = dndList; + this.strings = strings; + this.mainFrame = mainFrame; + } + + @Override + public int getSourceActions(JComponent comp) { + return MOVE; + } + + @Override + public Transferable createTransferable(JComponent comp) { + index = dndList.getSelectedIndex(); + return new StringSelection(dndList.getSelectedValue()); + } + + @Override + public void exportDone(JComponent comp, Transferable trans, int action) { + if (action == MOVE) { + if (beforeIndex) { + strings.remove(index + 1); + } else { + strings.remove(index); + } + } + } + + @Override + public boolean canImport(TransferHandler.TransferSupport support) { + return support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) || support.isDataFlavorSupported(DataFlavor.stringFlavor); + } + + @Override + public boolean importData(TransferHandler.TransferSupport support) { + try { + String s = (String) support.getTransferable().getTransferData(DataFlavor.stringFlavor); + JList.DropLocation dl = (JList.DropLocation) support.getDropLocation(); + strings.add(dl.getIndex(), s); + beforeIndex = dl.getIndex() < index; + return true; + } catch (UnsupportedFlavorException ex0) { + try { + List files = (List) support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); + mainFrame.addPdfFiles(files.toArray(new File[0])); + } catch (UnsupportedFlavorException | IOException ex1) { + java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex1); + } + } catch (IOException ex2) { + java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex2); + } + + return false; + } +} diff --git a/src/main/java/cloud/bernardi/pdfjuggler/MainFrame.form b/src/main/java/cloud/bernardi/pdfjuggler/MainFrame.form new file mode 100644 index 0000000..adfa13e --- /dev/null +++ b/src/main/java/cloud/bernardi/pdfjuggler/MainFrame.form @@ -0,0 +1,432 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/cloud/bernardi/pdfjuggler/MainFrame.java b/src/main/java/cloud/bernardi/pdfjuggler/MainFrame.java new file mode 100644 index 0000000..7a12dc3 --- /dev/null +++ b/src/main/java/cloud/bernardi/pdfjuggler/MainFrame.java @@ -0,0 +1,831 @@ +/* + * Copyright (C) 2020 Paolo Bernardi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cloud.bernardi.pdfjuggler; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Rectangle; +import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import javax.imageio.ImageIO; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.ImageIcon; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; +import javax.swing.filechooser.FileNameExtensionFilter; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageTree; +import org.apache.pdfbox.rendering.ImageType; +import org.apache.pdfbox.rendering.PDFRenderer; + +/** + * + * @author rnd + */ +public class MainFrame extends JFrame { + + /** + * Default thumbnail width, in pixels. + */ + public static final int DEFAULT_THUMB_WIDTH = 85; + + /** + * Default thumbnail height, in pixels. + */ + public static final int DEFAULT_THUMB_HEIGHT = 110; + + private static final int MIN_THUMB_WIDTH = DEFAULT_THUMB_WIDTH - 50; + private static final int MIN_THUMB_HEIGHT = DEFAULT_THUMB_HEIGHT - 50; + private static final int MAX_THUMB_WIDTH = DEFAULT_THUMB_WIDTH + 50; + private static final int MAX_THUMB_HEIGHT = DEFAULT_THUMB_HEIGHT + 50; + private static final int DEFAULT_THUMB_DPI = 10; + + private final Map pageMap = new HashMap<>(); + private final DefaultListModel pageListModel; + + // Package-local parameters for the persistent configuration + boolean isMaximized; + File lastOpenDir; + int thumbWidth = DEFAULT_THUMB_WIDTH; + int thumbHeight = DEFAULT_THUMB_HEIGHT; + private final Config config = new Config(); + + class Page { + + private static final int MAX_FILENAME_LENGTH = 15; + + public int index; + public File file; + public BufferedImage thumbnail; + public int rotation; + + public Page(int index, File file, BufferedImage thumbnail) { + this.index = index; + this.file = file; + this.thumbnail = thumbnail; + } + + private BufferedImage resize(BufferedImage img, int newW, int newH) { + Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH); + BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = dimg.createGraphics(); + g2d.drawImage(tmp, 0, 0, null); + g2d.dispose(); + return dimg; + } + + public void rotate(int degrees) { + rotation += degrees; + AffineTransform tx = new AffineTransform(); + double radians = degrees * Math.PI / 180; + tx.rotate(radians, thumbnail.getWidth() / 2, thumbnail.getHeight() / 2); + AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); + thumbnail = op.filter(thumbnail, null); + } + + public String getCaption() { + String fileName = this.file.getName(); + int fileNameLen = fileName.length(); + if (fileNameLen > MAX_FILENAME_LENGTH) { + fileName = fileName.substring(0, MAX_FILENAME_LENGTH - 2) + "…"; + } + int page = this.index + 1; + return String.format("
%s
Page %d
", fileName, page); + } + + public ImageIcon getThumbnail() { + int w = thumbnail.getWidth(); + int h = thumbnail.getHeight(); + int newW = 0; + int newH = 0; + if (h > w) { + newH = thumbHeight; + newW = w * thumbHeight / h; + } else { + newW = thumbWidth; + newH = h * thumbWidth / w; + } + return new ImageIcon(this.resize(thumbnail, newW, newH)); + } + } + + class ImageListRenderer extends DefaultListCellRenderer { + + private final Font font = new Font("helvetica", Font.PLAIN, 12); + + @Override + public Component getListCellRendererComponent( + JList list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + + Page page = pageMap.get(value.toString()); + JLabel label = (JLabel) super.getListCellRendererComponent( + list, page.getCaption(), index, isSelected, cellHasFocus); + label.setIcon(page.getThumbnail()); + label.setHorizontalTextPosition(JLabel.CENTER); + label.setVerticalTextPosition(JLabel.BOTTOM); + label.setFont(font); + return label; + } + } + + /** + * Creates new form NewJFrame + */ + public MainFrame() { + initComponents(); + setTitle(Const.APPNAME); + BufferedImage image; + try { + image = ImageIO.read(getClass().getResource("/cloud/bernardi/pdfjuggler/icons/icon-32.png")); + setIconImage(image); + } catch (IOException ex) { + // NOP + } + pageList.setCellRenderer(new ImageListRenderer()); + pageListModel = (DefaultListModel) pageList.getModel(); + pageList.setTransferHandler(new DndTransferHandler(pageList, pageListModel, this)); + pbStatus.setVisible(false); + config.load(this); + } + + private void addPdfFiles() { + JFileChooser fileChooser = new JFileChooser(); + if (lastOpenDir == null) { + lastOpenDir = new File(System.getProperty("user.home")); + } + fileChooser.setCurrentDirectory(lastOpenDir); + fileChooser.setMultiSelectionEnabled(true); + fileChooser.setFileFilter(new FileNameExtensionFilter("PDF Files", "pdf")); + int result = fileChooser.showOpenDialog(this); + if (result == JFileChooser.APPROVE_OPTION) { + File[] selectedFiles = fileChooser.getSelectedFiles(); + if (selectedFiles.length > 0) { + addPdfFiles(selectedFiles); + lastOpenDir = selectedFiles[0].getParentFile(); + config.set(this); + } + } + } + + void addPdfFiles(File[] pdfFiles) { + final MainFrame mainFrame = this; + new Thread(() -> { + int offset = pageListModel.size(); + for (File pdfFile : pdfFiles) { + try (PDDocument document = PDDocument.load(pdfFile)) { + PDFRenderer pdfRenderer = new PDFRenderer(document); + int numPages = document.getNumberOfPages(); + pbStatus.setVisible(true); + pbStatus.setString("Loading PDF..."); + pbStatus.setMaximum(numPages); + for (int page = 0; page < numPages; ++page) { + BufferedImage bim = pdfRenderer.renderImageWithDPI(page, DEFAULT_THUMB_DPI, ImageType.RGB); + final String key = "" + (offset + page); + final int realPage = page + 1; + final int offsettedPage = offset + page; + pageMap.put(key, new Page(page, pdfFile, bim)); + SwingUtilities.invokeLater(() -> { + pbStatus.setValue(realPage); + pageListModel.add(offsettedPage, key); + }); + } + SwingUtilities.invokeLater(() -> { + pbStatus.setValue(0); + pbStatus.setString(""); + pbStatus.setVisible(false); + }); + offset += numPages; + } catch (IOException ex) { + SwingUtilities.invokeLater(() -> { + JOptionPane.showMessageDialog(mainFrame, "Error while reading PDF file", Const.APPNAME, JOptionPane.ERROR_MESSAGE); + }); + } + } + }).start(); + } + + private void savePdf() { + if (pageListModel.isEmpty()) { + return; + } + JFileChooser fileChooser = new JFileChooser(); + if (lastOpenDir == null) { + lastOpenDir = new File(System.getProperty("user.home")); + } + fileChooser.setCurrentDirectory(lastOpenDir); + fileChooser.setFileFilter(new FileNameExtensionFilter("PDF Files", "pdf")); + int result = fileChooser.showSaveDialog(this); + if (result == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + if (!selectedFile.getName().toLowerCase().endsWith(".pdf")) { + selectedFile = new File(selectedFile.getAbsolutePath() + ".pdf"); + } + savePdf(selectedFile); + lastOpenDir = selectedFile.getParentFile(); + config.set(this); + } + } + + private void savePdf(File file) { + final MainFrame mainFrame = this; + new Thread(() -> { + Map pdfMap = new HashMap<>(); + PDDocument newDoc = new PDDocument(); + Enumeration e = pageListModel.elements(); + int numPages = pageListModel.size(); + pbStatus.setString("Saving PDF..."); + pbStatus.setMaximum(numPages); + try { + int count = 0; + while (e.hasMoreElements()) { + String key = (String) e.nextElement(); + Page page = pageMap.get(key); + PDPageTree allPages; + if (!pdfMap.containsKey(page.file)) { + PDDocument sourcePdf = PDDocument.load(page.file); + allPages = sourcePdf.getDocumentCatalog().getPages(); + pdfMap.put(page.file, allPages); + } else { + allPages = pdfMap.get(page.file); + } + PDPage sourcePage = allPages.get(page.index); + sourcePage.setRotation(page.rotation); + newDoc.addPage(sourcePage); + ++count; + final int realPage = count; + SwingUtilities.invokeLater(() -> { + pbStatus.setValue(realPage); + }); + } + newDoc.save(file); + SwingUtilities.invokeLater(() -> { + pbStatus.setValue(0); + pbStatus.setString(""); + JOptionPane.showMessageDialog(mainFrame, "The PDF file was saved correctly", Const.APPNAME, JOptionPane.INFORMATION_MESSAGE); + }); + } catch (IOException ex) { + JOptionPane.showMessageDialog(mainFrame, "Error while reading PDF file", Const.APPNAME, JOptionPane.ERROR_MESSAGE); + } + }).start(); + } + + private void removeAllPages() { + if (pageListModel.isEmpty()) { + return; + } + int result = JOptionPane.showConfirmDialog(this, "Do you really want to remove all pages?", Const.APPNAME, + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE); + if (result == JOptionPane.YES_OPTION) { + pageListModel.removeAllElements(); + pageMap.clear(); + } + } + + private void removeSelectedPages() { + if (pageListModel.isEmpty()) { + return; + } + int[] selection = pageList.getSelectedIndices(); + if (selection.length == 0) { + return; + } + for (int i = 0; i < selection.length; ++i) { + String key = (String) pageListModel.remove(selection[i]); + pageMap.remove(key); + for (int k = i + 1; k < selection.length; k++) { + if (selection[k] > selection[i]) { + --selection[k]; + } + } + } + int size = pageListModel.size(); + if (selection[0] < size) { + pageList.setSelectedIndex(selection[0]); + } else { + pageList.setSelectedIndex(size - 1); + } + } + + private void closeApplication() { + config.save(this); + dispose(); + } + + private void showAboutDialog() { + AboutDialog ad = new AboutDialog(this, true); + Rectangle mfBounds = getBounds(); + int mfcx = mfBounds.x + (mfBounds.width / 2); + int mfcy = mfBounds.y + (mfBounds.height / 2); + Rectangle adBounds = ad.getBounds(); + Dimension preferred = ad.getPreferredSize(); + adBounds.width = preferred.width; + adBounds.height = preferred.height; + adBounds.x = mfcx - adBounds.width / 2; + adBounds.y = mfcy - adBounds.height / 2; + ad.setBounds(adBounds); + ad.setVisible(true); + } + + private void openOnlineHelp() { + Web.openWebsite(Const.ONLINE_HELP); + } + + private void rotateSelection(int degrees) { + int[] selection = pageList.getSelectedIndices(); + for (int i : selection) { + String key = (String) pageListModel.get(i); + Page page = pageMap.get(key); + page.rotate(degrees); + } + pageList.repaint(); + } + + private void zoom(int pixels) { + if (pageListModel.isEmpty()) { + return; + } + int newThumbWidth = thumbWidth + pixels; + int newThumbHeight = thumbHeight + pixels; + if (newThumbWidth >= MIN_THUMB_WIDTH + && newThumbWidth <= MAX_THUMB_WIDTH + && newThumbHeight >= MIN_THUMB_HEIGHT + && newThumbHeight <= MAX_THUMB_HEIGHT) { + thumbWidth = newThumbWidth; + thumbHeight = newThumbHeight; + // TODO: this could be done way better... however, repaint/revalidate won't do + pageListModel.set(0, pageListModel.get(0)); + config.set(this); + } + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + javax.swing.JToolBar jToolBar1 = new javax.swing.JToolBar(); + btAddFile = new javax.swing.JButton(); + btSave = new javax.swing.JButton(); + btZoomIn = new javax.swing.JButton(); + btZoomOut = new javax.swing.JButton(); + btRotateClockwise = new javax.swing.JButton(); + btRotateCounterclockwise = new javax.swing.JButton(); + btRemoveSelectedPages = new javax.swing.JButton(); + javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane(); + pageList = new javax.swing.JList<>(); + pbStatus = new javax.swing.JProgressBar(); + javax.swing.JMenuBar jMenuBar1 = new javax.swing.JMenuBar(); + javax.swing.JMenu jMenu1 = new javax.swing.JMenu(); + jmiAddFile = new javax.swing.JMenuItem(); + jmiSave = new javax.swing.JMenuItem(); + jSeparator2 = new javax.swing.JPopupMenu.Separator(); + jmiExit = new javax.swing.JMenuItem(); + javax.swing.JMenu jMenu4 = new javax.swing.JMenu(); + jmiZoomIn = new javax.swing.JMenuItem(); + jmiZoomOut = new javax.swing.JMenuItem(); + javax.swing.JMenu jMenu3 = new javax.swing.JMenu(); + jmiRotateClockwise = new javax.swing.JMenuItem(); + jmiRotateCounterclockwise = new javax.swing.JMenuItem(); + jSeparator1 = new javax.swing.JPopupMenu.Separator(); + jmiRemoveSelectedPages = new javax.swing.JMenuItem(); + jmiRemoveAllPages = new javax.swing.JMenuItem(); + javax.swing.JMenu jMenu2 = new javax.swing.JMenu(); + jmiOnlineHelp = new javax.swing.JMenuItem(); + jSeparator3 = new javax.swing.JPopupMenu.Separator(); + jmiAbout = new javax.swing.JMenuItem(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + addComponentListener(new java.awt.event.ComponentAdapter() { + public void componentResized(java.awt.event.ComponentEvent evt) { + formComponentResized(evt); + } + }); + addWindowStateListener(new java.awt.event.WindowStateListener() { + public void windowStateChanged(java.awt.event.WindowEvent evt) { + formWindowStateChanged(evt); + } + }); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosed(java.awt.event.WindowEvent evt) { + formWindowClosed(evt); + } + }); + + jToolBar1.setFloatable(false); + jToolBar1.setRollover(true); + jToolBar1.setMaximumSize(new java.awt.Dimension(295, 32)); + jToolBar1.setMinimumSize(new java.awt.Dimension(295, 32)); + jToolBar1.setPreferredSize(new java.awt.Dimension(295, 32)); + + btAddFile.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cloud/bernardi/pdfjuggler/icons/open.png"))); // NOI18N + btAddFile.setToolTipText("Add File..."); + btAddFile.setFocusable(false); + btAddFile.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btAddFile.setMaximumSize(new java.awt.Dimension(32, 32)); + btAddFile.setMinimumSize(new java.awt.Dimension(32, 32)); + btAddFile.setPreferredSize(new java.awt.Dimension(32, 32)); + btAddFile.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btAddFile.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btAddFileActionPerformed(evt); + } + }); + jToolBar1.add(btAddFile); + + btSave.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cloud/bernardi/pdfjuggler/icons/saveas.png"))); // NOI18N + btSave.setToolTipText("Save As..."); + btSave.setFocusable(false); + btSave.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btSave.setMaximumSize(new java.awt.Dimension(32, 32)); + btSave.setMinimumSize(new java.awt.Dimension(32, 32)); + btSave.setPreferredSize(new java.awt.Dimension(32, 32)); + btSave.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btSave.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btSaveActionPerformed(evt); + } + }); + jToolBar1.add(btSave); + + btZoomIn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cloud/bernardi/pdfjuggler/icons/zoomin.png"))); // NOI18N + btZoomIn.setToolTipText("Zoom In"); + btZoomIn.setFocusable(false); + btZoomIn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btZoomIn.setMaximumSize(new java.awt.Dimension(32, 32)); + btZoomIn.setMinimumSize(new java.awt.Dimension(32, 32)); + btZoomIn.setPreferredSize(new java.awt.Dimension(32, 32)); + btZoomIn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btZoomIn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btZoomInActionPerformed(evt); + } + }); + jToolBar1.add(btZoomIn); + + btZoomOut.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cloud/bernardi/pdfjuggler/icons/zoomout.png"))); // NOI18N + btZoomOut.setToolTipText("Zoom Out"); + btZoomOut.setFocusable(false); + btZoomOut.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btZoomOut.setMaximumSize(new java.awt.Dimension(32, 32)); + btZoomOut.setMinimumSize(new java.awt.Dimension(32, 32)); + btZoomOut.setPreferredSize(new java.awt.Dimension(32, 32)); + btZoomOut.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btZoomOut.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btZoomOutActionPerformed(evt); + } + }); + jToolBar1.add(btZoomOut); + + btRotateClockwise.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cloud/bernardi/pdfjuggler/icons/rotateright.png"))); // NOI18N + btRotateClockwise.setToolTipText("Rotate Clockwise"); + btRotateClockwise.setFocusable(false); + btRotateClockwise.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btRotateClockwise.setMaximumSize(new java.awt.Dimension(32, 32)); + btRotateClockwise.setMinimumSize(new java.awt.Dimension(32, 32)); + btRotateClockwise.setPreferredSize(new java.awt.Dimension(32, 32)); + btRotateClockwise.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btRotateClockwise.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btRotateClockwiseActionPerformed(evt); + } + }); + jToolBar1.add(btRotateClockwise); + + btRotateCounterclockwise.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cloud/bernardi/pdfjuggler/icons/rotateleft.png"))); // NOI18N + btRotateCounterclockwise.setToolTipText("Rotate Counterclockwise"); + btRotateCounterclockwise.setFocusable(false); + btRotateCounterclockwise.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btRotateCounterclockwise.setMaximumSize(new java.awt.Dimension(32, 32)); + btRotateCounterclockwise.setMinimumSize(new java.awt.Dimension(32, 32)); + btRotateCounterclockwise.setPreferredSize(new java.awt.Dimension(32, 32)); + btRotateCounterclockwise.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btRotateCounterclockwise.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btRotateCounterclockwiseActionPerformed(evt); + } + }); + jToolBar1.add(btRotateCounterclockwise); + + btRemoveSelectedPages.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cloud/bernardi/pdfjuggler/icons/delete.png"))); // NOI18N + btRemoveSelectedPages.setToolTipText("Remove Selected Pages"); + btRemoveSelectedPages.setFocusable(false); + btRemoveSelectedPages.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btRemoveSelectedPages.setMaximumSize(new java.awt.Dimension(32, 32)); + btRemoveSelectedPages.setMinimumSize(new java.awt.Dimension(32, 32)); + btRemoveSelectedPages.setPreferredSize(new java.awt.Dimension(32, 32)); + btRemoveSelectedPages.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btRemoveSelectedPages.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btRemoveSelectedPagesActionPerformed(evt); + } + }); + jToolBar1.add(btRemoveSelectedPages); + + pageList.setModel(new DefaultListModel()); + pageList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + pageList.setDragEnabled(true); + pageList.setDropMode(javax.swing.DropMode.INSERT); + pageList.setLayoutOrientation(javax.swing.JList.HORIZONTAL_WRAP); + pageList.setVisibleRowCount(-1); + jScrollPane1.setViewportView(pageList); + + pbStatus.setString(""); + pbStatus.setStringPainted(true); + + jMenu1.setText("File"); + + jmiAddFile.setText("Add File..."); + jmiAddFile.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jmiAddFileActionPerformed(evt); + } + }); + jMenu1.add(jmiAddFile); + + jmiSave.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_DOWN_MASK)); + jmiSave.setText("Save As..."); + jmiSave.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jmiSaveActionPerformed(evt); + } + }); + jMenu1.add(jmiSave); + jMenu1.add(jSeparator2); + + jmiExit.setText("Exit"); + jmiExit.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jmiExitActionPerformed(evt); + } + }); + jMenu1.add(jmiExit); + + jMenuBar1.add(jMenu1); + + jMenu4.setText("View"); + + jmiZoomIn.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_PLUS, java.awt.event.InputEvent.CTRL_DOWN_MASK)); + jmiZoomIn.setText("Zoom In"); + jmiZoomIn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jmiZoomInActionPerformed(evt); + } + }); + jMenu4.add(jmiZoomIn); + + jmiZoomOut.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_MINUS, java.awt.event.InputEvent.CTRL_DOWN_MASK)); + jmiZoomOut.setText("Zoom Out"); + jmiZoomOut.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jmiZoomOutActionPerformed(evt); + } + }); + jMenu4.add(jmiZoomOut); + + jMenuBar1.add(jMenu4); + + jMenu3.setText("Edit"); + + jmiRotateClockwise.setText("Rotate Clockwise"); + jmiRotateClockwise.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jmiRotateClockwiseActionPerformed(evt); + } + }); + jMenu3.add(jmiRotateClockwise); + + jmiRotateCounterclockwise.setText("Rotate Counterclockwise"); + jmiRotateCounterclockwise.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jmiRotateCounterclockwiseActionPerformed(evt); + } + }); + jMenu3.add(jmiRotateCounterclockwise); + jMenu3.add(jSeparator1); + + jmiRemoveSelectedPages.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_DELETE, 0)); + jmiRemoveSelectedPages.setText("Remove Selected Pages"); + jmiRemoveSelectedPages.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jmiRemoveSelectedPagesActionPerformed(evt); + } + }); + jMenu3.add(jmiRemoveSelectedPages); + + jmiRemoveAllPages.setText("Remove All Pages"); + jmiRemoveAllPages.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jmiRemoveAllPagesActionPerformed(evt); + } + }); + jMenu3.add(jmiRemoveAllPages); + + jMenuBar1.add(jMenu3); + + jMenu2.setText("Help"); + + jmiOnlineHelp.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0)); + jmiOnlineHelp.setText("Online Help"); + jmiOnlineHelp.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jmiOnlineHelpActionPerformed(evt); + } + }); + jMenu2.add(jmiOnlineHelp); + jMenu2.add(jSeparator3); + + jmiAbout.setText("About"); + jmiAbout.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jmiAboutActionPerformed(evt); + } + }); + jMenu2.add(jmiAbout); + + jMenuBar1.add(jMenu2); + + setJMenuBar(jMenuBar1); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) + .addComponent(pbStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 403, Short.MAX_VALUE) + .addGap(2, 2, 2) + .addComponent(pbStatus, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void btAddFileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAddFileActionPerformed + addPdfFiles(); + }//GEN-LAST:event_btAddFileActionPerformed + + private void btSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btSaveActionPerformed + savePdf(); + }//GEN-LAST:event_btSaveActionPerformed + + private void btRemoveSelectedPagesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btRemoveSelectedPagesActionPerformed + removeSelectedPages(); + }//GEN-LAST:event_btRemoveSelectedPagesActionPerformed + + private void jmiAddFileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiAddFileActionPerformed + addPdfFiles(); + }//GEN-LAST:event_jmiAddFileActionPerformed + + private void jmiRemoveAllPagesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiRemoveAllPagesActionPerformed + removeAllPages(); + }//GEN-LAST:event_jmiRemoveAllPagesActionPerformed + + private void jmiSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiSaveActionPerformed + savePdf(); + }//GEN-LAST:event_jmiSaveActionPerformed + + private void jmiRemoveSelectedPagesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiRemoveSelectedPagesActionPerformed + removeSelectedPages(); + }//GEN-LAST:event_jmiRemoveSelectedPagesActionPerformed + + private void jmiExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiExitActionPerformed + closeApplication(); + }//GEN-LAST:event_jmiExitActionPerformed + + private void jmiAboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiAboutActionPerformed + showAboutDialog(); + }//GEN-LAST:event_jmiAboutActionPerformed + + private void btRotateCounterclockwiseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btRotateCounterclockwiseActionPerformed + rotateSelection(-90); + }//GEN-LAST:event_btRotateCounterclockwiseActionPerformed + + private void btRotateClockwiseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btRotateClockwiseActionPerformed + rotateSelection(90); + }//GEN-LAST:event_btRotateClockwiseActionPerformed + + private void jmiRotateClockwiseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiRotateClockwiseActionPerformed + rotateSelection(90); + }//GEN-LAST:event_jmiRotateClockwiseActionPerformed + + private void jmiRotateCounterclockwiseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiRotateCounterclockwiseActionPerformed + rotateSelection(-90); + }//GEN-LAST:event_jmiRotateCounterclockwiseActionPerformed + + private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed + config.save(this); + }//GEN-LAST:event_formWindowClosed + + private void formComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentResized + config.set(this); + }//GEN-LAST:event_formComponentResized + + private void formWindowStateChanged(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowStateChanged + int oldState = evt.getOldState(); + int newState = evt.getNewState(); + isMaximized = (oldState & JFrame.MAXIMIZED_BOTH) == 0 && (newState & JFrame.MAXIMIZED_BOTH) != 0; + }//GEN-LAST:event_formWindowStateChanged + + private void jmiOnlineHelpActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiOnlineHelpActionPerformed + openOnlineHelp(); + }//GEN-LAST:event_jmiOnlineHelpActionPerformed + + private void jmiZoomInActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiZoomInActionPerformed + zoom(10); + }//GEN-LAST:event_jmiZoomInActionPerformed + + private void btZoomInActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btZoomInActionPerformed + zoom(10); + }//GEN-LAST:event_btZoomInActionPerformed + + private void jmiZoomOutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiZoomOutActionPerformed + zoom(-10); + }//GEN-LAST:event_jmiZoomOutActionPerformed + + private void btZoomOutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btZoomOutActionPerformed + zoom(-10); + }//GEN-LAST:event_btZoomOutActionPerformed + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + try { + javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + java.awt.EventQueue.invokeLater(() -> { + new MainFrame().setVisible(true); + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton btAddFile; + private javax.swing.JButton btRemoveSelectedPages; + private javax.swing.JButton btRotateClockwise; + private javax.swing.JButton btRotateCounterclockwise; + private javax.swing.JButton btSave; + private javax.swing.JButton btZoomIn; + private javax.swing.JButton btZoomOut; + private javax.swing.JPopupMenu.Separator jSeparator1; + private javax.swing.JPopupMenu.Separator jSeparator2; + private javax.swing.JPopupMenu.Separator jSeparator3; + private javax.swing.JMenuItem jmiAbout; + private javax.swing.JMenuItem jmiAddFile; + private javax.swing.JMenuItem jmiExit; + private javax.swing.JMenuItem jmiOnlineHelp; + private javax.swing.JMenuItem jmiRemoveAllPages; + private javax.swing.JMenuItem jmiRemoveSelectedPages; + private javax.swing.JMenuItem jmiRotateClockwise; + private javax.swing.JMenuItem jmiRotateCounterclockwise; + private javax.swing.JMenuItem jmiSave; + private javax.swing.JMenuItem jmiZoomIn; + private javax.swing.JMenuItem jmiZoomOut; + private javax.swing.JList pageList; + private javax.swing.JProgressBar pbStatus; + // End of variables declaration//GEN-END:variables +} diff --git a/src/main/java/cloud/bernardi/pdfjuggler/Web.java b/src/main/java/cloud/bernardi/pdfjuggler/Web.java new file mode 100644 index 0000000..55845a3 --- /dev/null +++ b/src/main/java/cloud/bernardi/pdfjuggler/Web.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2020 Paolo Bernardi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cloud.bernardi.pdfjuggler; + +import java.awt.Desktop; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +/** + * Utilities to interact with the system web browser. + * + * @author rnd + */ +public class Web { + + /** + * Open the specified website with the system web browser. + * + * @param url + */ + public static void openWebsite(String url) { + if (Desktop.isDesktopSupported()) { + Desktop desktop = Desktop.getDesktop(); + try { + desktop.browse(new URI(url)); + } catch (IOException | URISyntaxException ex1) { + // NOP + } + } else { + Runtime runtime = Runtime.getRuntime(); + try { + runtime.exec("xdg-open " + url); + } catch (IOException e) { + try { + runtime.exec("open " + url); + } catch (IOException ex2) { + // NOP + } + } + } + } +} diff --git a/src/main/resources/cloud/bernardi/pdfjuggler/icons/delete.png b/src/main/resources/cloud/bernardi/pdfjuggler/icons/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..9924681938b693377a230be0f6e31865bee29d7c GIT binary patch literal 1119 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/cloud/bernardi/pdfjuggler/icons/rotateright.png b/src/main/resources/cloud/bernardi/pdfjuggler/icons/rotateright.png new file mode 100644 index 0000000000000000000000000000000000000000..004cc6df33e5bf8dc85c50a2990e531f14e28886 GIT binary patch literal 874 zcmV-w1C{)VP)oD`h}Uf^SOEwON6du7F(|KOE5UXBKdtxeEJsvGIXU7%$g%?s8JI= zEg$0@8w&s+vMi6XqB&OPfO6Ect;1Zop#V#_#e$_WZO}9aMRf+5sjb6HE{NXVfp>j< zeWBpi1(1a(U$9uUu`zS3O`X=l3t}&kbtTNaqKmL}VDW@tF$kbF2$X?EXS_VVdfwYR zzyN*tC-q~J<`HCk8`v^Ec1)u-lnSu1jiHPy2wU-O&-Q*Z+) z6JbTb!-@|DcZ4K7VMX<%=(WzQv;~-FyZ)pQ4gi|6hf9KmqHoYNP2{xWQO%bi^PGHB z@LB^!Cz;1pt%cXp>GYnGlIS(1sC|6=&OWa`zqPQA1lB5*8mt}~8ono`{Wg(EoMxsf zpYoz9xD!zR=BZR_XIWYN5|KHZNF*Z3WQQG%Mln78T>14COTpt6(DP!((P(Ux*_>@^ zYP6Ec4m%c$0RWUz5JCj~+E-J!F)=amz9;~uYFi48ZM*y;KV7wsc(3~+G`{{R3007*qoM6N<$f)5{x A_y7O^ literal 0 HcmV?d00001 diff --git a/src/main/resources/cloud/bernardi/pdfjuggler/icons/saveas.png b/src/main/resources/cloud/bernardi/pdfjuggler/icons/saveas.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f2a7e79f5e14a6a4fbffbbfbf7165bd5c4048d GIT binary patch literal 612 zcmV-q0-ODbP)>E2G<0_5QM=| z2{@zTmB7(k002aEKyWGu&Vt>kVHmLmf;c?4V7uL-*=)u(V8Jv^B$LTt19l@kVBgMA z*U)(#d65R?nOO0000&qakB&F74gNuPOT>d3P0Si?B=Lgc#m2-$lLKhWJD@G^$!Pq{nRmavlQM787(165pjd1U6BOK~ zg@wl1ID@(#>PE8>$Z;Aq&^eGjg+lXCY5-Lo0ubR`OwPLkgr0N3H#8AIv;1mLz?%iwxe)*W zmX_`fPKWD9Cs|M0_V)HJL4qzD2hac>&F5RYfw|U)_YJNxy!fXAEPr}`>;(CIYq#$M z=#3-*ks_3z0D=w|ul0&>rB{AT4FDQ84>@d%$)p7cJx2gkCDFaG0>E+lXMoGVzOcQn z255O}o`gbS#|X$?;ELn)olgx=uiLJOw)^<0(b2Jks{n3!v+8=^N8{nxso+UIPI^7Z z7E+}$HVGUDTveHHoJMV}#$=4i1S@9>Xt!S%#MEl;S*=uF9s+L?WKWlcTme0%n*Bw@`wn;{DMZ(1Q7V;s zGMW5P*xMghWmn+S8z4V`oF5qI`_i`UWq@*dd}kVnMBOT_Mn*=qt7b0(kKKW=UWofg zu%dy@P_#f&W>M(v{kh9cU{_I<{m7+M1qz>$+;@Dd4v-lmq>Qj)iY2 xKpccB9}(W1|EWr)i9)4v>^ZhL?RS-0w*g`9bk!#h>RSK+002ovPDHLkV1h`Dn+Xc z>!JyA(S7SMNo=(A-}Wv2Q>qe~Nw6-exX=-e7Ti>-n<8ym5otz5N>ns8gmJnMCY>bj zxOjKkWHLDSl|(oFR_~s7zH`2J?!D(cxP$*0(#pXYKaoyX27-WnBDxdUW?%iTD&K)l zl*^qH#iCzZa{;;B%g>4E>%e_2;#?KcWBL5(r)wg>7~`eWn_p9v!`5^K^u1Utezsa| z`)$L9zg49Do*-C!8e~7P!}^`*>gqi1`+ndmAl}TlEO|{t4$aNYj2DZ=r3SYtV9FRX zno4cS0VjbYv$GWij=2h0RRLS}Pk@?g@XXlQJLg;i4G)j(2?D+Z5)d0G6yBO};d#p! z#`uYi8>^oK9U?MPD2#sW5(Hp!^1^f`(|28jy%1!2diIW&O5ZeAZ53k67wL3mfbhUw znVXv#cTHYLxja(%o`a8?LV)qVgGPBq!{mav>tVGNBf0N5Fly|1DszZozV zKMSBr#>Kz!7Tg_@Z~O|-_G0Bc@R(!n^9%2G>d z$bMstx7z*RVL1l?RK;m7tPoHxcTNCTfgQHJMnWpJWeDUUV7grHI1^bwvFO)CwBE;0 z4iAs)aZPT0PlPM^z;!&YD)Z#z#UFcnAK3&vuF4CUOyBjMp6<(~QmN^UFvfVhcR%%# zDyM;jH9y+h+xNqzOBa4>C7|h5@qIrwJ6m}b^r$u69LLF|_X|L^x^%BSa0hJJ0saCy z?Q;#p6bf&D5m`VTgM+X1!_pfd+gp6dH0VLq`1c}9Ujz5MifGv^ve|5#=Oz1XZ+}>o zZ6QyufqV;crmL&tGvD_Y0dl!RTce0@>Q+%PG&HnXHGU3w@Ro?!^UeMd8i&!EAfM0w zDYEz^P_m{31RsT4x)SSBfjV5aV_hmx$Jp4Lf2ev-06$w(0`x