Skip to content

Commit 1c71995

Browse files
committed
Better resource cleanup
1 parent 660bb03 commit 1c71995

9 files changed

Lines changed: 85 additions & 15 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
.vs/
33
bin/
44
target/
5+
build/
56
.classpath
67
.project
78
*.fxbuild

src/de/rogovskyy/reorderpdf/Main.fxml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
<?import java.lang.*?>
99
<?import javafx.scene.layout.*?>
1010
<?import javafx.scene.layout.BorderPane?>
11+
<?import javafx.scene.layout.StackPane?>
12+
<?import javafx.scene.control.Label?>
1113

1214
<BorderPane prefHeight="646.0" prefWidth="973.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.rogovskyy.reorderpdf.MainController">
1315
<top>
@@ -54,7 +56,12 @@
5456
<items>
5557
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
5658
<children>
57-
<ListView fx:id="pagesView" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
59+
<StackPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
60+
<children>
61+
<ListView fx:id="pagesView" />
62+
<Label fx:id="infoTxt" alignment="CENTER" prefHeight="210.0" prefWidth="147.0" text="After adding PDF or image files, you can reorder them freely." textAlignment="CENTER" wrapText="true" />
63+
</children>
64+
</StackPane>
5865
</children>
5966
<padding>
6067
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />

src/de/rogovskyy/reorderpdf/Main.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,20 @@
22

33
import javafx.application.Application;
44
import javafx.fxml.FXMLLoader;
5+
import javafx.scene.Parent;
56
import javafx.scene.Scene;
6-
import javafx.scene.layout.BorderPane;
77
import javafx.stage.Stage;
88

