Browse Source

improved file naming

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
main
Stephan Richter 1 year ago
parent
commit
19dd5e183a
  1. 95
      doc/rework.md
  2. 20
      pom.xml
  3. 1
      resources/translations/Application.de.translation
  4. 108
      src/main/java/de/srsoftware/belegscanner/gui/DocTable.java
  5. 122
      src/main/java/de/srsoftware/belegscanner/gui/MainFrame.java
  6. 31
      src/main/java/de/srsoftware/belegscanner/gui/Toolbar.java

95
doc/rework.md

@ -0,0 +1,95 @@ @@ -0,0 +1,95 @@
# Ideen
Verbesserung des Pfad-Handlings
## Stand
Aktuell werden Dokumente nach folgendem Muster erzeugt:
Wenn der gesetzte Pfad
`$HOME/Dokumente/$YEAR/$MONTH/$BETREFF`
ist, würde am 5.2.2023 ein von `srichter` ausgelöster PDF-Auftrag mit Betreff „Demo“ zunächst eine Datei
`/home/srichter/2023/02/Demo/<timestamp.jpg>` ergeben.
Falls das Ziel ein PDF ist, würde sofort danach die Datei zu
`/home/srichter/2023/02/Demo/<timestamp.page.pdf>` konvertiert.
Falls OCR aktiviert ist, würde danach
`/home/srichter/2023/02/Demo/<timestamp.page.ocr.pdf>` erzeugt.
Beim Zusammenfügen ergäbe sich dann
`/home/srichter/2023/02/Demo/Demo.pdf`.
## Gewünschtes Verfahren
Sinnvoll wäre es, wenn bei gesetzem Pfad
`$HOME/Dokumente/$YEAR/$MONTH/$BETREFF`
die Dateien wie folgt erzeugt würden:
### Ziel JPG
Die Datei wird direkt nach
`/home/srichter/2023/02/Demo.jpg` gescannt.
### Ziel PDF
Die Datei wird nach
`/home/srichter/2023/02/Demo.jpg` gescannt und dann nach
`/home/srichter/2023/02/Demo.pdf` konvertiert.
### Ziel PDF+OCR
Die Datei wird nach
`/home/srichter/2023/02/Demo.jpg` gescannt,
dann nach
`/home/srichter/2023/02/Demo.tmp.pdf` konvertiert.
Nach Texterkennung wird
`/home/srichter/2023/02/Demo.pdf` erzeugt.
## Mehrseitige Dokumente
Für mehrseitige Dokument kann die Variable $PAGE eingebaut werden:
Ist diese im Pfad vorhanden, so wird ein Eingabefeld für den aktuellen Stand eingeblendet.
Dieses soll ggf. schon vorhandene Dokumente berücksichtigen.
Es sei der Pfad also
`$HOME/Dokumente/$YEAR/$MONTH/$BETREFF/Dok {$PAGE. Seite}`.
Das Page-Eingabefeld wird mit 1 initialisiert.
### Ziel JPG
Die Datei wird direkt nach
`/home/srichter/2023/02/Demo/Dok 1. Seite.jpg` gescannt.
Danach wird der Zähler erhöht, die nachfolgende Seite wird als
`/home/srichter/2023/02/Demo/Dok 2. Seite.jpg` gescannt.
### Ziel PDF
Die erste Datei wird als
`/home/srichter/2023/02/Demo/Dok 1. Seite.jpg`
gescannt und dann zu
`/home/srichter/2023/02/Demo/Dok 1. Seite.pdf` konvertiert.
Die nächste Seite wäre dann entsprechend
`/home/srichter/2023/02/Demo/Dok 2. Seite.jpg`
`/home/srichter/2023/02/Demo/Dok 2. Seite.pdf`
### Ziel PDF-OCR
Die erste Datei wird als
`/home/srichter/2023/02/Demo/Dok 1. Seite.jpg`
gescannt und dann zu
`/home/srichter/2023/02/Demo/Dok 1. Seite.tmp.png` konvertiert.
Nach der Texterkennung ist die Ausgabe-Datei
`/home/srichter/2023/02/Demo/Dok 1. Seite.pdf`.
Für die nächste Seite wäre dann entsprechend
`/home/srichter/2023/02/Demo/Dok 12. Seite.jpg`
`/home/srichter/2023/02/Demo/Dok 2. Seite.tmp.pdf`
`/home/srichter/2023/02/Demo/Dok 1. Seite.pdf` die Ausgabe.
### Zusammenfügen
In den letzten Beiden fällen ergäbe das Zusammenfügen dann `/home/srichter/2023/02/Demo/Dok.pdf`

