From bc769c54e32abc9a851c8022f64eb5a6f504db1a Mon Sep 17 00:00:00 2001 From: Quang Truong Date: Wed, 22 Jul 2026 09:50:56 +0200 Subject: [PATCH 1/2] export initial --- .../exportservice/ExportServiceImpl.java | 19 +++++++++++++--- .../table/overview/TableOverviewPart.java | 22 +++++++++++++++---- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/exportservice/ExportServiceImpl.java b/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/exportservice/ExportServiceImpl.java index 1c9ced8396..90a9f08692 100644 --- a/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/exportservice/ExportServiceImpl.java +++ b/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/exportservice/ExportServiceImpl.java @@ -13,6 +13,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -22,6 +23,7 @@ import java.util.stream.Stream; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Status; import org.eclipse.set.basis.FreeFieldInfo; import org.eclipse.set.basis.IModelSession; import org.eclipse.set.basis.OverwriteHandling; @@ -42,6 +44,7 @@ import org.eclipse.set.services.export.TableExport; import org.eclipse.set.services.export.TableExport.ExportFormat; import org.eclipse.set.utils.table.TableInfo; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; @@ -129,9 +132,19 @@ public void exportMultiTable(final ExportType exportType, .map(info -> TableToExport.createInstance(info, modelSession, exportType, outdir, exportFormate)) .toList(); - final List confirmOverwriteTables = filterConfirmOverwriteTable( - tablesToExport, shell, dialogService, overwriteHandling, - outputDir); + final List confirmOverwriteTables = new ArrayList<>(); + monitor.setBlocked(Status.info("Warte...")); + Display.getDefault().asyncExec(() -> { + try { + confirmOverwriteTables.addAll(filterConfirmOverwriteTable( + tablesToExport, + Display.getDefault().getActiveShell(), + dialogService, overwriteHandling, outputDir)); + monitor.clearBlocked(); + } catch (final IOException e) { + e.printStackTrace(); + } + }); confirmOverwriteTables.forEach(tableToExport -> { monitor.subTask(tableToExport.tableInfo() .nameInfo() diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/overview/TableOverviewPart.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/overview/TableOverviewPart.java index 1240b7fb4b..262b85931b 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/overview/TableOverviewPart.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/overview/TableOverviewPart.java @@ -17,8 +17,9 @@ import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Optional; +import java.util.Map.Entry; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; @@ -33,6 +34,7 @@ import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.set.basis.Pair; import org.eclipse.set.basis.constants.Events; +import org.eclipse.set.basis.constants.ExportType; import org.eclipse.set.basis.constants.TableType; import org.eclipse.set.basis.extensions.Exceptions; import org.eclipse.set.basis.threads.Threads; @@ -45,6 +47,7 @@ import org.eclipse.set.model.planpro.PlanPro.Container_AttributeGroup; import org.eclipse.set.services.export.ExportService; import org.eclipse.set.services.export.TableCompileService; +import org.eclipse.set.services.export.TableExport.ExportFormat; import org.eclipse.set.services.table.TableService; import org.eclipse.set.services.table.TableStatus; import org.eclipse.set.utils.BasePart; @@ -55,6 +58,7 @@ import org.eclipse.set.utils.events.SelectedControlAreaChangedEvent.ControlAreaValue; import org.eclipse.set.utils.events.ToolboxEventHandler; import org.eclipse.set.utils.events.ToolboxEvents; +import org.eclipse.set.utils.exception.ExceptionHandler; import org.eclipse.set.utils.table.TableError; import org.eclipse.set.utils.table.TableInfo; import org.eclipse.set.utils.table.TableInfo.Pt1TableCategory; @@ -302,16 +306,26 @@ private void exportAllRelevantTable( if (optionalOutputDir.isEmpty()) { return; } - + final String outputDir = optionalOutputDir.get(); + final List tableToExport = tablesStatus.entrySet() + .stream() + .filter(entry -> tableWithStatus.test(entry.getValue())) + .map(Entry::getKey) + .toList(); final IRunnableWithProgress exportThread = new IRunnableWithProgress() { - @Override public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask(messages.TableExportPart_TaskMsg, tablesStatus.size()); Threads.stopCurrentOnCancel(monitor); - // TODO + exportService.exportMultiTable(ExportType.INVENTORY_RECORDS, + tableToExport, getModelSession(), compileService, + getDialogService(), tableType, controlAreaIds, + List.of(ExportFormat.PDF, ExportFormat.EXCEL), + outputDir, monitor, getToolboxShell(), null, + new ExceptionHandler(getToolboxShell(), + getDialogService())); monitor.done(); } }; From 8b4216ccde3b5ce2a6cd5300cc774b57b3f545be Mon Sep 17 00:00:00 2001 From: Quang Truong Date: Thu, 23 Jul 2026 14:35:47 +0200 Subject: [PATCH 2/2] TableOverview export multi table --- .../OSGI-INF/l10n/bundle.properties | 4 + .../src/org/eclipse/set/core/Messages.java | 10 + .../core/dialogservice/DialogServiceImpl.java | 13 +- .../SelectionMultiValueDialog.java | 187 ++++++++++++++++++ .../exportservice/ExportServiceImpl.java | 154 ++------------- .../table/export/PlanProExportPart.java | 15 +- .../table/overview/TableOverviewPart.java | 127 +++++++++--- .../set/services/export/ExportService.java | 91 ++++++++- 8 files changed, 423 insertions(+), 178 deletions(-) create mode 100644 java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/dialogservice/SelectionMultiValueDialog.java diff --git a/java/bundles/org.eclipse.set.core/OSGI-INF/l10n/bundle.properties b/java/bundles/org.eclipse.set.core/OSGI-INF/l10n/bundle.properties index c062d0bed9..856088d625 100644 --- a/java/bundles/org.eclipse.set.core/OSGI-INF/l10n/bundle.properties +++ b/java/bundles/org.eclipse.set.core/OSGI-INF/l10n/bundle.properties @@ -134,3 +134,7 @@ LoadInvalidCRSDialog_Title=Unvollständiges Koordinatensystem LoadInvalidCRSDialog_MessagePattern=Achtung, die Datei "%s" enthält Objekt ohne gültiges Koordinatensystem. Der Lageplan kann nicht vollständig angezeigt werden. LoadInvalidCRSDialog_OpenLabel=Unvollständigen Lageplan anzeigen LoadInvalidCRSDialog_CloseLabel=Lageplan schließen + + +DialogService_selectAll=Alle auswählen +DialogService_deselectAll=Auswahl aufheben \ No newline at end of file diff --git a/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/Messages.java b/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/Messages.java index fd36bfcfd4..9a0806485f 100644 --- a/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/Messages.java +++ b/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/Messages.java @@ -534,4 +534,14 @@ private void bindBundleLocalization( * Lageplan schließen */ public String LoadInvalidCRSDialog_CloseLabel; + + /** + * Alle auswählen + */ + public String DialogService_selectAll; + + /** + * Auswahl aufheben + */ + public String DialogService_deselectAll; } diff --git a/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/dialogservice/DialogServiceImpl.java b/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/dialogservice/DialogServiceImpl.java index 39f271c564..3a16908061 100644 --- a/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/dialogservice/DialogServiceImpl.java +++ b/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/dialogservice/DialogServiceImpl.java @@ -163,16 +163,21 @@ public boolean confirmOverwrite(final Shell shell, final Path path) { @Override public List confirmOverwriteMultiFile(final Shell shell, final List filesName) { - final SelectValueDialog dialog = new SelectValueDialog(shell, - utilMessages.Dialogs_confirmOverwriteTitle, - utilMessages.Dialogs_confirmOverwrite_Multi, filesName); + + final SelectionMultiValueDialog dialog = new SelectionMultiValueDialog( + shell, utilMessages.Dialogs_confirmOverwriteTitle, + utilMessages.Dialogs_confirmOverwrite_Multi, + messages.DialogService_selectAll, + messages.DialogService_deselectAll, filesName); dialog.open(); final Collection result = dialog.getResult(); if (result.isEmpty()) { return Collections.emptyList(); } - return filesName.stream().filter(result::contains).toList(); + return filesName.stream() + .filter(file -> result.stream().anyMatch(r -> r.equals(file))) + .toList(); } @Override diff --git a/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/dialogservice/SelectionMultiValueDialog.java b/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/dialogservice/SelectionMultiValueDialog.java new file mode 100644 index 0000000000..c9d40b9e1a --- /dev/null +++ b/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/dialogservice/SelectionMultiValueDialog.java @@ -0,0 +1,187 @@ +/** + * Copyright (c) 2026 DB InfraGO AG and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v2.0 which is available at + * https://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + * + */ +package org.eclipse.set.core.dialogservice; + +import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.eclipse.jface.dialogs.AbstractSelectionDialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.CheckboxTableViewer; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.TableItem; + +/** + * Dialog for selection values + * + * @author Truong + */ +public class SelectionMultiValueDialog extends AbstractSelectionDialog { + CheckboxTableViewer listView; + String selectAllButtonLabel; + String deselectAllButtonLabel; + List items; + + /** + * @param parentShell + * the shell + * @param dialogTitle + * the dialog title + * @param dialogMessage + * the dialog message + * @param selectAllButtonLabel + * the select all button label + * @param deselectAllButtonLabel + * the deselect all button label + * @param items + * the items to selection + */ + public SelectionMultiValueDialog(final Shell parentShell, + final String dialogTitle, final String dialogMessage, + final String selectAllButtonLabel, + final String deselectAllButtonLabel, final List items) { + super(parentShell); + setTitle(dialogTitle); + setMessage(dialogMessage); + this.selectAllButtonLabel = selectAllButtonLabel; + this.deselectAllButtonLabel = deselectAllButtonLabel; + this.items = items; + setInitialSelection(items); + + } + + @Override + protected Control createDialogArea(final Composite parent) { + final Composite composite = (Composite) super.createDialogArea(parent); + initializeDialogUnits(composite); + createMessageArea(composite); + + listView = CheckboxTableViewer.newCheckList(composite, SWT.BORDER); + final GridData data = new GridData(GridData.FILL_BOTH); + data.heightHint = convertHeightInCharsToPixels(10); + data.widthHint = convertWidthInCharsToPixels(60); + listView.getTable().setLayoutData(data); + listView.setContentProvider(ArrayContentProvider.getInstance()); + listView.setLabelProvider(new LabelProvider() { + @Override + public String getText(final Object element) { + // Return the features's label. + return element == null ? "" //$NON-NLS-1$ + : (String) element; + } + }); + listView.addCheckStateListener(e -> updateButtonOnSelection()); + listView.addDoubleClickListener(e -> { + if (e.getSelection() instanceof final StructuredSelection structuredSelection) { + listView.setChecked(structuredSelection.getFirstElement(), + !listView.getChecked( + structuredSelection.getFirstElement())); + } + }); + addSelectionButtons(composite); + listView.setInput(items); + + return composite; + } + + private void addSelectionButtons(final Composite composite) { + final Composite buttonComposite = new Composite(composite, SWT.NONE); + final GridLayout layout = new GridLayout(); + layout.numColumns = 0; + layout.marginWidth = 0; + layout.horizontalSpacing = convertHorizontalDLUsToPixels( + IDialogConstants.HORIZONTAL_SPACING); + buttonComposite.setLayout(layout); + buttonComposite + .setLayoutData(new GridData(SWT.END, SWT.TOP, true, false)); + final Button selectAllButton = createButton(buttonComposite, + IDialogConstants.SELECT_ALL_ID, selectAllButtonLabel, false); + selectAllButton.setToolTipText(selectAllButtonLabel); + selectAllButton.addSelectionListener( + widgetSelectedAdapter(e -> setAllChecked(true))); + final Button deselectAllButton = createButton(buttonComposite, + IDialogConstants.DESELECT_ALL_ID, deselectAllButtonLabel, + false); + deselectAllButton.setToolTipText(deselectAllButtonLabel); + deselectAllButton.addSelectionListener( + widgetSelectedAdapter(e -> setAllChecked(false))); + } + + private void setAllChecked(final boolean state) { + listView.setAllChecked(state); + updateButtonOnSelection(); + } + + private void updateButtonOnSelection() { + final long selectedCount = Arrays.stream(listView.getTable().getItems()) + .filter(TableItem::getChecked) + .count(); + final int totalCount = listView.getTable().getItemCount(); + getButton(IDialogConstants.SELECT_ALL_ID) + .setEnabled(selectedCount < totalCount); + getButton(IDialogConstants.DESELECT_ALL_ID) + .setEnabled(selectedCount > 0); + getButton(IDialogConstants.OK_ID).setEnabled(selectedCount > 0); + } + + @Override + protected void createButtonsForButtonBar(final Composite parent) { + super.createButtonsForButtonBar(parent); + getButton(IDialogConstants.OK_ID).setEnabled(false); + } + + @Override + protected Label createMessageArea(final Composite composite) { + final Label label = new Label(composite, SWT.WRAP); + if (getMessage() != null && !getMessage().isEmpty()) { + label.setText(getMessage()); + GridDataFactory.fillDefaults() + .align(SWT.FILL, SWT.BEGINNING) + .grab(true, false) + .hint(convertHorizontalDLUsToPixels( + IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH), + SWT.DEFAULT) + .applyTo(label); + } + + return label; + } + + @Override + protected void okPressed() { + + // Get the input children. + final Object[] checkedItems = listView.getCheckedElements(); + final List result = new ArrayList<>(); + for (final Object item : checkedItems) { + if (item instanceof final String value) { + result.add(value); + } + } + setResult(result); + + super.okPressed(); + } +} diff --git a/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/exportservice/ExportServiceImpl.java b/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/exportservice/ExportServiceImpl.java index 90a9f08692..c26b96562a 100644 --- a/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/exportservice/ExportServiceImpl.java +++ b/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/exportservice/ExportServiceImpl.java @@ -9,29 +9,20 @@ package org.eclipse.set.feature.export.exportservice; import java.awt.image.BufferedImage; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.function.Consumer; -import java.util.stream.Stream; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Status; import org.eclipse.set.basis.FreeFieldInfo; import org.eclipse.set.basis.IModelSession; import org.eclipse.set.basis.OverwriteHandling; import org.eclipse.set.basis.ToolboxPaths; -import org.eclipse.set.basis.ToolboxPaths.ExportPathExtension; import org.eclipse.set.basis.constants.ExportType; import org.eclipse.set.basis.constants.TableType; -import org.eclipse.set.basis.exceptions.NotWritable; import org.eclipse.set.basis.guid.Guid; import org.eclipse.set.core.services.dialog.DialogService; import org.eclipse.set.core.services.session.SessionService; @@ -43,9 +34,6 @@ import org.eclipse.set.services.export.TableCompileService; import org.eclipse.set.services.export.TableExport; import org.eclipse.set.services.export.TableExport.ExportFormat; -import org.eclipse.set.utils.table.TableInfo; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ReferenceCardinality; @@ -64,37 +52,6 @@ @Component(immediate = true) public class ExportServiceImpl implements ExportService { - private record TableToExport(TableInfo tableInfo, Path pdfPath, - Path excelPath) { - private List getExportFilesName() { - return Stream.of(pdfPath, excelPath) - .filter(Objects::nonNull) - .map(p -> p.getFileName().toString()) - .toList(); - } - - private static TableToExport createInstance(final TableInfo tableInfo, - final IModelSession modelSession, final ExportType exportType, - final Path outdir, final List exportFormate) { - Path pdfExportPath = null; - if (exportFormate.contains(ExportFormat.PDF)) { - pdfExportPath = modelSession.getToolboxPaths() - .getTableExportPath(tableInfo.shortcut(), outdir, - exportType, - ExportPathExtension.TABLE_PDF_EXPORT_EXTENSION); - } - - Path excelExportPath = null; - if (exportFormate.contains(ExportFormat.EXCEL)) { - excelExportPath = modelSession.getToolboxPaths() - .getTableExportPath(tableInfo.shortcut(), outdir, - exportType, - ExportPathExtension.TABLE_XLSX_EXPORT_EXTENSION); - } - return new TableToExport(tableInfo, pdfExportPath, excelExportPath); - } - } - @Reference SessionService sessionService; @@ -114,12 +71,11 @@ public void addTableExportBuilder(final TableExport builder) { @Override public void exportMultiTable(final ExportType exportType, - final List tableInfos, final IModelSession modelSession, + final List tablesToExport, + final IModelSession modelSession, final TableCompileService compileService, final DialogService dialogService, final TableType tableType, - final Set controlAreaIds, - final List exportFormate, final String outputDir, - final IProgressMonitor monitor, final Shell shell, + final Set controlAreaIds, final IProgressMonitor monitor, final OverwriteHandling overwriteHandling, final Consumer errorHandler) { if (builders.isEmpty()) { @@ -127,25 +83,7 @@ public void exportMultiTable(final ExportType exportType, "There are no builders registered at the export service."); //$NON-NLS-1$ } try { - final Path outdir = Paths.get(outputDir); - final List tablesToExport = tableInfos.stream() - .map(info -> TableToExport.createInstance(info, - modelSession, exportType, outdir, exportFormate)) - .toList(); - final List confirmOverwriteTables = new ArrayList<>(); - monitor.setBlocked(Status.info("Warte...")); - Display.getDefault().asyncExec(() -> { - try { - confirmOverwriteTables.addAll(filterConfirmOverwriteTable( - tablesToExport, - Display.getDefault().getActiveShell(), - dialogService, overwriteHandling, outputDir)); - monitor.clearBlocked(); - } catch (final IOException e) { - e.printStackTrace(); - } - }); - confirmOverwriteTables.forEach(tableToExport -> { + tablesToExport.forEach(tableToExport -> { monitor.subTask(tableToExport.tableInfo() .nameInfo() .getFullDisplayName()); @@ -162,26 +100,23 @@ public void exportMultiTable(final ExportType exportType, .create(sessionService); final FreeFieldInfo freeField = planProToFreeFieldTransformation .transform(); - exportFormate.forEach(format -> { - final TableExport builder = getBuilder(format, - tableToExport.tableInfo().shortcut()); - final Path fileoutputPath = switch (format) { - case PDF -> tableToExport.pdfPath(); - case EXCEL -> tableToExport.excelPath(); - case TABLE_MODEL -> null; - }; - if (builder != null && fileoutputPath != null) { - try { - builder.export(tables, exportType, titleBox, - freeField, - tableToExport.tableInfo().shortcut(), - tableType, fileoutputPath, - OverwriteHandling.forCheckbox(true)); - } catch (final Exception e) { - errorHandler.accept(e); - } - } - }); + tableToExport.getExportFormatAndPaths() + .forEach((format, path) -> { + final TableExport builder = getBuilder(format, + tableToExport.tableInfo().shortcut()); + if (builder != null && path != null) { + try { + builder.export(tables, exportType, titleBox, + freeField, + tableToExport.tableInfo() + .shortcut(), + tableType, path, overwriteHandling); + } catch (final Exception e) { + errorHandler.accept(e); + } + } + }); + monitor.worked(1); }); } catch (final Exception e) { errorHandler.accept(e); @@ -198,53 +133,6 @@ private static Path getAttachmentPath(final IModelSession modelSession, } } - private static List filterConfirmOverwriteTable( - final List tablesToExport, final Shell shell, - final DialogService dialogService, - final OverwriteHandling overwriteHandling, final String outputDir) - throws IOException { - final List exportFilesName = tablesToExport.stream() - .flatMap(t -> t.getExportFilesName().stream()) - .toList(); - if (!alreadyExistAnyFile(exportFilesName, outputDir)) { - return tablesToExport; - } - - if (overwriteHandling != null) { - return tablesToExport.stream() - .filter(t -> Stream.of(t.excelPath(), t.pdfPath()) - .filter(Objects::nonNull) - .allMatch(p -> { - try { - return overwriteHandling.test(p); - } catch (final NotWritable e) { - return false; - } - - })) - .toList(); - } - final List confirmedOverwirteFiles = dialogService - .confirmOverwriteMultiFile(shell, exportFilesName); - return tablesToExport.stream() - .filter(table -> confirmedOverwirteFiles.stream() - .anyMatch(file -> table.getExportFilesName() - .contains(file))) - .toList(); - } - - private static boolean alreadyExistAnyFile(final List filesName, - final String outputDir) throws IOException { - final Path outDir = Path.of(outputDir); - if (!Files.exists(outDir) || !Files.isDirectory(outDir)) { - throw new IllegalArgumentException("outputDir should be Directory"); //$NON-NLS-1$ - } - try (Stream filesPath = Files.walk(Path.of(outputDir))) { - return filesPath.anyMatch( - p -> filesName.contains(p.getFileName().toString())); - } - } - @Override public void exportTable(final Map tables, final ExportType exportType, final Titlebox titlebox, diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/export/PlanProExportPart.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/export/PlanProExportPart.java index bb86956fce..d18e00c033 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/export/PlanProExportPart.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/export/PlanProExportPart.java @@ -38,6 +38,7 @@ import org.eclipse.set.model.tablemodel.extensions.TableExtensions; import org.eclipse.set.model.titlebox.Titlebox; import org.eclipse.set.ppmodel.extensions.utils.TableNameInfo; +import org.eclipse.set.services.export.ExportService.TableToExportPath; import org.eclipse.set.services.export.TableCompileService; import org.eclipse.set.services.export.TableExport.ExportFormat; import org.eclipse.set.services.table.TableService; @@ -227,7 +228,7 @@ protected void export(final List elements, final IModelSession modelSession, final OverwriteHandling overwriteHandling, final IProgressMonitor monitor) { - final List tablesToExport = new ArrayList<>(); + final List tablesToExport = new ArrayList<>(); elements.stream() .filter(ele -> TableInfo.Pt1TableCategory .getCategoryEnum(ele.getId()) == null) @@ -240,14 +241,17 @@ protected void export(final List elements, modelSession, monitor, getSelectedDirectory(), getExportType(), overwriteHandling); } else if (ele instanceof final CheckBoxTreeElement treeElement - && getTreeDataModel() instanceof TableCheckboxTreeModel) { - final TableInfo tableInfo = ((TableCheckboxTreeModel) getTreeDataModel()) + && getTreeDataModel() instanceof final TableCheckboxTreeModel tableCheckboxTreeModel) { + final TableInfo tableInfo = tableCheckboxTreeModel .getTableInfo(treeElement) .orElse(null); if (tableInfo == null) { return; } - tablesToExport.add(tableInfo); + tablesToExport.add(TableToExportPath.createInstance( + tableInfo, modelSession, getExportType(), + getSelectedDirectory(), + List.of(ExportFormat.PDF))); } }); getExportService().exportMultiTable(getExportType(), tablesToExport, @@ -257,8 +261,7 @@ modelSession, compileService, getDialogService(), .stream() .map(Pair::getSecond) .collect(Collectors.toSet()), - List.of(ExportFormat.PDF), getSelectedDirectory().toString(), - monitor, getToolboxShell(), overwriteHandling, + monitor, overwriteHandling, new ExceptionHandler(getToolboxShell(), getDialogService())); } diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/overview/TableOverviewPart.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/overview/TableOverviewPart.java index 262b85931b..c03dde24e3 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/overview/TableOverviewPart.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/overview/TableOverviewPart.java @@ -10,8 +10,11 @@ import static org.eclipse.set.basis.constants.ToolboxConstants.*; +import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -24,6 +27,7 @@ import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.e4.core.services.events.IEventBroker; @@ -32,6 +36,7 @@ import org.eclipse.emf.common.notify.Notification; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.set.basis.OverwriteHandling; import org.eclipse.set.basis.Pair; import org.eclipse.set.basis.constants.Events; import org.eclipse.set.basis.constants.ExportType; @@ -39,6 +44,7 @@ import org.eclipse.set.basis.extensions.Exceptions; import org.eclipse.set.basis.threads.Threads; import org.eclipse.set.core.services.configurationservice.UserConfigurationService; +import org.eclipse.set.core.services.dialog.DialogService; import org.eclipse.set.core.services.enumtranslation.EnumTranslationService; import org.eclipse.set.core.services.part.ToolboxPartService; import org.eclipse.set.feature.table.internal.TableServiceUtils; @@ -46,6 +52,7 @@ import org.eclipse.set.feature.table.overview.TableStatusGroupView.TableSectionControl; import org.eclipse.set.model.planpro.PlanPro.Container_AttributeGroup; import org.eclipse.set.services.export.ExportService; +import org.eclipse.set.services.export.ExportService.TableToExportPath; import org.eclipse.set.services.export.TableCompileService; import org.eclipse.set.services.export.TableExport.ExportFormat; import org.eclipse.set.services.table.TableService; @@ -64,6 +71,7 @@ import org.eclipse.set.utils.table.TableInfo.Pt1TableCategory; import org.eclipse.set.utils.table.menu.TableMenuService; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Shell; import org.osgi.service.event.EventHandler; import jakarta.annotation.PostConstruct; @@ -298,6 +306,7 @@ private void openAllRelevantTable( private void exportAllRelevantTable( final Predicate tableWithStatus) { + final Map tablesStatus = tableService .getTablesStatus(getTableCategory()); final Optional optionalOutputDir = getDialogService() @@ -307,45 +316,109 @@ private void exportAllRelevantTable( return; } final String outputDir = optionalOutputDir.get(); - final List tableToExport = tablesStatus.entrySet() + final List tablesToExport = tablesStatus.entrySet() .stream() .filter(entry -> tableWithStatus.test(entry.getValue())) .map(Entry::getKey) + .map(tableInfo -> TableToExportPath.createInstance(tableInfo, + getModelSession(), ExportType.INVENTORY_RECORDS, + Paths.get(outputDir), + List.of(ExportFormat.EXCEL, ExportFormat.PDF))) .toList(); - final IRunnableWithProgress exportThread = new IRunnableWithProgress() { - @Override - public void run(final IProgressMonitor monitor) - throws InvocationTargetException, InterruptedException { - monitor.beginTask(messages.TableExportPart_TaskMsg, - tablesStatus.size()); - Threads.stopCurrentOnCancel(monitor); - exportService.exportMultiTable(ExportType.INVENTORY_RECORDS, - tableToExport, getModelSession(), compileService, - getDialogService(), tableType, controlAreaIds, - List.of(ExportFormat.PDF, ExportFormat.EXCEL), - outputDir, monitor, getToolboxShell(), null, - new ExceptionHandler(getToolboxShell(), - getDialogService())); - monitor.done(); - } - }; - - final ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog( - getToolboxShell()); try { + final List filterConfirmOverwriteTable = filterConfirmOverwriteTable( + tablesToExport, getToolboxShell(), getDialogService(), + outputDir); + final IRunnableWithProgress exportThread = new IRunnableWithProgress() { + @Override + public void run(final IProgressMonitor monitor) + throws InvocationTargetException, InterruptedException { + monitor.beginTask(messages.TableExportPart_TaskMsg, + filterConfirmOverwriteTable.size()); + Threads.stopCurrentOnCancel(monitor); + exportService.exportMultiTable(ExportType.INVENTORY_RECORDS, + filterConfirmOverwriteTable, getModelSession(), + compileService, getDialogService(), tableType, + controlAreaIds, monitor, + OverwriteHandling.forCheckbox(true), + new ExceptionHandler(getToolboxShell(), + getDialogService())); + monitor.done(); + } + }; + + final ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog( + getToolboxShell()); progressMonitorDialog.run(true, true, exportThread); + + if (!progressMonitorDialog.getProgressMonitor().isCanceled()) { + // export finished + getDialogService().openDirectoryAfterExport(getToolboxShell(), + Path.of(optionalOutputDir.get())); + userConfigService + .setLastExportPath(Path.of(optionalOutputDir.get())); + } } catch (final Exception e) { if (!Exceptions.isCausedByThreadDeath(e)) { getDialogService().error(getToolboxShell(), e); + } else { + Thread.currentThread().interrupt(); } } - if (!progressMonitorDialog.getProgressMonitor().isCanceled()) { - // export finished - getDialogService().openDirectoryAfterExport(getToolboxShell(), - Path.of(optionalOutputDir.get())); - userConfigService - .setLastExportPath(Path.of(optionalOutputDir.get())); + } + + private static List filterConfirmOverwriteTable( + final List tablesToExport, final Shell shell, + final DialogService dialogService, final String outputDir) + throws IOException { + final Set alreadyExistExport = getAlreadyExistExport( + tablesToExport, outputDir); + if (alreadyExistExport.isEmpty()) { + return tablesToExport; + } + final List result = new ArrayList<>(tablesToExport); + result.removeIf(t -> alreadyExistExport.stream() + .anyMatch(exported -> exported.tableInfo() + .shortcut() + .equals(t.tableInfo().shortcut()))); + final List selectItems = alreadyExistExport.stream() + + .map(t -> t.tableInfo().nameInfo().getFullDisplayName()) + .sorted() + .toList(); + final List confirmedOverwirteFiles = dialogService + .confirmOverwriteMultiFile(shell, selectItems); + final List confirmOverwrite = alreadyExistExport + .stream() + .filter(table -> confirmedOverwirteFiles.contains( + table.tableInfo().nameInfo().getFullDisplayName())) + .toList(); + result.addAll(confirmOverwrite); + return result; + } + + private static Set getAlreadyExistExport( + final List tablesToExport, + final String outputDir) throws IOException { + final Path outDir = Path.of(outputDir); + if (!Files.exists(outDir) || !Files.isDirectory(outDir)) { + throw new IllegalArgumentException("outputDir should be Directory"); //$NON-NLS-1$ + } + final Set alreadyExistExportTable = new HashSet<>(); + try (Stream filesPath = Files.walk(Path.of(outputDir))) { + filesPath.forEach(p -> { + final String exportedFileName = p.getFileName().toString(); + final Optional exportedTable = tablesToExport + .stream() + .filter(t -> t.getExportFilesName() + .contains(exportedFileName)) + .findFirst(); + if (exportedTable.isPresent()) { + alreadyExistExportTable.add(exportedTable.get()); + } + }); } + return alreadyExistExportTable; } private Pt1TableCategory getTableCategory() { diff --git a/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/export/ExportService.java b/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/export/ExportService.java index 1d3e9c4c13..7283905763 100644 --- a/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/export/ExportService.java +++ b/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/export/ExportService.java @@ -10,16 +10,20 @@ import java.awt.image.BufferedImage; import java.nio.file.Path; +import java.util.EnumMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.function.Consumer; +import java.util.stream.Stream; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.set.basis.FreeFieldInfo; import org.eclipse.set.basis.IModelSession; import org.eclipse.set.basis.OverwriteHandling; import org.eclipse.set.basis.ToolboxPaths; +import org.eclipse.set.basis.ToolboxPaths.ExportPathExtension; import org.eclipse.set.basis.constants.ExportType; import org.eclipse.set.basis.constants.TableType; import org.eclipse.set.core.services.dialog.DialogService; @@ -36,6 +40,79 @@ * @author Schaefer */ public interface ExportService { + /** + * @param tableInfo + * the {@link TableInfo} + * @param pdfPath + * the path to export pdf file + * @param excelPath + * the path to export excel file + */ + public record TableToExportPath(TableInfo tableInfo, Path pdfPath, + Path excelPath) { + + /** + * @return the export format with relevant path + */ + public Map getExportFormatAndPaths() { + final EnumMap hashMap = new EnumMap<>( + ExportFormat.class); + if (pdfPath != null) { + hashMap.put(ExportFormat.PDF, pdfPath); + } + + if (excelPath != null) { + hashMap.put(ExportFormat.EXCEL, excelPath); + } + return hashMap; + } + + /** + * @return the export path of excel, pdf + */ + public List getExportFilesName() { + return Stream.of(pdfPath, excelPath) + .filter(Objects::nonNull) + .map(p -> p.getFileName().toString()) + .toList(); + } + + /** + * @param tableInfo + * the {@link TableInfo} + * @param modelSession + * the {@link IModelSession} + * @param exportType + * the {@link ExportType} + * @param outdir + * the output directory + * @param exportFormate + * the {@link ExportFormat} + * @return the {@link TableToExportPath} + */ + public static TableToExportPath createInstance( + final TableInfo tableInfo, final IModelSession modelSession, + final ExportType exportType, final Path outdir, + final List exportFormate) { + Path pdfExportPath = null; + if (exportFormate.contains(ExportFormat.PDF)) { + pdfExportPath = modelSession.getToolboxPaths() + .getTableExportPath(tableInfo.shortcut(), outdir, + exportType, + ExportPathExtension.TABLE_PDF_EXPORT_EXTENSION); + } + + Path excelExportPath = null; + if (exportFormate.contains(ExportFormat.EXCEL)) { + excelExportPath = modelSession.getToolboxPaths() + .getTableExportPath(tableInfo.shortcut(), outdir, + exportType, + ExportPathExtension.TABLE_XLSX_EXPORT_EXTENSION); + } + return new TableToExportPath(tableInfo, pdfExportPath, + excelExportPath); + } + } /** * Whether an implementation exports all, none or some of the provided @@ -135,7 +212,7 @@ void exportSiteplanPdf(List imagesData, Titlebox titleBox, * * @param exportType * the {@link ExportType} - * @param tableInfos + * @param tablesToExport * the tables to export * @param modelSession * the {@link IModelSession} @@ -147,7 +224,6 @@ void exportSiteplanPdf(List imagesData, Titlebox titleBox, * the {@link TableType} * @param controlAreaIds * the selected control area - * @param exportFormate * @param outputDir * the output directory * @param monitor @@ -159,11 +235,10 @@ void exportSiteplanPdf(List imagesData, Titlebox titleBox, * @param errorHandler * the error handler */ - void exportMultiTable(ExportType exportType, List tableInfos, - IModelSession modelSession, TableCompileService compileService, - DialogService dialogService, TableType tableType, - Set controlAreaIds, List exportFormate, - String outputDir, IProgressMonitor monitor, Shell shell, - OverwriteHandling overwriteHandling, + void exportMultiTable(ExportType exportType, + List tablesToExport, IModelSession modelSession, + TableCompileService compileService, DialogService dialogService, + TableType tableType, Set controlAreaIds, + IProgressMonitor monitor, OverwriteHandling overwriteHandling, Consumer errorHandler); }