You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.3 KiB
166 lines
5.3 KiB
package de.srsoftware.belegscanner; |
|
|
|
import de.srsoftware.belegscanner.gui.DocTable; |
|
import de.srsoftware.belegscanner.gui.StatusBar; |
|
import de.srsoftware.belegscanner.gui.Toolbar; |
|
import de.srsoftware.belegscanner.model.ScanProject; |
|
import de.srsoftware.belegscanner.model.api.Project; |
|
import de.srsoftware.tools.gui.DateChooser; |
|
import de.srsoftware.tools.gui.SelectComboBox; |
|
import org.json.JSONObject; |
|
import org.slf4j.Logger; |
|
import org.slf4j.LoggerFactory; |
|
|
|
import java.awt.*; |
|
import java.util.Optional; |
|
|
|
import static de.srsoftware.belegscanner.Application.t; |
|
import static de.srsoftware.belegscanner.Constants.CONFIG_TARGET; |
|
import static de.srsoftware.belegscanner.Constants.JPG; |
|
import static de.srsoftware.belegscanner.Constants.OCR; |
|
import static de.srsoftware.belegscanner.Constants.PDF; |
|
|
|
public class Worker { |
|
private static final Logger LOG = LoggerFactory.getLogger(Worker.class); |
|
private static final String HOME = System.getProperty("user.home"); |
|
private static final String YEAR = t("YEAR"); |
|
private final Configuration config; |
|
private SelectComboBox pathPicker; |
|
private StatusBar statusBar; |
|
private String category; |
|
private DateChooser datePicker; |
|
private String rawPath, resolvedPath; |
|
private Toolbar toolbar; |
|
private DocTable docTable; |
|
|
|
public Worker(Configuration config) { |
|
this.config = config; |
|
} |
|
|
|
public void dropCategory(String droppedCat) { |
|
LOG.debug("Worker.dropCategory({})",droppedCat); |
|
} |
|
public JSONObject getCategories() { |
|
return config.getOrCreate("app.categories",new JSONObject()); |
|
} |
|
|
|
private Optional<JSONObject> getCategory(String name){ |
|
var cats = getCategories(); |
|
return cats.has(name) ? (cats.get(name) instanceof JSONObject cat ? Optional.of(cat) : Optional.empty()) : Optional.empty(); |
|
} |
|
public String getType() { |
|
return config.getOrCreate(CONFIG_TARGET, PDF); |
|
} |
|
|
|
public void resolvePath(){ |
|
if (rawPath == null) return; |
|
LOG.debug("resolve({})",rawPath); |
|
var date = datePicker.getSelectedDate(); |
|
int year = 1900+date.getYear(); |
|
int month = date.getMonth()+1; |
|
int day = date.getDate(); |
|
resolvedPath = rawPath.replace("$"+t("HOME"),HOME) |
|
.replace("$"+t("CATEGORY"), category) |
|
.replace("$"+t("YEAR"), year+"") |
|
.replace("$"+t("MONTH"), month<10 ? "0"+month : ""+month) |
|
.replace("$"+t("DAY"), day < 10 ? "0"+day : ""+day); |
|
|
|
var start = resolvedPath.indexOf("$"); |
|
toolbar.resetAdditionalFields(); |
|
while (start>-1) { |
|
var end = endOfVar(resolvedPath, start+1); |
|
if (end>start+1){ |
|
var variable = resolvedPath.substring(start+1, end); |
|
LOG.debug("…unresolved '{}'",variable); |
|
String value = toolbar.requireField(variable); |
|
variable = "$"+variable; |
|
LOG.debug("replacing '{}' in '{}' by '{}'",variable,resolvedPath,value); |
|
resolvedPath = resolvedPath.replace(variable,value); |
|
start = resolvedPath.indexOf("$",start+1); |
|
} else { |
|
start = resolvedPath.indexOf("$",start+2); |
|
} |
|
} |
|
toolbar.dropUnusedAdditionalFields(); |
|
resolvedPath+="."+extension(); |
|
statusBar.setPath(resolvedPath); |
|
} |
|
|
|
private String extension() { |
|
switch (getType()){ |
|
case PDF: |
|
case OCR: |
|
return "pdf"; |
|
case JPG: |
|
return "jpg"; |
|
} |
|
return ""; |
|
} |
|
|
|
private int endOfVar(String path, int index) { |
|
while(index<path.length()){ |
|
if (!Character.isAlphabetic(path.codePointAt(index))) return index; |
|
index++; |
|
} |
|
return index; |
|
} |
|
|
|
public void scan() { |
|
LOG.debug("scan()"); |
|
var project = docTable.getProject(resolvedPath).orElseGet(this::createProject); |
|
} |
|
|
|
private Project createProject() { |
|
return new ScanProject(resolvedPath); |
|
} |
|
|
|
public void setDimension(Dimension dimension) { |
|
LOG.debug("setDimension({})",dimension); |
|
} |
|
|
|
public void setPath(String path) { |
|
LOG.debug("setPath({})",path); |
|
this.rawPath = path; |
|
resolvePath(); |
|
|
|
} |
|
public SelectComboBox setPathPicker(SelectComboBox select) { |
|
pathPicker = select; |
|
return pathPicker.onUpdateText(this::setPath); |
|
} |
|
|
|
public void setStatusBar(StatusBar statusBar) { |
|
this.statusBar = statusBar; |
|
} |
|
|
|
public void setType(String type) { |
|
LOG.debug("setType({})",type); |
|
config.set(CONFIG_TARGET, type); |
|
resolvePath(); |
|
} |
|
|
|
public void setCat(String newCat) { |
|
LOG.debug("setCat({}})",newCat); |
|
this.category = newCat; |
|
getCategory(newCat).map(cat -> cat.get(Constants.PATH)) |
|
.map(o -> o instanceof String path ? path : null) |
|
.ifPresent(path -> { |
|
pathPicker.setText(path); |
|
setPath(path); |
|
}); |
|
} |
|
|
|
|
|
public void setDatePicker(DateChooser pd) { |
|
datePicker = pd; |
|
pd.addActionListener(ev -> this.resolvePath()); |
|
} |
|
|
|
public void setToolbar(Toolbar toolbar) { |
|
this.toolbar = toolbar; |
|
} |
|
|
|
public void setDocTable(DocTable docTable) { |
|
this.docTable = docTable; |
|
} |
|
}
|
|
|