diff --git a/pdfsam-model/src/main/java/org/pdfsam/model/ui/workspace/LoadWorkspaceResponse.java b/pdfsam-model/src/main/java/org/pdfsam/model/ui/workspace/LoadWorkspaceResponse.java
index dc6e23f0a..8abb32591 100644
--- a/pdfsam-model/src/main/java/org/pdfsam/model/ui/workspace/LoadWorkspaceResponse.java
+++ b/pdfsam-model/src/main/java/org/pdfsam/model/ui/workspace/LoadWorkspaceResponse.java
@@ -18,26 +18,10 @@
* along with this program. If not, see .
*/
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-import static java.util.Optional.ofNullable;
-import static org.sejda.commons.util.RequireUtils.requireNotNullArg;
-
/**
* Response for a workspace load request
*
* @author Andrea Vacondio
*/
-public record LoadWorkspaceResponse(File workspace, Map> data) {
- public LoadWorkspaceResponse(File workspace, Map> data) {
- requireNotNullArg(workspace, "Workspace file cannot be null");
- this.workspace = workspace;
- this.data = ofNullable(data).orElseGet(HashMap::new);
- }
-
- public Map getData(String tool) {
- return this.data.computeIfAbsent(tool, (k) -> new HashMap<>());
- }
+public record LoadWorkspaceResponse(WorkspaceData data) {
}
diff --git a/pdfsam-model/src/main/java/org/pdfsam/model/ui/workspace/RestorableView.java b/pdfsam-model/src/main/java/org/pdfsam/model/ui/workspace/RestorableView.java
index 61b3eecd5..348045ad2 100644
--- a/pdfsam-model/src/main/java/org/pdfsam/model/ui/workspace/RestorableView.java
+++ b/pdfsam-model/src/main/java/org/pdfsam/model/ui/workspace/RestorableView.java
@@ -18,6 +18,8 @@
*/
package org.pdfsam.model.ui.workspace;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
+
import java.util.Map;
/**
@@ -40,5 +42,5 @@ public interface RestorableView {
*
* @param data
*/
- void restoreStateFrom(Map data);
+ void restoreStateFrom(ToolData data);
}
diff --git a/pdfsam-model/src/main/java/org/pdfsam/model/ui/workspace/WorkspaceData.java b/pdfsam-model/src/main/java/org/pdfsam/model/ui/workspace/WorkspaceData.java
new file mode 100644
index 000000000..edb8b5446
--- /dev/null
+++ b/pdfsam-model/src/main/java/org/pdfsam/model/ui/workspace/WorkspaceData.java
@@ -0,0 +1,141 @@
+/*
+ * This file is part of the PDF Split And Merge source code
+ * Created on 19/08/2025
+ * Copyright 2025 by Sober Lemur S.r.l. (info@soberlemur.com).
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License
+ * along with this program. If not, see .
+ */
+package org.pdfsam.model.ui.workspace;
+
+import org.pdfsam.model.tool.ToolBound;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+import static java.util.Optional.ofNullable;
+import static org.apache.commons.lang3.StringUtils.EMPTY;
+
+/**
+ * @author Alessandro Parisi
+ */
+public class WorkspaceData {
+ private final File file;
+ private final Map> data;
+ private boolean isRelativePaths = false;
+
+ public WorkspaceData(File file, Map> data) {
+ this.file = Objects.requireNonNull(file, "Workspace file cannot be null!");
+ this.data = ofNullable(data).orElseGet(Hashtable::new);
+
+ try {
+ String s = getProperty("relative.paths");
+ isRelativePaths = Boolean.parseBoolean(s);
+ } catch (Exception ignored) {
+ }
+ }
+
+ public String getProperty(String key) {
+ return ofNullable(data.get(key)).map(Object::toString).orElse(null);
+ }
+
+ public ToolData getToolData(ToolBound tool) {
+ return new ToolData(isRelativePaths ? file : null, data.get(tool.toolBinding()));
+ }
+
+ public File file() {
+ return file;
+ }
+
+ public Map> data() {
+ return Collections.unmodifiableMap(data);
+ }
+
+ public static class ToolData {
+ private final File workspaceFile;
+ private final Map data;
+
+ public ToolData() {
+ this(null, new HashMap<>());
+ }
+
+ public ToolData(File workspaceFile, Map data) {
+ this.workspaceFile = workspaceFile;
+ this.data = Optional.ofNullable(data).orElseGet(HashMap::new);
+ }
+
+ public String get(String key) {
+ return data.get(key);
+ }
+
+ public String get(String key, String or) {
+ return ofNullable(data.get(key)).orElse(or);
+ }
+
+ public Integer getInt(String key, Integer or) {
+ return Optional.ofNullable(get(key)).map(Integer::parseInt).orElse(or);
+ }
+
+ public boolean getBoolean(String key) {
+ return Optional.ofNullable(get(key)).map(Boolean::parseBoolean).orElse(false);
+ }
+
+ public Path getPath(String key) {
+ Path toPath = Path.of(get(key, EMPTY));
+ if (workspaceFile == null || Files.exists(toPath))
+ return toPath;
+
+ try {
+ Path workspaceDir = workspaceFile.toPath().getParent();
+ toPath = workspaceDir.resolve(toPath.getFileName());
+ if (!Files.exists(toPath))
+ return Path.of("");
+ return toPath;
+ } catch (Exception ex) {
+ return toPath;
+ }
+ }
+
+ public void set(String key, String value) {
+ data.put(key, value);
+ }
+
+ public void setBoolean(String key, boolean value) {
+ data.put(key, Boolean.toString(value));
+ }
+
+ public void setInt(String key, int value) {
+ data.put(key, Integer.toString(value));
+ }
+
+ public > void setEnum(String key, E value) {
+ if (value != null)
+ set(key, value.toString());
+ }
+
+ public boolean hasKey(String key) {
+ return data.containsKey(key);
+ }
+
+ public boolean isEmpty() {
+ return data.isEmpty();
+ }
+ }
+}
diff --git a/pdfsam-model/src/test/java/org/pdfsam/model/ui/workspace/LoadWorkspaceResponseTest.java b/pdfsam-model/src/test/java/org/pdfsam/model/ui/workspace/LoadWorkspaceResponseTest.java
index 2860b77b6..f99c16699 100644
--- a/pdfsam-model/src/test/java/org/pdfsam/model/ui/workspace/LoadWorkspaceResponseTest.java
+++ b/pdfsam-model/src/test/java/org/pdfsam/model/ui/workspace/LoadWorkspaceResponseTest.java
@@ -34,9 +34,9 @@ class LoadWorkspaceResponseTest {
@Test
public void nullDataConstructor() {
File file = mock(File.class);
- LoadWorkspaceResponse victim = new LoadWorkspaceResponse(file, null);
- assertNotNull(victim.getData("CHUCK"));
- assertTrue(victim.getData("CHUCK").isEmpty());
+ WorkspaceData victim = new WorkspaceData(file, null);
+ assertNotNull(victim.getToolData(() -> "CHUCK"));
+ assertTrue(victim.getToolData(() -> "CHUCK").isEmpty());
}
@Test
@@ -46,8 +46,8 @@ public void withData() {
Map> moduleData = new HashMap<>();
moduleData.put("module", data);
File file = mock(File.class);
- LoadWorkspaceResponse victim = new LoadWorkspaceResponse(file, moduleData);
- assertFalse(victim.getData("module").isEmpty());
+ WorkspaceData victim = new WorkspaceData(file, moduleData);
+ assertFalse(victim.getToolData(() -> "module").isEmpty());
}
@Test
@@ -57,8 +57,8 @@ public void getNonExisting() {
Map> moduleData = new HashMap<>();
moduleData.put("module", data);
File file = mock(File.class);
- LoadWorkspaceResponse victim = new LoadWorkspaceResponse(file, moduleData);
- assertNotNull(victim.getData("CHUCK"));
- assertTrue(victim.getData("CHUCK").isEmpty());
+ WorkspaceData victim = new WorkspaceData(file, moduleData);
+ assertNotNull(victim.getToolData(() -> "CHUCK"));
+ assertTrue(victim.getToolData(() -> "CHUCK").isEmpty());
}
}
\ No newline at end of file
diff --git a/pdfsam-service/src/main/java/org/pdfsam/service/ui/WorkspaceController.java b/pdfsam-service/src/main/java/org/pdfsam/service/ui/WorkspaceController.java
index e8c3f8725..c3a2201dd 100644
--- a/pdfsam-service/src/main/java/org/pdfsam/service/ui/WorkspaceController.java
+++ b/pdfsam-service/src/main/java/org/pdfsam/service/ui/WorkspaceController.java
@@ -25,6 +25,7 @@
import org.pdfsam.model.ui.workspace.LoadWorkspaceRequest;
import org.pdfsam.model.ui.workspace.LoadWorkspaceResponse;
import org.pdfsam.model.ui.workspace.SaveWorkspaceRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.model.ui.workspace.WorkspaceLoadedEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -48,6 +49,7 @@ public class WorkspaceController {
private final Collection tools;
private final WorkspaceService service;
private final RecentWorkspacesService recentWorkspace;
+ private WorkspaceData workspace;
@Inject
WorkspaceController(WorkspaceService service, RecentWorkspacesService recentWorkspace) {
@@ -85,8 +87,9 @@ public void loadWorkspace(LoadWorkspaceRequest event) {
LOG.debug(i18n().tr("Loading workspace from {0}", event.workspace().getName()));
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
var data = service.loadWorkspace(event.workspace());
+ workspace = new WorkspaceData(event.workspace(), data);
if (!data.isEmpty()) {
- var response = new LoadWorkspaceResponse(event.workspace(), data);
+ var response = new LoadWorkspaceResponse(workspace);
tools.forEach(m -> scope.fork(() -> {
eventStudio().broadcast(response, m.id());
return null;
diff --git a/pdfsam-tools/pdfsam-alternate-mix/src/main/java/org/pdfsam/tools/alternatemix/AlternateMixToolPanel.java b/pdfsam-tools/pdfsam-alternate-mix/src/main/java/org/pdfsam/tools/alternatemix/AlternateMixToolPanel.java
index 15340b71a..2606d18c4 100644
--- a/pdfsam-tools/pdfsam-alternate-mix/src/main/java/org/pdfsam/tools/alternatemix/AlternateMixToolPanel.java
+++ b/pdfsam-tools/pdfsam-alternate-mix/src/main/java/org/pdfsam/tools/alternatemix/AlternateMixToolPanel.java
@@ -26,6 +26,8 @@
import org.pdfsam.eventstudio.annotation.EventListener;
import org.pdfsam.eventstudio.annotation.EventStation;
import org.pdfsam.model.tool.ClearToolRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.io.BrowsablePdfOutputField;
import org.pdfsam.ui.components.io.PdfDestinationPane;
import org.pdfsam.ui.components.support.Views;
@@ -64,20 +66,21 @@ public void onSaveWorkspace(Map data) {
}
@Override
- public void onLoadWorkspace(Map data) {
+ public void onLoadWorkspace(WorkspaceData workspace) {
+ ToolData data = workspace.getToolData(this);
// backwards comp when alternate mix had 2 inputs
- if (data.containsKey("firstDocumentMixinput")) {
- data.put("input.0", data.get("firstDocumentMixinput"));
- data.put("input.password.0", data.get("firstDocumentMixinputinput.password"));
- data.put("input.step.0", data.get("firstStep"));
- data.put("input.reverse.0", data.get("reverseFirst"));
- data.put("input.size", "1");
- if (data.containsKey("secondDocumentMixinput")) {
- data.put("input.1", data.get("secondDocumentMixinput"));
- data.put("input.password.1", data.get("secondDocumentMixinput.password"));
- data.put("input.step.1", data.get("secondStep"));
- data.put("input.reverse.1", data.get("reverseSecond"));
- data.put("input.size", "2");
+ if (data.hasKey("firstDocumentMixinput")) {
+ data.set("input.0", data.getPath("firstDocumentMixinput").toString());
+ data.set("input.password.0", data.get("firstDocumentMixinputinput.password"));
+ data.set("input.step.0", data.get("firstStep"));
+ data.set("input.reverse.0", data.get("reverseFirst"));
+ data.setInt("input.size", 1);
+ if (data.hasKey("secondDocumentMixinput")) {
+ data.set("input.1", data.getPath("secondDocumentMixinput").toString());
+ data.set("input.password.1", data.get("secondDocumentMixinput.password"));
+ data.set("input.step.1", data.get("secondStep"));
+ data.set("input.reverse.1", data.get("reverseSecond"));
+ data.setInt("input.size", 2);
}
}
selectionPane.restoreStateFrom(data);
diff --git a/pdfsam-tools/pdfsam-backpages/src/main/java/org/pdfsam/tools/backpages/AddBackpagesPane.java b/pdfsam-tools/pdfsam-backpages/src/main/java/org/pdfsam/tools/backpages/AddBackpagesPane.java
index e8e49c512..3b0004f52 100644
--- a/pdfsam-tools/pdfsam-backpages/src/main/java/org/pdfsam/tools/backpages/AddBackpagesPane.java
+++ b/pdfsam-tools/pdfsam-backpages/src/main/java/org/pdfsam/tools/backpages/AddBackpagesPane.java
@@ -27,6 +27,7 @@
import org.pdfsam.core.support.params.TaskParametersBuildStep;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.commons.ValidableTextField;
import org.pdfsam.ui.components.selection.single.SingleSelectionPane;
import org.pdfsam.ui.components.support.FXValidationSupport;
@@ -175,7 +176,7 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
+ public void restoreStateFrom(ToolData data) {
backpagesSourceField.restoreStateFrom(data);
range.setText(Optional.ofNullable(data.get("range.field")).orElse(EMPTY));
pace.setText(Optional.ofNullable(data.get("pace.field")).orElse(EMPTY));
diff --git a/pdfsam-tools/pdfsam-backpages/src/main/java/org/pdfsam/tools/backpages/AddBackpagesToolPanel.java b/pdfsam-tools/pdfsam-backpages/src/main/java/org/pdfsam/tools/backpages/AddBackpagesToolPanel.java
index a3f9cc2b9..5816ef70d 100644
--- a/pdfsam-tools/pdfsam-backpages/src/main/java/org/pdfsam/tools/backpages/AddBackpagesToolPanel.java
+++ b/pdfsam-tools/pdfsam-backpages/src/main/java/org/pdfsam/tools/backpages/AddBackpagesToolPanel.java
@@ -25,6 +25,8 @@
import org.pdfsam.eventstudio.annotation.EventListener;
import org.pdfsam.eventstudio.annotation.EventStation;
import org.pdfsam.model.tool.ClearToolRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.io.BrowsablePdfOutputField;
import org.pdfsam.ui.components.io.PdfDestinationPane;
import org.pdfsam.ui.components.selection.single.TaskParametersBuilderSingleSelectionPane;
@@ -72,7 +74,8 @@ public void onSaveWorkspace(Map data) {
}
@Override
- public void onLoadWorkspace(Map data) {
+ public void onLoadWorkspace(WorkspaceData workspace) {
+ ToolData data = workspace.getToolData(this);
selectionPane.restoreStateFrom(data);
addBackpagesOptions.restoreStateFrom(data);
destinationFileField.restoreStateFrom(data);
diff --git a/pdfsam-tools/pdfsam-backpages/src/test/java/org/pdfsam/tools/backpages/AddBackpagesPaneTest.java b/pdfsam-tools/pdfsam-backpages/src/test/java/org/pdfsam/tools/backpages/AddBackpagesPaneTest.java
index a251f3603..fa98ec217 100644
--- a/pdfsam-tools/pdfsam-backpages/src/test/java/org/pdfsam/tools/backpages/AddBackpagesPaneTest.java
+++ b/pdfsam-tools/pdfsam-backpages/src/test/java/org/pdfsam/tools/backpages/AddBackpagesPaneTest.java
@@ -80,7 +80,7 @@ public void start(Stage stage) {
@Test
public void validRange() throws Exception {
populate();
- robot.clickOn("#selectedBackpages").type(KeyCode.DIGIT5, KeyCode.MINUS, KeyCode.DIGIT9).push(KeyCode.ENTER);
+ robot.clickOn("#selectedBackpages").write("5-9").push(KeyCode.ENTER);
victim.apply(builder, onError);
verify(builder).ranges(anySet());
verify(onError, never()).accept(anyString());
diff --git a/pdfsam-tools/pdfsam-extract/src/main/java/org/pdfsam/tools/extract/ExtractOptionsPane.java b/pdfsam-tools/pdfsam-extract/src/main/java/org/pdfsam/tools/extract/ExtractOptionsPane.java
index d3a2329ae..839764b39 100644
--- a/pdfsam-tools/pdfsam-extract/src/main/java/org/pdfsam/tools/extract/ExtractOptionsPane.java
+++ b/pdfsam-tools/pdfsam-extract/src/main/java/org/pdfsam/tools/extract/ExtractOptionsPane.java
@@ -26,13 +26,13 @@
import org.pdfsam.core.support.params.TaskParametersBuildStep;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.commons.ValidableTextField;
import org.pdfsam.ui.components.support.FXValidationSupport.ValidationState;
import org.pdfsam.ui.components.support.Style;
import org.sejda.conversion.exception.ConversionException;
import java.util.Map;
-import java.util.Optional;
import java.util.function.Consumer;
import static org.apache.commons.lang3.StringUtils.EMPTY;
@@ -112,9 +112,9 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
- field.setText(Optional.ofNullable(data.get("pages")).orElse(EMPTY));
- separateFile.setSelected(Boolean.parseBoolean(data.get("separateFile")));
+ public void restoreStateFrom(ToolData data) {
+ field.setText(data.get("pages", EMPTY));
+ separateFile.setSelected(data.getBoolean("separateFile"));
}
@Override
diff --git a/pdfsam-tools/pdfsam-extract/src/main/java/org/pdfsam/tools/extract/ExtractToolPanel.java b/pdfsam-tools/pdfsam-extract/src/main/java/org/pdfsam/tools/extract/ExtractToolPanel.java
index 82b2a3294..832ffca50 100644
--- a/pdfsam-tools/pdfsam-extract/src/main/java/org/pdfsam/tools/extract/ExtractToolPanel.java
+++ b/pdfsam-tools/pdfsam-extract/src/main/java/org/pdfsam/tools/extract/ExtractToolPanel.java
@@ -27,6 +27,8 @@
import org.pdfsam.eventstudio.annotation.EventListener;
import org.pdfsam.eventstudio.annotation.EventStation;
import org.pdfsam.model.tool.ClearToolRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.io.BrowsableOutputDirectoryField;
import org.pdfsam.ui.components.io.PdfDestinationPane;
import org.pdfsam.ui.components.prefix.PrefixPane;
@@ -85,11 +87,12 @@ public void onSaveWorkspace(Map data) {
}
@Override
- public void onLoadWorkspace(Map data) {
- if (data.containsKey("input")) {
- data.put("input.0", data.get("input"));
- data.put("input.password.0", data.get("input.password"));
- data.put("input.size", "1");
+ public void onLoadWorkspace(WorkspaceData workspace) {
+ ToolData data = workspace.getToolData(this);
+ if (data.hasKey("input")) {
+ data.set("input.0", data.getPath("input").toString());
+ data.set("input.password.0", data.get("input.password"));
+ data.setInt("input.size", 1);
}
selectionPane.restoreStateFrom(data);
extractOptions.restoreStateFrom(data);
diff --git a/pdfsam-tools/pdfsam-extract/src/test/java/org/pdfsam/tools/extract/ExtractOptionsPaneTest.java b/pdfsam-tools/pdfsam-extract/src/test/java/org/pdfsam/tools/extract/ExtractOptionsPaneTest.java
index 24888ac9c..4cc718da2 100644
--- a/pdfsam-tools/pdfsam-extract/src/test/java/org/pdfsam/tools/extract/ExtractOptionsPaneTest.java
+++ b/pdfsam-tools/pdfsam-extract/src/test/java/org/pdfsam/tools/extract/ExtractOptionsPaneTest.java
@@ -26,6 +26,7 @@
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.pdfsam.ui.components.commons.ValidableTextField;
import org.testfx.api.FxRobot;
@@ -100,7 +101,9 @@ public void saveState() {
@Test
public void restoreState() {
- var data = Map.of("pages", "100", "separateFile", Boolean.TRUE.toString());
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setInt("pages", 100);
+ data.setBoolean("separateFile", true);
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
var field = robot.lookup("#extractRanges").queryAs(ValidableTextField.class);
var separateFile = robot.lookup("#separateFile").queryAs(CheckBox.class);
diff --git a/pdfsam-tools/pdfsam-merge/src/main/java/org/pdfsam/tools/merge/MergeOptionsPane.java b/pdfsam-tools/pdfsam-merge/src/main/java/org/pdfsam/tools/merge/MergeOptionsPane.java
index 9657039e4..d705c9c32 100644
--- a/pdfsam-tools/pdfsam-merge/src/main/java/org/pdfsam/tools/merge/MergeOptionsPane.java
+++ b/pdfsam-tools/pdfsam-merge/src/main/java/org/pdfsam/tools/merge/MergeOptionsPane.java
@@ -27,6 +27,7 @@
import org.pdfsam.model.ui.ComboItem;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.support.Style;
import org.sejda.model.outline.OutlinePolicy;
import org.sejda.model.pdf.form.AcroFormPolicy;
@@ -159,7 +160,7 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
+ public void restoreStateFrom(ToolData data) {
Optional.ofNullable(data.get("outline")).map(OutlinePolicy::valueOf)
.flatMap(key -> this.outline.getItems().stream().filter(i -> i.key().equals(key)).findFirst())
.ifPresent(this.outline.getSelectionModel()::select);
@@ -183,7 +184,7 @@ public void restoreStateFrom(Map data) {
this.pageNormalization.getItems().stream().filter(i -> i.key().equals(normalization)).findFirst()
.ifPresent(this.pageNormalization.getSelectionModel()::select);
- blankIfOdd.setSelected(Boolean.parseBoolean(data.get("blankIfOdd")));
- footer.setSelected(Boolean.parseBoolean(data.get("footer")));
+ blankIfOdd.setSelected(data.getBoolean("blankIfOdd"));
+ footer.setSelected(data.getBoolean("footer"));
}
}
diff --git a/pdfsam-tools/pdfsam-merge/src/main/java/org/pdfsam/tools/merge/MergeToolPanel.java b/pdfsam-tools/pdfsam-merge/src/main/java/org/pdfsam/tools/merge/MergeToolPanel.java
index f3df36ed8..ac881561b 100644
--- a/pdfsam-tools/pdfsam-merge/src/main/java/org/pdfsam/tools/merge/MergeToolPanel.java
+++ b/pdfsam-tools/pdfsam-merge/src/main/java/org/pdfsam/tools/merge/MergeToolPanel.java
@@ -26,6 +26,8 @@
import org.pdfsam.eventstudio.annotation.EventListener;
import org.pdfsam.eventstudio.annotation.EventStation;
import org.pdfsam.model.tool.ClearToolRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.io.BrowsablePdfOutputField;
import org.pdfsam.ui.components.io.PdfDestinationPane;
import org.pdfsam.ui.components.tool.BaseToolPanel;
@@ -65,7 +67,8 @@ public void onSaveWorkspace(Map data) {
}
@Override
- public void onLoadWorkspace(Map data) {
+ public void onLoadWorkspace(WorkspaceData workspace) {
+ ToolData data = workspace.getToolData(this);
selectionPane.restoreStateFrom(data);
mergeOptions.restoreStateFrom(data);
destinationFileField.restoreStateFrom(data);
diff --git a/pdfsam-tools/pdfsam-merge/src/test/java/org/pdfsam/tools/merge/MergeOptionsPaneTest.java b/pdfsam-tools/pdfsam-merge/src/test/java/org/pdfsam/tools/merge/MergeOptionsPaneTest.java
index fce700172..ab7ed10b0 100644
--- a/pdfsam-tools/pdfsam-merge/src/test/java/org/pdfsam/tools/merge/MergeOptionsPaneTest.java
+++ b/pdfsam-tools/pdfsam-merge/src/test/java/org/pdfsam/tools/merge/MergeOptionsPaneTest.java
@@ -26,6 +26,7 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.pdfsam.model.ui.ComboItem;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.sejda.model.outline.OutlinePolicy;
import org.sejda.model.pdf.form.AcroFormPolicy;
@@ -108,13 +109,13 @@ public void restoreStateFrom() {
CheckBox blankIfOdd = robot.lookup("#blankIfOddCheck").queryAs(CheckBox.class);
CheckBox footer = robot.lookup("#footerCheck").queryAs(CheckBox.class);
ComboBox> normalize = robot.lookup("#normalizeCheck").queryComboBox();
- Map data = new HashMap<>();
- data.put("outline", OutlinePolicy.ONE_ENTRY_EACH_DOC.toString());
- data.put("acroForms", AcroFormPolicy.MERGE_RENAMING_EXISTING_FIELDS.toString());
- data.put("blankIfOdd", Boolean.FALSE.toString());
- data.put("footer", Boolean.TRUE.toString());
- data.put("pageNormalization", PageNormalizationPolicy.SAME_WIDTH_ORIENTATION_BASED.toString());
- data.put("toc", ToCPolicy.DOC_TITLES.toString());
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setEnum("outline", OutlinePolicy.ONE_ENTRY_EACH_DOC);
+ data.setEnum("acroForms", AcroFormPolicy.MERGE_RENAMING_EXISTING_FIELDS);
+ data.setBoolean("blankIfOdd", false);
+ data.setBoolean("footer", true);
+ data.setEnum("pageNormalization", PageNormalizationPolicy.SAME_WIDTH_ORIENTATION_BASED);
+ data.setEnum("toc", ToCPolicy.DOC_TITLES);
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals(OutlinePolicy.ONE_ENTRY_EACH_DOC, outline.getSelectionModel().getSelectedItem().key());
assertEquals(AcroFormPolicy.MERGE_RENAMING_EXISTING_FIELDS, forms.getSelectionModel().getSelectedItem().key());
@@ -128,8 +129,8 @@ public void restoreStateFrom() {
@Test
public void restoreNormalizationStateBackwardCompatible() {
ComboBox> normalize = robot.lookup("#normalizeCheck").queryComboBox();
- Map data = new HashMap<>();
- data.put("normalize", Boolean.TRUE.toString());
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setBoolean("normalize", true);
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals(PageNormalizationPolicy.SAME_WIDTH_ORIENTATION_BASED,
normalize.getSelectionModel().getSelectedItem().key());
@@ -143,13 +144,13 @@ public void reset() {
CheckBox blankIfOdd = robot.lookup("#blankIfOddCheck").queryAs(CheckBox.class);
CheckBox footer = robot.lookup("#footerCheck").queryAs(CheckBox.class);
ComboBox> normalize = robot.lookup("#normalizeCheck").queryComboBox();
- Map data = new HashMap<>();
- data.put("outline", OutlinePolicy.ONE_ENTRY_EACH_DOC.toString());
- data.put("acroForms", AcroFormPolicy.FLATTEN.toString());
- data.put("blankIfOdd", Boolean.TRUE.toString());
- data.put("footer", Boolean.TRUE.toString());
- data.put("pageNormalization", PageNormalizationPolicy.SAME_WIDTH_ORIENTATION_BASED.toString());
- data.put("toc", ToCPolicy.DOC_TITLES.toString());
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setEnum("outline", OutlinePolicy.ONE_ENTRY_EACH_DOC);
+ data.setEnum("acroForms", AcroFormPolicy.FLATTEN);
+ data.setBoolean("blankIfOdd", true);
+ data.setBoolean("footer", true);
+ data.setEnum("pageNormalization", PageNormalizationPolicy.SAME_WIDTH_ORIENTATION_BASED);
+ data.setEnum("toc", ToCPolicy.DOC_TITLES);
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals(OutlinePolicy.ONE_ENTRY_EACH_DOC, outline.getSelectionModel().getSelectedItem().key());
assertEquals(AcroFormPolicy.FLATTEN, forms.getSelectionModel().getSelectedItem().key());
diff --git a/pdfsam-tools/pdfsam-rotate/src/main/java/org/pdfsam/tools/rotate/RotateOptionsPane.java b/pdfsam-tools/pdfsam-rotate/src/main/java/org/pdfsam/tools/rotate/RotateOptionsPane.java
index 7c72e7305..da6aedcd5 100644
--- a/pdfsam-tools/pdfsam-rotate/src/main/java/org/pdfsam/tools/rotate/RotateOptionsPane.java
+++ b/pdfsam-tools/pdfsam-rotate/src/main/java/org/pdfsam/tools/rotate/RotateOptionsPane.java
@@ -25,6 +25,7 @@
import org.pdfsam.model.ui.ComboItem;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.support.Style;
import org.sejda.model.pdf.page.PredefinedSetOfPages;
import org.sejda.model.rotation.Rotation;
@@ -87,7 +88,7 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
+ public void restoreStateFrom(ToolData data) {
Optional.ofNullable(data.get("rotation")).map(Rotation::valueOf)
.flatMap(key -> this.rotation.getItems().stream().filter(i -> i.key().equals(key)).findFirst())
.ifPresent(this.rotation.getSelectionModel()::select);
diff --git a/pdfsam-tools/pdfsam-rotate/src/main/java/org/pdfsam/tools/rotate/RotateToolPanel.java b/pdfsam-tools/pdfsam-rotate/src/main/java/org/pdfsam/tools/rotate/RotateToolPanel.java
index 845ede9ad..592cc6192 100644
--- a/pdfsam-tools/pdfsam-rotate/src/main/java/org/pdfsam/tools/rotate/RotateToolPanel.java
+++ b/pdfsam-tools/pdfsam-rotate/src/main/java/org/pdfsam/tools/rotate/RotateToolPanel.java
@@ -27,6 +27,8 @@
import org.pdfsam.eventstudio.annotation.EventListener;
import org.pdfsam.eventstudio.annotation.EventStation;
import org.pdfsam.model.tool.ClearToolRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.io.BrowsableOutputDirectoryField;
import org.pdfsam.ui.components.io.PdfDestinationPane;
import org.pdfsam.ui.components.prefix.PrefixPane;
@@ -83,7 +85,8 @@ public void onSaveWorkspace(Map data) {
}
@Override
- public void onLoadWorkspace(Map data) {
+ public void onLoadWorkspace(WorkspaceData workspace) {
+ ToolData data = workspace.getToolData(this);
selectionPane.restoreStateFrom(data);
rotateOptions.restoreStateFrom(data);
destinationPane.restoreStateFrom(data);
diff --git a/pdfsam-tools/pdfsam-rotate/src/test/java/org/pdfsam/tools/rotate/RotateOptionsPaneTest.java b/pdfsam-tools/pdfsam-rotate/src/test/java/org/pdfsam/tools/rotate/RotateOptionsPaneTest.java
index a0db6355a..538431188 100644
--- a/pdfsam-tools/pdfsam-rotate/src/test/java/org/pdfsam/tools/rotate/RotateOptionsPaneTest.java
+++ b/pdfsam-tools/pdfsam-rotate/src/test/java/org/pdfsam/tools/rotate/RotateOptionsPaneTest.java
@@ -24,6 +24,7 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.pdfsam.model.ui.ComboItem;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.sejda.model.pdf.page.PredefinedSetOfPages;
import org.sejda.model.rotation.Rotation;
@@ -84,9 +85,9 @@ public void onSaveWorkspace() {
public void restoreStateFrom() {
ComboBox> rotationType = robot.lookup("#rotationType").queryComboBox();
ComboBox> rotation = robot.lookup("#rotation").queryComboBox();
- Map data = new HashMap<>();
- data.put("rotation", Rotation.DEGREES_270.toString());
- data.put("rotationType", PredefinedSetOfPages.EVEN_PAGES.toString());
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setEnum("rotation", Rotation.DEGREES_270);
+ data.setEnum("rotationType", PredefinedSetOfPages.EVEN_PAGES);
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals(Rotation.DEGREES_270, rotation.getSelectionModel().getSelectedItem().key());
assertEquals(PredefinedSetOfPages.EVEN_PAGES, rotationType.getSelectionModel().getSelectedItem().key());
@@ -96,9 +97,9 @@ public void restoreStateFrom() {
public void reset() {
ComboBox> rotationType = robot.lookup("#rotationType").queryComboBox();
ComboBox> rotation = robot.lookup("#rotation").queryComboBox();
- Map data = new HashMap<>();
- data.put("rotation", Rotation.DEGREES_270.toString());
- data.put("rotationType", PredefinedSetOfPages.EVEN_PAGES.toString());
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setEnum("rotation", Rotation.DEGREES_270);
+ data.setEnum("rotationType", PredefinedSetOfPages.EVEN_PAGES);
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals(Rotation.DEGREES_270, rotation.getSelectionModel().getSelectedItem().key());
assertEquals(PredefinedSetOfPages.EVEN_PAGES, rotationType.getSelectionModel().getSelectedItem().key());
diff --git a/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitAfterPredefinedSetOfPagesRadioButton.java b/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitAfterPredefinedSetOfPagesRadioButton.java
index 037b1d657..466d6e9fc 100644
--- a/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitAfterPredefinedSetOfPagesRadioButton.java
+++ b/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitAfterPredefinedSetOfPagesRadioButton.java
@@ -24,6 +24,7 @@
import org.pdfsam.model.ui.ComboItem;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.sejda.model.parameter.SimpleSplitParameters;
import org.sejda.model.pdf.page.PredefinedSetOfPages;
@@ -78,8 +79,8 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
- Optional.ofNullable(data.get("splitAfterPredefined")).map(Boolean::valueOf).ifPresent(this::setSelected);
+ public void restoreStateFrom(ToolData data) {
+ setSelected(data.getBoolean("splitAfterPredefined"));
Optional.ofNullable(data.get("splitAfterPredefined.combo")).map(PredefinedSetOfPages::valueOf)
.flatMap(key -> this.combo.getItems().stream().filter(i -> i.key().equals(key)).findFirst())
.ifPresent(this.combo.getSelectionModel()::select);
diff --git a/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitAfterRadioButton.java b/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitAfterRadioButton.java
index fcd372187..edeaea079 100644
--- a/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitAfterRadioButton.java
+++ b/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitAfterRadioButton.java
@@ -23,6 +23,7 @@
import org.pdfsam.core.support.validation.Validators;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.commons.ValidableTextField;
import org.pdfsam.ui.components.support.FXValidationSupport.ValidationState;
import org.sejda.conversion.PageNumbersListAdapter;
@@ -30,7 +31,6 @@
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.function.Consumer;
import static org.apache.commons.lang3.StringUtils.EMPTY;
@@ -77,9 +77,9 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
- Optional.ofNullable(data.get("splitAfter")).map(Boolean::valueOf).ifPresent(this::setSelected);
- field.setText(Optional.ofNullable(data.get("splitAfter.field")).orElse(EMPTY));
+ public void restoreStateFrom(ToolData data) {
+ setSelected(data.getBoolean("splitAfter"));
+ field.setText(data.get("splitAfter.field", EMPTY));
}
@Override
diff --git a/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitByEveryRadioButton.java b/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitByEveryRadioButton.java
index 75cd2fdf3..d7f5ca2f1 100644
--- a/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitByEveryRadioButton.java
+++ b/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitByEveryRadioButton.java
@@ -23,12 +23,12 @@
import org.pdfsam.core.support.validation.Validators;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.commons.ValidableTextField;
import org.pdfsam.ui.components.support.FXValidationSupport.ValidationState;
import org.sejda.model.parameter.SplitByEveryXPagesParameters;
import java.util.Map;
-import java.util.Optional;
import java.util.function.Consumer;
import static org.apache.commons.lang3.StringUtils.EMPTY;
@@ -75,9 +75,9 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
- Optional.ofNullable(data.get("splitByEvery")).map(Boolean::valueOf).ifPresent(this::setSelected);
- field.setText(Optional.ofNullable(data.get("splitByEvery.field")).orElse(EMPTY));
+ public void restoreStateFrom(ToolData data) {
+ setSelected(data.getBoolean("splitByEvery"));
+ field.setText(data.get("splitByEvery.field", EMPTY));
}
void setMaxPages(Integer value) {
diff --git a/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitOptionsPane.java b/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitOptionsPane.java
index d4b01d888..e3dfcf7f9 100644
--- a/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitOptionsPane.java
+++ b/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitOptionsPane.java
@@ -25,6 +25,7 @@
import org.pdfsam.model.ui.ComboItem;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.commons.RadioButtonDrivenTextFieldsPane;
import org.pdfsam.ui.components.commons.ValidableTextField;
import org.pdfsam.ui.components.support.Style;
@@ -95,7 +96,7 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
+ public void restoreStateFrom(ToolData data) {
splitAfterPredefined.restoreStateFrom(data);
splitAfter.restoreStateFrom(data);
splitByEvery.restoreStateFrom(data);
diff --git a/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitToolPanel.java b/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitToolPanel.java
index 42555451f..43956c06d 100644
--- a/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitToolPanel.java
+++ b/pdfsam-tools/pdfsam-simple-split/src/main/java/org/pdfsam/tools/split/SplitToolPanel.java
@@ -28,6 +28,8 @@
import org.pdfsam.eventstudio.annotation.EventListener;
import org.pdfsam.eventstudio.annotation.EventStation;
import org.pdfsam.model.tool.ClearToolRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.io.BrowsableOutputDirectoryField;
import org.pdfsam.ui.components.io.PdfDestinationPane;
import org.pdfsam.ui.components.prefix.PrefixPane;
@@ -80,7 +82,8 @@ public void onSaveWorkspace(Map data) {
}
@Override
- public void onLoadWorkspace(Map data) {
+ public void onLoadWorkspace(WorkspaceData workspace) {
+ ToolData data = workspace.getToolData(this);
selectionPane.restoreStateFrom(data);
splitOptions.restoreStateFrom(data);
destinationDirectoryField.restoreStateFrom(data);
diff --git a/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitAfterPredefinedSetOfPagesRadioButtonTest.java b/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitAfterPredefinedSetOfPagesRadioButtonTest.java
index e037433c3..710e8e2a0 100644
--- a/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitAfterPredefinedSetOfPagesRadioButtonTest.java
+++ b/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitAfterPredefinedSetOfPagesRadioButtonTest.java
@@ -28,6 +28,7 @@
import org.junit.jupiter.api.io.TempDir;
import org.pdfsam.core.ConfigurableSystemProperty;
import org.pdfsam.model.ui.ComboItem;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.sejda.model.input.PdfFileSource;
import org.sejda.model.optimization.OptimizationPolicy;
@@ -163,9 +164,9 @@ public void saveStateNotSelected() {
@Test
public void restoreState() {
ComboBox> combo = robot.lookup("#combo").queryComboBox();
- Map data = new HashMap<>();
- data.put("splitAfterPredefined", Boolean.TRUE.toString());
- data.put("splitAfterPredefined.combo", PredefinedSetOfPages.EVEN_PAGES.toString());
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setBoolean("splitAfterPredefined", true);
+ data.setEnum("splitAfterPredefined.combo", PredefinedSetOfPages.EVEN_PAGES);
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertTrue(victim.isSelected());
assertEquals(PredefinedSetOfPages.EVEN_PAGES, combo.getSelectionModel().getSelectedItem().key());
diff --git a/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitAfterRadioButtonTest.java b/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitAfterRadioButtonTest.java
index dfd38f63d..75b20629f 100644
--- a/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitAfterRadioButtonTest.java
+++ b/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitAfterRadioButtonTest.java
@@ -27,6 +27,7 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.io.TempDir;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.pdfsam.tools.split.SplitAfterRadioButton.SplitByPageParametersBuilder;
import org.pdfsam.ui.components.commons.ValidableTextField;
@@ -181,9 +182,9 @@ public void saveStateNotSelected() {
@Test
public void restoreState() {
ValidableTextField field = robot.lookup("#field").queryAs(ValidableTextField.class);
- Map data = new HashMap<>();
- data.put("splitAfter", Boolean.TRUE.toString());
- data.put("splitAfter.field", "chuck");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setBoolean("splitAfter", true);
+ data.set("splitAfter.field", "chuck");
victim.restoreStateFrom(data);
assertTrue(victim.isSelected());
assertEquals("chuck", field.getText());
diff --git a/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitByEveryRadioButtonTest.java b/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitByEveryRadioButtonTest.java
index 369798308..57f0744cf 100644
--- a/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitByEveryRadioButtonTest.java
+++ b/pdfsam-tools/pdfsam-simple-split/src/test/java/org/pdfsam/tools/split/SplitByEveryRadioButtonTest.java
@@ -27,6 +27,7 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.io.TempDir;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.pdfsam.ui.components.commons.ValidableTextField;
import org.pdfsam.ui.components.support.FXValidationSupport.ValidationState;
@@ -166,9 +167,9 @@ public void saveStateNotSelected() {
@Test
public void restoreState() {
ValidableTextField field = robot.lookup("#field").queryAs(ValidableTextField.class);
- Map data = new HashMap<>();
- data.put("splitByEvery", Boolean.TRUE.toString());
- data.put("splitByEvery.field", "chuck");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setBoolean("splitByEvery", true);
+ data.set("splitByEvery.field", "chuck");
victim.restoreStateFrom(data);
assertTrue(victim.isSelected());
assertEquals("chuck", field.getText());
diff --git a/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/BookmarksLevelComboBox.java b/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/BookmarksLevelComboBox.java
index 5bbd051ce..4a45d77cc 100644
--- a/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/BookmarksLevelComboBox.java
+++ b/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/BookmarksLevelComboBox.java
@@ -24,6 +24,7 @@
import org.pdfsam.core.support.validation.Validators;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.support.FXValidationSupport;
import org.pdfsam.ui.components.support.FXValidationSupport.ValidationState;
import org.pdfsam.ui.components.support.Style;
@@ -36,11 +37,12 @@
import static java.util.Objects.nonNull;
import static java.util.Optional.ofNullable;
+import static org.apache.commons.lang3.StringUtils.EMPTY;
import static org.pdfsam.i18n.I18nContext.i18n;
/**
* Combo box letting the user specify the filesize in the split by size task
- *
+ *
* @author Andrea Vacondio
*
*/
@@ -60,7 +62,7 @@ class BookmarksLevelComboBox extends ComboBox
getEditor().getStyleClass().removeAll(Style.INVALID.css());
}
});
-
+
}
public void setValidBookmarkLevels(SortedSet levels) {
@@ -111,11 +113,12 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
+ public void restoreStateFrom(ToolData data) {
getSelectionModel().selectFirst();
- ofNullable(data.get("levelCombo.max")).map(Integer::valueOf).ifPresent(max -> IntStream.rangeClosed(1, max).mapToObj(Integer::toString).forEach(getItems()::add));
+ ofNullable(data.getInt("levelCombo.max", null)).ifPresent(
+ max -> IntStream.rangeClosed(1, max).mapToObj(Integer::toString).forEach(getItems()::add));
Arrays.stream(ofNullable(data.get("levelCombo.levels")).map(l -> l.split(",")).orElse(new String[0]))
.forEach(getItems()::add);
- setValue(ofNullable(data.get("levelCombo.selected")).orElse(""));
+ setValue(data.get("levelCombo.selected", EMPTY));
}
}
diff --git a/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/SplitByBookmarksToolPanel.java b/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/SplitByBookmarksToolPanel.java
index 5d4790c71..9df98d373 100644
--- a/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/SplitByBookmarksToolPanel.java
+++ b/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/SplitByBookmarksToolPanel.java
@@ -27,6 +27,8 @@
import org.pdfsam.eventstudio.annotation.EventListener;
import org.pdfsam.eventstudio.annotation.EventStation;
import org.pdfsam.model.tool.ClearToolRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.io.BrowsableOutputDirectoryField;
import org.pdfsam.ui.components.io.PdfDestinationPane;
import org.pdfsam.ui.components.prefix.PrefixPane;
@@ -78,7 +80,8 @@ public void onSaveWorkspace(Map data) {
}
@Override
- public void onLoadWorkspace(Map data) {
+ public void onLoadWorkspace(WorkspaceData workspace) {
+ ToolData data = workspace.getToolData(this);
selectionPane.restoreStateFrom(data);
splitOptions.restoreStateFrom(data);
destinationDirectoryField.restoreStateFrom(data);
diff --git a/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/SplitOptionsPane.java b/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/SplitOptionsPane.java
index de4c3ae81..436555a52 100644
--- a/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/SplitOptionsPane.java
+++ b/pdfsam-tools/pdfsam-split-by-bookmarks/src/main/java/org/pdfsam/tools/splitbybookmarks/SplitOptionsPane.java
@@ -28,10 +28,10 @@
import org.pdfsam.core.support.params.TaskParametersBuildStep;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.support.Style;
import java.util.Map;
-import java.util.Optional;
import java.util.SortedSet;
import java.util.function.Consumer;
@@ -115,8 +115,8 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
- regexpField.setText(Optional.ofNullable(data.get("regexp")).orElse(EMPTY));
+ public void restoreStateFrom(ToolData data) {
+ regexpField.setText(data.get("regexp", EMPTY));
levelCombo.restoreStateFrom(data);
}
}
diff --git a/pdfsam-tools/pdfsam-split-by-bookmarks/src/test/java/org/pdfsam/tools/splitbybookmarks/BookmarksLevelComboBoxTest.java b/pdfsam-tools/pdfsam-split-by-bookmarks/src/test/java/org/pdfsam/tools/splitbybookmarks/BookmarksLevelComboBoxTest.java
index 15a75ed09..dbff628b1 100644
--- a/pdfsam-tools/pdfsam-split-by-bookmarks/src/test/java/org/pdfsam/tools/splitbybookmarks/BookmarksLevelComboBoxTest.java
+++ b/pdfsam-tools/pdfsam-split-by-bookmarks/src/test/java/org/pdfsam/tools/splitbybookmarks/BookmarksLevelComboBoxTest.java
@@ -27,6 +27,7 @@
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.pdfsam.ui.components.support.FXValidationSupport.ValidationState;
import org.pdfsam.ui.components.support.Style;
@@ -175,9 +176,9 @@ public void saveStateEmptySelection() {
@Test
public void restoreState() {
victim.setValidBookmarkLevels(new TreeSet<>(Arrays.asList(40, 50)));
- Map data = new HashMap<>();
- data.put("levelCombo.levels", "2,3,5,6,7,10");
- data.put("levelCombo.selected", "2");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.set("levelCombo.levels", "2,3,5,6,7,10");
+ data.setInt("levelCombo.selected", 2);
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals("2", victim.getValue());
assertThat(victim.getItems()).contains("2", "3", "5", "6", "7", "10");
@@ -197,9 +198,9 @@ public void reset() {
@Test
public void restoreStateBackwardCompatible() {
victim.setValidBookmarkLevels(new TreeSet<>(Arrays.asList(40, 50)));
- Map data = new HashMap<>();
- data.put("levelCombo.max", "3");
- data.put("levelCombo.selected", "2");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setInt("levelCombo.max", 3);
+ data.setInt("levelCombo.selected", 2);
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals("2", victim.getValue());
assertThat(victim.getItems()).contains("1", "2", "3");
@@ -208,8 +209,8 @@ public void restoreStateBackwardCompatible() {
@Test
public void restoreStateEmptySelected() {
victim.setValidBookmarkLevels(validLevels);
- Map data = new HashMap<>();
- data.put("levelCombo.selected", "");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.set("levelCombo.selected", "");
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals("", victim.getValue());
}
@@ -217,8 +218,8 @@ public void restoreStateEmptySelected() {
@Test
public void restoreStateNullSelected() {
victim.setValidBookmarkLevels(validLevels);
- Map data = new HashMap<>();
- data.put("levelCombo.selected", null);
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.set("levelCombo.selected", null);
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals("", victim.getValue());
}
diff --git a/pdfsam-tools/pdfsam-split-by-bookmarks/src/test/java/org/pdfsam/tools/splitbybookmarks/SplitOptionsPaneTest.java b/pdfsam-tools/pdfsam-split-by-bookmarks/src/test/java/org/pdfsam/tools/splitbybookmarks/SplitOptionsPaneTest.java
index 9c7c6e33c..4affda117 100644
--- a/pdfsam-tools/pdfsam-split-by-bookmarks/src/test/java/org/pdfsam/tools/splitbybookmarks/SplitOptionsPaneTest.java
+++ b/pdfsam-tools/pdfsam-split-by-bookmarks/src/test/java/org/pdfsam/tools/splitbybookmarks/SplitOptionsPaneTest.java
@@ -26,6 +26,7 @@
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.testfx.api.FxRobot;
import org.testfx.framework.junit5.ApplicationExtension;
@@ -131,10 +132,10 @@ public void saveStateEmptyRegexp() {
@Test
public void restoreState() {
- Map data = new HashMap<>();
- data.put("regexp", "Chuck");
- data.put("levelCombo.selected", "2");
- data.put("levelCombo.levels", "2,3,5,6,7,10");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.set("regexp", "Chuck");
+ data.set("levelCombo.selected", "2");
+ data.set("levelCombo.levels", "2,3,5,6,7,10");
victim.restoreStateFrom(data);
TextInputControl field = robot.lookup("#bookmarksRegexp").queryTextInputControl();
assertEquals("Chuck", field.getText());
diff --git a/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SizeUnitRadio.java b/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SizeUnitRadio.java
index 0f6427242..de78332b1 100644
--- a/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SizeUnitRadio.java
+++ b/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SizeUnitRadio.java
@@ -20,9 +20,9 @@
import javafx.scene.control.RadioButton;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import java.util.Map;
-import java.util.Optional;
import static org.sejda.commons.util.RequireUtils.requireNotNullArg;
@@ -50,8 +50,8 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
- Optional.ofNullable(data.get(unit.toString())).map(Boolean::valueOf).ifPresent(this::setSelected);
+ public void restoreStateFrom(ToolData data) {
+ setSelected(data.getBoolean(unit.toString()));
}
public SizeUnit unit() {
diff --git a/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SplitBySizeToolPanel.java b/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SplitBySizeToolPanel.java
index 157d34e14..f25f2c792 100644
--- a/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SplitBySizeToolPanel.java
+++ b/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SplitBySizeToolPanel.java
@@ -27,6 +27,8 @@
import org.pdfsam.eventstudio.annotation.EventListener;
import org.pdfsam.eventstudio.annotation.EventStation;
import org.pdfsam.model.tool.ClearToolRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.io.BrowsableOutputDirectoryField;
import org.pdfsam.ui.components.io.PdfDestinationPane;
import org.pdfsam.ui.components.prefix.PrefixPane;
@@ -77,7 +79,8 @@ public void onSaveWorkspace(Map data) {
}
@Override
- public void onLoadWorkspace(Map data) {
+ public void onLoadWorkspace(WorkspaceData workspace) {
+ ToolData data = workspace.getToolData(this);
selectionPane.restoreStateFrom(data);
splitOptions.restoreStateFrom(data);
destinationDirectoryField.restoreStateFrom(data);
diff --git a/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SplitOptionsPane.java b/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SplitOptionsPane.java
index 1fcf7d0d5..e88783cde 100644
--- a/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SplitOptionsPane.java
+++ b/pdfsam-tools/pdfsam-split-by-size/src/main/java/org/pdfsam/tools/splitbysize/SplitOptionsPane.java
@@ -25,13 +25,13 @@
import org.pdfsam.core.support.validation.Validators;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.commons.ValidableTextField;
import org.pdfsam.ui.components.support.FXValidationSupport.ValidationState;
import org.pdfsam.ui.components.support.Style;
import java.util.Arrays;
import java.util.Map;
-import java.util.Optional;
import java.util.function.Consumer;
import static org.apache.commons.lang3.StringUtils.EMPTY;
@@ -85,8 +85,8 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
- field.setText(Optional.ofNullable(data.get("size")).orElse(EMPTY));
+ public void restoreStateFrom(ToolData data) {
+ field.setText(data.get("size", EMPTY));
group.getToggles().stream().map(t -> (SizeUnitRadio) t).forEach(s -> s.restoreStateFrom(data));
}
diff --git a/pdfsam-tools/pdfsam-split-by-size/src/test/java/org/pdfsam/tools/splitbysize/SizeUnitRadioTest.java b/pdfsam-tools/pdfsam-split-by-size/src/test/java/org/pdfsam/tools/splitbysize/SizeUnitRadioTest.java
index ab57a9dad..7fd6468cf 100644
--- a/pdfsam-tools/pdfsam-split-by-size/src/test/java/org/pdfsam/tools/splitbysize/SizeUnitRadioTest.java
+++ b/pdfsam-tools/pdfsam-split-by-size/src/test/java/org/pdfsam/tools/splitbysize/SizeUnitRadioTest.java
@@ -20,6 +20,7 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.JavaFxThreadInitializeExtension;
import java.util.HashMap;
@@ -62,8 +63,8 @@ public void onSaveStateNotSelected() {
public void onRestoreState() {
SizeUnitRadio victim = new SizeUnitRadio(SizeUnit.MEGABYTE);
victim.setSelected(false);
- Map data = new HashMap<>();
- data.put(SizeUnit.MEGABYTE.toString(), Boolean.TRUE.toString());
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setBoolean(SizeUnit.MEGABYTE.toString(), true);
victim.restoreStateFrom(data);
assertTrue(victim.isSelected());
}
diff --git a/pdfsam-tools/pdfsam-split-by-size/src/test/java/org/pdfsam/tools/splitbysize/SplitOptionsPaneTest.java b/pdfsam-tools/pdfsam-split-by-size/src/test/java/org/pdfsam/tools/splitbysize/SplitOptionsPaneTest.java
index baf454912..bf25784b2 100644
--- a/pdfsam-tools/pdfsam-split-by-size/src/test/java/org/pdfsam/tools/splitbysize/SplitOptionsPaneTest.java
+++ b/pdfsam-tools/pdfsam-split-by-size/src/test/java/org/pdfsam/tools/splitbysize/SplitOptionsPaneTest.java
@@ -26,6 +26,7 @@
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.testfx.api.FxRobot;
import org.testfx.framework.junit5.ApplicationExtension;
@@ -104,9 +105,9 @@ public void saveState() {
public void restoreState() {
SizeUnitRadio kilo = robot.lookup("#unit" + SizeUnit.KILOBYTE.symbol()).queryAs(SizeUnitRadio.class);
SizeUnitRadio mega = robot.lookup("#unit" + SizeUnit.MEGABYTE.symbol()).queryAs(SizeUnitRadio.class);
- Map data = new HashMap<>();
- data.put("size", "100");
- data.put(SizeUnit.MEGABYTE.toString(), Boolean.TRUE.toString());
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setInt("size", 100);
+ data.setBoolean(SizeUnit.MEGABYTE.toString(), true);
victim.restoreStateFrom(data);
TextInputControl field = robot.lookup("#sizeField").queryTextInputControl();
assertEquals("100", field.getText());
diff --git a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/io/BrowsableField.java b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/io/BrowsableField.java
index 8fbd7b13f..5970b3736 100644
--- a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/io/BrowsableField.java
+++ b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/io/BrowsableField.java
@@ -25,6 +25,7 @@
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.commons.ValidableTextField;
import org.pdfsam.ui.components.support.FXValidationSupport;
import org.pdfsam.ui.components.support.Style;
@@ -33,7 +34,6 @@
import java.nio.file.Path;
import java.util.Map;
import java.util.Objects;
-import java.util.Optional;
import static org.apache.commons.lang3.StringUtils.EMPTY;
import static org.apache.commons.lang3.StringUtils.defaultString;
@@ -109,8 +109,8 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
- textField.setText(Optional.ofNullable(data.get(defaultString(getId()) + "browsableField")).orElse(EMPTY));
+ public void restoreStateFrom(ToolData data) {
+ textField.setText(data.get(defaultString(getId()) + "browsableField", EMPTY));
}
public final void setGraphic(Node value) {
diff --git a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/io/PdfDestinationPane.java b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/io/PdfDestinationPane.java
index cb5b0ad78..f1c337314 100644
--- a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/io/PdfDestinationPane.java
+++ b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/io/PdfDestinationPane.java
@@ -33,6 +33,7 @@
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.SetDestinationRequest;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.support.Style;
import org.pdfsam.ui.components.support.Views;
import org.sejda.model.output.ExistingOutputPolicy;
@@ -166,11 +167,11 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
+ public void restoreStateFrom(ToolData data) {
version.resetView();
- compress.setSelected(Boolean.parseBoolean(data.get("compress")));
- overwrite().setSelected(Boolean.parseBoolean(data.get("overwrite")));
- discardBookmarks.ifPresent(d -> d.setSelected(Boolean.parseBoolean(data.get("discardBookmarks"))));
+ compress.setSelected(data.getBoolean("compress"));
+ overwrite().setSelected(data.getBoolean("overwrite"));
+ discardBookmarks.ifPresent(d -> d.setSelected(data.getBoolean("discardBookmarks")));
ofNullable(data.get("version")).map(PdfVersion::valueOf).map(DefaultPdfVersionComboItem::new)
.ifPresent(v -> this.version.getSelectionModel().select(v));
}
diff --git a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/prefix/PrefixPane.java b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/prefix/PrefixPane.java
index 9488b5d3a..efe04393a 100644
--- a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/prefix/PrefixPane.java
+++ b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/prefix/PrefixPane.java
@@ -29,12 +29,12 @@
import org.pdfsam.model.tool.ToolBound;
import org.pdfsam.model.ui.ResettableView;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.persistence.PreferencesRepository;
import org.pdfsam.ui.components.support.Style;
import org.sejda.model.prefix.Prefix;
import java.util.Map;
-import java.util.Optional;
import java.util.function.Consumer;
import static org.apache.commons.lang3.StringUtils.EMPTY;
@@ -126,8 +126,8 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
- field.setText(Optional.ofNullable(data.get(defaultString(getId()) + "prefix")).orElse(EMPTY));
+ public void restoreStateFrom(ToolData data) {
+ field.setText(data.get(defaultString(getId()) + "prefix", EMPTY));
}
}
diff --git a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/multiple/MultipleSelectionPane.java b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/multiple/MultipleSelectionPane.java
index d920522dd..35b9ef8e9 100644
--- a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/multiple/MultipleSelectionPane.java
+++ b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/multiple/MultipleSelectionPane.java
@@ -30,6 +30,7 @@
import org.pdfsam.model.tool.ClearToolRequest;
import org.pdfsam.model.tool.ToolBound;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.selection.RemoveSelectedEvent;
import org.sejda.model.parameter.base.TaskParameters;
@@ -103,7 +104,7 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
+ public void restoreStateFrom(ToolData data) {
table.restoreStateFrom(data);
}
diff --git a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/multiple/SelectionTable.java b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/multiple/SelectionTable.java
index e2dbacec7..39f40aeb1 100644
--- a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/multiple/SelectionTable.java
+++ b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/multiple/SelectionTable.java
@@ -66,6 +66,7 @@
import org.pdfsam.model.ui.ShowStageRequest;
import org.pdfsam.model.ui.dnd.FilesDroppedEvent;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.selection.PasswordFieldPopup;
import org.pdfsam.ui.components.selection.RemoveSelectedEvent;
import org.pdfsam.ui.components.selection.SetPageRangesRequest;
@@ -76,7 +77,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -590,23 +590,23 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
+ public void restoreStateFrom(ToolData data) {
onClear(null);
- int size = Optional.ofNullable(data.get(defaultString(getId()) + "input.size")).map(Integer::valueOf).orElse(0);
+ String id = defaultString(getId());
+ int size = data.getInt(id + "input.size", 0);
if (size > 0) {
PdfLoadRequest loadEvent = new PdfLoadRequest(toolBinding());
List items = new ArrayList<>();
IntStream.range(0, size).forEach(i -> {
- String id = defaultString(getId());
- Optional.ofNullable(data.get(id + "input." + i)).ifPresent(f -> {
- PdfDocumentDescriptor descriptor = PdfDocumentDescriptor.newDescriptor(new File(f),
+ Optional.ofNullable(data.getPath(id + "input." + i)).ifPresent(p -> {
+ PdfDocumentDescriptor descriptor = PdfDocumentDescriptor.newDescriptor(p.toFile(),
ofNullable(data.get(id + "input.password.enc" + i)).map(EncryptionUtils::decrypt)
- .orElseGet(() -> data.get(defaultString(getId()) + "input.password." + i)));
+ .orElseGet(() -> data.get(id + "input.password." + i)));
loadEvent.add(descriptor);
SelectionTableRowData row = new SelectionTableRowData(descriptor);
row.pageSelection.set(data.get(id + "input.range." + i));
row.pace.set(data.get(id + "input.step." + i));
- row.reverse.set(Boolean.parseBoolean(data.get(id + "input.reverse." + i)));
+ row.reverse.set(data.getBoolean(id + "input.reverse." + i));
items.add(row);
});
});
diff --git a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/single/SingleSelectionPane.java b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/single/SingleSelectionPane.java
index 5a19a8257..bb24a35d5 100644
--- a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/single/SingleSelectionPane.java
+++ b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/selection/single/SingleSelectionPane.java
@@ -59,6 +59,7 @@
import org.pdfsam.model.ui.ShowPdfDescriptorRequest;
import org.pdfsam.model.ui.ShowStageRequest;
import org.pdfsam.model.ui.workspace.RestorableView;
+import org.pdfsam.model.ui.workspace.WorkspaceData.ToolData;
import org.pdfsam.ui.components.commons.ToggleChangeListener;
import org.pdfsam.ui.components.io.BrowsableFileField;
import org.pdfsam.ui.components.selection.LoadingStatusIndicatorUpdater;
@@ -261,15 +262,16 @@ public void saveStateTo(Map data) {
}
@Override
- public void restoreStateFrom(Map data) {
+ public void restoreStateFrom(ToolData data) {
getField().getTextField().setText(EMPTY);
- Optional.ofNullable(data.get(defaultString(getId()) + "input")).ifPresent(f -> {
+ String id = defaultString(getId());
+ Optional.ofNullable(data.getPath(id + "input")).ifPresent(p -> {
onValidState.disabled(true);
- getField().getTextField().setText(f);
+ getField().getTextField().setText(p.toString());
onValidState.disabled(false);
- initializeFor(newDescriptor(new File(f),
- ofNullable(data.get(defaultString(getId()) + "input.password.enc")).map(EncryptionUtils::decrypt)
- .orElseGet(() -> data.get(defaultString(getId()) + "input.password"))));
+ initializeFor(newDescriptor(p.toFile(),
+ ofNullable(data.get(id + "input.password.enc")).map(EncryptionUtils::decrypt)
+ .orElseGet(() -> data.get(id + "input.password"))));
});
}
diff --git a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/tool/BaseToolPanel.java b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/tool/BaseToolPanel.java
index 73178e0ee..309cec996 100644
--- a/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/tool/BaseToolPanel.java
+++ b/pdfsam-ui-components/src/main/java/org/pdfsam/ui/components/tool/BaseToolPanel.java
@@ -29,6 +29,7 @@
import org.pdfsam.model.tool.ToolBound;
import org.pdfsam.model.ui.workspace.LoadWorkspaceResponse;
import org.pdfsam.model.ui.workspace.SaveWorkspaceRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.ui.components.notification.AddNotificationRequest;
import org.pdfsam.ui.components.notification.NotificationType;
import org.pdfsam.ui.components.support.Style;
@@ -87,7 +88,7 @@ public final void saveStateData(SaveWorkspaceRequest event) {
@EventListener
public final void restoreState(LoadWorkspaceResponse event) {
- Platform.runLater(() -> onLoadWorkspace(event.getData(toolBinding())));
+ Platform.runLater(() -> onLoadWorkspace(event.data()));
}
/**
@@ -100,9 +101,9 @@ public final void restoreState(LoadWorkspaceResponse event) {
/**
* Request to restore the module state using the provided data.
*
- * @param data
+ * @param workspace
*/
- public abstract void onLoadWorkspace(Map data);
+ public abstract void onLoadWorkspace(WorkspaceData workspace);
@EventListener
public void onRunButtonAccelerator(RunButtonTriggerRequest request) {
diff --git a/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/io/BrowsableFileFieldTest.java b/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/io/BrowsableFileFieldTest.java
index 76c8b5907..eb6fb0801 100644
--- a/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/io/BrowsableFileFieldTest.java
+++ b/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/io/BrowsableFileFieldTest.java
@@ -24,6 +24,7 @@
import org.pdfsam.i18n.SetLocaleRequest;
import org.pdfsam.model.io.FileType;
import org.pdfsam.model.io.OpenType;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.JavaFxThreadExtension;
import org.pdfsam.ui.components.support.FXValidationSupport.ValidationState;
@@ -173,8 +174,8 @@ public void saveState(@TempDir Path folder) {
public void restoreState() {
BrowsableFileField victim = new BrowsableFileField(FileType.PDF, OpenType.SAVE);
victim.setId("fieldId");
- Map data = new HashMap<>();
- data.put("fieldIdbrowsableField", "/some/file/test.pdf");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.set("fieldIdbrowsableField", "/some/file/test.pdf");
victim.restoreStateFrom(data);
assertEquals("/some/file/test.pdf", victim.getTextField().getText());
}
diff --git a/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/io/PdfDestinationPaneTest.java b/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/io/PdfDestinationPaneTest.java
index 5fe9d5918..8202528b5 100644
--- a/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/io/PdfDestinationPaneTest.java
+++ b/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/io/PdfDestinationPaneTest.java
@@ -27,6 +27,7 @@
import org.pdfsam.core.context.BooleanPersistentProperty;
import org.pdfsam.model.ui.PdfVersionComboItem;
import org.pdfsam.model.ui.SetDestinationRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.pdfsam.test.JavaFxThreadInitializeExtension;
import org.sejda.model.pdf.PdfVersion;
@@ -134,10 +135,10 @@ public void saveState() {
@Test
public void restoreState() {
- Map data = new HashMap<>();
- data.put("overwrite", Boolean.FALSE.toString());
- data.put("compress", Boolean.TRUE.toString());
- data.put("version", PdfVersion.VERSION_1_4.toString());
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setBoolean("overwrite", false);
+ data.setBoolean("compress", true);
+ data.setEnum("version", PdfVersion.VERSION_1_4);
victim.restoreStateFrom(data);
assertFalse(victim.overwrite().isSelected());
}
diff --git a/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/prefix/PrefixPaneTest.java b/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/prefix/PrefixPaneTest.java
index 995583afd..ce65724ae 100644
--- a/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/prefix/PrefixPaneTest.java
+++ b/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/prefix/PrefixPaneTest.java
@@ -28,6 +28,7 @@
import org.pdfsam.core.context.StringPersistentProperty;
import org.pdfsam.core.support.params.MultipleOutputTaskParametersBuilder;
import org.pdfsam.model.tool.TaskExecutionRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.persistence.PreferencesRepository;
import org.pdfsam.test.ClearEventStudioExtension;
import org.sejda.model.parameter.base.AbstractParameters;
@@ -112,8 +113,8 @@ public void restoredFieldValue() {
@Test
public void restoreState() {
- Map data = new HashMap<>();
- data.put("victimprefix", "Chuck");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.set("victimprefix", "Chuck");
victim.restoreStateFrom(data);
assertEquals("Chuck", victim.getText());
}
diff --git a/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/selection/multiple/SelectionTableTest.java b/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/selection/multiple/SelectionTableTest.java
index 99d8b057a..084e592c8 100644
--- a/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/selection/multiple/SelectionTableTest.java
+++ b/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/selection/multiple/SelectionTableTest.java
@@ -52,6 +52,7 @@
import org.pdfsam.model.ui.SetDestinationRequest;
import org.pdfsam.model.ui.ShowLogMessagesRequest;
import org.pdfsam.model.ui.ShowPdfDescriptorRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.pdfsam.test.HitTestListener;
import org.pdfsam.ui.components.selection.RemoveSelectedEvent;
@@ -236,10 +237,10 @@ public void restoreStateFromPwdBackwardCompatible() {
eventStudio().clear();
Listener listener = mock(Listener.class);
eventStudio().add(PdfLoadRequest.class, listener);
- Map data = new HashMap<>();
- data.put("victiminput.size", "1");
- data.put("victiminput.0", "chuck.pdf");
- data.put("victiminput.password.0", "pwd");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.setInt("victiminput.size", 1);
+ data.set("victiminput.0", "chuck.pdf");
+ data.set("victiminput.password.0", "pwd");
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals(1, victim.getItems().size());
SelectionTableRowData first = victim.getItems().get(0);
@@ -251,14 +252,14 @@ public void restoreStateFrom() {
eventStudio().clear();
Listener listener = mock(Listener.class);
eventStudio().add(PdfLoadRequest.class, listener);
- Map data = new HashMap<>();
- data.put("victiminput.size", "2");
- data.put("victiminput.0", "chuck.pdf");
- data.put("victiminput.password.enc0", EncryptionUtils.encrypt("pwd"));
- data.put("victiminput.range.0", "1-10");
- data.put("victiminput.step.0", "4");
- data.put("victiminput.reverse.0", "true");
- data.put("victiminput.1", "norris.pdf");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.set("victiminput.size", "2");
+ data.set("victiminput.0", "chuck.pdf");
+ data.set("victiminput.password.enc0", EncryptionUtils.encrypt("pwd"));
+ data.set("victiminput.range.0", "1-10");
+ data.set("victiminput.step.0", "4");
+ data.set("victiminput.reverse.0", "true");
+ data.set("victiminput.1", "norris.pdf");
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals(2, victim.getItems().size());
SelectionTableRowData first = victim.getItems().get(0);
@@ -277,15 +278,15 @@ public void restoreStateFrom() {
@Test
public void restoreStateFromEmpty() {
- Map data = new HashMap<>();
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertTrue(victim.getItems().isEmpty());
}
@Test
public void restoreStateFromSizeZero() {
- Map data = new HashMap<>();
- data.put("victiminput.size", "0");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.set("victiminput.size", "0");
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertTrue(victim.getItems().isEmpty());
}
diff --git a/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/selection/single/SingleSelectionPaneTest.java b/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/selection/single/SingleSelectionPaneTest.java
index 58f81ae2d..596ae45b7 100644
--- a/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/selection/single/SingleSelectionPaneTest.java
+++ b/pdfsam-ui-components/src/test/java/org/pdfsam/ui/components/selection/single/SingleSelectionPaneTest.java
@@ -43,6 +43,7 @@
import org.pdfsam.model.ui.SetDestinationRequest;
import org.pdfsam.model.ui.ShowLogMessagesRequest;
import org.pdfsam.model.ui.ShowPdfDescriptorRequest;
+import org.pdfsam.model.ui.workspace.WorkspaceData;
import org.pdfsam.test.ClearEventStudioExtension;
import org.pdfsam.test.HitConsumer;
import org.pdfsam.test.HitTestListener;
@@ -313,9 +314,9 @@ public void onSaveWorkspaceEmptyDescriptor() {
public void restoreStateFromPwdBackwardCompatible() {
Listener listener = mock(Listener.class);
eventStudio().add(PdfLoadRequest.class, listener);
- Map data = new HashMap<>();
- data.put("victim-selection-paneinput", "chuck.pdf");
- data.put("victim-selection-paneinput.password", "pwd");
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.set("victim-selection-paneinput", "chuck.pdf");
+ data.set("victim-selection-paneinput.password", "pwd");
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals("chuck.pdf", victim.getField().getTextField().getText());
assertEquals("pwd", victim.getPdfDocumentDescriptor().getPassword());
@@ -326,9 +327,9 @@ public void restoreStateFromPwdBackwardCompatible() {
public void restoreStateFrom() {
Listener listener = mock(Listener.class);
eventStudio().add(PdfLoadRequest.class, listener);
- Map data = new HashMap<>();
- data.put("victim-selection-paneinput", "chuck.pdf");
- data.put("victim-selection-paneinput.password.enc", EncryptionUtils.encrypt("pwd"));
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
+ data.set("victim-selection-paneinput", "chuck.pdf");
+ data.set("victim-selection-paneinput.password.enc", EncryptionUtils.encrypt("pwd"));
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertEquals("chuck.pdf", victim.getField().getTextField().getText());
assertEquals("pwd", victim.getPdfDocumentDescriptor().getPassword());
@@ -338,7 +339,7 @@ public void restoreStateFrom() {
@Test
public void restoreStateFromEmpty() throws Exception {
moveToLoadedState(victim);
- Map data = new HashMap<>();
+ WorkspaceData.ToolData data = new WorkspaceData.ToolData();
WaitForAsyncUtils.waitForAsyncFx(2000, () -> victim.restoreStateFrom(data));
assertTrue(isEmpty(victim.getField().getTextField().getText()));
}