Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 55be320c by Tony Chemit at 2021-01-07T12:07:36+01:00 Fix JLabel init (never assign LabelFor if JLabel is not design for (his name must ends by Label) : because otherwise nasty StackOverFlow can happen! - - - - - 88cfaf49 by Tony Chemit at 2021-01-07T13:29:59+01:00 If no row selected, then do nothing - - - - - d63a83d8 by Tony Chemit at 2021-01-07T14:27:22+01:00 Avoid costy log - - - - - c03d89aa by Tony Chemit at 2021-01-07T14:37:30+01:00 Consultation du tableau des débarquements lorsque le formulaire est verrouillé - Closes #1739 - - - - - 15 changed files: - client/core/src/main/java/fr/ird/observe/client/util/init/UIInitHelper.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/ContentUIInitializer.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/open/ContentOpen.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/ContentEditUIOpenExecutor.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableEditorLayerUI.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/ContentTableUIInitializer.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/NotStandaloneContentTableUIHandler.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/ContentTableUIEntryActionSupport.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/select/SelectFirst.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/select/SelectLast.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/select/SelectNext.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/select/SelectPrevious.java - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/observation/BranchlineUIHandler.java Changes: ===================================== client/core/src/main/java/fr/ird/observe/client/util/init/UIInitHelper.java ===================================== @@ -24,18 +24,21 @@ package fr.ird.observe.client.util.init; import org.jdesktop.swingx.painter.Painter; +import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; +import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.JTree; import javax.swing.KeyStroke; import javax.swing.UIDefaults; import java.awt.Color; import java.awt.event.KeyEvent; +import java.util.Arrays; /** * To manage init of our ui. @@ -62,7 +65,7 @@ public class UIInitHelper { "fr.ird.observe.client.ui.admin.actions.CopyToClipBoard" }; public static final Class<?>[] ACCEPTABLE_COMPONENTS_TYPE = { - JScrollBar.class, JTabbedPane.class + JScrollBar.class, JTabbedPane.class, JTable.class }; public static void init(JScrollPane selectedTreePane, JTree tree) { @@ -97,4 +100,14 @@ public class UIInitHelper { editor.setOpaque(false); } + public static void cleanInputMapAndSet(JComponent editor, KeyStroke[] keyStrokes, InputMap newInputMap, ActionMap newActionMap) { + cleanInputMap(editor, keyStrokes); + editor.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).setParent(newInputMap); + editor.getActionMap().setParent(newActionMap); + } + + public static void cleanInputMap(JComponent editor, KeyStroke[] keyStrokes) { + InputMap map = editor.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + Arrays.stream(keyStrokes).forEach(uiActionKeyStroke -> map.put(uiActionKeyStroke, "none")); + } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/ContentUIHandler.java ===================================== @@ -134,8 +134,6 @@ public abstract class ContentUIHandler<U extends ContentUI> implements ObserveSe log.info(String.format("%sInit ui", prefix)); DefaultUIInitializerResult initializerResult = contentOpen.init(initializer); - onInit(ui); - installFocusTraversalPolicy(); model.getStates().addPropertyChangeListener(ContentUIModelStates.PROPERTY_FORM_FOCUS_OWNER, evt -> onFormFocusOwnerChanged((JComponent) evt.getNewValue())); installPermanentFocusOwnerListener(); @@ -181,14 +179,11 @@ public abstract class ContentUIHandler<U extends ContentUI> implements ObserveSe action.doAction(); } + @SuppressWarnings("unchecked") public final void resetFromPreviousUi(ContentUI ui) { contentOpen.resetFromPreviousUi((U) ui); } - public final void restartEditUI() { - contentOpen.restartEditUI(); - } - public final void destroyUI() { if (ui == null) { return; ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/ContentUIInitializer.java ===================================== @@ -78,12 +78,12 @@ import javax.swing.JList; import javax.swing.JScrollBar; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; +import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.KeyStroke; import javax.swing.ListCellRenderer; import java.awt.Component; import java.awt.Dimension; -import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -125,11 +125,12 @@ public class ContentUIInitializer<UI extends ContentUI> extends UIInitializerSup NormalTextEditor.class, ContentUI.class, Table.class, + JTable.class, JTabbedPane.class }; protected final UI ui; protected final DecoratorService decoratorService; - private final Class<?>[] acceptedClassesInBlockingLayer = new Class[]{TripMapUI.class, ObserveMapPane.class, JScrollBar.class, JTabbedPane.class}; + protected final Class<?>[] acceptedClassesInBlockingLayer = new Class[]{TripMapUI.class, JTable.class, /*NotStandaloneContentUI.class,*/ ObserveMapPane.class, JScrollBar.class, JTabbedPane.class}; private final boolean isParentUI; public ContentUIInitializer(UI ui) { @@ -202,6 +203,7 @@ public class ContentUIInitializer<UI extends ContentUI> extends UIInitializerSup .onComponents(NormalTextEditor.class, this::init) .onSubComponents(ContentUI.class, this::init) .onComponents(Table.class, this::init) + .onComponents(JTable.class, true, this::init) .startSecondPass() .onSubComponents(JTabbedPane.class, this::init) .onSubComponents(BlockingLayerUI.class, this::init); @@ -278,10 +280,13 @@ public class ContentUIInitializer<UI extends ContentUI> extends UIInitializerSup private void init(JLabel editor) { initializerContext.checkFirstPass(); - String editorName = StringUtils.removeEnd(editor.getName(), "Label"); - Object objectById = ui.getObjectById(editorName); - if (objectById instanceof JComponent) { - editor.setLabelFor((Component) objectById); + String editorName = editor.getName(); + if (editorName.endsWith("Label")) { + editorName = StringUtils.removeEnd(editorName, "Label"); + Object objectById = ui.getObjectById(editorName); + if (objectById instanceof JComponent) { + editor.setLabelFor((Component) objectById); + } } } @@ -309,13 +314,13 @@ public class ContentUIInitializer<UI extends ContentUI> extends UIInitializerSup JTextComponents.addAutoSelect(editor.getTextField()); } + public JComponent getActionContainer() { + return ui; + } + @SuppressWarnings({"unchecked", "rawtypes"}) protected void init(JaxxComboBox editor) { initializerContext.checkFirstPass(); - InputMap inputMap = editor.getCombobox().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); - inputMap.setParent(ui.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)); - editor.getCombobox().getActionMap().setParent(ui.getActionMap()); - inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F4, 0), "none"); @SuppressWarnings({"RawTypeCanBeGeneric", "rawtypes"}) Class referenceType = editor.getBeanType(); editor.setI18nPrefix("observe.common."); editor.setAutoSelectContent(true); @@ -471,6 +476,11 @@ public class ContentUIInitializer<UI extends ContentUI> extends UIInitializerSup initializerContext.checkFirstPass(); } + private void init(JTable editor) { + initializerContext.checkFirstPass(); +// UIInitHelper.init(editor); + } + @SuppressWarnings({"unchecked", "rawtypes"}) private <R extends DataDtoReference> void prepareDataFilterableDoubleList(Class<R> dtoClass, FilterableDoubleList<R> editor) { DataReferenceDecorator<R> decorator = decoratorService.getDataReferenceDecorator(dtoClass); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/open/ContentOpen.java ===================================== @@ -40,13 +40,16 @@ import fr.ird.observe.client.datasource.validation.ClientValidationContext; import fr.ird.observe.client.util.UIHelper; import fr.ird.observe.client.util.init.DefaultUIInitializer; import fr.ird.observe.client.util.init.DefaultUIInitializerResult; +import fr.ird.observe.client.util.init.UIInitHelper; import fr.ird.observe.dto.IdDto; import fr.ird.observe.dto.form.Form; import fr.ird.observe.spi.module.ObserveBusinessProject; import io.ultreia.java4all.bean.JavaBean; +import io.ultreia.java4all.jaxx.widgets.combobox.JaxxComboBox; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.nuiton.jaxx.runtime.swing.JVetoableTabbedPane; +import org.nuiton.jaxx.runtime.swing.action.MenuAction; import org.nuiton.jaxx.validator.swing.SwingValidatorUtil; import org.nuiton.jaxx.validator.swing.tab.JTabbedPaneValidator; import org.nuiton.jaxx.widgets.datetime.DateTimeEditor; @@ -57,14 +60,21 @@ import org.nuiton.jaxx.widgets.gis.absolute.CoordinatesEditorModel; import org.nuiton.jaxx.widgets.hidor.HidorButton; import org.nuiton.jaxx.widgets.temperature.TemperatureEditor; +import javax.swing.Action; +import javax.swing.ActionMap; +import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTabbedPane; +import javax.swing.JTable; +import javax.swing.KeyStroke; import javax.swing.MenuElement; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import javax.swing.plaf.ActionMapUIResource; +import javax.swing.plaf.InputMapUIResource; import java.beans.PropertyChangeListener; import java.util.LinkedHashMap; import java.util.List; @@ -101,6 +111,9 @@ public class ContentOpen<U extends ContentUI> { private JTabbedPaneValidator tabbedPaneValidator; private JTabbedPaneValidator subTabbedPaneValidator; private ArrayListMultimap<String, JComponent> focusComponents; + private List<JTable> tables; + private ActionMap newActionMap; + private InputMap newInputMap; public ContentOpen(U ui, ContentOpenExecutor<U> contentOpenExecutor) { this(ui, contentOpenExecutor, null); @@ -126,6 +139,7 @@ public class ContentOpen<U extends ContentUI> { public DefaultUIInitializerResult init(ContentUIInitializer<U> initializer) { DefaultUIInitializerResult initializerResult = initializer.initUI(); + tables = initializerResult.getComponentsList(JTable.class); tabbedPaneValidator = initializerResult.getTabbedPaneValidator(); subTabbedPaneValidator = initializerResult.getSubTabbedPaneValidator(); coordinateEditors = initializerResult.getCoordinateEditors(); @@ -136,9 +150,18 @@ public class ContentOpen<U extends ContentUI> { dateTimeEditors.forEach(e -> e.getSliderHidor().addPropertyChangeListener(HidorButton.PROPERTY_TARGET_VISIBLE, onToggleDateTimeEditorSliderChangedListener)); timeEditors.forEach(e -> e.getSliderHidor().addPropertyChangeListener(HidorButton.PROPERTY_TARGET_VISIBLE, onToggleTimeEditorSliderChangedListener)); coordinateEditors.forEach(e -> e.getModel().addPropertyChangeListener(CoordinatesEditorModel.PROPERTY_FORMAT, onCoordinateFormatChangedListener)); - initActions(); + ui.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).setParent(null); + ui.getActionMap().setParent(null); + JComponent actionContainer = initializer.getActionContainer(); + initActions(actionContainer, initializerResult); ContentUIModel model = ui.getModel(); + + @SuppressWarnings("unchecked") ContentUIHandler<U> handler = (ContentUIHandler<U>) ui.getHandler(); model.init(ui, initializerResult); + handler.onInit(ui); + + postInstallActions(actionContainer, newInputMap, newActionMap, initializerResult); + model.getStates().addPropertyChangeListener(ContentUIModelStates.PROPERTY_MODE, evt -> { ContentMode newValue = (ContentMode) evt.getNewValue(); ui.getHandler().onModeChanged(newValue); @@ -179,8 +202,6 @@ public class ContentOpen<U extends ContentUI> { if (contentEditExecutor != null) { contentEditExecutor.doEditOnOpen(ui); } - //FIXME:Action We got ComboBox actions here... Side effecrt JaxxComboBox :( - ui.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).setParent(null); } public boolean doClose() { @@ -458,6 +479,8 @@ public class ContentOpen<U extends ContentUI> { ContentTableUIModel<?, ?> model = subUi.getModel(); if (!model.getStates().isStandalone()) { log.info(String.format("%sInit not standalone table ui: %s", ui.getModel().getPrefix(), subUi.getClass().getSimpleName())); + InputMap inputMap = ui.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + ActionMap actionMap = ui.getActionMap(); ui.getTitleRightToolBar().add(subUi.getSelectToolbar(), 0); subUi.getSelectToolbar().setVisible(false); MenuElement[] subElements = subUi.getInsertPopup().getSubElements(); @@ -518,10 +541,29 @@ public class ContentOpen<U extends ContentUI> { return ui; } - private void initActions() { + public void initActions(JComponent actionContainer, DefaultUIInitializerResult initializerResult) { ContentUIHandler<?> handler = ui.getHandler(); handler.initActions(); handler.installChangeModeAction(); + + InputMap inputMap = actionContainer.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + KeyStroke[] uiActionKeyStrokes = inputMap.allKeys(); + log.info(String.format("%sFound %d actions to share", ui.getModel().getPrefix(), uiActionKeyStrokes.length)); + ActionMap actionMap = actionContainer.getActionMap(); + newActionMap = new ActionMapUIResource(); + newInputMap = new InputMapUIResource(); + for (KeyStroke actionKeyStroke : uiActionKeyStrokes) { + Object actionMapKey = inputMap.get(actionKeyStroke); + newInputMap.put(actionKeyStroke, actionMapKey); + Action action = actionMap.get(actionMapKey); + if (action instanceof MenuAction) { + log.info(String.format("Skip menu action %s → %s", actionKeyStroke, actionMapKey)); + continue; + } + newActionMap.put(actionMapKey, action); + log.info(String.format("Register action %s → %s", actionKeyStroke, actionMapKey)); + } + ContentUIModel model = ui.getModel(); NodeCapability<?> capability = model.getSource().getCapability(); if (capability instanceof ContainerCapability) { @@ -540,6 +582,17 @@ public class ContentOpen<U extends ContentUI> { handler.updateToggleInsertVisibility(); } + protected void postInstallActions(JComponent actionContainer, InputMap newInputMap, ActionMap newActionMap, DefaultUIInitializerResult initializerResult) { + KeyStroke[] keyStrokes = newInputMap.allKeys(); + initializerResult.getComponents(JaxxComboBox.class).forEach(editor -> UIInitHelper.cleanInputMapAndSet(editor, keyStrokes, newInputMap, newActionMap)); + initializerResult.getComponents(JTable.class).forEach(editor -> UIInitHelper.cleanInputMap(editor, keyStrokes)); + for (Map.Entry<ContentTableUI<?, ?, ?>, JPanel> entry : subUiMap.entrySet()) { + ContentTableUI<?, ?, ?> subUi = entry.getKey(); + subUi.getHandler().getContentOpen().getTables().forEach(editor -> UIInitHelper.cleanInputMap(editor, keyStrokes)); + //FIXME:Actions We should define some scope only for subUi ? + } + } + private void onToggleDateTimeEditorSliderChanged(boolean newValue) { if (!toggleDateTimeEditorSliderIsChanging) { toggleDateTimeEditorSliderIsChanging = true; @@ -555,6 +608,10 @@ public class ContentOpen<U extends ContentUI> { } } + public List<JTable> getTables() { + return tables; + } + private void onToggleTimeEditorSliderChanged(boolean newValue) { if (!toggleTimeEditorSliderIsChanging) { toggleTimeEditorSliderIsChanging = true; ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/ContentEditUIOpenExecutor.java ===================================== @@ -51,18 +51,13 @@ public class ContentEditUIOpenExecutor<D extends DataDto, U extends ContentEditU // chaque arrive sur un écran invalide le cache de validation getClientValidationContext().reset(); - openModel(ui); - - handler.fixFormSize(); - handler.onEndOpenUI(); - } - - public void openModel(U ui) { ContentEditUIModel<D> model = ui.getModel(); Form<D> form = model.openForm(model.getStates().getSelectedId()); - ContentEditUIHandler<D, U> handler = ui.getHandler(); handler.getContentOpen().onOpenForm(form); handler.onOpenAfterOpenModel(); + + handler.fixFormSize(); + handler.onEndOpenUI(); } @Override ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableEditorLayerUI.java ===================================== @@ -69,7 +69,7 @@ public class ContentTableEditorLayerUI extends ObserveBlockingLayerUI implements try { log.trace("Set focus on table editor"); Component focusComponent = editor.getModel().getStates().getFormFocusOwner(); - log.debug(String.format("Set focus on table editor - initial form focus owner: %s", focusComponent)); + log.debug(String.format("Set focus on table editor - initial form focus owner: %s", focusComponent == null ? null : focusComponent.getName())); boolean readingMode = editor.getModel().getStates().isReadingMode(); if (focusComponent != null) { // if not reading, then we can try to have a more accurate focus owner @@ -88,17 +88,17 @@ public class ContentTableEditorLayerUI extends ObserveBlockingLayerUI implements // compute focus owner FocusTraversalPolicy focusTraversalPolicy = editor.getFocusTraversalPolicy(); focusComponent = Objects.requireNonNull(focusTraversalPolicy).getFirstComponent(editor); - log.debug(String.format("compute new form focus owner: %s", focusComponent)); + log.debug(String.format("compute new form focus owner: %s", focusComponent==null?null:focusComponent.getName())); } if (focusComponent == null) { focusComponent = editor.getMode(); - } else if (focusComponent.hasFocus()) { + } + if (Objects.requireNonNull(focusComponent).hasFocus()) { return; } - log.debug(String.format("Set focus on table editor: %s", focusComponent)); + log.debug(String.format("Set focus on table editor: %s", focusComponent.getName())); // this will change the focus editor.getModel().getStates().setFormFocusOwner(focusComponent); -// editor.getHandler().setFormFocusOwner(focusComponent); } finally { focusAdjusting = false; } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableUIHandler.java ===================================== @@ -40,6 +40,12 @@ 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.ResetEntry; import fr.ird.observe.client.datasource.editor.api.content.data.table.actions.entry.SaveAndNewEntry; import fr.ird.observe.client.datasource.editor.api.content.data.table.actions.entry.SaveTableEntry; +import fr.ird.observe.client.datasource.editor.api.content.data.table.actions.entry.select.SelectFirst; +import fr.ird.observe.client.datasource.editor.api.content.data.table.actions.entry.select.SelectLast; +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.content.data.table.sortable.SortableTableUI; import fr.ird.observe.client.datasource.editor.api.content.ui.ObserveLayoutFocusTraversalPolicy; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; import fr.ird.observe.dto.data.DataDto; @@ -138,6 +144,16 @@ public abstract class ContentTableUIHandler<D extends DataDto, C extends DataDto getComponent(JButton.class, "importData").ifPresent(e -> ImportDataFile.installAction(ui, e)); getComponent(JButton.class, "deleteData").ifPresent(e -> DeleteDataFile.installAction(ui, e)); getComponent(JButton.class, "exportData").ifPresent(e -> ExportDataFile.installAction(ui, e)); + + SelectFirst.init(ui, ui.getSelectFirstTableEntry(), SelectFirst.class); + SelectPrevious.init(ui, ui.getSelectPreviousTableEntry(), SelectPrevious.class); + SelectNext.init(ui, ui.getSelectNextTableEntry(), SelectNext.class); + SelectLast.init(ui, ui.getSelectLastTableEntry(), SelectLast.class); + + if (ui instanceof SortableTableUI) { + log.info(String.format("%sInstall sortable popup actions", ui.getModel().getPrefix())); + new AutoSelectWithMoveUpAndDownShowPopupAction(ui); + } } @Override ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableUIInitializer.java ===================================== @@ -23,12 +23,7 @@ package fr.ird.observe.client.datasource.editor.api.content.data.table; */ import fr.ird.observe.client.datasource.editor.api.content.ContentUIInitializer; -import fr.ird.observe.client.datasource.editor.api.content.data.table.actions.entry.select.SelectFirst; -import fr.ird.observe.client.datasource.editor.api.content.data.table.actions.entry.select.SelectLast; -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.content.data.table.sortable.SortableTableUI; +import fr.ird.observe.client.datasource.editor.api.content.NotStandaloneContentUI; import fr.ird.observe.client.util.UIHelper; import fr.ird.observe.client.util.init.DefaultUIInitializerResult; import fr.ird.observe.dto.data.DataDto; @@ -36,7 +31,6 @@ import io.ultreia.java4all.i18n.I18n; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.KeyStroke; @@ -100,32 +94,11 @@ public class ContentTableUIInitializer<D extends DataDto, C extends DataDto, U e ui.getSelectNextTableEntry().setEnabled(false); ui.getSelectLastTableEntry().setEnabled(false); InputMap inputMap = ui.getTable().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); - inputMap.put(KeyStroke.getKeyStroke("pressed UP"), "none"); inputMap.put(KeyStroke.getKeyStroke("pressed DOWN"), "none"); inputMap.put(KeyStroke.getKeyStroke("pressed LEFT"), "none"); inputMap.put(KeyStroke.getKeyStroke("pressed RIGHT"), "none"); - ActionMap actionMap = ui.getTable().getActionMap(); - -// inputMap = ui.getTable().getInputMap(JComponent.WHEN_FOCUSED); - SelectFirst selectFirst = SelectFirst.init(ui, ui.getSelectFirstTableEntry(), SelectFirst.class); - inputMap.put(selectFirst.getKeyStroke(), "selectFirstRow"); - actionMap.put("selectFirstRow", selectFirst); - SelectPrevious selectPrevious = SelectPrevious.init(ui, ui.getSelectPreviousTableEntry(), SelectPrevious.class); - inputMap.put(selectPrevious.getKeyStroke(), "selectPreviousRow"); - actionMap.put("selectPreviousRow", selectPrevious); - SelectNext selectNext = SelectNext.init(ui, ui.getSelectNextTableEntry(), SelectNext.class); - inputMap.put(selectNext.getKeyStroke(), "selectNextRow"); - actionMap.put("selectNextRow", selectNext); - SelectLast selectLast = SelectLast.init(ui, ui.getSelectLastTableEntry(), SelectLast.class); - inputMap.put(selectLast.getKeyStroke(), "selectLastRow"); - actionMap.put("selectLastRow", selectLast); - - if (ui instanceof SortableTableUI) { - log.info(String.format("%sInstall sortable popup actions", ui.getModel().getPrefix())); - new AutoSelectWithMoveUpAndDownShowPopupAction(ui); - } ui.getTitleRightToolBar().add(ui.getSelectToolbar(), 0); String message = I18n.t("observe.data.Data.list.message.none", ContentTableUII18nHelper.getType(getModel().getScope().getMainType())); @@ -146,7 +119,7 @@ public class ContentTableUIInitializer<D extends DataDto, C extends DataDto, U e log.debug("<<<<<<<<<< has clear selection..."); } else { // on met a jour le modele de selection - log.info(String.format(">>>>>>>>>> will set selection to %d", selectedRow)); + log.debug(String.format(">>>>>>>>>> will set selection to %d", selectedRow)); ui.getSelectionModel().setSelectionInterval(selectedRow, selectedRow); } FocusTraversalPolicy focusTraversalPolicy = ui.getFocusTraversalPolicy(); @@ -157,7 +130,6 @@ public class ContentTableUIInitializer<D extends DataDto, C extends DataDto, U e if (focusComponent != null) { log.info(String.format("New form focus owner: %s", focusComponent)); ui.getModel().getStates().setFormFocusOwner(focusComponent); -// ui.getHandler().setFormFocusOwner(focusComponent); } } @@ -173,4 +145,11 @@ public class ContentTableUIInitializer<D extends DataDto, C extends DataDto, U e ui.getEditorBlockLayerUI().setAcceptedComponentNames(doNotBlockComponentIds); } + @Override + public JComponent getActionContainer() { + if (!ui.getModel().getStates().isStandalone()) { + return (JComponent) ((NotStandaloneContentUI<?>) ui).getParentUI(); + } + return super.getActionContainer(); + } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/NotStandaloneContentTableUIHandler.java ===================================== @@ -37,6 +37,7 @@ public abstract class NotStandaloneContentTableUIHandler<D extends DataDto, C ex private EditableContentUI<D> parent; + @Override public EditableContentUI<D> getParentUI() { if (parent == null) { parent = NotStandaloneContentUIHandler.getParentUI(ui); @@ -50,23 +51,8 @@ public abstract class NotStandaloneContentTableUIHandler<D extends DataDto, C ex return new ContentOpen<>(ui, executor, executor); } -// @Override -// public void startEditUI() { -// ui.getValidatorTable().setParentValidator(ui.getValidator()); -// super.startEditUI(); -// } - -// @Override -// public void stopEditUI() { -// ui.getValidatorTable().setParentValidator(null); -// super.stopEditUI(); -// } - -// @Override -// public void onEndOpenUI() { -// super.onEndOpenUI(); -// if (!getModel().getStates().isUpdatingMode()) { -// reselectRow(); -// } -// } + @Override + public void installChangeModeAction() { + // not for this one + } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/ContentTableUIEntryActionSupport.java ===================================== @@ -23,16 +23,17 @@ package fr.ird.observe.client.datasource.editor.api.content.data.table.actions.e */ import fr.ird.observe.client.WithClientUIContext; +import fr.ird.observe.client.datasource.editor.api.content.NotStandaloneContentUI; import fr.ird.observe.client.datasource.editor.api.content.data.table.ContentTableUI; import fr.ird.observe.client.datasource.editor.api.content.data.table.ContentTableUITableModel; import fr.ird.observe.client.datasource.editor.api.content.data.table.actions.ContentTableUIActionSupport; -import fr.ird.observe.client.main.MainUIModel; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.nuiton.jaxx.runtime.JAXXObject; import org.nuiton.jaxx.runtime.swing.action.JAXXObjectActionSupport; import javax.swing.AbstractButton; +import javax.swing.JComponent; import javax.swing.KeyStroke; import java.awt.event.ActionEvent; import java.beans.PropertyChangeListener; @@ -49,7 +50,6 @@ public abstract class ContentTableUIEntryActionSupport extends ContentTableUIAct private boolean canExecuteFromRead; public static <U extends JAXXObject, A extends JAXXObjectActionSupport<U>> A init(U ui, AbstractButton editor, Class<A> actionType) { - A action = JAXXObjectActionSupport.init(ui, editor, actionType); editor.putClientProperty(ACTIVATE_FROM_POPUP, true); return action; @@ -61,11 +61,19 @@ public abstract class ContentTableUIEntryActionSupport extends ContentTableUIAct boolean b = computeEnabled(this.ui.getTableModel().getSelectedRow(), this.ui.getTableModel().getRowCount()); log.debug("Set enabled? " + b + " on " + getActionCommandKey()); setEnabled(b); -// editor.setEnabled(b); }; setEnabled(false); } + @Override + protected JComponent getContainer(ContentTableUI<?, ?, ?> ui) { + if (ui.getModel().getStates().isStandalone()) { + return super.getContainer(ui); + } + // if not standalone, attach to body since this is the only part which will be displayed and action aware + return (JComponent) ((NotStandaloneContentUI<?>) ui).getParentUI(); + } + public abstract boolean computeEnabled(int selectedRow, int rowCount); protected abstract void actionPerformed(ContentTableUITableModel<?, ?, ?> tableModel, int selectedRow); @@ -79,34 +87,15 @@ public abstract class ContentTableUIEntryActionSupport extends ContentTableUIAct } @Override - protected void doActionPerformed(ActionEvent e, ContentTableUI<?,?,?> contentTableUI) { + protected void doActionPerformed(ActionEvent e, ContentTableUI<?, ?, ?> contentTableUI) { if (!isEnabled()) { //FIXME should not have to check this here... log.info(String.format("Reject action: %s :: %s", getActionCommandKey(), this)); return; } log.info(String.format("Accept action: %s :: %s", getActionCommandKey(), this)); -// boolean focusOwner = ui.getTable().isFocusOwner(); -// log.debug("table has focus? " + focusOwner); -// MainUIModel mainUIModel = getClientUIContext().getMainUIModel(); -// boolean blockFocus = mainUIModel.isBlockFocus(); -// if (focusOwner) { -// mainUIModel.blockFocus(); -// } - try { - int selectedRow = ui.getTable().getSelectedRow(); - actionPerformed(ui.getTableModel(), selectedRow); - } finally { -// //FIXME:Focus -// if (focusOwner) { -// if (!blockFocus) { -// mainUIModel.unblockFocus(); -// } -// log.debug("Add focus back to table"); -// //ui.getTable().requestFocusInWindow(); -// ui.getHandler().setFormFocusOwner(ui.getTable()); -// } - } + int selectedRow = ui.getTable().getSelectedRow(); + actionPerformed(ui.getTableModel(), selectedRow); } @Override ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/select/SelectFirst.java ===================================== @@ -45,6 +45,9 @@ public final class SelectFirst extends ContentTableUIEntryActionSupport { @Override protected void actionPerformed(ContentTableUITableModel<?, ?, ?> tableModel, int selectedRow) { + if (selectedRow == -1) { + return; + } tableModel.selectFirst(); } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/select/SelectLast.java ===================================== @@ -45,6 +45,9 @@ public final class SelectLast extends ContentTableUIEntryActionSupport { @Override protected void actionPerformed(ContentTableUITableModel<?, ?, ?> tableModel, int selectedRow) { + if (selectedRow==-1) { + return; + } tableModel.selectLast(); } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/select/SelectNext.java ===================================== @@ -46,6 +46,9 @@ public final class SelectNext extends ContentTableUIEntryActionSupport { @Override protected void actionPerformed(ContentTableUITableModel<?, ?, ?> tableModel, int selectedRow) { + if (selectedRow==-1) { + return; + } tableModel.selectNext(selectedRow); } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/select/SelectPrevious.java ===================================== @@ -45,6 +45,9 @@ public final class SelectPrevious extends ContentTableUIEntryActionSupport { @Override protected void actionPerformed(ContentTableUITableModel<?, ?, ?> tableModel, int selectedRow) { + if (selectedRow==-1) { + return; + } tableModel.selectPrevious(selectedRow); } } ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/observation/BranchlineUIHandler.java ===================================== @@ -89,6 +89,11 @@ public class BranchlineUIHandler extends GeneratedBranchlineUIHandler { }; } + @Override + public void installChangeModeAction() { + // not for this one (not standalone) + } + @Override protected void installResetAction() { ResetAction<BranchlineUI> action = ResetAction.prepareAction(new DefaultResetAdapter<BranchlineUI>() { View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/0ee15c404dd2b873acc83a018... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/0ee15c404dd2b873acc83a018... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT