Tony CHEMIT pushed to branch develop-9.3.x at ultreiaio / ird-observe Commits: 270eee57 by Tony Chemit at 2024-09-11T11:57:25+02:00 Improve table column sort for enum and boolean - See #1203 - - - - - b4945146 by Tony Chemit at 2024-09-11T11:57:25+02:00 Introduce DecoratorTableRenderer - - - - - 224a5b40 by Tony Chemit at 2024-09-11T12:06:35+02:00 Fix focus owner to number (but should review this in Focus session) - See #2902 - - - - - 5 changed files: - client/core/src/main/java/fr/ird/observe/client/util/table/JXTableUtil.java - + client/core/src/main/java/fr/ird/observe/client/util/table/renderer/DecoratorTableRenderer.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/ContentUIHandler.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableUIHandler.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableUITableModel.java Changes: ===================================== client/core/src/main/java/fr/ird/observe/client/util/table/JXTableUtil.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.client.util.table; import fr.ird.observe.client.ClientUIContextApplicationComponent; import fr.ird.observe.client.util.UIHelper; +import fr.ird.observe.client.util.table.renderer.DecoratorTableRenderer; import fr.ird.observe.dto.I18nDecoratorHelper; import io.ultreia.java4all.decoration.Decorated; import io.ultreia.java4all.decoration.Decorator; @@ -106,15 +107,7 @@ public class JXTableUtil { } public static TableCellRenderer newDecoratedRenderer(Decorator decorator) { - StringValue sv = value -> { - if (value == null) { - return null; - } - Decorated reference = (Decorated) value; - reference.registerDecorator(decorator); - return reference.decorate(); - }; - return getDefaultTableRenderer(sv, true); + return new DecoratorTableRenderer(decorator); } public static TableCellRenderer newEmptyNumberTableCellRenderer() { ===================================== client/core/src/main/java/fr/ird/observe/client/util/table/renderer/DecoratorTableRenderer.java ===================================== @@ -0,0 +1,97 @@ +package fr.ird.observe.client.util.table.renderer; + +/*- + * #%L + * ObServe Client :: Core + * %% + * Copyright (C) 2008 - 2023 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import io.ultreia.java4all.decoration.Decorated; +import io.ultreia.java4all.decoration.Decorator; +import org.jdesktop.swingx.renderer.DefaultTableRenderer; +import org.jdesktop.swingx.renderer.LabelProvider; +import org.jdesktop.swingx.renderer.StringValue; + +import javax.swing.JComponent; +import javax.swing.JTable; +import java.awt.Component; + +/** + * Created at 11/09/2024. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.3.7 + */ +public class DecoratorTableRenderer extends DefaultTableRenderer { + + public DecoratorTableRenderer(Decorator decorator) { + super(new DecoratorLabelProvider(decorator)); + } + + @Override + public DecoratorLabelProvider getComponentProvider() { + return (DecoratorLabelProvider) super.getComponentProvider(); + } + public Decorator getDecorator() { + return getComponentProvider().getStringValue().getDecorator(); + } + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + JComponent tableCellRendererComponent = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + String toolTipText = getString(value); + tableCellRendererComponent.setToolTipText(toolTipText); + return tableCellRendererComponent; + } + + public static class DecoratorStringValue implements StringValue { + + private final Decorator decorator; + + private DecoratorStringValue(Decorator decorator) { + this.decorator = decorator; + } + + @Override + public String getString(Object value) { + if (value == null) { + return null; + } + Decorated reference = (Decorated) value; + reference.registerDecorator(decorator); + return reference.decorate(); + } + + public Decorator getDecorator() { + return decorator; + } + } + + public static class DecoratorLabelProvider extends LabelProvider { + + + public DecoratorLabelProvider(Decorator decorator) { + super(new DecoratorStringValue(decorator)); + } + + @Override + public DecoratorStringValue getStringValue() { + return (DecoratorStringValue) super.getStringValue(); + } + } +} ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/ContentUIHandler.java ===================================== @@ -173,6 +173,10 @@ public abstract class ContentUIHandler<U extends ContentUI> implements ObserveSe container = (Container) ui.getObjectById(DefaultUIInitializer.MAIN_TABBED_PANE); if (withSubTab) { container = (Container) ui.getObjectById(DefaultUIInitializer.SUB_TABBED_PANE); + if (!container.isShowing()) { + // stay on main tabbed pane + container = (Container) ui.getObjectById(DefaultUIInitializer.MAIN_TABBED_PANE); + } } } else { container = ui.getContentBody(); @@ -183,11 +187,19 @@ public abstract class ContentUIHandler<U extends ContentUI> implements ObserveSe } public Component computeFocusOwner() { + //FIXME Review this on Focus clean session Container container = computeFocusOwnerContainer(); if (container instanceof JTabbedPane) { container = (Container) ((JTabbedPane) container).getSelectedComponent(); } - return ui.getFocusTraversalPolicy().getFirstComponent(container); + Component result = ui.getFocusTraversalPolicy().getFirstComponent(container); + if (ui.getModel().getStates().isReadingMode()) { + return result; + } + if (result instanceof JTabbedPane) { + result = ((JTabbedPane) result).getSelectedComponent(); + } + return ui.getFocusTraversalPolicy().getFirstComponent((Container) result); } public void onModeChanged(ContentMode newMode) { ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableUIHandler.java ===================================== @@ -45,6 +45,7 @@ import fr.ird.observe.client.datasource.editor.api.content.data.table.actions.en import fr.ird.observe.client.datasource.editor.api.content.data.table.actions.entry.select.SelectNext; import fr.ird.observe.client.datasource.editor.api.content.data.table.actions.entry.select.SelectPrevious; import fr.ird.observe.client.datasource.editor.api.content.data.table.sortable.AutoSelectWithMoveUpAndDownShowPopupAction; +import fr.ird.observe.client.datasource.editor.api.focus.ContentZone; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationScope; import fr.ird.observe.client.main.focus.FocusDispatcher; @@ -64,6 +65,7 @@ import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Rectangle; +import java.util.Objects; import java.util.function.Function; /** @@ -376,7 +378,7 @@ public abstract class ContentTableUIHandler<D extends DataDto, C extends Contain if (focusComponent instanceof JComponent) { focusComponent = focusDispatcher.dispatchFocus((JComponent) focusComponent); } - SwingUtilities.invokeLater(focusComponent::requestFocusInWindow); +// SwingUtilities.invokeLater(focusComponent::requestFocusInWindow); } } @@ -385,11 +387,13 @@ public abstract class ContentTableUIHandler<D extends DataDto, C extends Contain SwingUtilities.invokeLater(() -> { if (getFocusModel() != null) { unblockFocus(); - ui.getHandler().grabFocusOnForm(); - if (finalFocusComponent != null) { - SwingUtilities.invokeLater(finalFocusComponent::requestFocusInWindow); + //FIXME Review this on Focus clean session (the blockFocus does not work!!!) + if (Objects.equals(getFocusModel().getFocusOwnerZone(), ContentZone.ZONE_NAME)) { + ui.getHandler().grabFocusOnForm(); + if (finalFocusComponent != null) { + SwingUtilities.invokeLater(finalFocusComponent::requestFocusInWindow); + } } - ; } }); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableUITableModel.java ===================================== @@ -194,7 +194,7 @@ public abstract class ContentTableUITableModel<D extends DataDto, C extends Cont if (getColumnMeta(0).getType().equals(int.class)) { sorter.setComparator(0, Comparator.comparingInt(v -> (int) v)); } - int index=-1; + int index = -1; for (ContentTableMeta<C> meta : metas) { index++; Class<?> type = meta.getType(); @@ -205,6 +205,12 @@ public abstract class ContentTableUITableModel<D extends DataDto, C extends Cont DecoratedSorter<?> decoratedSorter = decorator.definition().sorter(); Comparator<?> comparator = decoratedSorter.getComparator((DecoratorDefinition) decorator.definition(), decoratorService.getReferentialLocale().getLocale(), decoratorIndex); sorter.setComparator(index, comparator); + } else if (boolean.class.equals(type)) { + sorter.setComparator(index, Comparator.comparingInt(v -> (boolean) v ? 1 : 0)); + } else if (Boolean.class.equals(type)) { + sorter.setComparator(index, Comparator.nullsLast(Comparator.comparingInt(v -> (Boolean) v ? 1 : 0))); + } else if (Enum.class.isAssignableFrom(type)) { + sorter.setComparator(index, Comparator.comparing(Object::toString)); } } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/aa74e3bab779552a56cc5bac8... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/aa74e3bab779552a56cc5bac8... You're receiving this email because of your account on gitlab.com.