20
pom.xml

@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
<dependency>
<groupId>de.srsoftware</groupId>
<artifactId>tools.gui.selectcombobox</artifactId>
<version>0.1.8</version>
<version>0.1.9</version>
<scope>compile</scope>
</dependency>
<dependency>
@ -90,13 +90,6 @@ @@ -90,13 +90,6 @@
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
@ -130,7 +123,16 @@ @@ -130,7 +123,16 @@
<mainClass>de.srsoftware.web4rail.Application</mainClass>
</configuration>
</plugin>
</plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>

1
resources/translations/Application.de.translation

@ -25,6 +25,7 @@ Language support : Sprach-Unterstützung @@ -25,6 +25,7 @@ Language support : Sprach-Unterstützung
MONTH : MONAT
OCR failed. : OCR fehlgeschlagen.
open folder : Ordner öffnen
PAGE : SEITE
Path '{}' does not exist! : Pfad '{}' existiert nicht!
Path : Pfad
Please install the package : Bitte installiere das Paket

108
src/main/java/de/srsoftware/belegscanner/gui/DocTable.java

@ -14,10 +14,11 @@ import java.io.FilenameFilter; @@ -14,10 +14,11 @@ import java.io.FilenameFilter;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.TreeMap;
import java.util.Vector;
import javax.swing.BorderFactory;
@ -62,23 +63,23 @@ public class DocTable extends JPanel{ @@ -62,23 +63,23 @@ public class DocTable extends JPanel{
private String path;
private JButton joinButton;
public Row(String path) {
this.path = path;
rows.put(path, this);
public Row(String project) {
this.path = project;
rows.put(project, this);
constraints.gridy = ++rowCounter;
constraints.gridx = 0;
add(pathLabel = new JLabel(path), constraints);
add(pathLabel = new JLabel(project), constraints);
constraints.gridx = 1;
add(status = new JLabel("neu"),constraints);
buttons = new JPanel();
buttons.setLayout(new FlowLayout());
buttons.add(button("⚁",t("open folder"),ev -> openFolder(path)));
buttons.add(joinButton = button("⎗",t("join PDFs"),ev -> joinDocs(path)));
buttons.add(button("✉",t("display preview"),ev -> preview(path)));
buttons.add(button("⚁",t("open folder"),ev -> openFolder(project)));
buttons.add(joinButton = button("⎗",t("join PDFs"),ev -> joinDocs(project)));
buttons.add(button("✉",t("display preview"),ev -> preview(project)));
buttons.add(button("✓",t("done"),ev -> drop(this)));
buttons.add(button("❌",t("drop file"),ev -> dropFile(path)));
buttons.add(button("❌",t("drop file"),ev -> dropFile(project)));
constraints.gridx = 2;
add(buttons,constraints);
@ -111,11 +112,10 @@ public class DocTable extends JPanel{ @@ -111,11 +112,10 @@ public class DocTable extends JPanel{
/**
* remove the join button assigned with the selected document
*/
public void removeJoinButton() {
joinButton.setEnabled(false);
buttons.remove(joinButton);
public void setJoinButton(boolean enabled) {
joinButton.setEnabled(enabled);
joinButton.setVisible(enabled);
}
}
private static final long serialVersionUID = 1073955198529023744L;
@ -151,10 +151,13 @@ public class DocTable extends JPanel{ @@ -151,10 +151,13 @@ public class DocTable extends JPanel{
/**
* Ad a table entry for the directory represented by path
* @param path
* @param project
*/
public void add(String path) {
if (!rows.containsKey(path)) new Row(path).status("neu");
public void add(String project) {
var row = rows.get(project);
if (row == null) {
new Row(project).status("neu");
} else row.setJoinButton(true);
}
/**
@ -187,10 +190,11 @@ public class DocTable extends JPanel{ @@ -187,10 +190,11 @@ public class DocTable extends JPanel{
}
private void dropFile(String path) {
Path latest = latestFile(path);
Path latest = latestFile(new File(path));
if (latest != null) {
LOG.debug("Removing {}",latest);
latest.toFile().delete();
preview(path); // show lates of remaining files
preview(latest.toFile().getParent()); // show lates of remaining files
}
}
@ -200,19 +204,37 @@ public class DocTable extends JPanel{ @@ -200,19 +204,37 @@ public class DocTable extends JPanel{
*/
public void joinDocs(String path) {
LOG.debug("joinFiles({})",path);
rows.get(path).removeJoinButton();
File folder = new File(path);
rows.get(path).setJoinButton(false);
File folder = new File(path).getParentFile();
if (!folder.exists()) return;
List<String> pdfs = Arrays.asList(folder.list(PAGES));
Collections.sort(pdfs);
String pattern = new File(path).getName();
var parts = pattern.split("\\$"+t("PAGE"));
var prefix = parts[0];
var suffix = parts.length>1 ? parts[1] : "";
if (parts.length<2) return;
var pages = new TreeMap<Integer,String>();
for (var file : folder.list()){
Optional<Integer> opt = getPage(file, prefix, suffix);
if (opt.isPresent()){
pages.put(opt.get(),file);
}
}
if (pages.size()<2) return;
int first = pages.firstKey();
int last = pages.lastKey();
var range = first + (last != first ? "…"+last:"");
var target = pattern.replace("$"+t("PAGE"),range);
var pdfs = pages.values();
Vector<String> cmd = new Vector<>();
cmd.add("pdftk");
cmd.addAll(pdfs);
cmd.add("cat");
cmd.add("output");
cmd.add(folder.getName()+".pdf");
cmd.add(target);
LOG.debug("executing {}",cmd);
ProcessBuilder builder = new ProcessBuilder(cmd);
builder.directory(folder);
@ -226,17 +248,33 @@ public class DocTable extends JPanel{ @@ -226,17 +248,33 @@ public class DocTable extends JPanel{
} catch (InterruptedException | IOException e) {
LOG.error("{} terminated: ",builder,e);
}
for (String page : pdfs) Path.of(path,page).toFile().delete();
pdfs.stream()
.peek(page -> LOG.debug("removing {}",page))
.map(page -> folder.toPath().resolve(page))
.map(Path::toFile)
.forEach(File::delete);
setState(path,t("PDFs joined."));
preview(path);
preview(folder);
}
private Path latestFile(String path) {
File folder = new File(path);
private Optional<Integer> getPage(String file, String prefix, String suffix) {
if (file.startsWith(prefix) && file.endsWith(suffix)) {
file = file.substring(prefix.length(), file.length() - suffix.length());
try {
return Optional.of(Integer.parseInt(file));
} catch (NumberFormatException nfe) {}
}
return Optional.empty();
}
private Path latestFile(File folder) {
if (!folder.exists()) return null;
if (!folder.isDirectory()) folder = folder.getParentFile();
List<String> files = Arrays.asList(folder.list());
String latest = files.stream().sorted(DocTable::compareFiles).findFirst().orElse(null);
return latest == null ? null : Path.of(path,latest);
return latest == null ? null : folder.toPath().resolve(latest);
}
/**
@ -254,17 +292,21 @@ public class DocTable extends JPanel{ @@ -254,17 +292,21 @@ public class DocTable extends JPanel{
}
try {
process = new ProcessBuilder(List.of(Constants.FILE_BROWSER,path)).start();
process = new ProcessBuilder(List.of(Constants.FILE_BROWSER,new File(path).getParent())).start();
} catch (IOException e) {
LOG.error(t("{} terminated: "),process,e);
}
}
public void preview(String path){
preview(new File(path));
}
/**
* show lates document of the given directory in preview area
* @param path
*/
public void preview(String path) {
public void preview(File path) {
LOG.debug("preview({})",path);
previewListeners.forEach(l -> l.show(latestFile(path)));
}

122
src/main/java/de/srsoftware/belegscanner/gui/MainFrame.java

@ -87,6 +87,7 @@ public class MainFrame extends JFrame { @@ -87,6 +87,7 @@ public class MainFrame extends JFrame {
private Date date = new Date();
private String patchedPath = "";
private String project = "";
private Configuration config;
@ -155,13 +156,26 @@ public class MainFrame extends JFrame { @@ -155,13 +156,26 @@ public class MainFrame extends JFrame {
* Scans the given path for occurences of '$VARIABLES' and creates input fields for the found variables.
* @param path
*/
private void addFieldsFor(String path) {
private void addFieldsForPath(String path) {
Vector<String> marks = new Vector<>();
Matcher matches = MARKEN.matcher(path);
while (matches.find()) marks.add(matches.group(1));
toolbar.addFieldsFor(marks);
};
public String appMissing(String appTest){
List<String> cmd = Arrays.asList(appTest.split(" "));
try {
Process process = new ProcessBuilder(cmd).start();
int errorCode = process.waitFor();
if (errorCode == 0) return null;
} catch (InterruptedException | IOException e) {
LOG.error(t("{} terminated: "),appTest,e);
}
return cmd.get(0);
}
public void checkDependencies() {
List<String> missing = List.of("convert --version", "killall --version", "pdfsandwich -version", "pdftk --version", "scanimage --version",FILE_BROWSER+" --version")
.stream().map(this::appMissing).filter(app -> app != null).collect(Collectors.toList());
@ -226,18 +240,7 @@ public class MainFrame extends JFrame { @@ -226,18 +240,7 @@ public class MainFrame extends JFrame {
public String appMissing(String appTest){
List<String> cmd = Arrays.asList(appTest.split(" "));
try {
Process process = new ProcessBuilder(cmd).start();
int errorCode = process.waitFor();
if (errorCode == 0) return null;
} catch (InterruptedException | IOException e) {
LOG.error(t("{} terminated: "),appTest,e);
}
return cmd.get(0);
}
/**
* checks, whether the scan button may be enabled.
@ -246,6 +249,12 @@ public class MainFrame extends JFrame { @@ -246,6 +249,12 @@ public class MainFrame extends JFrame {
toolbar.readyToScan(!(isScanning || patchedPath==null || patchedPath.isBlank() || patchedPath.contains("$")));
}
private String extension(String path) {
var target = config.get(CONFIG_TARGET);
return path +"."+ (JPG.equals(target) ? "jpg":"pdf");
}
private void notifyAppsMissing(List<String> missingApps) {
StringBuilder message = new StringBuilder();
message.append("<html>");
@ -267,25 +276,26 @@ public class MainFrame extends JFrame { @@ -267,25 +276,26 @@ public class MainFrame extends JFrame {
* @param path
* @param dimension
*/
private void performScan(String path, Dimension dimension) {
private void performScan(String project, String path, Dimension dimension) {
LOG.debug("performScan({})",path);
/* We need to save all required config values before starting to scan, because they might be changed during scanning */
String target = config.getOrCreate(CONFIG_TARGET, "pdf");
setScanning(true);
File folder = new File(path);
var targetFile = new File(path);
File folder = targetFile.getParentFile();
if (!folder.exists()) {
LOG.warn(t("Path '{}' does not exist!"),path);
folder.mkdirs();
}
docTable.add(path);
docTable.add(project);
int resolution = toolbar.getResolution();
boolean improbeBrightness = toolbar.getImproveBrightness();
long timestamp = new Date().getTime();
String raw = timestamp+".jpg";
//long timestamp = new Date().getTime();
//String raw = timestamp+".jpg";
var raw = targetFile.getName()+".jpg";
Vector<String> cmd = new Vector<>();
cmd.add("scanimage");
@ -305,19 +315,19 @@ public class MainFrame extends JFrame { @@ -305,19 +315,19 @@ public class MainFrame extends JFrame {
builder.directory(folder);
try {
Process process = builder.start();
docTable.setState(path,t("Scanning…"));
docTable.setState(project,t("Scanning…"));
int errorCode = process.waitFor();
if (errorCode != 0) {
LOG.error(t("Error code: {} for {}"),errorCode,cmd);
docTable.setState(path, t("Scan failed."));
docTable.setState(project, t("Scan failed."));
setScanning(false);
return;
}
}
} catch (InterruptedException | IOException e) {
LOG.error(t("{} terminated: "),builder,e);
}
setScanning(false);
toolbar.nextPage();
if (improbeBrightness) {
cmd = new Vector<>();
@ -329,11 +339,11 @@ public class MainFrame extends JFrame { @@ -329,11 +339,11 @@ public class MainFrame extends JFrame {
builder.directory(folder);
try {
Process process = builder.start();
docTable.setState(path,t("Adjusting brightness…"));
docTable.setState(project,t("Adjusting brightness…"));
int errorCode = process.waitFor();
if (errorCode != 0) {
LOG.error(t("Error code: {} for {}"),errorCode,cmd);
docTable.setState(path, t("Adjustment failed."));
docTable.setState(project, t("Adjustment failed."));
setScanning(false);
return;
}
@ -344,12 +354,12 @@ public class MainFrame extends JFrame { @@ -344,12 +354,12 @@ public class MainFrame extends JFrame {
}
if (JPG.equals(target)) {
docTable.setState(path, t("Image scanned"));
docTable.preview(path);
docTable.setState(project, t("Image scanned"));
docTable.preview(folder);
return;
};
String pdf = timestamp+".page.pdf";
String pdf = targetFile.getName() + (PDF.equals(target) ? ".pdf" : ".tmp.pdf"); //timestamp+".page.pdf";
cmd = new Vector<>();
cmd.add("convert");
cmd.add(raw);
@ -358,26 +368,27 @@ public class MainFrame extends JFrame { @@ -358,26 +368,27 @@ public class MainFrame extends JFrame {
builder.directory(folder);
try {
Process process = builder.start();
docTable.setState(path,t("Converting to PDF…"));
docTable.setState(project,t("Converting to PDF…"));
int errorCode = process.waitFor();
if (errorCode != 0) {
LOG.error("Error code: {} for {}",errorCode,cmd);
docTable.setState(path, t("Conversion failed."));
docTable.setState(project, t("Conversion failed."));
return;
}
} catch (InterruptedException | IOException e) {
LOG.error("{} terminated: ",builder,e);
}
Path.of(path, raw).toFile().delete();
LOG.debug("removing {}",raw);
folder.toPath().resolve(raw).toFile().delete();
//Path.of(folder,raw).toFile().delete();
if (PDF.equals(target)) {
docTable.setState(path, t("PDF created"));
docTable.preview(path);
docTable.setState(project, t("PDF created"));
docTable.preview(folder);
return;
}
String ocr = timestamp+".page.ocr.pdf";
String ocr = targetFile.getName() + ".pdf";//timestamp+".page.ocr.pdf";
cmd = new Vector<>();
cmd.add("pdfsandwich");
@ -396,20 +407,26 @@ public class MainFrame extends JFrame { @@ -396,20 +407,26 @@ public class MainFrame extends JFrame {
builder.directory(folder);
try {
Process process = builder.start();
docTable.setState(path,t("Text recognition…"));
docTable.setState(project,t("Text recognition…"));
int errorCode = process.waitFor();
if (errorCode != 0) {
LOG.error("error code: {} for {}",errorCode,cmd);
docTable.setState(path, t("OCR failed."));
docTable.setState(project, t("OCR failed."));
return;
}
}
if (!folder.toPath().resolve(ocr).toFile().exists()){
docTable.setState(project,t("OCR failed."));
return;
}
} catch (InterruptedException | IOException e) {
LOG.error("{} terminated: ",builder,e);
}
Path.of(path, pdf).toFile().delete();
docTable.setState(path,t("Finished text recognition."));
docTable.preview(path);
LOG.debug("removing {}",pdf);
folder.toPath().resolve(pdf).toFile().delete();
docTable.setState(project,t("Finished text recognition."));
docTable.preview(folder);
}
/**
@ -440,7 +457,7 @@ public class MainFrame extends JFrame { @@ -440,7 +457,7 @@ public class MainFrame extends JFrame {
/**
* open file in preview panel
* @param file
* @param filePath
*/
private void preview(Path filePath) {
if (filePath == null) return;
@ -482,7 +499,7 @@ public class MainFrame extends JFrame { @@ -482,7 +499,7 @@ public class MainFrame extends JFrame {
*/
private void scan(ActionEvent ev) {
updateConfig();
new Thread(() -> performScan(patchedPath,dimension)).start();
new Thread(() -> performScan(project,patchedPath,dimension)).start();
}
/**
@ -592,10 +609,17 @@ public class MainFrame extends JFrame { @@ -592,10 +609,17 @@ public class MainFrame extends JFrame {
.replace("$"+t("YEAR"), year+"")
.replace("$"+t("MONTH"), month<10 ? "0"+month : ""+month)
.replace("$"+t("DAY"), day < 10 ? "0"+day : ""+day);
addFieldsFor(patchedPath);
for (Entry<String, String> entry : fields.entrySet()) patchedPath = patchedPath.replace("$"+entry.getKey(), entry.getValue());
statusBar.setPath(patchedPath);
addFieldsForPath(patchedPath);
project = extension(patchedPath);
for (Entry<String, String> entry : fields.entrySet()) {
var key = entry.getKey();
patchedPath = patchedPath.replace("$"+entry.getKey(), entry.getValue());
if (!t("PAGE").equals(key)){
project = project.replace("$"+entry.getKey(), entry.getValue());
}
}
statusBar.setPath(extension(patchedPath));
checkScanButton();
}
}

31
src/main/java/de/srsoftware/belegscanner/gui/Toolbar.java

@ -153,6 +153,10 @@ public class Toolbar extends JPanel { @@ -153,6 +153,10 @@ public class Toolbar extends JPanel {
if (additonalComponents.containsKey(name)) continue;
SelectComboBox valuePicker = new SelectComboBox(new Vector<>()).onUpdateText(newText -> updateField(name,newText));
JPanel input = input(name, valuePicker);
if (t("PAGE").equals(name)) {
valuePicker.setText("1");
SwingUtilities.invokeLater(() -> updateField(name,"1"));
}
input.setBorder(BORDER);
add(input,getComponentCount()-OFFSET);
additonalComponents.put(name, input);
@ -348,6 +352,25 @@ public class Toolbar extends JPanel { @@ -348,6 +352,25 @@ public class Toolbar extends JPanel {
panel.add(component);
return panel;
}
public Toolbar nextPage(){
var page = t("PAGE");
var panel = additonalComponents.get(page);
if (panel == null) return this;
for (var child : panel.getComponents()){
if (child instanceof SelectComboBox scb){
var val = scb.getText();
try {
var newVal = ""+(Integer.parseInt(val)+1);
scb.setText(newVal);
fieldListeners.forEach(l -> l.setField(page,newVal));
} catch (NumberFormatException nfe){}
}
LOG.debug("component: {}",child);
}
return this;
}
/**
* creates an auto-complete text field for setting the scan target path
@ -359,7 +382,7 @@ public class Toolbar extends JPanel { @@ -359,7 +382,7 @@ public class Toolbar extends JPanel {
JSONObject catInfo = cats.getJSONObject(catName);
if (catInfo.has("path")) paths.add(catInfo.get("path"));
}
paths.add("$"+t("HOME")+"/$"+t("YEAR")+"/$"+t("MONTH")+"-$"+t("DAY")+" - $"+t("CATEGORY"));
paths.add("$"+t("HOME")+"/$"+t("YEAR")+"/$"+t("MONTH")+"-$"+t("DAY")+" - $"+t("CATEGORY")+"/$"+t("PAGE"));
return new SelectComboBox(paths).onUpdateText(this::updatePath);
}
@ -427,7 +450,7 @@ public class Toolbar extends JPanel { @@ -427,7 +450,7 @@ public class Toolbar extends JPanel {
* create one radio button for the typeSelector
* @param group
* @param label
* @param i
* @param selection
* @return
*/
private JRadioButton typeButton(ButtonGroup group, String label,String selection) {
@ -440,7 +463,6 @@ public class Toolbar extends JPanel { @@ -440,7 +463,6 @@ public class Toolbar extends JPanel {
/**
* create a radio group to select the target type for scanning
* @param jsonObject
* @return
*/
private JPanel typeSelector() {
@ -533,7 +555,4 @@ public class Toolbar extends JPanel { @@ -533,7 +555,4 @@ public class Toolbar extends JPanel {
LOG.debug("updatePath({})",newPath);
pathListeners.forEach(l -> l.setPath(newPath));
}
}

Loading…
Cancel
Save