From aab36db2169a80c02058a436519260fb457987af Mon Sep 17 00:00:00 2001 From: Mara Date: Sun, 12 May 2024 13:15:07 +0800 Subject: [PATCH] a6.8.1 --- .../controller/BaseDataConvertController.java | 44 +- .../java/mara/mybox/controller/BaseLogs.java | 16 +- .../controller/ControlData2DSetValue.java | 39 +- .../controller/ControlPdfWriteOptions.java | 673 +++++------------- .../mybox/controller/ControlTTFSelector.java | 11 +- .../controller/Data2DSetValuesController.java | 6 +- .../controller/ImagesSaveController.java | 5 + .../mybox/controller/PptToPdfController.java | 9 +- .../bundles/Messages_zh_CN.properties | 2 +- .../MyBox/src/main/resources/doc/en/README.md | 5 +- .../doc/en/mybox_about_data2d_en.html | 13 + .../MyBox/src/main/resources/doc/zh/README.md | 9 +- .../doc/zh/mybox_about_data2d_zh.html | 11 + .../resources/fxml/ControlData2DSetValue.fxml | 48 +- .../fxml/ControlPdfWriteOptions.fxml | 6 +- 15 files changed, 315 insertions(+), 582 deletions(-) diff --git a/alpha/MyBox/src/main/java/mara/mybox/controller/BaseDataConvertController.java b/alpha/MyBox/src/main/java/mara/mybox/controller/BaseDataConvertController.java index 415e44873..5b3b19b7b 100644 --- a/alpha/MyBox/src/main/java/mara/mybox/controller/BaseDataConvertController.java +++ b/alpha/MyBox/src/main/java/mara/mybox/controller/BaseDataConvertController.java @@ -45,7 +45,7 @@ * @License Apache License Version 2.0 */ public class BaseDataConvertController extends BaseTaskController { - + @FXML protected TextArea cssArea; @FXML @@ -58,7 +58,7 @@ public class BaseDataConvertController extends BaseTaskController { protected ControlTextOptions textWriteOptionsController; @FXML protected ControlPdfWriteOptions pdfOptionsController; - + public void initControls(String name) { baseName = name + "_" + baseName; initCSV(); @@ -67,13 +67,13 @@ public void initControls(String name) { initPDF(); initHtml(); } - + private void initCSV() { if (csvWriteController != null) { csvWriteController.setControls(baseName + "CSVWrite", false, false); } } - + private void initExcel() { if (excelWithNamesCheck != null) { excelWithNamesCheck.setSelected(UserConfig.getBoolean(baseName + "ExcelTargetWithNames", true)); @@ -82,19 +82,19 @@ private void initExcel() { currentSheetOnlyCheck.setSelected(UserConfig.getBoolean(baseName + "ExcelCurrentSheetOnly", false)); } } - + private void initTexts() { if (textWriteOptionsController != null) { textWriteOptionsController.setControls(baseName + "TextWrite", false, true); } } - + private void initHtml() { if (cssArea != null) { cssArea.setText(UserConfig.getString(baseName + "Css", HtmlStyles.TableStyle)); } } - + private void initPDF() { if (pdfOptionsController != null) { pdfOptionsController.set(baseName, false); @@ -102,7 +102,7 @@ private void initPDF() { pdfOptionsController.standardSizeRadio.setSelected(true); } } - + public DataFileCSVWriter pickCSVWriter() { try { DataFileCSVWriter writer = new DataFileCSVWriter(); @@ -115,14 +115,14 @@ public DataFileCSVWriter pickCSVWriter() { .setDelimiter(csvWriteController.getDelimiterName()) .setWriteHeader(csvWriteController.withName()); } - + return writer; } catch (Exception e) { MyBoxLog.error(e); return null; } } - + public DataFileExcelWriter pickExcelWriter() { try { DataFileExcelWriter writer = new DataFileExcelWriter(); @@ -134,14 +134,14 @@ public DataFileExcelWriter pickExcelWriter() { UserConfig.setBoolean(baseName + "ExcelCurrentSheetOnly", currentSheetOnlyCheck.isSelected()); writer.setCurrentSheetOnly(currentSheetOnlyCheck.isSelected()); } - + return writer; } catch (Exception e) { MyBoxLog.error(e); return null; } } - + public DataFileTextWriter pickTextWriter() { try { DataFileTextWriter writer = new DataFileTextWriter(); @@ -154,18 +154,21 @@ public DataFileTextWriter pickTextWriter() { .setDelimiter(textWriteOptionsController.getDelimiterName()) .setWriteHeader(textWriteOptionsController.withName()); } - + return writer; } catch (Exception e) { MyBoxLog.error(e); return null; } } - + public PdfWriter pickPDFWriter() { try { PdfWriter writer = new PdfWriter(); if (pdfOptionsController != null) { + if (!pdfOptionsController.pickValues()) { + return null; + } List columnWidths = new ArrayList<>(); String w = widthList.getText(); if (w != null && !w.isBlank()) { @@ -180,6 +183,7 @@ public PdfWriter pickPDFWriter() { } } } + writer.setPdfTable(PaginatedPdfTable.create() .setPageSize(new PDRectangle(pdfOptionsController.pageWidth, pdfOptionsController.pageHeight)) .setTtf(pdfOptionsController.getTtfFile()) @@ -191,14 +195,14 @@ public PdfWriter pickPDFWriter() { .setFooter(pdfOptionsController.getFooter()) .setShowPageNumber(pdfOptionsController.showPageNumber)); } - + return writer; } catch (Exception e) { MyBoxLog.error(e); return null; } } - + public HtmlWriter pickHtmlWriter() { try { HtmlWriter writer = new HtmlWriter(); @@ -207,14 +211,14 @@ public HtmlWriter pickHtmlWriter() { UserConfig.setString(baseName + "Css", css); writer.setCss(css); } - + return writer; } catch (Exception e) { MyBoxLog.error(e); return null; } } - + public Data2DWriter pickWriter(TargetType format) { try { if (format == null) { @@ -262,7 +266,7 @@ public Data2DWriter pickWriter(TargetType format) { break; } if (writer != null) { - + } return writer; } catch (Exception e) { @@ -270,5 +274,5 @@ public Data2DWriter pickWriter(TargetType format) { return null; } } - + } diff --git a/alpha/MyBox/src/main/java/mara/mybox/controller/BaseLogs.java b/alpha/MyBox/src/main/java/mara/mybox/controller/BaseLogs.java index 029163778..153f39fd8 100644 --- a/alpha/MyBox/src/main/java/mara/mybox/controller/BaseLogs.java +++ b/alpha/MyBox/src/main/java/mara/mybox/controller/BaseLogs.java @@ -116,15 +116,19 @@ public void updateLogs(String line, boolean showTime, boolean immediate) { if (line == null) { return; } - if (logsTextArea == null) { - popInformation(line); - return; - } if (Platform.isFxApplicationThread()) { - writeLogs(line, showTime, immediate); + if (logsTextArea == null) { + popInformation(line); + } else { + writeLogs(line, showTime, immediate); + } } else { Platform.runLater(() -> { - writeLogs(line, showTime, immediate); + if (logsTextArea == null) { + popInformation(line); + } else { + writeLogs(line, showTime, immediate); + } }); } } diff --git a/alpha/MyBox/src/main/java/mara/mybox/controller/ControlData2DSetValue.java b/alpha/MyBox/src/main/java/mara/mybox/controller/ControlData2DSetValue.java index 337378864..539fb44da 100644 --- a/alpha/MyBox/src/main/java/mara/mybox/controller/ControlData2DSetValue.java +++ b/alpha/MyBox/src/main/java/mara/mybox/controller/ControlData2DSetValue.java @@ -6,9 +6,9 @@ import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; import javafx.scene.control.RadioButton; +import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.control.ToggleGroup; -import javafx.scene.layout.FlowPane; import javafx.scene.layout.VBox; import mara.mybox.data.SetValue; import mara.mybox.data.SetValue.ValueType; @@ -41,18 +41,17 @@ public class ControlData2DSetValue extends BaseController { numberSuffixStringRadio, numberPrefixStringRadio, gaussianDistributionRadio, identifyRadio, upperTriangleRadio, lowerTriangleRadio; @FXML - protected TextField valueInput, prefixInput, suffixInput, startInput, digitInput, - numberSuffixInput, numberPrefixInput; + protected TextField startInput, digitInput; @FXML - protected ComboBox scaleSelector; + protected TextArea valueInput, prefixInput, suffixInput, numberSuffixInput, numberPrefixInput; @FXML - protected FlowPane scalePane, numberPane, matrixPane; + protected ComboBox scaleSelector; @FXML protected ControlData2DRowExpression expressionController; @FXML protected CheckBox fillZeroCheck; @FXML - protected VBox expBox; + protected VBox expBox, matrixBox; public void setParameter(Data2DSetValuesController handleController) { try { @@ -182,10 +181,10 @@ public void setData2D(Data2D data2D) { public void setMatrixPane(boolean isAvailable) { if (isAvailable) { - matrixPane.setDisable(false); + matrixBox.setVisible(true); } else { - matrixPane.setDisable(true); + matrixBox.setVisible(false); if (gaussianDistributionRadio.isSelected() || identifyRadio.isSelected() || upperTriangleRadio.isSelected() || lowerTriangleRadio.isSelected()) { valueRadio.setSelected(true); @@ -308,12 +307,36 @@ public boolean pickValues() { UserConfig.setBoolean(conn, baseName + "FillZero", setValue.isFillZero()); UserConfig.setBoolean(conn, baseName + "AutoDigit", setValue.isAotoDigit()); } else if (gaussianDistributionRadio.isSelected()) { + if (handleController.sourceController.filteredRowsIndices.size() + != handleController.checkedColsIndices.size()) { + outError(message("MatricesCannotCalculateShouldSqure")); + return false; + } + if (handleController.sourceController.filteredRowsIndices.size() % 2 == 0) { + outError(message("MatricesCannotCalculateShouldOdd")); + return false; + } setValue.setType(ValueType.GaussianDistribution); } else if (identifyRadio.isSelected()) { + if (handleController.sourceController.filteredRowsIndices.size() + != handleController.checkedColsIndices.size()) { + outError(message("MatricesCannotCalculateShouldSqure")); + return false; + } setValue.setType(ValueType.GaussianDistribution); } else if (upperTriangleRadio.isSelected()) { + if (handleController.sourceController.filteredRowsIndices.size() + != handleController.checkedColsIndices.size()) { + outError(message("MatricesCannotCalculateShouldSqure")); + return false; + } setValue.setType(ValueType.UpperTriangle); } else if (lowerTriangleRadio.isSelected()) { + if (handleController.sourceController.filteredRowsIndices.size() + != handleController.checkedColsIndices.size()) { + outError(message("MatricesCannotCalculateShouldSqure")); + return false; + } setValue.setType(ValueType.LowerTriangle); } else if (expressionRadio.isSelected()) { if (!expressionController.checkExpression(handleController.isAllPages())) { diff --git a/alpha/MyBox/src/main/java/mara/mybox/controller/ControlPdfWriteOptions.java b/alpha/MyBox/src/main/java/mara/mybox/controller/ControlPdfWriteOptions.java index c03dfc44e..2e9b3b6b1 100644 --- a/alpha/MyBox/src/main/java/mara/mybox/controller/ControlPdfWriteOptions.java +++ b/alpha/MyBox/src/main/java/mara/mybox/controller/ControlPdfWriteOptions.java @@ -1,5 +1,6 @@ package mara.mybox.controller; +import java.sql.Connection; import java.util.Arrays; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; @@ -13,11 +14,11 @@ import javafx.scene.control.ToggleGroup; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; +import mara.mybox.db.DerbyBase; import mara.mybox.db.data.VisitHistory; import mara.mybox.dev.MyBoxLog; -import mara.mybox.fxml.ValidationTools; import mara.mybox.tools.PdfTools.PdfImageFormat; -import mara.mybox.value.Languages; +import static mara.mybox.value.Languages.message; import mara.mybox.value.UserConfig; /** @@ -27,8 +28,8 @@ */ public class ControlPdfWriteOptions extends BaseController { - protected String ttfFile, author, header, footer; - protected boolean isImageSize, includeImageOptions, dithering, showPageNumber; + protected String author, header, footer, ttfFile; + protected boolean isImageSize, includeImageOptions, dithering, showPageNumber, landscape; protected int marginSize, pageWidth, pageHeight, jpegQuality, threshold, fontSize, zoom; protected PdfImageFormat imageFormat; @@ -40,6 +41,7 @@ public class ControlPdfWriteOptions extends BaseController { protected ToggleGroup sizeGroup, imageFormatGroup; @FXML protected RadioButton pixSizeRadio, standardSizeRadio, customSizeRadio, + pngRadio, jpgRadio, bwRadio, pdfMem500MRadio, pdfMem1GRadio, pdfMem2GRadio, pdfMemUnlimitRadio; @FXML protected TextField authorInput, headerInput, footerInput, @@ -59,14 +61,17 @@ public void setFileType() { setFileType(VisitHistory.FileType.TTF); } - public static ControlPdfWriteOptions create() { - return new ControlPdfWriteOptions(); + public ControlPdfWriteOptions set(String baseName, boolean imageOptions) { + this.baseName = baseName; + this.includeImageOptions = imageOptions; + ttfController.name(baseName); + setControls(); + return this; } - public ControlPdfWriteOptions set(String baseName, boolean includeImageOptions) { - this.baseName = baseName; - this.includeImageOptions = includeImageOptions; - try { + public void setControls() { + try (Connection conn = DerbyBase.getConnection()) { + sizeGroup.selectedToggleProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue ov, Toggle old_toggle, Toggle new_toggle) { @@ -89,152 +94,55 @@ public void changed(ObservableValue ov, Toggle old_toggle, Tog "C5 16.2cm x 22.9cm", "C6 11.4cm x 16.2cm" )); + standardSizeSelector.setValue(UserConfig.getString(conn, baseName + "PdfStandardSize", "A4 (16k) 21.0cm x 29.7cm")); standardSizeSelector.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue ov, String oldValue, String newValue) { - UserConfig.setString(baseName + "PdfStandardSize", newValue); checkStandardValues(); } }); - standardSizeSelector.setValue(UserConfig.getString(baseName + "PdfStandardSize", "A4 (16k) 21.0cm x 29.7cm")); - dpiSelector.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue ov, String oldValue, String newValue) { - checkStandardValues(); - } - }); + pageWidth = UserConfig.getInt(conn, baseName + "PdfCustomWidth", 1024); + customWidthInput.setText(pageWidth + ""); - customWidthInput.textProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, String oldValue, String newValue) { - UserConfig.setString(baseName + "PdfCustomWidth", newValue); - checkCustomValues(); - } - }); - customWidthInput.setText(UserConfig.getString(baseName + "PdfCustomWidth", "")); - customHeightInput.textProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, String oldValue, String newValue) { - UserConfig.setString(baseName + "PdfCustomHeight", newValue); - checkCustomValues(); - } - }); - customHeightInput.setText(UserConfig.getString(baseName + "PdfCustomHeight", "")); + pageHeight = UserConfig.getInt(conn, baseName + "PdfCustomHeight", 500); + customHeightInput.setText(pageHeight + ""); marginSelector.getItems().addAll(Arrays.asList("20", "10", "15", "5", "25", "30", "40")); - marginSize = UserConfig.getInt(baseName + "PdfMarginSize", 20); + marginSize = UserConfig.getInt(conn, baseName + "PdfMarginSize", 20); marginSelector.setValue(marginSize + ""); - marginSelector.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue ov, String oldValue, String newValue) { - try { - int v = Integer.parseInt(newValue); - if (v >= 0) { - marginSize = v; - ValidationTools.setEditorNormal(marginSelector); - UserConfig.setInt(baseName + "PdfMarginSize", v); - } else { - ValidationTools.setEditorBadStyle(marginSelector); - } - } catch (Exception e) { - ValidationTools.setEditorBadStyle(marginSelector); - } - } - }); - - ttfController.name(baseName); fontSizeSelector.getItems().addAll(Arrays.asList( "20", "14", "18", "15", "9", "10", "12", "17", "24", "36", "48", "64", "72", "96")); - fontSize = UserConfig.getInt(baseName + "PdfFontSize", 20); + fontSize = UserConfig.getInt(conn, baseName + "PdfFontSize", 20); fontSizeSelector.getSelectionModel().select(fontSize + ""); - fontSizeSelector.valueProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue ov, String oldValue, String newValue) { - try { - int v = Integer.parseInt(newValue); - if (v > 0) { - fontSize = v; - UserConfig.setInt(baseName + "PdfFontSize", v); - ValidationTools.setEditorNormal(fontSizeSelector); - } else { - ValidationTools.setEditorBadStyle(fontSizeSelector); - } - } catch (Exception e) { - ValidationTools.setEditorBadStyle(fontSizeSelector); - } - } - }); zoomSelector.getItems().addAll(Arrays.asList("60", "100", "75", "50", "125", "30", "45", "200")); - zoom = UserConfig.getInt(baseName + "PdfZoom", 60); + zoom = UserConfig.getInt(conn, baseName + "PdfZoom", 60); zoomSelector.getSelectionModel().select(zoom + ""); - zoomSelector.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue ov, - String oldValue, String newValue) { - try { - int v = Integer.parseInt(newValue); - if (v > 0) { - zoom = v; - ValidationTools.setEditorNormal(zoomSelector); - UserConfig.setInt(baseName + "PdfZoom", v); - } else { - ValidationTools.setEditorBadStyle(zoomSelector); - } - - } catch (Exception e) { - ValidationTools.setEditorBadStyle(zoomSelector); - } - } - }); - authorInput.setText(UserConfig.getString(baseName + "PdfAuthor", System.getProperty("user.name"))); - authorInput.textProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, String oldValue, String newValue) { - UserConfig.setString(baseName + "PdfAuthor", newValue); - } - }); + author = UserConfig.getString(conn, baseName + "PdfAuthor", System.getProperty("user.name")); + authorInput.setText(author); - headerInput.setText(UserConfig.getString(baseName + "PdfHeader", "")); - headerInput.textProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, String oldValue, String newValue) { - UserConfig.setString(baseName + "PdfHeader", newValue); - } - }); + header = UserConfig.getString(conn, baseName + "PdfHeader", ""); + headerInput.setText(header); - footerInput.setText(UserConfig.getString(baseName + "PdfFooter", "")); - footerInput.textProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, String oldValue, String newValue) { - UserConfig.setString(baseName + "PdfFooter", newValue); - } - }); + footer = UserConfig.getString(conn, baseName + "PdfFooter", ""); + footerInput.setText(footer); - showPageNumber = UserConfig.getBoolean(baseName + "PdfShowPageNumber", true); + showPageNumber = UserConfig.getBoolean(conn, baseName + "PdfShowPageNumber", true); pageNumberCheck.setSelected(showPageNumber); - pageNumberCheck.selectedProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { - showPageNumber = newValue; - UserConfig.setBoolean(baseName + "PdfShowPageNumber", newValue); - } - }); - landscapeCheck.setSelected(UserConfig.getBoolean(baseName + "PdfPageHorizontal", false)); + landscape = UserConfig.getBoolean(conn, baseName + "PdfPageHorizontal", false); + landscapeCheck.setSelected(landscape); landscapeCheck.selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { - UserConfig.setBoolean(baseName + "PdfPageHorizontal", newValue); checkStandardValues(); } }); String pm = UserConfig.getString("PdfMemDefault", "1GB"); - isSettingValues = true; switch (pm) { case "1GB": pdfMem1GRadio.setSelected(true); @@ -249,41 +157,31 @@ public void changed(ObservableValue observable, Boolean oldVa default: pdfMem500MRadio.setSelected(true); } - isSettingValues = false; - initImageOptions(); + initImageOptions(conn); checkPageSize(); } catch (Exception e) { MyBoxLog.error(e, baseName); } - return this; } protected void checkPageSize() { standardSizeSelector.setDisable(true); dpiBox.setDisable(true); landscapeCheck.setDisable(true); - customWidthInput.setDisable(true); - customHeightInput.setDisable(true); - customWidthInput.setStyle(null); - customHeightInput.setStyle(null); isImageSize = false; - RadioButton selected = (RadioButton) sizeGroup.getSelectedToggle(); - if (Languages.message("ImagesSize").equals(selected.getText())) { + if (pixSizeRadio.isSelected()) { isImageSize = true; - } else if (Languages.message("StandardSize").equals(selected.getText())) { + } else if (standardSizeRadio.isSelected()) { standardSizeSelector.setDisable(false); dpiBox.setDisable(false); landscapeCheck.setDisable(false); checkStandardValues(); - } else if (Languages.message("Custom").equals(selected.getText())) { - customWidthInput.setDisable(false); - customHeightInput.setDisable(false); - checkCustomValues(); + } else if (customSizeRadio.isSelected()) { } } @@ -357,36 +255,7 @@ protected int calculateCmPixels(float cm, int dpi) { return (int) Math.round(cm * dpi / 2.54); } - protected void checkCustomValues() { - RadioButton selected = (RadioButton) sizeGroup.getSelectedToggle(); - if (!Languages.message("Custom").equals(selected.getText())) { - return; - } - try { - int v = Integer.parseInt(customWidthInput.getText()); - if (v > 0) { - pageWidth = v; - customWidthInput.setStyle(null); - } else { - customWidthInput.setStyle(UserConfig.badStyle()); - } - } catch (Exception e) { - customWidthInput.setStyle(UserConfig.badStyle()); - } - try { - int v = Integer.parseInt(customHeightInput.getText()); - if (pageHeight > 0) { - pageHeight = v; - customHeightInput.setStyle(null); - } else { - customHeightInput.setStyle(UserConfig.badStyle()); - } - } catch (Exception e) { - customHeightInput.setStyle(UserConfig.badStyle()); - } - } - - protected void initImageOptions() { + protected void initImageOptions(Connection conn) { try { if (!includeImageOptions) { thisPane.getChildren().removeAll(pixSizeRadio, imageOptionsBox); @@ -394,104 +263,129 @@ protected void initImageOptions() { return; } - imageFormatGroup.selectedToggleProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue ov, Toggle old_toggle, Toggle new_toggle) { - checkImageFormat(); - } - }); - jpegQualitySelector.getItems().addAll(Arrays.asList("100", "75", "90", "50", "60", "80", "30", "10")); - jpegQuality = UserConfig.getInt(baseName + "PdfJpegQuality", 100); + jpegQuality = UserConfig.getInt(conn, baseName + "PdfJpegQuality", 100); jpegQualitySelector.setValue(jpegQuality + ""); - jpegQualitySelector.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue ov, String oldValue, String newValue) { - checkJpegQuality(); - } - }); - threshold = UserConfig.getInt(baseName + "PdfThreshold", -1); - if (threshold > 0 && threshold < 100) { - thresholdInput.setText(threshold + ""); - } - thresholdInput.textProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, String oldValue, String newValue) { - checkThreshold(); - UserConfig.setString(baseName + "PdfThreshold", newValue); - } - }); + threshold = UserConfig.getInt(conn, baseName + "PdfThreshold", -1); + thresholdInput.setText(threshold + ""); - dithering = UserConfig.getBoolean(baseName + "PdfImageDithering", true); + dithering = UserConfig.getBoolean(conn, baseName + "PdfImageDithering", true); ditherCheck.setSelected(dithering); - ditherCheck.selectedProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { - dithering = newValue; - UserConfig.setBoolean(baseName + "PdfImageDithering", newValue); - } - }); - - checkImageFormat(); } catch (Exception e) { MyBoxLog.error(e, baseName); } } - protected void checkJpegQuality() { - try { - int v = Integer.parseInt(jpegQualitySelector.getSelectionModel().getSelectedItem()); - if (v >= 0 && v <= 100) { - jpegQuality = v; - jpegQualitySelector.setStyle(null); - UserConfig.setInt(baseName + "PdfJpegQuality", jpegQuality); - } else { - jpegQualitySelector.setStyle(UserConfig.badStyle()); + public boolean pickValues() { + if (customSizeRadio.isSelected()) { + try { + pageWidth = Integer.parseInt(customWidthInput.getText()); + } catch (Exception e) { + pageWidth = -1; + } + try { + pageHeight = Integer.parseInt(customHeightInput.getText()); + } catch (Exception e) { + pageHeight = -1; + } + } else if (standardSizeRadio.isSelected()) { + try { + dpi = Integer.parseInt(dpiSelector.getValue()); + } catch (Exception e) { + dpi = -1; + } + if (dpi <= 0) { + popError(message("InvalidParameter") + ": " + "DPI"); + return false; } + } + if (!isImageSize) { + if (pageWidth <= 0) { + popError(message("InvalidParameter") + ": " + message("Width")); + return false; + } + if (pageHeight <= 0) { + popError(message("InvalidParameter") + ": " + message("Height")); + return false; + } + } + try { + fontSize = Integer.parseInt(fontSizeSelector.getValue()); } catch (Exception e) { - jpegQualitySelector.setStyle(UserConfig.badStyle()); + fontSize = -1; } - } - - protected void checkImageFormat() { - jpegQualitySelector.setDisable(true); - jpegQualitySelector.setStyle(null); - thresholdInput.setDisable(true); - - RadioButton selected = (RadioButton) imageFormatGroup.getSelectedToggle(); - if (Languages.message("PNG").equals(selected.getText())) { - imageFormat = PdfImageFormat.Original; - } else if (Languages.message("CCITT4").equals(selected.getText())) { - imageFormat = PdfImageFormat.Tiff; - thresholdInput.setDisable(false); - checkThreshold(); - } else if (Languages.message("JpegQuailty").equals(selected.getText())) { - imageFormat = PdfImageFormat.Jpeg; - jpegQualitySelector.setDisable(false); - checkJpegQuality(); + if (fontSize <= 0) { + popError(message("InvalidParameter") + ": " + message("FontSize")); + return false; } - dithering = ditherCheck.isSelected(); - } - - protected void checkThreshold() { try { - threshold = -1; - if (thresholdInput.getText().isEmpty()) { - thresholdInput.setStyle(null); - return; - } - int v = Integer.parseInt(thresholdInput.getText()); - if (v >= 0 && v <= 255) { - threshold = v; - thresholdInput.setStyle(null); + zoom = Integer.parseInt(zoomSelector.getValue()); + } catch (Exception e) { + zoom = -1; + } + if (zoom <= 0) { + popError(message("InvalidParameter") + ": " + message("DefaultDisplayScale")); + return false; + } + if (includeImageOptions) { + if (bwRadio.isSelected()) { + try { + threshold = Integer.parseInt(thresholdInput.getText()); + } catch (Exception e) { + threshold = -1; + } + if (threshold < 0 || threshold > 255) { + popError(message("InvalidParameter") + ": " + message("CCITT4")); + return false; + } + imageFormat = PdfImageFormat.Tiff; + } else if (jpgRadio.isSelected()) { + try { + jpegQuality = Integer.parseInt(thresholdInput.getText()); + } catch (Exception e) { + jpegQuality = -1; + } + if (jpegQuality < 0 || jpegQuality > 100) { + popError(message("InvalidParameter") + ": " + message("JpegQuailty")); + return false; + } + imageFormat = PdfImageFormat.Jpeg; } else { - thresholdInput.setStyle(UserConfig.badStyle()); + imageFormat = PdfImageFormat.Original; } + } + try { + marginSize = Integer.parseInt(marginSelector.getValue()); + } catch (Exception e) { + marginSize = 0; + } + showPageNumber = pageNumberCheck.isSelected(); + landscape = landscapeCheck.isSelected(); + dithering = ditherCheck.isSelected(); + ttfFile = ttfController.ttfFile; + author = authorInput.getText(); + header = headerInput.getText(); + footer = footerInput.getText(); + try (Connection conn = DerbyBase.getConnection()) { + UserConfig.setInt(conn, baseName + "PdfZoom", zoom); + UserConfig.setInt(conn, baseName + "PdfFontSize", fontSize); + UserConfig.setInt(conn, baseName + "PdfMarginSize", marginSize); + UserConfig.setInt(conn, baseName + "PdfCustomWidth", pageWidth); + UserConfig.setInt(conn, baseName + "PdfCustomHeight", pageHeight); + UserConfig.setInt(conn, baseName + "PdfThreshold", threshold); + UserConfig.setInt(conn, baseName + "PdfJpegQuality", jpegQuality); + UserConfig.setString(conn, baseName + "PdfHeader", header); + UserConfig.setString(conn, baseName + "PdfAuthor", author); + UserConfig.setString(conn, baseName + "PdfFooter", footer); + UserConfig.setString(conn, baseName + "PdfStandardSize", standardSizeSelector.getValue()); + UserConfig.setBoolean(conn, baseName + "PdfShowPageNumber", showPageNumber); + UserConfig.setBoolean(conn, baseName + "PdfPageHorizontal", landscape); + UserConfig.setBoolean(conn, baseName + "PdfImageDithering", dithering); } catch (Exception e) { - thresholdInput.setStyle(UserConfig.badStyle()); } + return true; } @FXML @@ -526,316 +420,71 @@ protected void pdfMemUnlimit(ActionEvent event) { UserConfig.setPdfMem("Unlimit"); } - /* - get/set + get */ - public String getTtfFile() { - if (ttfController != null) { - ttfFile = ttfController.ttfFile; - } - return ttfFile; + public String getAuthor() { + return author; + } + + public String getHeader() { + return header; + } + + public String getFooter() { + return footer; } - public void setTtfFile(String ttfFile) { - this.ttfFile = ttfFile; + public String getTtfFile() { + return ttfFile; } public boolean isIsImageSize() { return isImageSize; } - public void setIsImageSize(boolean isImageSize) { - this.isImageSize = isImageSize; + public boolean isDithering() { + return dithering; } - public boolean isIncludeImageOptions() { - return includeImageOptions; + public boolean isShowPageNumber() { + return showPageNumber; } - public void setIncludeImageOptions(boolean includeImageOptions) { - this.includeImageOptions = includeImageOptions; + public boolean isLandscape() { + return landscape; } public int getMarginSize() { return marginSize; } - public void setMarginSize(int marginSize) { - this.marginSize = marginSize; - } - public int getPageWidth() { return pageWidth; } - public void setPageWidth(int pageWidth) { - this.pageWidth = pageWidth; - } - public int getPageHeight() { return pageHeight; } - public void setPageHeight(int pageHeight) { - this.pageHeight = pageHeight; - } - public int getJpegQuality() { return jpegQuality; } - public void setJpegQuality(int jpegQuality) { - this.jpegQuality = jpegQuality; - } - public int getThreshold() { return threshold; } - public void setThreshold(int threshold) { - this.threshold = threshold; - } - public int getFontSize() { return fontSize; } - public void setFontSize(int fontSize) { - this.fontSize = fontSize; - } - - public PdfImageFormat getImageFormat() { - return imageFormat; - } - - public void setImageFormat(PdfImageFormat imageFormat) { - this.imageFormat = imageFormat; - } - - public ComboBox getMarginSelector() { - return marginSelector; - } - - public void setMarginSelector(ComboBox marginSelector) { - this.marginSelector = marginSelector; - } - - public ComboBox getStandardSizeSelector() { - return standardSizeSelector; - } - - public void setStandardSizeSelector(ComboBox standardSizeSelector) { - this.standardSizeSelector = standardSizeSelector; - } - - public ComboBox getJpegQualitySelector() { - return jpegQualitySelector; - } - - public void setJpegQualitySelector(ComboBox jpegQualitySelector) { - this.jpegQualitySelector = jpegQualitySelector; - } - - public ComboBox getFontSizeSelector() { - return fontSizeSelector; - } - - public void setFontSizeSelector(ComboBox fontSizeSelector) { - this.fontSizeSelector = fontSizeSelector; - } - - public ToggleGroup getSizeGroup() { - return sizeGroup; - } - - public void setSizeGroup(ToggleGroup sizeGroup) { - this.sizeGroup = sizeGroup; - } - - public ToggleGroup getImageFormatGroup() { - return imageFormatGroup; - } - - public void setImageFormatGroup(ToggleGroup imageFormatGroup) { - this.imageFormatGroup = imageFormatGroup; - } - - public RadioButton getPixSizeRadio() { - return pixSizeRadio; - } - - public void setPixSizeRadio(RadioButton pixSizeRadio) { - this.pixSizeRadio = pixSizeRadio; - } - - public RadioButton getStandardSizeRadio() { - return standardSizeRadio; - } - - public void setStandardSizeRadio(RadioButton standardSizeRadio) { - this.standardSizeRadio = standardSizeRadio; - } - - public RadioButton getCustomSizeRadio() { - return customSizeRadio; - } - - public void setCustomSizeRadio(RadioButton customSizeRadio) { - this.customSizeRadio = customSizeRadio; - } - - public TextField getAuthorInput() { - return authorInput; - } - - public void setAuthorInput(TextField authorInput) { - this.authorInput = authorInput; - } - - public TextField getHeaderInput() { - return headerInput; - } - - public void setHeaderInput(TextField headerInput) { - this.headerInput = headerInput; - } - - public TextField getFooterInput() { - return footerInput; - } - - public void setFooterInput(TextField footerInput) { - this.footerInput = footerInput; - } - - public TextField getCustomWidthInput() { - return customWidthInput; - } - - public void setCustomWidthInput(TextField customWidthInput) { - this.customWidthInput = customWidthInput; - } - - public TextField getCustomHeightInput() { - return customHeightInput; - } - - public void setCustomHeightInput(TextField customHeightInput) { - this.customHeightInput = customHeightInput; - } - - public TextField getThresholdInput() { - return thresholdInput; - } - - public void setThresholdInput(TextField thresholdInput) { - this.thresholdInput = thresholdInput; - } - - public CheckBox getPageNumberCheck() { - return pageNumberCheck; - } - - public void setPageNumberCheck(CheckBox pageNumberCheck) { - this.pageNumberCheck = pageNumberCheck; - } - - public CheckBox getDitherCheck() { - return ditherCheck; - } - - public void setDitherCheck(CheckBox ditherCheck) { - this.ditherCheck = ditherCheck; - } - - public CheckBox getLandscapeCheck() { - return landscapeCheck; - } - - public void setLandscapeCheck(CheckBox landscapeCheck) { - this.landscapeCheck = landscapeCheck; - } - - public VBox getImageOptionsBox() { - return imageOptionsBox; - } - - public void setImageOptionsBox(VBox imageOptionsBox) { - this.imageOptionsBox = imageOptionsBox; - } - - public boolean isDithering() { - return dithering; - } - - public void setDithering(boolean dithering) { - this.dithering = dithering; - } - - public boolean isShowPageNumber() { - return showPageNumber; - } - - public void setShowPageNumber(boolean showPageNumber) { - this.showPageNumber = showPageNumber; - } - - public String getAuthor() { - if (authorInput != null) { - author = authorInput.getText(); - } - return author; - } - - public void setAuthor(String author) { - this.author = author; - } - - public String getHeader() { - if (headerInput != null) { - header = headerInput.getText(); - } - return header; - } - - public void setHeader(String header) { - this.header = header; - } - - public String getFooter() { - if (footerInput != null) { - footer = footerInput.getText(); - } - return footer; - } - - public void setFooter(String footer) { - this.footer = footer; - } - public int getZoom() { return zoom; } - public void setZoom(int zoom) { - this.zoom = zoom; - } - - public ComboBox getZoomSelector() { - return zoomSelector; - } - - public void setZoomSelector(ComboBox zoomSelector) { - this.zoomSelector = zoomSelector; - } - - public ControlTTFSelector getTtfController() { - return ttfController; - } - - public void setTtfController(ControlTTFSelector ttfController) { - this.ttfController = ttfController; + public PdfImageFormat getImageFormat() { + return imageFormat; } } diff --git a/alpha/MyBox/src/main/java/mara/mybox/controller/ControlTTFSelector.java b/alpha/MyBox/src/main/java/mara/mybox/controller/ControlTTFSelector.java index f0a302649..4dddd9b76 100644 --- a/alpha/MyBox/src/main/java/mara/mybox/controller/ControlTTFSelector.java +++ b/alpha/MyBox/src/main/java/mara/mybox/controller/ControlTTFSelector.java @@ -1,6 +1,7 @@ package mara.mybox.controller; import java.io.File; +import java.util.List; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; @@ -36,15 +37,15 @@ public static ControlTTFSelector create() { public ControlTTFSelector name(String baseName) { this.baseName = baseName; - ttfSelector.getItems().addAll(TTFTools.ttfList()); + List files = TTFTools.ttfList(); + ttfSelector.getItems().addAll(files); ttfFile = UserConfig.getString(baseName + "TTF", null); if (ttfFile == null) { - if (!ttfSelector.getItems().isEmpty()) { - ttfSelector.getSelectionModel().select(0); + if (!files.isEmpty()) { + ttfFile = files.get(0); } - } else { - ttfSelector.setValue(ttfFile); } + ttfSelector.setValue(ttfFile); ttfSelector.valueProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue s, String ov, String nv) { diff --git a/alpha/MyBox/src/main/java/mara/mybox/controller/Data2DSetValuesController.java b/alpha/MyBox/src/main/java/mara/mybox/controller/Data2DSetValuesController.java index 5e6018300..4d43a6e48 100644 --- a/alpha/MyBox/src/main/java/mara/mybox/controller/Data2DSetValuesController.java +++ b/alpha/MyBox/src/main/java/mara/mybox/controller/Data2DSetValuesController.java @@ -231,7 +231,7 @@ public boolean handleRows() { } else if (valueController.lowerTriangleRadio.isSelected()) { return lowerTriangleMatrix(); } else { - return setValue(valueController.value()); + return setValue(); } } catch (Exception e) { setError(e.toString()); @@ -239,8 +239,10 @@ public boolean handleRows() { } } - public boolean setValue(String value) { + public boolean setValue() { try { + String value = valueController.value(); + outputData = new ArrayList<>(); outputData.addAll(sourceController.tableData); for (int row : sourceController.filteredRowsIndices) { List values = sourceController.tableData.get(row); diff --git a/alpha/MyBox/src/main/java/mara/mybox/controller/ImagesSaveController.java b/alpha/MyBox/src/main/java/mara/mybox/controller/ImagesSaveController.java index 63e33da3e..23d904b89 100644 --- a/alpha/MyBox/src/main/java/mara/mybox/controller/ImagesSaveController.java +++ b/alpha/MyBox/src/main/java/mara/mybox/controller/ImagesSaveController.java @@ -426,6 +426,11 @@ public boolean checkOptions() { } } } + if (pdfRadio.isSelected()) { + if (!pdfOptionsController.pickValues()) { + return false; + } + } try (Connection conn = DerbyBase.getConnection()) { UserConfig.setInt(conn, baseName + "savedWidth", savedWidth); UserConfig.setInt(conn, baseName + "PptWidth", pptWidth); diff --git a/alpha/MyBox/src/main/java/mara/mybox/controller/PptToPdfController.java b/alpha/MyBox/src/main/java/mara/mybox/controller/PptToPdfController.java index b0383f0ee..da242f40d 100644 --- a/alpha/MyBox/src/main/java/mara/mybox/controller/PptToPdfController.java +++ b/alpha/MyBox/src/main/java/mara/mybox/controller/PptToPdfController.java @@ -57,6 +57,11 @@ public void initControls() { } } + @Override + public boolean makeMoreParameters() { + return pdfOptionsController.pickValues() && super.makeMoreParameters(); + } + @Override public String handleFile(FxTask currentTask, File srcFile, File targetPath) { File target = makeTargetFile(srcFile, targetPath); @@ -90,8 +95,8 @@ public String handleFile(FxTask currentTask, File srcFile, File targetPath) { return message("Canceled"); } PdfTools.setAttributes(document, - pdfOptionsController.authorInput.getText(), - pdfOptionsController.zoom); + pdfOptionsController.getAuthor(), + pdfOptionsController.getZoom()); document.save(tmpFile); document.close(); } catch (Exception e) { diff --git a/alpha/MyBox/src/main/resources/bundles/Messages_zh_CN.properties b/alpha/MyBox/src/main/resources/bundles/Messages_zh_CN.properties index 68cbbb422..203f076aa 100644 --- a/alpha/MyBox/src/main/resources/bundles/Messages_zh_CN.properties +++ b/alpha/MyBox/src/main/resources/bundles/Messages_zh_CN.properties @@ -5234,7 +5234,7 @@ Robustness=\u5065\u58ee\u6027 Usability=\u53ef\u7528\u6027 Compatibility=\u517c\u5bb9\u6027 Security=\u5b89\u5168 -DataFilterComments=\u5f53\u8868\u8fbe\u5f0f\u4e0d\u4e3a\u7a7a\u4e14\u5176\u503c\u4e0d\u4e3atrue\u6216false\uff0c\u5219\u4e0d\u53d6\u6b64\u884c\u3002 +DataFilterComments=\u5f53\u8868\u8fbe\u5f0f\u4e0d\u4e3a\u7a7a\u4e14\u5176\u503c\u4e0d\u4e3atrue\u6216false\uff0c\u4e0d\u53d6\u6b64\u884c\u3002 Truncate=\u622a\u65ad AppendOriginal=\u9644\u52a0\u5230\u539f\u503c\u540e\u9762 PrefixOriginal=\u524d\u7f00\u5230\u539f\u503c\u524d\u9762 diff --git a/alpha/MyBox/src/main/resources/doc/en/README.md b/alpha/MyBox/src/main/resources/doc/en/README.md index e59f676a4..ba78f3ad5 100644 --- a/alpha/MyBox/src/main/resources/doc/en/README.md +++ b/alpha/MyBox/src/main/resources/doc/en/README.md @@ -9,10 +9,13 @@ This is compute application to provide simple and easy functions. It's free and * Add: - Write watermarks in PDF files in batch. - New data column type: Editable enumeration. + - Documents: Test Environment, Base Functions' Verification List, Compatibility Testing, Detailed Testing. * Improve: - Redesign and implement "Data manufacture". The base framework is: reader + operate + writers. - Options: Verify types when edit data; Verify types when save data. - - Implement row expresion with bindings. Placeholders are handled as variable names instead of variable values. + - Row expression: Set variable values by bindings. Placeholders are handled as variable names instead of variable values. + - Row filter: When expression is not empty and its value is not true nor false, the row is not taken. + - Data manufacture: Fix and enhance "Set Values". - Simplify interface of "Data manufacture". - Transparent can be set when customized colors. - "rtbufsize" and rotation can be set for ffmpeg. diff --git a/alpha/MyBox/src/main/resources/doc/en/mybox_about_data2d_en.html b/alpha/MyBox/src/main/resources/doc/en/mybox_about_data2d_en.html index 07ab34e9c..f142c4bc7 100644 --- a/alpha/MyBox/src/main/resources/doc/en/mybox_about_data2d_en.html +++ b/alpha/MyBox/src/main/resources/doc/en/mybox_about_data2d_en.html @@ -451,6 +451,19 @@

12.3 Texts File

  • Data can be saved as different charsets and delimiters.
  • +

    13 Temporary Data File

    +

    Temporary data files are generated when:

    +
      +
    • Import example.
    • +
    • Create data chart.
    • +
    • Caculate data.
    • +
    +

    Temporary data are saved in CSV format under internal temporary files path of MyBox by default.
    + The temporary files path will be cleared automatically when MyBox exits.
    + So please save temporary data under other path if need.

    +

    Option: Save temporary data under "generated" path. + When this option is checked, temporary data files will not be removed automatically。

    +

    More details can be referred in "User Guide - Data Tools"


    diff --git a/alpha/MyBox/src/main/resources/doc/zh/README.md b/alpha/MyBox/src/main/resources/doc/zh/README.md index e9e3dcc46..69be91149 100644 --- a/alpha/MyBox/src/main/resources/doc/zh/README.md +++ b/alpha/MyBox/src/main/resources/doc/zh/README.md @@ -10,18 +10,21 @@ * 新增: - 对PDF批量添加水印。 - 数据的列类型:可编辑的枚举型。 + - 文档:测试环境、基本功能检验列表、兼容性测试、详细测试。 * 改进: - 重新设计和实现"处理数据",基础框架为:读+处理+写。 - - 可选:编辑数据时检验类型、保存数据时检验类型。 - - 行表达式的实现:以bindings代入变量值,占位符被处理为变量名而不是变量值。 + - 选项:编辑数据时检验类型、保存数据时检验类型。 + - 行表达式:以bindings代入变量值,占位符被处理为变量名而不是变量值。 + - 行过滤:当表达式不为空且其值不为true或false,不取此行。 - 简化"处理数据"的界面。 + - 处理数据:修正和增强“赋值”。 - 定制颜色时可以设置透明度。 - ffmpeg可以设置"rtbufsize"和旋转。 - 笔记:节点是任何html,可以包含head。 * 解决问题: - 缺省locale非中文时无法切换语言。 - 当数据值为多行字串时行表达式会解析混乱。 - - 数据处理中当表达式非法时“赋值”不应当清除数据行。 + - 数据处理中当表达式非法时“赋值”不应清除数据行。 - 编辑数据行时弹出错误。 - 对数据库表导入数据时,类型“纪元”转换错误。 - icon图片显示为空白。 diff --git a/alpha/MyBox/src/main/resources/doc/zh/mybox_about_data2d_zh.html b/alpha/MyBox/src/main/resources/doc/zh/mybox_about_data2d_zh.html index 7827d3a70..ae3cd724f 100644 --- a/alpha/MyBox/src/main/resources/doc/zh/mybox_about_data2d_zh.html +++ b/alpha/MyBox/src/main/resources/doc/zh/mybox_about_data2d_zh.html @@ -552,6 +552,17 @@

    12.3 文本文件

  • 数据可以保存为不同的字符集和换行符。
  • +

    13 临时数据文件

    +

    以下情形会生成临时数据文件:

    +
      +
    • 导入示例。
    • +
    • 生成数据图。
    • +
    • 计算数据。
    • +
    +

    临时数据文件为CSV格式,缺省存放位置为MyBox内部的临时文件目录。
    + 当MyBox退出时,会自动清空临时文件目录。因此请将需要存留的临时数据另存到其它目录下。

    +

    选项:将临时数据文件写在"generated"目录下。选择此项后,临时数据文件就不会被自动清除了。

    +

    更详细的说明见《用户手册-数据工具》


    diff --git a/alpha/MyBox/src/main/resources/fxml/ControlData2DSetValue.fxml b/alpha/MyBox/src/main/resources/fxml/ControlData2DSetValue.fxml index 750a1212a..50fd545fc 100644 --- a/alpha/MyBox/src/main/resources/fxml/ControlData2DSetValue.fxml +++ b/alpha/MyBox/src/main/resources/fxml/ControlData2DSetValue.fxml @@ -14,6 +14,7 @@ License: Apache License Version 2.0 + @@ -30,14 +31,14 @@ License: Apache License Version 2.0 - + - +