r2741 - in trunk: jaxx-compiler/src/main/java/jaxx/compiler/tags/validator jaxx-validator/src/main/java/jaxx/runtime/validator/swing jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui
Author: tchemit Date: 2013-10-24 17:54:44 +0200 (Thu, 24 Oct 2013) New Revision: 2741 Url: http://nuiton.org/projects/jaxx/repository/revisions/2741 Log: fixes #2878: Validate more than one bean property with one editor Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/ExcludeFieldValidatorHandler.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/FieldValidatorHandler.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableRenderer.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorUtil.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/AbstractBeanValidatorUI.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/IconValidationUI.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/ImageValidationUI.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/TranslucentValidationUI.java Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java 2013-10-17 15:49:11 UTC (rev 2740) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java 2013-10-24 15:54:44 UTC (rev 2741) @@ -25,9 +25,7 @@ package jaxx.compiler.tags.validator; -import com.google.common.base.Joiner; import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import jaxx.compiler.CompiledObject; import jaxx.compiler.CompilerException; @@ -35,16 +33,12 @@ import jaxx.compiler.beans.JAXXBeanInfo; import jaxx.compiler.beans.JAXXPropertyDescriptor; import jaxx.compiler.binding.DataBindingHelper; -import jaxx.compiler.java.JavaField; -import jaxx.compiler.java.JavaFile; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorHelper; import jaxx.compiler.tags.DefaultObjectHandler; import jaxx.compiler.types.TypeManager; -import jaxx.runtime.JAXXValidator; import jaxx.runtime.validator.swing.SwingValidator; import jaxx.runtime.validator.swing.SwingValidatorUtil; -import jaxx.runtime.validator.swing.meta.ValidatorField; import jaxx.runtime.validator.swing.ui.AbstractBeanValidatorUI; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/ExcludeFieldValidatorHandler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/ExcludeFieldValidatorHandler.java 2013-10-17 15:49:11 UTC (rev 2740) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/ExcludeFieldValidatorHandler.java 2013-10-24 15:54:44 UTC (rev 2741) @@ -41,8 +41,11 @@ public class ExcludeFieldValidatorHandler implements TagHandler { public static final String TAG = "excludeField"; + public static final String NAME_ATTRIBUTE = "name"; + public static final String COMPONENT_ATTRIBUTE = "component"; + /** Logger */ static private Log log = LogFactory.getLog(ExcludeFieldValidatorHandler.class); Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/FieldValidatorHandler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/FieldValidatorHandler.java 2013-10-17 15:49:11 UTC (rev 2740) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/FieldValidatorHandler.java 2013-10-24 15:54:44 UTC (rev 2741) @@ -86,8 +86,8 @@ return; } name = name.trim(); - - String component = tag.getAttribute(COMPONENT_ATTRIBUTE); + + String component = tag.getAttribute(COMPONENT_ATTRIBUTE); if (StringUtils.isEmpty(component)) { // try to use the name as component if (!compiler.checkReference(tag, name, false, name)) { Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java 2013-10-17 15:49:11 UTC (rev 2740) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java 2013-10-24 15:54:44 UTC (rev 2741) @@ -25,6 +25,8 @@ package jaxx.runtime.validator.swing; import com.google.common.base.Preconditions; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; import jaxx.runtime.validator.swing.ui.AbstractBeanValidatorUI; import jaxx.runtime.validator.swing.ui.IconValidationUI; import org.apache.commons.logging.Log; @@ -40,6 +42,7 @@ import java.awt.Container; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -358,22 +361,77 @@ // use the default one uiClass = DEFAULT_UI_CLASS; } + + // compute reverse map of fieldRepresentation : a same editor can + // reference more than one field + Multimap<JComponent, String> fieldsByEditor = + ArrayListMultimap.create(); for (Entry<String, JComponent> entry : fieldRepresentation.entrySet()) { + fieldsByEditor.put(entry.getValue(), entry.getKey()); + } + + for (JComponent editor : fieldsByEditor.keySet()) { + Collection<String> fields = fieldsByEditor.get(editor); try { setMessageRepresentation( - entry.getKey(), - null, - entry.getValue(), + editor, + fields, uiClass ); } catch (Exception e) { throw new RuntimeException(e); } } + +// for (Entry<String, JComponent> entry : +// fieldRepresentation.entrySet()) { +// try { +// setMessageRepresentation( +// entry.getKey(), +// null, +// entry.getValue(), +// uiClass +// ); +// } catch (Exception e) { +// throw new RuntimeException(e); +// } +// } } protected void setMessageRepresentation( + JComponent c, + Collection<String> fieldnames, + Class<? extends AbstractBeanValidatorUI> uiClass) + throws InvocationTargetException, + IllegalAccessException, + InstantiationException, + NoSuchMethodException { + + Preconditions.checkNotNull(c, "No editor"); + + // ajout du jxlayer sous ce composant + Container container = c.getParent(); + if (container instanceof JXLayer<?>) { + JXLayer jx = (JXLayer<?>) container; + Object oldUI = jx.getUI(); + if (oldUI != null && oldUI instanceof AbstractBeanValidatorUI) { + + // supression de l'ancien layer + removeSimpleBeanValidatorListener((AbstractBeanValidatorUI) oldUI); + } + Constructor<? extends AbstractBeanValidatorUI> cons = + uiClass.getConstructor(Collection.class); + AbstractBeanValidatorUI ui = cons.newInstance(fieldnames); + +// ui.setEnabled(true); + addSimpleBeanValidatorListener(ui); + jx.setUI(ui); + } + } + + @Deprecated + protected void setMessageRepresentation( String fieldname, JComponent old, JComponent c, Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableRenderer.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableRenderer.java 2013-10-17 15:49:11 UTC (rev 2740) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableRenderer.java 2013-10-24 15:54:44 UTC (rev 2741) @@ -67,10 +67,10 @@ String text = null; String toolTipText = null; - column = table.convertColumnIndexToModel(column); - if (table.getRowSorter() != null) { - row = table.getRowSorter().convertRowIndexToModel(row); - } +// column = table.convertColumnIndexToModel(column); +// if (table.getRowSorter() != null) { +// row = table.getRowSorter().convertRowIndexToModel(row); +// } switch (column) { case 0: Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorUtil.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorUtil.java 2013-10-17 15:49:11 UTC (rev 2740) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorUtil.java 2013-10-24 15:54:44 UTC (rev 2741) @@ -24,6 +24,8 @@ */ package jaxx.runtime.validator.swing; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; import jaxx.runtime.JAXXObject; import jaxx.runtime.JAXXValidator; import jaxx.runtime.SwingUtil; @@ -55,7 +57,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.EnumMap; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -229,7 +230,7 @@ */ public static void detectValidatorFields(JAXXValidator ui) { - Map<JComponent, ValidatorField> editors = getValidatorEditors(ui); + Multimap<JComponent, ValidatorField> editors = getValidatorEditors(ui); try { @@ -237,7 +238,7 @@ SwingValidator<?> validator = ui.getValidator(validatorId); for (Map.Entry<JComponent, ValidatorField> entry : - editors.entrySet()) { + editors.entries()) { ValidatorField fieldAnnotation = entry.getValue(); JComponent editor = entry.getKey(); if (!validatorId.equals(fieldAnnotation.validatorId())) { @@ -446,7 +447,7 @@ /** * @param list the validator list ui * @return the validator list mouse listener, or <code>null</code> if not - * found + * found * @see SwingValidatorMessageListMouseListener */ public static SwingValidatorMessageListMouseListener getErrorListMouseListener(JList list) { @@ -463,7 +464,7 @@ /** * @param table the validator table ui * @return the validator table mouse listener, or <code>null</code> if not - * found + * found * @see SwingValidatorMessageTableMouseListener */ public static SwingValidatorMessageTableMouseListener getErrorTableMouseListener(JTable table) { @@ -480,7 +481,7 @@ /** * @param table the validator table ui * @return the validator table mouse listener, or <code>null</code> if not - * found + * found * @see SwingValidatorMessageTableMouseListener */ public static SwingValidatorMessageTableMouseListener getListErrorTableMouseListener(JTable table) { @@ -667,12 +668,10 @@ } } - protected static Map<JComponent, ValidatorField> getValidatorEditors(JAXXValidator ui) { + protected static Multimap<JComponent, ValidatorField> getValidatorEditors(JAXXValidator ui) { + Multimap<JComponent, ValidatorField> editors = ArrayListMultimap.create(); - Map<JComponent, ValidatorField> editors = new HashMap<JComponent, ValidatorField>(); - - Map<Field, ValidatorField> validatorFields = null; Map<Method, ValidatorField> validatorMethods = null; try { Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/AbstractBeanValidatorUI.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/AbstractBeanValidatorUI.java 2013-10-17 15:49:11 UTC (rev 2740) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/AbstractBeanValidatorUI.java 2013-10-24 15:54:44 UTC (rev 2741) @@ -24,14 +24,19 @@ */ package jaxx.runtime.validator.swing.ui; +import com.google.common.collect.Ordering; +import com.google.common.collect.Sets; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.jxlayer.plaf.AbstractLayerUI; import org.nuiton.validator.NuitonValidatorScope; +import org.nuiton.validator.bean.simple.SimpleBeanValidator; import org.nuiton.validator.bean.simple.SimpleBeanValidatorEvent; import org.nuiton.validator.bean.simple.SimpleBeanValidatorListener; import javax.swing.JComponent; +import java.util.Collection; +import java.util.Set; /** * Abstract renderer @@ -54,12 +59,16 @@ protected NuitonValidatorScope scope; /** Field name in validator. */ - protected final String field; + protected final Set<String> fields; - public AbstractBeanValidatorUI(String field) { - this.field = field; + protected AbstractBeanValidatorUI(String field) { + this(Sets.newHashSet(field)); + } + + protected AbstractBeanValidatorUI(Collection<String> fields) { + this.fields = Sets.newHashSet(fields); if (log.isDebugEnabled()) { - log.debug("install " + this + "<field:" + field + ">"); + log.debug("install " + this + "<fields:" + this.fields + ">"); } } @@ -69,15 +78,29 @@ @Override public void onFieldChanged(SimpleBeanValidatorEvent event) { - if (field.equals(event.getField())) { + if (fields.contains(event.getField())) { - scope = event.getSource().getHighestScope(field); + scope = getHighestScope(event); if (log.isDebugEnabled()) { - log.debug("set new scope : " + scope + " to field " + field); + log.debug("set new scope : " + scope + " to field " + fields); } // ask to repaint the layer setDirty(true); } } + protected NuitonValidatorScope getHighestScope(SimpleBeanValidatorEvent event) { + SimpleBeanValidator<?> source = event.getSource(); + Set<NuitonValidatorScope> scopes = Sets.newHashSet(); + for (String field : fields) { + NuitonValidatorScope scope = source.getHighestScope(field); + if (scope != null) { + scopes.add(scope); + } + } + NuitonValidatorScope result = scopes.isEmpty() ? null : Ordering.natural().max(scopes); + return result; + } + + } Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/IconValidationUI.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/IconValidationUI.java 2013-10-17 15:49:11 UTC (rev 2740) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/IconValidationUI.java 2013-10-24 15:54:44 UTC (rev 2741) @@ -24,6 +24,7 @@ */ package jaxx.runtime.validator.swing.ui; +import com.google.common.collect.Sets; import jaxx.runtime.validator.swing.SwingValidatorUtil; import org.jdesktop.jxlayer.JXLayer; import org.nuiton.validator.NuitonValidatorScope; @@ -34,7 +35,9 @@ import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; +import java.util.Collection; import java.util.EnumMap; +import java.util.Set; /** @@ -52,7 +55,11 @@ protected EnumMap<NuitonValidatorScope, BufferedImage> icons; public IconValidationUI(String field) { - super(field); + this(Sets.newHashSet(field)); + } + + public IconValidationUI(Collection<String> fields) { + super(fields); icons = new EnumMap<NuitonValidatorScope, BufferedImage>(NuitonValidatorScope.class); for (NuitonValidatorScope scope : NuitonValidatorScope.values()) { Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/ImageValidationUI.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/ImageValidationUI.java 2013-10-17 15:49:11 UTC (rev 2740) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/ImageValidationUI.java 2013-10-24 15:54:44 UTC (rev 2741) @@ -24,6 +24,7 @@ */ package jaxx.runtime.validator.swing.ui; +import com.google.common.collect.Sets; import jaxx.runtime.validator.swing.SwingValidatorUtil; import org.jdesktop.jxlayer.JXLayer; import org.nuiton.validator.NuitonValidatorScope; @@ -34,7 +35,9 @@ import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; +import java.util.Collection; import java.util.EnumMap; +import java.util.Set; /** @@ -49,8 +52,12 @@ protected EnumMap<NuitonValidatorScope, BufferedImage> icons; - public ImageValidationUI(String field) { - super(field); + public ImageValidationUI(String fields) { + this(Sets.newHashSet(fields)); + } + + public ImageValidationUI(Collection<String> fields) { + super(fields); icons = new EnumMap<NuitonValidatorScope, BufferedImage>(NuitonValidatorScope.class); for (NuitonValidatorScope scope : NuitonValidatorScope.values()) { Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/TranslucentValidationUI.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/TranslucentValidationUI.java 2013-10-17 15:49:11 UTC (rev 2740) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/TranslucentValidationUI.java 2013-10-24 15:54:44 UTC (rev 2741) @@ -34,6 +34,8 @@ import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Rectangle; +import java.util.Collection; +import java.util.Set; /** * An implementation of {@link AbstractBeanValidatorUI} which paints a @@ -50,6 +52,10 @@ super(field); } + public TranslucentValidationUI(Collection<String> fields) { + super(fields); + } + @Override protected void paintLayer(Graphics2D g2, JXLayer<? extends JComponent> l) { // paints the layer as is
participants (1)
-
tchemit@users.nuiton.org