diff --git a/java/bundles/org.eclipse.set.feature.table/OSGI-INF/l10n/bundle.properties b/java/bundles/org.eclipse.set.feature.table/OSGI-INF/l10n/bundle.properties index 5f995d51f8..d63599861c 100644 --- a/java/bundles/org.eclipse.set.feature.table/OSGI-INF/l10n/bundle.properties +++ b/java/bundles/org.eclipse.set.feature.table/OSGI-INF/l10n/bundle.properties @@ -18,6 +18,9 @@ TableOverviewPart_OpenAllWithErrors=Alle öffnen TableOverviewPart_CalculateMissingTask=Überprüfe Tabellen... TableOverviewPart_DebugModeHint=Debug-Mode: Tabellen können immer wieder neu überprüft werden TableOverviewPart_NonTransformableTable=Nicht generierbar: +TableOverviewPart_WithStateChanges=Enthalten Zustandsänderungen: +TableOverviewPart_WithPlanChanges=Enthalten Plansänderungen: +TableOverviewPart_EmptyTable=Leere Tabellen: TableErrorTableColumns_Index=Lfd. Nr. TableErrorTableColumns_LeadingObject=Führendes Objekt diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java index 4d8eb74916..05406aaeb7 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/ToolboxTableView.java @@ -98,6 +98,7 @@ import org.eclipse.set.services.export.TableCompileService; import org.eclipse.set.services.table.TableService; import org.eclipse.set.services.table.TableService.TableRendererUtil; +import org.eclipse.set.services.table.TableStatus; import org.eclipse.set.utils.BasePart; import org.eclipse.set.utils.RefreshAction; import org.eclipse.set.utils.SelectableAction; @@ -193,7 +194,7 @@ public class ToolboxTableView extends BasePart { private TableModelInstanceBodyDataProvider bodyDataProvider; - private EventHandler secondaryPlanningLoadedHanlder; + private EventHandler secondaryPlanningLoadedHandler; protected TableInfo tableInfo; /** @@ -307,9 +308,9 @@ public void accept(final SelectedControlAreaChangedEvent t) { SelectedControlAreaChangedEvent.class, selectionControlAreaHandler); - secondaryPlanningLoadedHanlder = this::comparePlaningLoadedHandler; + secondaryPlanningLoadedHandler = this::comparePlaningLoadedHandler; getBroker().subscribe(Events.COMPARE_MODEL_LOADED, - secondaryPlanningLoadedHanlder); + secondaryPlanningLoadedHandler); } protected void comparePlaningLoadedHandler(final Event event) { @@ -327,7 +328,7 @@ protected void preDestroy() { ToolboxEvents.unsubscribe(getBroker(), tableSelectRowHandler); ToolboxEvents.unsubscribe(getBroker(), tableDataChangeHandler); ToolboxEvents.unsubscribe(getBroker(), selectionControlAreaHandler); - getBroker().unsubscribe(secondaryPlanningLoadedHanlder); + getBroker().unsubscribe(secondaryPlanningLoadedHandler); getBroker().send(Events.CLOSE_PART, extractShortcut()); } @@ -362,7 +363,7 @@ protected Table transformToTableModel() { private void updateTableView(final List tableCategories) { tableService.updateTable(this, tableCategories, new TableRendererUtil( - () -> transformToTableModel(), transformedTable -> { + this::transformToTableModel, transformedTable -> { if (transformedTable == null) { return; } @@ -402,8 +403,10 @@ protected void createView(final Composite parent) { return; } subcribeTriggerResortEvent(); - if (tableService.getNonTransformableTables(tableInfo.category()) - .contains(tableInfo)) { + final TableStatus status = tableService + .getTablesStatus(tableInfo.category()) + .getOrDefault(tableInfo, null); + if (status == null || status.isNonTransformable()) { getDialogService().error(getToolboxShell(), messages.TableTransform_Error_Msg); } diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceContextFunction.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceContextFunction.java index f434a5d2c7..ccb476fe12 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceContextFunction.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceContextFunction.java @@ -202,10 +202,14 @@ public void handleEvent(final Event event) { .getCacheService() .getCache(schnitstelle, ToolboxConstants.CacheId.DIRECTED_EDGE_TO_SUBPATH)); - if (event.getTopic().equals(Events.MODEL_CHANGED) - && tableService != null) { - tableService.clearInstance(); - } + } + + if (tableService == null) { + return; + } + + if (event.getTopic().equals(Events.MODEL_CHANGED)) { + tableService.clearInstance(); } if (event.getTopic().equals(Events.CLOSE_SESSION)) { @@ -220,17 +224,16 @@ public void handleEvent(final Event event) { if (event.getTopic().equals(TableDataChangeEvent.TOPIC)) { final Object data = event.getProperty(IEventBroker.DATA); - if (data instanceof final TableDataChangeEvent changedEvent) { - if (!changedEvent.getProperties().isEmpty() && changedEvent - .getProperties() - .getFirst() instanceof Pt1TableChangeProperties) { - tableService.addChangedTableData( - changedEvent.getTableShortcut(), - changedEvent.getProperties() - .stream() - .map(Pt1TableChangeProperties.class::cast) - .toList()); - } + if (data instanceof final TableDataChangeEvent changedEvent + && !changedEvent.getProperties().isEmpty() + && changedEvent.getProperties() + .getFirst() instanceof Pt1TableChangeProperties) { + tableService.addChangedTableData( + changedEvent.getTableShortcut(), + changedEvent.getProperties() + .stream() + .map(Pt1TableChangeProperties.class::cast) + .toList()); } } diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceImpl.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceImpl.java index 42f0100d01..8060ff0dde 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceImpl.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceImpl.java @@ -16,7 +16,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -26,7 +25,6 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.UnaryOperator; -import java.util.stream.Collectors; import java.util.stream.StreamSupport; import org.eclipse.core.runtime.IProgressMonitor; @@ -57,6 +55,8 @@ import org.eclipse.set.feature.table.PlanPro2TableTransformationService; import org.eclipse.set.feature.table.messages.Messages; import org.eclipse.set.model.tablemodel.ColumnDescriptor; +import org.eclipse.set.model.tablemodel.CompareStateCellContent; +import org.eclipse.set.model.tablemodel.CompareTableCellContent; import org.eclipse.set.model.tablemodel.Footnote; import org.eclipse.set.model.tablemodel.RowGroup; import org.eclipse.set.model.tablemodel.Table; @@ -72,6 +72,7 @@ import org.eclipse.set.services.table.TableDiffService; import org.eclipse.set.services.table.TableDiffService.TableCompareType; import org.eclipse.set.services.table.TableService; +import org.eclipse.set.services.table.TableStatus; import org.eclipse.set.utils.BasePart; import org.eclipse.set.utils.ToolboxConfiguration; import org.eclipse.set.utils.table.Pt1TableChangeProperties; @@ -135,9 +136,8 @@ public final class TableServiceImpl implements TableService { private final Map diffServiceMap = new ConcurrentHashMap<>(); private static final Queue> transformTableThreads = new LinkedList<>(); private final Map> footnotesPerTable = new ConcurrentHashMap<>(); - private static final Set nonTransformableTables = new HashSet<>(); - private static final Map> tableChangedData = new ConcurrentHashMap<>(); + private static final Map tablesStatus = new HashMap<>(); private CacheService getCacheService() { return ToolboxConfiguration.isDebugMode() ? Services.getNoCacheService() @@ -261,8 +261,8 @@ public TableNameInfo getTableNameInfo(final TableInfo tableInfo) { public Collection getAvailableTables() { return modelServiceMap.keySet() .stream() - .filter(tableInfo -> !nonTransformableTables - .contains(tableInfo)) + .filter(tableInfo -> tablesStatus.get(tableInfo) == null + || !tablesStatus.get(tableInfo).isNonTransformable()) .toList(); } @@ -303,7 +303,17 @@ private void saveTableError(final TableInfo tableInfo, final Collection errors) { final String shortName = getTableNameInfo(tableInfo).getShortName(); final String shortCut = tableInfo.shortcut(); + errors.forEach(error -> error.setSource(shortName)); + + // Only considered table in main session + if (modelSession.getToolboxFile() + .getRole() == ToolboxFileRole.SESSION) { + final TableStatus tableStatus = tablesStatus + .computeIfAbsent(tableInfo, k -> new TableStatus()); + tableStatus.setContainsErrors(!errors.isEmpty()); + } + getCacheService() .getCache(modelSession.getPlanProSchnittstelle(), ToolboxConstants.CacheId.TABLE_ERRORS) @@ -428,6 +438,7 @@ public Table transformToTable(final TableInfo tableInfo, if (!(table instanceof Table)) { return null; } + if (tableType != TableType.DIFF && !controlAreaIds.isEmpty() && controlAreaIds.stream() .noneMatch(area -> isContainerContainArea( @@ -439,8 +450,16 @@ public Table transformToTable(final TableInfo tableInfo, final Table resultTable = TableServiceUtils.filterRequestValue( EcoreUtil.copy((Table) table), tableType, tableInfo, modelSession, getModelService(tableInfo), controlAreaIds); + final TableStatus status = tablesStatus.computeIfAbsent(tableInfo, + k -> new TableStatus()); TableServiceUtils.clearEmptyRow(resultTable); getModelService(tableInfo).addAdditionRow((Table) table, resultTable); + if (modelSession.getToolboxFile() + .getRole() == ToolboxFileRole.SESSION) { + status.setContainsStateChanged( + TableServiceUtils.isTableExistChangedCompareContent( + resultTable, CompareStateCellContent.class)); + } sortTable(resultTable, tableInfo, tableType); return resultTable; } @@ -651,14 +670,12 @@ public Map transformTables(final IProgressMonitor monitor, try { final TableNameInfo nameInfo = getTableNameInfo(tableInfo); monitor.subTask(nameInfo.getFullDisplayName()); - final Table table = transformToTable(tableInfo, tableType, - sessionService.getLoadedSession( - ToolboxFileRole.SESSION), + + final Table table = createDiffTable(tableInfo, tableType, controlAreaIds); while (!TableService.isTransformComplete(tableInfo, null)) { Thread.sleep(2000); } - storageFootnotes(ToolboxFileRole.SESSION, tableInfo, table); result.put(tableInfo, table); monitor.worked(1); } catch (final Exception e) { @@ -673,6 +690,8 @@ public Map transformTables(final IProgressMonitor monitor, public Table createDiffTable(final TableInfo tableInfo, final TableType tableType, final Set controlAreaIds) { Table mainSessionTable = null; + final TableStatus tableStatus = tablesStatus.computeIfAbsent(tableInfo, + k -> new TableStatus()); try { mainSessionTable = transformToTable(tableInfo, tableType, sessionService.getLoadedSession(ToolboxFileRole.SESSION), @@ -681,6 +700,8 @@ public Table createDiffTable(final TableInfo tableInfo, mainSessionTable); if (sessionService.getLoadedSession( ToolboxFileRole.COMPARE_PLANNING) == null) { + tableStatus.setEmpty( + TableExtensions.isTableEmpty(mainSessionTable)); return mainSessionTable; } // Waiting table compare transform, then create compare table @@ -691,7 +712,7 @@ public Table createDiffTable(final TableInfo tableInfo, } catch (final Exception e) { logger.error("Transformation Error: {} : {}", //$NON-NLS-1$ tableInfo.shortcut(), e.getMessage()); - nonTransformableTables.add(tableInfo); + tableStatus.setNonTransformable(true); broker.post(Events.TABLEERROR_CHANGED, null); // Give empty table back return createEmptyTable(tableInfo); @@ -713,12 +734,17 @@ public Table createDiffTable(final TableInfo tableInfo, .get(TableCompareType.PROJECT) .createDiffTable(mainSessionTable, compareSessionTable); sortTable(compareTable, tableInfo, tableType); - + tableStatus.setContainsPlanChanged( + TableServiceUtils.isTableExistChangedCompareContent( + compareTable, CompareTableCellContent.class)); + tableStatus.setEmpty(TableExtensions.isTableEmpty(compareTable)); return compareTable; } catch (final Exception e) { dialogService.error(Display.getCurrent().getActiveShell(), messages.TableTransform_Error, messages.TableTransform_ComparePlanError_Msg, e); + tableStatus + .setEmpty(TableExtensions.isTableEmpty(mainSessionTable)); return mainSessionTable; } } @@ -743,20 +769,18 @@ public TableRowGroupComparator getRowGroupComparator( } @Override - public Set getNonTransformableTables( + public Map getTablesStatus( final Pt1TableCategory tableCategory) { - return nonTransformableTables.stream() - .filter(info -> info.category().equals(tableCategory)) - .collect(Collectors.toSet()); + return tablesStatus; } void clearInstance() { transformTableThreads.clear(); - nonTransformableTables.clear(); footnotesPerTable.clear(); modelServiceMap.values() .forEach(transformService -> transformService.getTableErrors() .clear()); + tablesStatus.clear(); } @Override diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceUtils.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceUtils.java index a05f5a5f76..a62519b4d4 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceUtils.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/internal/TableServiceUtils.java @@ -20,7 +20,6 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; @@ -50,6 +49,7 @@ import org.eclipse.set.model.tablemodel.CompareFootnoteContainer; import org.eclipse.set.model.tablemodel.CompareStateCellContent; import org.eclipse.set.model.tablemodel.CompareTableCellContent; +import org.eclipse.set.model.tablemodel.PlanCompareRow; import org.eclipse.set.model.tablemodel.RowGroup; import org.eclipse.set.model.tablemodel.SimpleFootnoteContainer; import org.eclipse.set.model.tablemodel.StringCellContent; @@ -195,8 +195,7 @@ public static Collection getMissingTables( final TableService tableService, final IModelSession modelSession, final Set controlAreaIds, final Pt1TableCategory tableCategory) { - final Map> computedErrors = tableService - .getTableErrors(modelSession, controlAreaIds, tableCategory); + final Collection allTableInfos = tableService .getAvailableTables() .stream() @@ -209,8 +208,10 @@ public static Collection getMissingTables( if (!ToolboxConfiguration.isDebugMode()) { // in debug mode we want to be able to recompute the errors // that's why we mark all as missing - missingTables - .removeIf(info -> computedErrors.keySet().contains(info)); + missingTables.removeIf( + info -> tableService.getTablesStatus(tableCategory) + .keySet() + .contains(info)); } return missingTables; } @@ -710,4 +711,31 @@ private static boolean equalsValues(final List oldValues, && oldValues.stream().allMatch(newValues::contains); } + /** + * @param table + * the table + * @param cellContentClass + * the compare cell content class {@link CompareStateCellContent} + * or {@link CompareTableCellContent} + * @return true, if exist compare cell + */ + public static boolean isTableExistChangedCompareContent(final Table table, + final Class cellContentClass) { + if (cellContentClass != CompareTableCellContent.class + && cellContentClass != CompareStateCellContent.class) { + throw new IllegalArgumentException( + "CellContent isn't CompareCellContent"); //$NON-NLS-1$ + } + final List tableRows = TableExtensions.getTableRows(table); + if (cellContentClass == CompareTableCellContent.class + && tableRows.stream() + .anyMatch(PlanCompareRow.class::isInstance)) { + return true; + } + return tableRows.stream() + .flatMap(row -> row.getCells().stream()) + .filter(Objects::nonNull) + .anyMatch(cell -> cell.getContent() != null + && cellContentClass.isInstance(cell.getContent())); + } } diff --git a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/messages/Messages.java b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/messages/Messages.java index 5f2202ba4e..63633247ee 100644 --- a/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/messages/Messages.java +++ b/java/bundles/org.eclipse.set.feature.table/src/org/eclipse/set/feature/table/messages/Messages.java @@ -107,6 +107,21 @@ public class Messages { */ public String TableOverviewPart_WithErrorsDesc; + /** + * Enthalten Zustandsänderungen + */ + public String TableOverviewPart_WithStateChanges; + + /** + * Enthalten Plansänderungen + */ + public String TableOverviewPart_WithPlanChanges; + + /** + * Leere Tabellen + */ + public String TableOverviewPart_EmptyTable; + /** * Debug-Mode: Tabellen können immer wieder neu überprüft werden */ @@ -197,5 +212,4 @@ public class Messages { * vollständig darstellen */ public String TableTransform_Error_Msg; - } 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 047f613719..8f21124b4a 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 @@ -19,11 +19,14 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Predicate; import java.util.stream.Collectors; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.core.services.nls.Translation; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; import org.eclipse.emf.common.notify.Notification; import org.eclipse.set.basis.Pair; import org.eclipse.set.basis.constants.Events; @@ -33,6 +36,7 @@ import org.eclipse.set.feature.table.messages.Messages; import org.eclipse.set.model.planpro.PlanPro.Container_AttributeGroup; import org.eclipse.set.services.table.TableService; +import org.eclipse.set.services.table.TableStatus; import org.eclipse.set.utils.BasePart; import org.eclipse.set.utils.ToolboxConfiguration; import org.eclipse.set.utils.events.ContainerDataChanged; @@ -59,6 +63,7 @@ import org.eclipse.swt.widgets.Text; import org.osgi.service.event.EventHandler; +import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import jakarta.inject.Inject; @@ -96,15 +101,64 @@ private record TableSectionControl(Label label, Text text, Button button) { private TableSectionControl missingTablesControl; private TableSectionControl containErrorTablesControl; private TableSectionControl nonTransformableTablesControl; + private TableSectionControl containsStatesChangeTablesControl; + private TableSectionControl containsPlanChangeTablesControl; + private TableSectionControl emptyTablesControl; private Label completenessHint; private TableErrorTableView tableErrorTableView; private final EventHandler tableErrorsChangeEventHandler = event -> onTableErrorsChange(); private ToolboxEventHandler selectionControlAreaHandler; + private EventHandler comparePlaningLoadedHandler; private boolean ignoreChangeEvent = false; private Set controlAreaIds = new HashSet<>(); + @PostConstruct + void postConstruct() { + selectionControlAreaHandler = new DefaultToolboxEventHandler<>() { + @Override + public void accept(final SelectedControlAreaChangedEvent t) { + controlAreaIds = t.getControlAreas() + .stream() + .map(ControlAreaValue::areaId) + .collect(Collectors.toSet()); + // When all table already transformation, that mean the + // calculate all table button is disable, therefore need to + // reload the + // tables here for update table status + if (getMissingTables().isEmpty()) { + final Set needToTransformTable = getTableToReTransform(); + calculateAllMissingTablesEvent( + monitor -> tableService.transformTables(monitor, + needToTransformTable, t.getTableType(), + controlAreaIds)); + } + update(); + } + }; + + ToolboxEvents.subscribe(getBroker(), + SelectedControlAreaChangedEvent.class, + selectionControlAreaHandler); + + comparePlaningLoadedHandler = event -> { + // When all table already transformation, that mean the calculate + // all table button is disable, therefore need to reload the tables + // here for update table status + if (getMissingTables().isEmpty()) { + final Set needToTransformTable = getTableToReTransform(); + calculateAllMissingTablesEvent( + monitor -> tableService.transformTables(monitor, + needToTransformTable, getTableType(), + controlAreaIds)); + } + update(); + }; + getBroker().subscribe(Events.COMPARE_MODEL_LOADED, + comparePlaningLoadedHandler); + } + @Override protected void createView(final Composite parent) { controlAreaIds = getModelSession().getSelectedControlAreas() @@ -126,35 +180,29 @@ protected void createView(final Composite parent) { missingTablesControl = createSectionControl(section, messages.TableOverviewPart_MissingTablesDesc, messages.TableOverviewPart_CalculateMissing, - new SelectionListener() { - @Override - public void widgetDefaultSelected(final SelectionEvent e) { - calculateAllMissingTablesEvent(); - } - - @Override - public void widgetSelected(final SelectionEvent e) { - widgetDefaultSelected(e); - } - }); - + () -> calculateAllMissingTablesEvent( + this::calculateAllMissingTables)); containErrorTablesControl = createSectionControl(section, messages.TableOverviewPart_WithErrorsDesc, messages.TableOverviewPart_OpenAllWithErrors, - new SelectionListener() { - @Override - public void widgetDefaultSelected(final SelectionEvent e) { - openAllTablesWithErrors(); - } - - @Override - public void widgetSelected(final SelectionEvent e) { - widgetDefaultSelected(e); - } - }); + () -> openAllRelevantTable(TableStatus::isContainsErrors)); + containsStatesChangeTablesControl = createSectionControl(section, + messages.TableOverviewPart_WithStateChanges, + messages.TableOverviewPart_OpenAllWithErrors, + () -> openAllRelevantTable( + TableStatus::isContainsStateChanged)); + + containsPlanChangeTablesControl = createSectionControl(section, + messages.TableOverviewPart_WithPlanChanges, + messages.TableOverviewPart_OpenAllWithErrors, + () -> openAllRelevantTable(TableStatus::isContainsPlanChanged)); + + emptyTablesControl = createSectionControl(section, + messages.TableOverviewPart_EmptyTable, null, null); nonTransformableTablesControl = createSectionControl(section, messages.TableOverviewPart_NonTransformableTable, null, null); + // Create table problem table view tableErrorTableView = new TableErrorTableView(messages, this, enumTranslationService, tableMenuService); @@ -163,27 +211,12 @@ public void widgetSelected(final SelectionEvent e) { getBroker().subscribe(Events.TABLEERROR_CHANGED, tableErrorsChangeEventHandler); - selectionControlAreaHandler = new DefaultToolboxEventHandler<>() { - @Override - public void accept(final SelectedControlAreaChangedEvent t) { - controlAreaIds = t.getControlAreas() - .stream() - .map(ControlAreaValue::areaId) - .collect(Collectors.toSet()); - update(); - } - }; - - ToolboxEvents.subscribe(getBroker(), - SelectedControlAreaChangedEvent.class, - selectionControlAreaHandler); - update(); } private static TableSectionControl createSectionControl(final Group section, final String labelText, final String buttonText, - final SelectionListener buttonAction) { + final Runnable buttonAction) { final Label label = new Label(section, SWT.NONE); label.setText(labelText); @@ -191,12 +224,27 @@ private static TableSectionControl createSectionControl(final Group section, text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); text.setEnabled(false); if (buttonText == null && buttonAction == null) { + final Composite space = new Composite(section, SWT.NONE); + space.setLayout(new GridLayout()); return new TableSectionControl(label, text, null); } final Button button = new Button(section, SWT.NONE); button.setText(buttonText); - button.addSelectionListener(buttonAction); + if (buttonAction != null) { + button.addSelectionListener(new SelectionListener() { + @Override + public void widgetDefaultSelected(final SelectionEvent e) { + buttonAction.run(); + } + + @Override + public void widgetSelected(final SelectionEvent e) { + widgetDefaultSelected(e); + } + }); + } + return new TableSectionControl(label, text, button); } @@ -206,11 +254,12 @@ private void onTableErrorsChange() { } } - private void calculateAllMissingTablesEvent() { + private void calculateAllMissingTablesEvent( + final Consumer calculateEvent) { ignoreChangeEvent = true; try { getDialogService().showProgress(getToolboxShell(), - this::calculateAllMissingTables); + calculateEvent::accept); } catch (InvocationTargetException | InterruptedException e) { getDialogService().error(getToolboxShell(), e); } @@ -224,9 +273,16 @@ private void calculateAllMissingTables(final IProgressMonitor monitor) { messages); } - private void openAllTablesWithErrors() { - final Collection tablesWithErrors = getTablesContainingErrors(); - for (final TableInfo tableInfo : tablesWithErrors) { + private Map> getTableErrors() { + return tableService.getTableErrors(getModelSession(), controlAreaIds, + getTableCategory()); + } + + private void openAllRelevantTable( + final Predicate tableWithStatus) { + final Map tablesStatus = tableService + .getTablesStatus(getTableCategory()); + tablesStatus.forEach((k, v) -> { final String tablePartIdPrefix = switch (getTableCategory()) { case ESTW -> ESTW_TABLE_PART_ID_PREFIX; case ETCS -> ETCS_TABLE_PART_ID_PREFIX; @@ -234,14 +290,12 @@ private void openAllTablesWithErrors() { default -> throw new IllegalArgumentException( "Unexpected value: " + getTableCategory()); //$NON-NLS-1$ }; - toolboxPartService.showPart(String.format("%s.%s", //$NON-NLS-1$ - tablePartIdPrefix, tableInfo.shortcut())); - } - } - private Map> getTableErrors() { - return tableService.getTableErrors(getModelSession(), controlAreaIds, - getTableCategory()); + if (tableWithStatus.test(v)) { + toolboxPartService.showPart(String.format("%s.%s", //$NON-NLS-1$ + tablePartIdPrefix, k.shortcut())); + } + }); } private Pt1TableCategory getTableCategory() { @@ -258,7 +312,6 @@ private Pt1TableCategory getTableCategory() { private void update() { final Collection missingTables = getMissingTables(); - if (!ToolboxConfiguration.isDebugMode()) { completenessHint.setVisible(!missingTables.isEmpty()); missingTablesControl.text() @@ -270,37 +323,46 @@ private void update() { completenessHint.setVisible(false); } - final Collection tablesWithErrors = getTablesContainingErrors(); - containErrorTablesControl.text() - .setText(tableList2DisplayString(tablesWithErrors)); - containErrorTablesControl.button() - .setEnabled(!tablesWithErrors.isEmpty()); + setControlText(containErrorTablesControl, + TableStatus::isContainsErrors); + setControlText(containsStatesChangeTablesControl, + TableStatus::isContainsStateChanged); + setControlText(containsPlanChangeTablesControl, + TableStatus::isContainsPlanChanged); + setControlText(emptyTablesControl, TableStatus::isEmpty); + setControlText(nonTransformableTablesControl, + TableStatus::isNonTransformable); - final Set nonTransformableTables = tableService - .getNonTransformableTables(getTableCategory()); - nonTransformableTablesControl.text() - .setText(tableList2DisplayString(nonTransformableTables)); final ArrayList allErrors = new ArrayList<>(); getTableErrors().values().forEach(allErrors::addAll); tableErrorTableView.updateView(allErrors); } - private Collection getMissingTables() { - return TableServiceUtils.getMissingTables(tableService, - getModelSession(), controlAreaIds, getTableCategory()); + private void setControlText(final TableSectionControl control, + final Predicate tableWithStatus) { + final Map tablesStatus = tableService + .getTablesStatus(getTableCategory()); + final Set relevantTable = getTablesWithStatus(tablesStatus, + tableWithStatus); + control.text().setText(tableList2DisplayString(relevantTable)); + if (control.button() != null) { + control.button().setEnabled(!relevantTable.isEmpty()); + } } - private Collection getTablesContainingErrors() { - final Map> computedErrors = getTableErrors(); + private static Set getTablesWithStatus( + final Map tablesStatus, + final Predicate predicate) { + return tablesStatus.entrySet() + .stream() + .filter(entry -> predicate.test(entry.getValue())) + .map(Entry::getKey) + .collect(Collectors.toSet()); + } - final ArrayList tablesWithErrors = new ArrayList<>(); - for (final Entry> entry : computedErrors - .entrySet()) { - if (!entry.getValue().isEmpty()) { - tablesWithErrors.add(entry.getKey()); - } - } - return tablesWithErrors; + private Collection getMissingTables() { + return TableServiceUtils.getMissingTables(tableService, + getModelSession(), controlAreaIds, getTableCategory()); } private String tableList2DisplayString(final Collection tables) { @@ -318,9 +380,32 @@ private String tableList2DisplayString(final Collection tables) { @PreDestroy private void unsubscribe() { broker.unsubscribe(tableErrorsChangeEventHandler); + broker.unsubscribe(comparePlaningLoadedHandler); ToolboxEvents.unsubscribe(broker, selectionControlAreaHandler); } + private Set getTableToReTransform() { + final List activeTablePart = getActiveTablePart(); + return tableService.getAvailableTables() + .stream() + .filter(info -> info.category() == getTableCategory()) + .filter(info -> activeTablePart.stream() + .noneMatch( + partId -> partId.equals(info.getTablePartId()))) + .collect(Collectors.toSet()); + } + + private List getActiveTablePart() { + final String tablePartPrefix = getTableCategory().getTablePartPrefix(); + return toolboxPartService.getOpenParts() + .stream() + .filter(part -> part.getElementId().startsWith(tablePartPrefix) + && !part.getElementId() + .equals(getToolboxPart().getElementId())) + .map(MPart::getElementId) + .toList(); + } + /** * Create the part. */ diff --git a/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/table/TableService.java b/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/table/TableService.java index 547362548c..cae6913aec 100644 --- a/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/table/TableService.java +++ b/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/table/TableService.java @@ -107,7 +107,7 @@ Map> getTableErrors( * @param tableCategory * @return the tables, which throw Exception during transformation */ - Set getNonTransformableTables(Pt1TableCategory tableCategory); + Map getTablesStatus(Pt1TableCategory tableCategory); /** * Transform the selected container to a string with CSV format. @@ -273,4 +273,5 @@ Comparator getRowGroupComparator(TableInfo tableInfo, */ void fillDelayCells(List tableRow, List changedDatas, TableType tableType); + } diff --git a/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/table/TableStatus.java b/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/table/TableStatus.java new file mode 100644 index 0000000000..b87ef620ba --- /dev/null +++ b/java/bundles/org.eclipse.set.services/src/org/eclipse/set/services/table/TableStatus.java @@ -0,0 +1,110 @@ +/** + * 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.services.table; + +/** + * The status of the Pt1 table by each table state/control area + * + * @author truong + */ +public class TableStatus { + private boolean containsErrors; + private boolean containsStateChanged; + private boolean containsPlanChanged; + private boolean nonTransformable; + private boolean isEmpty; + + /** + * + */ + public TableStatus() { + containsErrors = false; + containsPlanChanged = false; + containsStateChanged = false; + nonTransformable = false; + isEmpty = false; + } + + /** + * @return true, when table contain errors + */ + public boolean isContainsErrors() { + return containsErrors; + } + + /** + * @param containsErrors + * true, when table contain errors + */ + public void setContainsErrors(final boolean containsErrors) { + this.containsErrors = containsErrors; + } + + /** + * @return true, when table contains state changed + */ + public boolean isContainsStateChanged() { + return containsStateChanged; + } + + /** + * @param containsStateChanged + * true, when table contains state changed + */ + public void setContainsStateChanged(final boolean containsStateChanged) { + this.containsStateChanged = containsStateChanged; + } + + /** + * @return true, when table contains plan changed + */ + public boolean isContainsPlanChanged() { + return containsPlanChanged; + } + + /** + * @param containsPlanChanged + * true, when table contains plan changed + */ + public void setContainsPlanChanged(final boolean containsPlanChanged) { + this.containsPlanChanged = containsPlanChanged; + } + + /** + * @return true, if table non transformable + */ + public boolean isNonTransformable() { + return nonTransformable; + } + + /** + * @param nonTransformable + * true, if table non transformable + */ + public void setNonTransformable(final boolean nonTransformable) { + this.nonTransformable = nonTransformable; + } + + /** + * @return true, if table is empty + */ + public boolean isEmpty() { + return isEmpty; + } + + /** + * @param value + * true, if table is empty + */ + public void setEmpty(final boolean value) { + isEmpty = value; + } +} diff --git a/java/bundles/org.eclipse.set.utils.table/src/org/eclipse/set/utils/table/TableInfo.java b/java/bundles/org.eclipse.set.utils.table/src/org/eclipse/set/utils/table/TableInfo.java index b530fba3c9..d21f341eb2 100644 --- a/java/bundles/org.eclipse.set.utils.table/src/org/eclipse/set/utils/table/TableInfo.java +++ b/java/bundles/org.eclipse.set.utils.table/src/org/eclipse/set/utils/table/TableInfo.java @@ -78,6 +78,13 @@ public String toString() { }; } + /** + * @return the table part prefix of this category + */ + public String getTablePartPrefix() { + return getTablePartPrefix(this); + } + /** * Get Pt1Category enumerator from category id * @@ -140,6 +147,15 @@ public static Pt1TableCategory getCategoryFromPartId( } } + /** + * @return the table part id + */ + public String getTablePartId() { + return String.format("%s.%s", //$NON-NLS-1$ + Pt1TableCategory.getTablePartPrefix(category), + shortcut().toLowerCase()); + } + /** * @param categoryId * the category id