[Git][ultreiaio/ird-observe][feature/issue-2907] 6 commits: Improve table column sort for enum and boolean - See #1203
Tony CHEMIT pushed to branch feature/issue-2907 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 - - - - - 1f940567 by Tony Chemit at 2024-09-11T12:06:57+02:00 Fix decorator in table for location on branchline - - - - - 90f70522 by Tony Chemit at 2024-09-11T12:06:57+02:00 New design of form - - - - - 5e6b88c9 by Tony Chemit at 2024-09-11T12:06:57+02:00 Fix focus owner to number (but should review this in Focus session) - - - - - 9 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 - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/observation/SetCatchUI.jaxx - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/observation/SetCatchUI.jcss - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/observation/SetCatchUIHandler.java - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/observation/SetCatchUITableModel.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)); } } ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/observation/SetCatchUI.jaxx ===================================== @@ -120,17 +120,27 @@ <JTabbedPane id='mainTabbedPane'> <tab id='caracteristicTab' i18nProperty=""> <Table id='editForm' fill='both' insets='1'> - <row> - <cell columns="2"> - <!-- acquisition Mode --> + <cell columns="2" rows="2"> <JPanel id='acquisitionMode'> <JRadioButton id='acquisitionModeIndividual'/> <JRadioButton id='acquisitionModeGrouped'/> </JPanel> </cell> - <cell columns="2" rows="2"> - <!-- location on longline --> + <cell> + <JLabel id='numberLabel'/> + </cell> + <cell weightx='1' anchor='east'> + <NumberEditor id='number' styleClass="int6"/> + </cell> + </row> + <row> + <cell> + <JPanel/> + </cell> + </row> + <row> + <cell columns="2" rows="4"> <Table id="locationOnLonglinePanel"> <row> <cell anchor="west"> @@ -158,9 +168,6 @@ </row> </Table> </cell> - </row> - <!-- species --> - <row> <cell> <JLabel id='speciesLabel'/> </cell> @@ -168,16 +175,7 @@ <FilterableComboBox id='species' genericType='SpeciesReference'/> </cell> </row> - - <!-- tagNumber --> - <!-- count --> <row> - <cell anchor='west'> - <JLabel id='tagNumberLabel'/> - </cell> - <cell anchor='east' weightx="1" fill="both"> - <NormalTextEditor id='tagNumber'/> - </cell> <cell> <JLabel id='countLabel'/> </cell> @@ -185,22 +183,6 @@ <NumberEditor id='count' styleClass="int6"/> </cell> </row> - - <!-- number --> - <row> - <cell> - <JLabel id='numberLabel'/> - </cell> - <cell weightx='1' anchor='east'> - <NumberEditor id='number' styleClass="int6"/> - </cell> - <cell columns="2"> - <JPanel/> - </cell> - </row> - - <!-- total weight --> - <!-- weightMeasureMethod --> <row> <cell> <JLabel id='totalWeightLabel'/> @@ -208,6 +190,8 @@ <cell weightx='1' anchor='east'> <NumberEditor id='totalWeight' styleClass="float3"/> </cell> + </row> + <row> <cell> <JLabel id='weightMeasureMethodLabel'/> </cell> @@ -215,9 +199,6 @@ <FilterableComboBox id='weightMeasureMethod' genericType='WeightMeasureMethodReference'/> </cell> </row> - - <!-- catch healthStatus --> - <!-- hook position --> <row> <cell> <JLabel id='catchHealthStatusLabel'/> @@ -225,16 +206,7 @@ <cell weightx='1' anchor='east'> <FilterableComboBox id='catchHealthStatus' genericType='HealthStatusReference'/> </cell> - <cell> - <JLabel id='hookPositionLabel'/> - </cell> - <cell weightx='1' anchor='east'> - <FilterableComboBox id='hookPosition' genericType='HookPositionReference'/> - </cell> </row> - - <!-- catch fate --> - <!-- discard healthStatus --> <row> <cell> <JLabel id='catchFateLabel'/> @@ -249,24 +221,44 @@ <FilterableComboBox id='discardHealthStatus' genericType='HealthStatusReference'/> </cell> </row> - - <!-- hookWhenDiscarded --> - <!-- photoReferences --> <row> + <cell> + <JLabel id='hookPositionLabel'/> + </cell> + <cell weightx='1' anchor='east'> + <FilterableComboBox id='hookPosition' genericType='HookPositionReference'/> + </cell> <cell anchor="west"> <JLabel id='hookWhenDiscardedLabel'/> </cell> <cell anchor='west' fill="both"> <BooleanEditor id='hookWhenDiscarded'/> </cell> + </row> + <row> <cell anchor='west'> <JLabel id='photoReferencesLabel'/> </cell> <cell anchor='east' weightx="1" fill="both"> <NormalTextEditor id='photoReferences'/> </cell> + <cell columns="2"/> + <!-- <cell anchor='west'>--> + <!-- <JLabel id='sampleReferencesLabel'/>--> + <!-- </cell>--> + <!-- <cell anchor='east' weightx="1" fill="both">--> + <!-- <NormalTextEditor id='sampleReferences'/>--> + <!-- </cell>--> </row> + <row> + <cell anchor='west'> + <JLabel id='tagNumberLabel'/> + </cell> + <cell anchor='east' weightx="1" fill="both"> + <NormalTextEditor id='tagNumber'/> + </cell> + </row> </Table> </tab> ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/observation/SetCatchUI.jcss ===================================== @@ -26,7 +26,7 @@ } #mainTabbedPane { - _focusComponent:{newComponentArray(acquisitionModeIndividual,depredated,beatDiameter)}; + _focusComponent:{newComponentArray(number,depredated,beatDiameter)}; } /* ***************************************************************************** */ ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/observation/SetCatchUIHandler.java ===================================== @@ -43,7 +43,6 @@ import org.apache.logging.log4j.Logger; import org.nuiton.jaxx.validator.swing.SwingValidator; import javax.swing.AbstractAction; -import javax.swing.JComponent; import javax.swing.JToolBar; import java.awt.Component; import java.awt.event.ActionEvent; @@ -74,19 +73,20 @@ public class SetCatchUIHandler extends GeneratedSetCatchUIHandler { @Override protected Component getFocusComponentOnSelectedRow(SetCatchUI ui, boolean notPersisted, boolean newRow, CatchDto tableEditBean, CatchDto previousRowBean) { - JComponent requestFocus; - if (newRow) { - requestFocus = ui.getSpecies(); - } else { - int acquisitionMode = tableEditBean.getAcquisitionMode(); - CatchAcquisitionMode acquisitionModeEnum = CatchAcquisitionMode.valueOf(acquisitionMode); - if (acquisitionModeEnum.equals(CatchAcquisitionMode.GROUPED)) { - requestFocus = ui.getCount(); - } else { - requestFocus = ui.getCatchHealthStatus(); - } - } - return requestFocus; + //FIXME Review this on Focus clean session +// JComponent requestFocus; +// if (newRow) { +// requestFocus = ui.getNumber(); +// } else { +// int acquisitionMode = tableEditBean.getAcquisitionMode(); +// CatchAcquisitionMode acquisitionModeEnum = CatchAcquisitionMode.valueOf(acquisitionMode); +// if (acquisitionModeEnum.equals(CatchAcquisitionMode.GROUPED)) { +// requestFocus = ui.getCount(); +// } else { +// requestFocus = ui.getCatchHealthStatus(); +// } +// } + return ui.getNumber(); } @Override ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/observation/SetCatchUITableModel.java ===================================== @@ -23,6 +23,7 @@ package fr.ird.observe.client.datasource.editor.ll.data.observation; */ import fr.ird.observe.client.util.table.EditableListProperty; +import fr.ird.observe.client.util.table.renderer.DecoratorTableRenderer; import fr.ird.observe.dto.data.CatchAcquisitionMode; import fr.ird.observe.dto.data.ll.observation.CatchDto; import fr.ird.observe.dto.data.ll.observation.SizeMeasureDto; @@ -30,6 +31,8 @@ import fr.ird.observe.dto.data.ll.observation.WeightMeasureDto; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import javax.swing.JTable; +import javax.swing.table.TableColumnModel; import java.util.Collection; import java.util.List; @@ -79,6 +82,15 @@ public class SetCatchUITableModel extends GeneratedSetCatchUITableModel { return weightMeasuresTableModel; } + @Override + public void initTableUISize(JTable table) { + super.initTableUISize(table); + TableColumnModel columnModel = table.getColumnModel(); + ((DecoratorTableRenderer) columnModel.getColumn(2).getCellRenderer()).getDecorator().setIndex(1); + ((DecoratorTableRenderer) columnModel.getColumn(3).getCellRenderer()).getDecorator().setIndex(1); + ((DecoratorTableRenderer) columnModel.getColumn(4).getCellRenderer()).getDecorator().setIndex(1); + } + @Override protected void onBeforeResetRow(int row) { super.onBeforeResetRow(row); View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/3fe60734f0d6451421af4d5d1... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/3fe60734f0d6451421af4d5d1... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)