99
public class Main extends Application {
10+
private MainController mainController;
11+
1012
@Override
1113
public void start(Stage primaryStage) {
1214
try {
13-
BorderPane root = (BorderPane) FXMLLoader.load(getClass().getResource("Main.fxml"));
15+
FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
16+
Parent root = loader.load();
17+
mainController = loader.getController();
1418
Scene scene = new Scene(root, 800, 600);
15-
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
1619
primaryStage.setScene(scene);
1720
primaryStage.setTitle("ReorderPDF");
1821
primaryStage.show();
@@ -24,4 +27,10 @@ public void start(Stage primaryStage) {
2427
public static void main(String[] args) {
2528
launch(args);
2629
}
30+
31+
@Override
32+
public void stop() throws Exception {
33+
if (mainController != null)
34+
mainController.close();
35+
}
2736
}

src/de/rogovskyy/reorderpdf/MainController.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import javafx.scene.control.Alert.AlertType;
1515
import javafx.scene.control.Button;
1616
import javafx.scene.control.ButtonType;
17+
import javafx.scene.control.Label;
1718
import javafx.scene.control.ListView;
1819
import javafx.scene.layout.Background;
1920
import javafx.scene.layout.BackgroundImage;
@@ -27,6 +28,9 @@
2728
public class MainController {
2829
private final PagesManager mgr = new PagesManager();
2930

31+
@FXML
32+
public Label infoTxt;
33+
3034
@FXML
3135
public ListView<DocumentPage> pagesView;
3236

@@ -62,7 +66,8 @@ public void initialize() {
6266
downBtn.disableProperty().bind(dependsOnSelected((i, s) -> i == -1 || i == mgr.getDocumentPages().size() - 1));
6367
removeBtn.disableProperty().bind(dependsOnSelected((i, s) -> s == null));
6468
saveBtn.disableProperty().bind(Bindings.equal(Bindings.size(mgr.documentPagesProperty()), 0));
65-
69+
infoTxt.visibleProperty().bind(Bindings.equal(Bindings.size(mgr.documentPagesProperty()), 0));
70+
6671
addBtn.setOnAction((ae) -> {
6772
FileChooser fileChooser = new FileChooser();
6873
fileChooser.getExtensionFilters().addAll(new ExtensionFilter("PDF File", "*.pdf"),
@@ -125,7 +130,7 @@ public void initialize() {
125130

126131
removeBtn.setOnAction((ae) -> {
127132
int i = pagesView.getSelectionModel().getSelectedIndex();
128-
mgr.getDocumentPages().remove(i);
133+
mgr.remove(i);
129134
if (mgr.getDocumentPages().size() > 0) {
130135
pagesView.getSelectionModel().select(i);
131136
pagesView.requestFocus();
@@ -149,4 +154,8 @@ private Background getBackgroundFromSelectedItm() {
149154
new BackgroundImage(selected.getImage(), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
150155
BackgroundPosition.CENTER, new BackgroundSize(0, 0, false, false, true, false)));
151156
}
157+
158+
public void close() {
159+
mgr.close();
160+
}
152161
}

src/de/rogovskyy/reorderpdf/application.css

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package de.rogovskyy.reorderpdf.model;
2+
3+
import org.apache.pdfbox.pdmodel.PDDocument;
4+
5+
public interface PDFReference {
6+
PDDocument getPdf();
7+
}

src/de/rogovskyy/reorderpdf/model/PagesManager.java

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,18 @@
88
import java.util.stream.Collectors;
99
import java.util.stream.IntStream;
1010

11+
import org.apache.commons.logging.Log;
12+
import org.apache.commons.logging.LogFactory;
1113
import org.apache.pdfbox.pdmodel.PDDocument;
1214

1315
import javafx.beans.property.SimpleListProperty;
1416
import javafx.collections.FXCollections;
1517
import javafx.collections.ObservableList;
1618

1719
public class PagesManager {
20+
private static final Log log = LogFactory.getLog(PagesManager.class);
1821
public static final String[] SUPPORTED_IMG_EXTS = { ".jpg", ".jpeg", ".png" };
1922

20-
// TODO add pdf closing
2123
private final SimpleListProperty<DocumentPage> documentPages = new SimpleListProperty<>(
2224
FXCollections.observableArrayList());
2325

@@ -67,14 +69,14 @@ public void unpackPDF(int itemIndex) {
6769
// convert them first and add all at once to update UI only once
6870
WholeDocumentPage pdfPage = ((WholeDocumentPage) page);
6971
PDDocument pdf = pdfPage.getPdf();
70-
List<PDFPage> newPages = IntStream.range(0, pdf.getNumberOfPages()).mapToObj((i) -> new PDFPage(pdfPage.toString(), pdf, i))
71-
.collect(Collectors.toList());
72+
List<SinglePDFPage> newPages = IntStream.range(0, pdf.getNumberOfPages())
73+
.mapToObj((i) -> new SinglePDFPage(pdfPage.toString(), pdf, i)).collect(Collectors.toList());
7274
documentPages.remove(itemIndex);
7375
documentPages.addAll(itemIndex, newPages);
7476
}
7577

7678
public void save(File selectedFile) throws IOException {
77-
if(documentPages.size()==0)
79+
if (documentPages.size() == 0)
7880
throw new IOException("You need to add at least one page");
7981
PDDocument pdf = new PDDocument();
8082
for (DocumentPage documentPage : documentPages) {
@@ -83,4 +85,40 @@ public void save(File selectedFile) throws IOException {
8385
pdf.save(selectedFile);
8486
}
8587

88+
public void remove(int i) {
89+
if (i < 0 || i >= documentPages.size())
90+
throw new IndexOutOfBoundsException();
91+
PDDocument referencedDoc;
92+
DocumentPage page = documentPages.get(i);
93+
if (page instanceof PDFReference)
94+
referencedDoc = ((PDFReference) page).getPdf();
95+
else
96+
referencedDoc = null;
97+
98+
documentPages.remove(i);
99+
100+
// if the removed page referenced a PDDocument, we need to make sure to close it if no references
101+
// to it are left
102+
if (referencedDoc != null && !documentPages.stream()
103+
.anyMatch((p) -> p instanceof PDFReference && ((PDFReference) p).getPdf() == referencedDoc)) {
104+
try {
105+
referencedDoc.close();
106+
} catch (IOException e) {
107+
log.debug("Error while closing PDF document", e);
108+
}
109+
}
110+
}
111+
112+
public void close() {
113+
for (DocumentPage page : documentPages) {
114+
if(page instanceof PDFReference) {
115+
try {
116+
((PDFReference) page).getPdf().close();
117+
} catch (IOException e) {
118+
log.debug("Error while closing PDF document", e);
119+
}
120+
}
121+
}
122+
}
123+
86124
}

src/de/rogovskyy/reorderpdf/model/PDFPage.java renamed to src/de/rogovskyy/reorderpdf/model/SinglePDFPage.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@
1111
import javafx.embed.swing.SwingFXUtils;
1212
import javafx.scene.image.Image;
1313

14-
public class PDFPage implements DocumentPage {
15-
private static final Log log = LogFactory.getLog(PDFPage.class);
14+
public class SinglePDFPage implements DocumentPage, PDFReference {
15+
private static final Log log = LogFactory.getLog(SinglePDFPage.class);
1616

1717
private final String name;
1818
private final PDDocument pdf;
1919
private final int pageNum;
2020
private final PDPage page;
2121
private final Image rendered;
2222

23-
public PDFPage(String name, PDDocument pdf, int pageNum) {
23+
public SinglePDFPage(String name, PDDocument pdf, int pageNum) {
2424
this.name = name;
2525
this.pdf = pdf;
2626
this.pageNum = pageNum;

src/de/rogovskyy/reorderpdf/model/WholeDocumentPage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import javafx.embed.swing.SwingFXUtils;
1212
import javafx.scene.image.Image;
1313

14-
public class WholeDocumentPage implements DocumentPage{
14+
public class WholeDocumentPage implements DocumentPage, PDFReference{
1515
private static final Log log = LogFactory.getLog(WholeDocumentPage.class);
1616

1717
private final String docName;

0 commit comments

Comments
 (0)