You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2023/09/26 05:28:30 UTC

[causeway] branch master updated: CAUSEWAY-3601: activates autosize for both: columns and rows

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new ddbc22e521 CAUSEWAY-3601: activates autosize for both: columns and rows
ddbc22e521 is described below

commit ddbc22e521005a81a19806f9181805605602a08a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 26 07:28:26 2023 +0200

    CAUSEWAY-3601: activates autosize for both: columns and rows
---
 .../ui/components/ExcelFileModel.java              | 34 +++++++++++++++++-----
 1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/causeway/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileModel.java b/extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/causeway/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileModel.java
index d7dd22568e..ffafdea711 100644
--- a/extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/causeway/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileModel.java
+++ b/extensions/vw/exceldownload/wicket-ui/src/main/java/org/apache/causeway/extensions/viewer/wicket/exceldownload/ui/components/ExcelFileModel.java
@@ -29,6 +29,7 @@ import java.time.LocalDateTime;
 import java.time.OffsetDateTime;
 import java.util.Date;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;
@@ -40,6 +41,8 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.apache.wicket.model.LoadableDetachableModel;
 
 import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.commons.internal.base._Reduction;
+import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.core.metamodel.interactions.managed.nonscalar.DataTableModel;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.viewer.wicket.model.models.EntityCollectionModel;
@@ -96,8 +99,9 @@ class ExcelFileModel extends LoadableDetachableModel<File> {
 
     private File createFile() throws IOException, FileNotFoundException {
         try(final Workbook wb = new XSSFWorkbook()) {
-            String sheetName = table().getTitle().getValue();
-            if(sheetName==null||sheetName.length()==0) sheetName = "Collection";
+            final String sheetName = _Strings.nonEmpty(table().getTitle().getValue())
+                    .orElse("Collection"); // fallback sheet name
+
             val tempFile = File.createTempFile(ExcelFileModel.class.getCanonicalName(), sheetName + ".xlsx");
 
             try(val fos = new FileOutputStream(tempFile)) {
@@ -118,6 +122,7 @@ class ExcelFileModel extends LoadableDetachableModel<File> {
                 final CellStyle dateCellStyle = createDateFormatCellStyle(wb);
 
                 val dataRows = table().getDataRowsFiltered().getValue();
+                val maxLinesInRow = _Reduction.of(1, Math::max); // row auto-size calculation
 
                 // detail rows
                 for (val dataRow : dataRows) {
@@ -125,13 +130,19 @@ class ExcelFileModel extends LoadableDetachableModel<File> {
                     i=0;
                     for(val column : dataColumns) {
                         final Cell cell = row.createCell((short) i++);
-                        setCellValue(dataRow.getCellElementsForColumn(column)
-                                .filter(managedObject->managedObject.getPojo()!=null),
+                        val cellElements = dataRow.getCellElementsForColumn(column)
+                                .filter(managedObject->managedObject.getPojo()!=null);
+                        maxLinesInRow.accept(cellElements.size());
+                        setCellValue(cellElements,
                                 cell,
                                 dateCellStyle);
                     }
+                    autoSizeRow(row, maxLinesInRow.getResult().orElse(1));
                 }
 
+                // column auto-size
+                autoSizeColumns(sheet, dataColumns.size());
+
                 // freeze panes
                 sheet.createFreezePane(0, 1);
 
@@ -142,10 +153,17 @@ class ExcelFileModel extends LoadableDetachableModel<File> {
         }
     }
 
-    protected void autoSize(final Sheet sh, final int numProps) {
-        for(int prop=0; prop<numProps; prop++) {
-            sh.autoSizeColumn(prop);
-        }
+    protected void autoSizeRow(final Row row, final int numberOfLines) {
+        if(numberOfLines<2) return; // ignore
+        final int defaultHeight = row.getSheet().getDefaultRowHeight();
+        int height = numberOfLines * defaultHeight;
+        height = Math.min(height, Short.MAX_VALUE); // upper bound to 32767 lines
+        row.setHeight((short) height);
+    }
+
+    protected void autoSizeColumns(final Sheet sheet, final int columnCount) {
+        IntStream.range(0, columnCount)
+            .forEach(sheet::autoSizeColumn);
     }
 
     protected CellStyle createDateFormatCellStyle(final Workbook wb) {