r2444 - in trunk/jaxx-validator/src/main: java/jaxx/runtime java/jaxx/runtime/validator/swing java/jaxx/runtime/validator/swing/ui resources/i18n
Author: tchemit Date: 2012-07-27 16:34:35 +0200 (Fri, 27 Jul 2012) New Revision: 2444 Url: http://nuiton.org/repositories/revision/jaxx/2444 Log: refs #2210: Use new validation api from nuiton-utils Added: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorDataLocator.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessage.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableModel.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableMouseListener.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableRenderer.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorTableEditorModelListener.java Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/JAXXValidator.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessage.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListModel.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableModel.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/resources/i18n/jaxx-validator_en_GB.properties trunk/jaxx-validator/src/main/resources/i18n/jaxx-validator_es_ES.properties trunk/jaxx-validator/src/main/resources/i18n/jaxx-validator_fr_FR.properties Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/JAXXValidator.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/JAXXValidator.java 2012-07-27 14:33:56 UTC (rev 2443) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/JAXXValidator.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -25,7 +25,6 @@ package jaxx.runtime; -import org.nuiton.validator.bean.BeanValidator; import jaxx.runtime.validator.swing.SwingValidator; import javax.swing.JComponent; @@ -44,7 +43,7 @@ * @param validatorId validator id * @return the associated validator, or <code>null</code> if not find */ - BeanValidator<?> getValidator(String validatorId); + SwingValidator<?> getValidator(String validatorId); /** @return the list of ids of all registred validator */ List<String> getValidatorIds(); Added: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorDataLocator.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorDataLocator.java (rev 0) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorDataLocator.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -0,0 +1,43 @@ +package jaxx.runtime.validator.swing; + +import org.apache.commons.lang3.tuple.Pair; + +import javax.swing.table.TableModel; + +/** + * Object that can locate for a given {@link SwingListValidatorMessage}, + * the cell of this data in a table editor. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.5.3 + */ +public interface SwingListValidatorDataLocator<O> { + + /** + * Locate the cell of the given data. + * + * @param tableModel the table model where data are edited + * @param bean the bean to locate + * @param fieldName the field to locate + * @return the cell where to find data + */ + Pair<Integer, Integer> locateDataCell(TableModel tableModel, O bean, String fieldName); + + /** + * Locate the index of the row of the given bean. + * + * @param tableModel the table model where data are edited + * @param bean the bean to find + * @return the row index of the given bean in the table. + */ + int locateBeanRowIndex(TableModel tableModel, O bean); + + /** + * Locate the bean given his row index in the table. + * + * @param tableModel the table model where data are edited + * @param rowIndex the row index of the bean to find in the editor + * @return the bean corresponding to the given row index in the editor + */ + O locateBean(TableModel tableModel, int rowIndex); +} Added: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessage.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessage.java (rev 0) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessage.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -0,0 +1,46 @@ +package jaxx.runtime.validator.swing; + +import org.nuiton.validator.NuitonValidatorScope; +import org.nuiton.validator.bean.list.BeanListValidator; +import org.nuiton.validator.bean.list.BeanListValidatorMessage; + +import javax.swing.JComponent; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since 2.5.3 + */ +public class SwingListValidatorMessage extends BeanListValidatorMessage<SwingListValidatorMessage> { + + private static final long serialVersionUID = 1L; + + /** the optional field's editor */ + protected JComponent editor; + + public SwingListValidatorMessage(BeanListValidator<?> validator, + Object bean, + String fieldName, + String message, + NuitonValidatorScope scope, + JComponent editor) { + super(validator, bean, fieldName, message, scope); + this.editor = editor; + } + + public JComponent getEditor() { + return editor; + } + + @Override + public String toString() { + String s = scope + " - " + + (field == null ? message : field + "[" + getBean() + + "] - " + message); + if (editor != null) { + s = editor.getName() + " : " + s; + } + return s; + } +} \ No newline at end of file Added: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableModel.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableModel.java (rev 0) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableModel.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -0,0 +1,254 @@ +package jaxx.runtime.validator.swing; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import jaxx.runtime.SwingUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.validator.NuitonValidatorScope; +import org.nuiton.validator.bean.list.BeanListValidator; +import org.nuiton.validator.bean.list.BeanListValidatorEvent; +import org.nuiton.validator.bean.list.BeanListValidatorListener; + +import javax.swing.JComponent; +import javax.swing.table.AbstractTableModel; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * The model of the table of errors. + * <p/> + * The model listens list-validators messages and update his internal model + * from it. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.5.3 + */ +public class SwingListValidatorMessageTableModel extends AbstractTableModel + implements BeanListValidatorListener { + + private static final long serialVersionUID = 1L; + + /** Logger */ + private static Log log = + LogFactory.getLog(SwingListValidatorMessageTableModel.class); + + public static final String[] columnNames = + {"validator.scope", "validator.bean", + "validator.field", "validator.message"}; + + public static final Class<?>[] columnClasses = + {NuitonValidatorScope.class, Integer.class, String.class, String.class}; + + /** list of registred validators */ + protected transient List<BeanListValidator<?>> validators; + + /** list of messages actual displayed */ + protected List<SwingListValidatorMessage> data; + + public SwingListValidatorMessageTableModel() { + data = Lists.newArrayList(); + validators = Lists.newArrayList(); + } + + /** + * Register a validator for this model. + * <p/> + * <p/> + * Note: a validator can not be register twice in the same model. + * + * @param validator the validator to register + */ + public void registerValidator(BeanListValidator<?> validator) { + Preconditions.checkState( + !validators.contains(validator), + "Validator " + validator + " is already registred in " + + this); + validators.add(validator); + validator.addBeanListValidatorListener(this); + } + + public void clear() { + int i = data.size() + data.size(); + if (i > 0) { + data.clear(); + fireTableRowsDeleted(0, i - 1); + } + } + + public void clearValidators() { + for (BeanListValidator<?> v : validators) { + v.removeBeanListValidatorListener(this); + } + validators.clear(); + } + + /** + * Obtain the message for a given row. + * + * @param rowIndex the row index + * @return the message for the given row index + */ + public SwingListValidatorMessage getRow(int rowIndex) { + SwingUtil.ensureRowIndex(this, rowIndex); + return data.get(rowIndex); + } + + @Override + public boolean isCellEditable(int row, int column) { + // cells are never editable in this model + return false; + } + + @Override + public Class<?> getColumnClass(int columnIndex) { + SwingUtil.ensureColumnIndex(this, columnIndex); + return columnClasses[columnIndex]; + } + + @Override + public String getColumnName(int column) { + SwingUtil.ensureColumnIndex(this, column); + return columnNames[column]; + } + + @Override + public void onFieldChanged(BeanListValidatorEvent event) { + String[] toDelete = event.getMessagesToDelete(); + String[] toAdd = event.getMessagesToAdd(); + String field = event.getField(); + Object bean = event.getBean(); + NuitonValidatorScope scope = event.getScope(); + boolean mustAdd = toAdd != null && toAdd.length > 0; + boolean mustDel = toDelete != null && toDelete.length > 0; + + if (log.isTraceEnabled()) { + log.trace("----------------------------------------------------------"); + log.trace(field + " - (" + getRowCount() + ") toAdd " + mustAdd); + log.trace(field + " - (" + getRowCount() + ") toDelete " + mustDel); + } + + BeanListValidator<?> validator = event.getSource(); + + if (mustDel) { + + // removes datas and notify if no messages to add + removeMessages(validator, bean, field, scope, !mustAdd, toDelete); + } + + if (mustAdd) { + + // add new messages, sort datas and notify + addMessages(validator, bean, field, scope, true, toAdd); + } + } + + @Override + public int getRowCount() { + return data.size(); + } + + @Override + public int getColumnCount() { + return columnNames.length; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + SwingUtil.ensureColumnIndex(this, columnIndex); + SwingUtil.ensureRowIndex(this, rowIndex); + + SwingListValidatorMessage row = data.get(rowIndex); + if (columnIndex == 0) { + // the icon + return row.getScope(); + } + if (columnIndex == 1) { + // the bean + return row.getBean(); + } + if (columnIndex == 2) { + // the field + return row.getField(); + } + if (columnIndex == 3) { + // the message + return row.getMessage(); + } + + // should never come here + return null; + } + + protected void addMessages(BeanListValidator<?> validator, + Object bean, + String fieldName, + NuitonValidatorScope scope, + boolean sort, + String... messages) { + +// JComponent editor = validator == null ? +// null : +// validator.getFieldRepresentation(fieldName); + + JComponent editor = null; + + // add new errors + for (String error : messages) { + SwingListValidatorMessage row = + new SwingListValidatorMessage( + validator, + bean, + fieldName, + error, + scope, + editor + ); + data.add(row); + if (!sort) { + fireTableRowsInserted(data.size() - 1, data.size() - 1); + } + } + + if (sort) { + + // resort datas + Collections.sort(data); + + // notify + fireTableDataChanged(); + } + } + + protected void removeMessages(BeanListValidator<?> validator, + Object bean, + String fieldName, + NuitonValidatorScope scope, + boolean notify, + String... messages) { + + List<String> messagesToDel = + new ArrayList<String>(Arrays.asList(messages)); + + // do it in reverse mode (only one pass in that way since index + // will stay coherent while removing them) + + for (int i = getRowCount() - 1; i > -1; i--) { + SwingListValidatorMessage error = data.get(i); + if (validator.equals(error.getValidator()) && + error.getScope() == scope && + error.getBean() == bean && + error.getField().equals(fieldName) && + messagesToDel.contains(error.getMessage())) { + // remove the message + data.remove(i); + if (notify) { + fireTableRowsDeleted(i, i); + } + } + } + } + +} Added: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableMouseListener.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableMouseListener.java (rev 0) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableMouseListener.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -0,0 +1,124 @@ +package jaxx.runtime.validator.swing; + +import jaxx.runtime.SwingUtil; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.JTable; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; + +/** + * A mouse listener to edit a cell when double clicking on a validation + * message coming from a {@link SwingValidatorMessageTableModel}. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.5.3 + */ +public class SwingListValidatorMessageTableMouseListener extends MouseAdapter { + + /** Logger */ + private static Log log = + LogFactory.getLog(SwingListValidatorMessageTableMouseListener.class); + + public static final String HIGHLIGHT_ERROR_PROPERTY = "highlightError"; + + /** + * Delegate property change support. + * + * @since 2.5.3 + */ + protected PropertyChangeSupport pcs; + + /** + * The editor of listened bean. + * + * @since 2.5.3 + */ + protected final JTable editor; + + /** + * The cell data locator. + * + * @since 2.5.3 + */ + protected final SwingListValidatorDataLocator dataLocator; + + public SwingListValidatorMessageTableMouseListener( + JTable editor, + SwingListValidatorDataLocator dataLocator) { + this.editor = editor; + this.dataLocator = dataLocator; + pcs = new PropertyChangeSupport(this); + } + + @Override + public void mouseClicked(MouseEvent e) { + super.mouseClicked(e); + if (e.getClickCount() == 2) { + + SwingListValidatorMessage entry = getSelectedMessage(e); + if (entry == null) { + // no entry found + return; + } + + Pair<Integer, Integer> cell = dataLocator.locateDataCell( + editor.getModel(), + entry.getBean(), + entry.getField()); + + SwingUtil.editCell(editor, cell.getLeft(), cell.getRight()); + } + } + + protected SwingListValidatorMessage getSelectedMessage(MouseEvent e) { + JTable table = (JTable) e.getSource(); + if (!(table.getModel() instanceof SwingListValidatorMessageTableModel)) { + if (log.isWarnEnabled()) { + log.warn("model must be a " + + SwingValidatorMessageTableModel.class + + ", but was " + table.getModel()); + } + return null; + } + + SwingListValidatorMessageTableModel model = + (SwingListValidatorMessageTableModel) table.getModel(); + int index = table.getSelectionModel().getMinSelectionIndex(); + if (index == -1) { + // nothing is selected + return null; + } + if (table.getRowSorter() != null) { + index = table.getRowSorter().convertRowIndexToModel(index); + } + SwingListValidatorMessage entry = model.getRow(index); + if (log.isDebugEnabled()) { + log.debug("selected index: " + index + " : error: " + entry); + } + return entry; + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + pcs.addPropertyChangeListener(listener); + } + + public void addPropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + pcs.addPropertyChangeListener(propertyName, listener); + } + + public void removePropertyChangeListener(PropertyChangeListener listener) { + pcs.removePropertyChangeListener(listener); + } + + public void removePropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + pcs.removePropertyChangeListener(propertyName, listener); + } + +} \ No newline at end of file Added: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableRenderer.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableRenderer.java (rev 0) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorMessageTableRenderer.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -0,0 +1,115 @@ +package jaxx.runtime.validator.swing; + +import org.nuiton.validator.NuitonValidatorScope; + +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.table.DefaultTableCellRenderer; +import java.awt.Component; + +import static org.nuiton.i18n.I18n._; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since 2.5.3 + */ +public class SwingListValidatorMessageTableRenderer extends DefaultTableCellRenderer { + + private static final long serialVersionUID = 1L; + + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, + boolean isSelected, + boolean hasFocus, + int row, + int column) { + JLabel rendererComponent = (JLabel) + super.getTableCellRendererComponent( + table, + value, + isSelected, + hasFocus, + row, + column + ); + + ImageIcon icon = null; + String text = null; + String toolTipText = null; + + column = table.convertColumnIndexToModel(column); + if (table.getRowSorter() != null) { + row = table.getRowSorter().convertRowIndexToModel(row); + } + + switch (column) { + case 0: + // scope + NuitonValidatorScope scope = (NuitonValidatorScope) value; + icon = SwingValidatorUtil.getIcon(scope); + String label = _(scope.getLabel()); + toolTipText = _("validator.scope.tip", label); + break; + + case 1: + // row bean + text = getBeanValue(table, row); + toolTipText = _("validator.bean.tip", text); + break; + + case 2: + // field name + text = getFieldName(table, (String) value, row); + toolTipText = _("validator.field.tip", text); + break; + + case 3: + // message + text = getMessage(table, (String) value, row); + toolTipText = _("validator.message.tip", text); + break; + } + + rendererComponent.setText(text); + rendererComponent.setToolTipText(toolTipText); + rendererComponent.setIcon(icon); + return rendererComponent; + } + + public ImageIcon getIcon(NuitonValidatorScope scope) { + ImageIcon icon = SwingValidatorUtil.getIcon(scope); + return icon; + } + + public String getMessage(JTable table, String value, int row) { + SwingListValidatorMessageTableModel tableModel = + (SwingListValidatorMessageTableModel) table.getModel(); + SwingListValidatorMessage model = tableModel.getRow(row); + String text = SwingValidatorUtil.getMessage(model); + return text; + } + + public String getFieldName(JTable table, String value, int row) { + SwingListValidatorMessageTableModel tableModel = + (SwingListValidatorMessageTableModel) table.getModel(); + SwingListValidatorMessage model = tableModel.getRow(row); + String fieldName = SwingValidatorUtil.getFieldName(model, value); + return fieldName; + } + + public String getBeanValue(JTable table, int row) { + SwingListValidatorMessageTableModel tableModel = + (SwingListValidatorMessageTableModel) table.getModel(); + SwingListValidatorMessage model = tableModel.getRow(row); + String text = decorateBean(model.getBean()); + return text; + } + + protected String decorateBean(Object bean) { + return bean.toString(); + } +} Added: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorTableEditorModelListener.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorTableEditorModelListener.java (rev 0) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorTableEditorModelListener.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -0,0 +1,78 @@ +package jaxx.runtime.validator.swing; + +import com.google.common.collect.Sets; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.validator.bean.list.BeanListValidator; + +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; +import javax.swing.table.TableModel; +import java.util.Set; + +/** + * Listens a table model which is the editor of a list of bean, add and remove + * beans to the target validator. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.5.3 + */ +public class SwingListValidatorTableEditorModelListener<O> implements TableModelListener { + + /** Logger. */ + private static final Log log = + LogFactory.getLog(SwingListValidatorTableEditorModelListener.class); + + private final SwingListValidatorDataLocator<O> dataLocator; + + private BeanListValidator<O> validator; + + public SwingListValidatorTableEditorModelListener(BeanListValidator<O> validator, + SwingListValidatorDataLocator<O> dataLocator) { + this.dataLocator = dataLocator; + this.validator = validator; + } + + @Override + public void tableChanged(TableModelEvent e) { + + if (e.getType() == TableModelEvent.INSERT) { + + // bean added + + int firstRow = e.getFirstRow(); + int lastRow = e.getLastRow(); + + for (int i = firstRow; i <= lastRow; i++) { + + TableModel model = (TableModel) e.getSource(); + O bean = dataLocator.locateBean(model, i); + if (log.isInfoEnabled()) { + log.info("Add a bean to validator " + bean); + } + validator.addBean(bean); + } + } + if (e.getType() == TableModelEvent.DELETE) { + + // bean removed + + // bean are no more existing in editor, must then find out + // which beans must be deleted from all the beans in the validator + + TableModel model = (TableModel) e.getSource(); + Set<O> beans = Sets.newHashSet(validator.getBeans()); + for (int i = 0; i <= model.getRowCount(); i++) { + O bean = dataLocator.locateBean(model, i); + beans.remove(bean); + } + + for (O bean : beans) { + if (log.isInfoEnabled()) { + log.info("Remove a bean to validator " + bean); + } + validator.removeBean(bean); + } + } + } +} 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 2012-07-27 14:33:56 UTC (rev 2443) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidator.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -24,15 +24,18 @@ */ package jaxx.runtime.validator.swing; +import com.google.common.base.Preconditions; import jaxx.runtime.validator.swing.ui.AbstractBeanValidatorUI; import jaxx.runtime.validator.swing.ui.IconValidationUI; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.jxlayer.JXLayer; +import org.nuiton.validator.NuitonValidator; import org.nuiton.validator.NuitonValidatorFactory; import org.nuiton.validator.NuitonValidatorProvider; import org.nuiton.validator.NuitonValidatorScope; import org.nuiton.validator.bean.BeanValidator; +import org.nuiton.validator.bean.simple.SimpleBeanValidator; import javax.swing.JComponent; import java.awt.Container; @@ -117,19 +120,88 @@ * </pre> * * @param <B> le type de bean a valider - * @author poussin <poussin@codelutin.com> * @author tchemit <chemit@codelutin.com> * @version 1.0 */ -public class SwingValidator<B> extends BeanValidator<B> { +public class SwingValidator<B> extends SimpleBeanValidator<B> { /** Logger */ - static private final Log log = LogFactory.getLog(SwingValidator.class); + private static final Log log = LogFactory.getLog(SwingValidator.class); - static private final Class<? extends AbstractBeanValidatorUI> + private static final Class<? extends AbstractBeanValidatorUI> DEFAULT_UI_CLASS = IconValidationUI.class; /** + * Obtain a new {@link SimpleBeanValidator} for the given parameters. + * <p/> + * <b>Note:</b> It will use the default provider of {@link NuitonValidator} + * + * @param type type of bean to validate + * @param context context of validation + * @param scopes authorized scopes (if {@code null}, will use all scopes) + * @param <O> type of bean to validate + * @return the new instanciated {@link SimpleBeanValidator}. + * @throws NullPointerException if type is {@code null} + * @see NuitonValidatorFactory#getDefaultProviderName() + */ + public static <O> SwingValidator<O> newValidator( + Class<O> type, + String context, + NuitonValidatorScope... scopes) throws NullPointerException { + + + // get the provider default name + String providerName = NuitonValidatorFactory.getDefaultProviderName(); + + // get the bean validator with this provider + SwingValidator<O> beanValidator = newValidator(providerName, + type, + context, + scopes + ); + return beanValidator; + } + + /** + * Obtain a new {@link SimpleBeanValidator} for the given parameters. + * <p/> + * <b>Note:</b> It will use the provider of {@link NuitonValidator} + * defined by the {@code providerName}. + * + * @param providerName name of {@link NuitonValidator} to use + * @param type type of bean to validate + * @param context context of validation + * @param scopes authorized scopes (if {@code null}, will use all scopes) + * @param <O> type of bean to validate + * @return the new instanciated {@link SimpleBeanValidator}. + * @throws NullPointerException if type is {@code null} + * @see NuitonValidatorFactory#getProvider(String) + */ + public static <O> SwingValidator<O> newValidator( + String providerName, + Class<O> type, + String context, + NuitonValidatorScope... scopes) throws NullPointerException { + + Preconditions.checkNotNull(type, + "type parameter can not be null."); + + // get delegate validator provider + NuitonValidatorProvider provider = + NuitonValidatorFactory.getProvider(providerName); + + Preconditions.checkState( + provider != null, + "Could not find provider with name " + providerName); + + // create the new instance of bean validator + SwingValidator<O> validator = new SwingValidator<O>( + provider, type, context, scopes); + + return validator; + } + + /** * permet de faire le lien en un champs du bean et l'objet qui permet de * l'editer */ @@ -249,14 +321,14 @@ log.warn("the field '" + fieldname + "' is not defined in validator (no rules on it)"); } - return; + } else { + if (log.isInfoEnabled()) { + log.info("register field [" + fieldname + "] with component : " + + c.getName() + ); + } + fieldRepresentation.put(fieldname, c); } - if (log.isInfoEnabled()) { - log.info("register field [" + fieldname + "] with component : " + - c.getName() - ); - } - fieldRepresentation.put(fieldname, c); } public void setFieldRepresentation( @@ -330,7 +402,7 @@ JXLayer<?> jx = (JXLayer<?>) container; Object ui = jx.getUI(); if (ui != null && ui instanceof AbstractBeanValidatorUI) { - removeBeanValidatorListener((AbstractBeanValidatorUI) ui); + removeSimpleBeanValidatorListener((AbstractBeanValidatorUI) ui); } jx.setUI(null); @@ -345,14 +417,14 @@ if (oldUI != null && oldUI instanceof AbstractBeanValidatorUI) { // supression de l'ancien layer - removeBeanValidatorListener((AbstractBeanValidatorUI) oldUI); + removeSimpleBeanValidatorListener((AbstractBeanValidatorUI) oldUI); } Constructor<? extends AbstractBeanValidatorUI> cons = uiClass.getConstructor(String.class); AbstractBeanValidatorUI ui = cons.newInstance(fieldname); // ui.setEnabled(true); - addBeanValidatorListener(ui); + addSimpleBeanValidatorListener(ui); jx.setUI(ui); } } Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessage.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessage.java 2012-07-27 14:33:56 UTC (rev 2443) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessage.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -26,6 +26,7 @@ import org.nuiton.validator.NuitonValidatorScope; import org.nuiton.validator.bean.BeanValidatorMessage; +import org.nuiton.validator.bean.simple.SimpleBeanValidatorMessage; import javax.swing.JComponent; @@ -36,7 +37,7 @@ * @see BeanValidatorMessage * @since 1.3 */ -public class SwingValidatorMessage extends BeanValidatorMessage<SwingValidatorMessage> { +public class SwingValidatorMessage extends SimpleBeanValidatorMessage<SwingValidatorMessage> { private static final long serialVersionUID = 1L; @@ -56,61 +57,13 @@ return editor; } - /** - * @return the field name - * @deprecated since 2.3, will not be replaced - */ - @Deprecated - public String getFieldName() { - return getField(); - } - -// @Override -// public int compareTo(SwingValidatorMessage o) { -// // sort on scope -// int result = getScope().compareTo(o.getScope()); -// if (result == 0) { -// // sort on field name -// result = fieldName.compareTo(o.getField()); -// if (result == 0) { -// // sort on message -// result = message.compareTo(o.getMessage()); -// } -// } -// return result; -// } - -// @Override -// public boolean equals(Object o) { -// if (this == o) { -// return true; -// } -// if (o == null || getClass() != o.getClass()) { -// return false; -// } -// -// SwingValidatorMessage that = (SwingValidatorMessage) o; -// -// return fieldName.equals(that.fieldName) && -// message.equals(that.message) && -// scope == that.scope; -// } - -// @Override -// public int hashCode() { -// int result = fieldName.hashCode(); -// result = 31 * result + message.hashCode(); -// result = 31 * result + scope.hashCode(); -// return result; -// } - @Override public String toString() { String s = scope + " - " + (field == null ? message : field + " - " + message); - if (editor == null) { - return s; + if (editor != null) { + s = editor.getName() + " : " + s; } - return editor.getName() + " : " + s; + return s; } } Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListModel.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListModel.java 2012-07-27 14:33:56 UTC (rev 2443) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageListModel.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -27,8 +27,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.validator.NuitonValidatorScope; -import org.nuiton.validator.bean.BeanValidatorEvent; -import org.nuiton.validator.bean.BeanValidatorListener; +import org.nuiton.validator.bean.simple.SimpleBeanValidatorEvent; +import org.nuiton.validator.bean.simple.SimpleBeanValidatorListener; import javax.swing.AbstractListModel; import javax.swing.JComponent; @@ -44,7 +44,7 @@ */ public class SwingValidatorMessageListModel extends AbstractListModel - implements BeanValidatorListener { + implements SimpleBeanValidatorListener { private static final long serialVersionUID = 1L; @@ -73,7 +73,7 @@ + this); } validators.add(validator); - validator.addBeanValidatorListener(this); + validator.addSimpleBeanValidatorListener(this); } public void clear() { @@ -96,7 +96,7 @@ } @Override - public void onFieldChanged(BeanValidatorEvent event) { + public void onFieldChanged(SimpleBeanValidatorEvent event) { String[] toDelete = event.getMessagesToDelete(); String[] toAdd = event.getMessagesToAdd(); String field = event.getField(); Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableModel.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableModel.java 2012-07-27 14:33:56 UTC (rev 2443) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorMessageTableModel.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -24,11 +24,12 @@ */ package jaxx.runtime.validator.swing; +import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.validator.NuitonValidatorScope; -import org.nuiton.validator.bean.BeanValidatorEvent; -import org.nuiton.validator.bean.BeanValidatorListener; +import org.nuiton.validator.bean.simple.SimpleBeanValidatorEvent; +import org.nuiton.validator.bean.simple.SimpleBeanValidatorListener; import javax.swing.JComponent; import javax.swing.table.AbstractTableModel; @@ -47,7 +48,7 @@ */ public class SwingValidatorMessageTableModel extends AbstractTableModel - implements BeanValidatorListener { + implements SimpleBeanValidatorListener { private static final long serialVersionUID = 1L; @@ -87,7 +88,7 @@ + this); } validators.add(validator); - validator.addBeanValidatorListener(this); + validator.addSimpleBeanValidatorListener(this); } public void addMessages(SwingValidator<?> validator, @@ -147,7 +148,7 @@ public void clearValidators() { for (SwingValidator<?> v : validators) { - v.removeBeanValidatorListener(this); + v.removeSimpleBeanValidatorListener(this); } validators.clear(); } @@ -159,7 +160,7 @@ * @return the message for the given row index */ public SwingValidatorMessage getRow(int rowIndex) { - ensureRowIndex(rowIndex); + SwingUtil.ensureRowIndex(this, rowIndex); return data.get(rowIndex); } @@ -171,18 +172,18 @@ @Override public Class<?> getColumnClass(int columnIndex) { - ensureColumnIndex(columnIndex); + SwingUtil.ensureColumnIndex(this, columnIndex); return columnClasses[columnIndex]; } @Override public String getColumnName(int column) { - ensureColumnIndex(column); + SwingUtil.ensureColumnIndex(this, column); return columnNames[column]; } @Override - public void onFieldChanged(BeanValidatorEvent event) { + public void onFieldChanged(SimpleBeanValidatorEvent event) { String[] toDelete = event.getMessagesToDelete(); String[] toAdd = event.getMessagesToAdd(); String field = event.getField(); @@ -223,8 +224,8 @@ @Override public Object getValueAt(int rowIndex, int columnIndex) { - ensureColumnIndex(columnIndex); - ensureRowIndex(rowIndex); + SwingUtil.ensureColumnIndex(this, columnIndex); + SwingUtil.ensureRowIndex(this, rowIndex); SwingValidatorMessage row = data.get(rowIndex); if (columnIndex == 0) { @@ -244,24 +245,6 @@ return null; } - protected void ensureRowIndex(int rowIndex) - throws ArrayIndexOutOfBoundsException { - if (rowIndex < -1 || rowIndex >= getRowCount()) { - throw new ArrayIndexOutOfBoundsException( - "the rowIndex was " + rowIndex + ", but should be int [0," - + (getRowCount() - 1) + "]"); - } - } - - protected void ensureColumnIndex(int index) - throws ArrayIndexOutOfBoundsException { - if (index < -1 || index >= getColumnCount()) { - throw new ArrayIndexOutOfBoundsException( - "the columnIndex was " + index + ", but should be int [0," - + (getColumnCount() - 1) + "]"); - } - } - protected void addMessages(SwingValidator<?> validator, String fieldName, NuitonValidatorScope scope, 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 2012-07-27 14:33:56 UTC (rev 2443) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorUtil.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -32,10 +32,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.util.ReflectUtil; -import org.nuiton.validator.NuitonValidatorProvider; import org.nuiton.validator.NuitonValidatorScope; -import org.nuiton.validator.bean.BeanValidator; -import org.nuiton.validator.bean.BeanValidatorFactory; import org.nuiton.validator.bean.BeanValidatorUtil; import javax.swing.ImageIcon; @@ -129,14 +126,13 @@ public static <O> SwingValidator<O> newValidator(Class<O> type, String context) { - if (BeanValidatorFactory.isDefaultCreator()) { - - // set the swing bean validator creator - BeanValidatorFactory.setCreator(new DefaultSwingValidatorCreator()); - } +// if (BeanValidatorFactory.isDefaultCreator()) { +// +// // set the swing bean validator creator +// BeanValidatorFactory.setCreator(new DefaultSwingValidatorCreator()); +// } SwingValidator<O> validator = - (SwingValidator<O>) BeanValidatorFactory.newBeanValidator( - type, context); + SwingValidator.newValidator(type, context); return validator; } @@ -167,8 +163,7 @@ List<String> validatorIds = ui.getValidatorIds(); for (String validatorId : validatorIds) { - SwingValidator<?> validator = (SwingValidator<?>) - ui.getValidator(validatorId); + SwingValidator<?> validator = ui.getValidator(validatorId); // install uis validator.installUIs(); @@ -288,6 +283,32 @@ } /** + * Prepare the ui where to display the validators messages. + * + * @param errorTable the table where to display validators messages + * @param render renderer to use + */ + public static void installUI(JTable errorTable, + SwingListValidatorMessageTableRenderer render) { + errorTable.setDefaultRenderer(Object.class, render); + errorTable.getRowSorter().setSortKeys( + Arrays.asList(new RowSorter.SortKey(0, SortOrder.ASCENDING))); + SwingUtil.setI18nTableHeaderRenderer( + errorTable, + n_("validator.scope.header"), + n_("validator.scope.header.tip"), + n_("validator.bean.header"), + n_("validator.bean.header.tip"), + n_("validator.field.header"), + n_("validator.field.header.tip"), + n_("validator.message.header"), + n_("validator.message.header.tip")); + SwingUtil.fixTableColumnWidth(errorTable, 0, 25); + +// SwingUtil.fixTableColumnWidth(errorTable, 1, 25); + } + + /** * Register for a given validator list ui a validator mouse listener. * <p/> * Note: there is only one listener registred for a given list model, so @@ -371,6 +392,23 @@ return null; } + /** + * @param table the validator table ui + * @return the validator table mouse listener, or <code>null</code> if not + * found + * @see SwingValidatorMessageTableMouseListener + */ + public static SwingValidatorMessageTableMouseListener getListErrorTableMouseListener(JTable table) { + if (table != null) { + for (MouseListener listener : table.getMouseListeners()) { + if (listener instanceof SwingValidatorMessageTableMouseListener) { + return (SwingValidatorMessageTableMouseListener) listener; + } + } + } + return null; + } + public static String getMessage(SwingValidatorMessage model) { String text = model.getMessage(); if (model.getField() != null) { @@ -379,6 +417,14 @@ return text; } + public static String getMessage(SwingListValidatorMessage model) { + String text = model.getMessage(); + if (model.getField() != null) { + text = model.getI18nError(text); + } + return text; + } + public static String getFieldName(SwingValidatorMessage model, String value) { String text = null; JComponent editor = model.getEditor(); @@ -396,6 +442,22 @@ return text; } + public static String getFieldName(SwingListValidatorMessage model, String value) { + String text = null; + JComponent editor = model.getEditor(); + if (editor != null) { + text = (String) editor.getClientProperty("validatorLabel"); + /*if (l != null) { + text = I18n._(l); + } else { + // TODO should try the text + }*/ + } + if (text == null) { + text = value; + } + return text; + } /** * Method to listen the modification of the context name and at each time * reload fields of the ui. @@ -425,25 +487,25 @@ ); } - /** - * Default bean validator creator to use in the {@link BeanValidatorFactory}. - * - * @author tchemit <chemit@codelutin.com> - * @since 2.1 - */ - public static class DefaultSwingValidatorCreator implements BeanValidatorFactory.BeanValidatorCreator { +// /** +// * Default bean validator creator to use in the {@link BeanValidatorFactory}. +// * +// * @author tchemit <chemit@codelutin.com> +// * @since 2.1 +// */ +// public static class DefaultSwingValidatorCreator implements BeanValidatorFactory.BeanValidatorCreator { +// +// @Override +// public <O> BeanValidator<O> newBeanValidator(NuitonValidatorProvider provider, Class<O> type, String context, NuitonValidatorScope... scopes) { +// BeanValidator<O> beanValidator = new SwingValidator<O>(provider, +// type, +// context, +// scopes +// ); +// return beanValidator; +// } +// } - @Override - public <O> BeanValidator<O> newBeanValidator(NuitonValidatorProvider provider, Class<O> type, String context, NuitonValidatorScope... scopes) { - BeanValidator<O> beanValidator = new SwingValidator<O>(provider, - type, - context, - scopes - ); - return beanValidator; - } - } - /** * Convinient method to attach a bean to all validators of an JAXXObject. * <p/> @@ -469,7 +531,7 @@ } } for (String validatorId : validatorIds) { - BeanValidator beanValidator = + SwingValidator beanValidator = jaxxValidator.getValidator(validatorId); if (bean == null || beanValidator.getType().isAssignableFrom( bean.getClass())) { @@ -505,7 +567,7 @@ } } for (String validatorId : validatorIds) { - BeanValidator<?> beanValidator = + SwingValidator<?> beanValidator = jaxxValidator.getValidator(validatorId); beanValidator.setChanged(newValue); } 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 2012-07-27 14:33:56 UTC (rev 2443) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/ui/AbstractBeanValidatorUI.java 2012-07-27 14:34:35 UTC (rev 2444) @@ -28,8 +28,8 @@ import org.apache.commons.logging.LogFactory; import org.jdesktop.jxlayer.plaf.AbstractLayerUI; import org.nuiton.validator.NuitonValidatorScope; -import org.nuiton.validator.bean.BeanValidatorEvent; -import org.nuiton.validator.bean.BeanValidatorListener; +import org.nuiton.validator.bean.simple.SimpleBeanValidatorEvent; +import org.nuiton.validator.bean.simple.SimpleBeanValidatorListener; import javax.swing.JComponent; @@ -38,7 +38,7 @@ * * @author tchemit <chemit@codelutin.com> */ -public abstract class AbstractBeanValidatorUI extends AbstractLayerUI<JComponent> implements BeanValidatorListener { +public abstract class AbstractBeanValidatorUI extends AbstractLayerUI<JComponent> implements SimpleBeanValidatorListener { /** Logger */ private static final Log log = LogFactory.getLog(AbstractBeanValidatorUI.class); @@ -68,7 +68,7 @@ } @Override - public void onFieldChanged(BeanValidatorEvent event) { + public void onFieldChanged(SimpleBeanValidatorEvent event) { if (field.equals(event.getField())) { scope = event.getSource().getHighestScope(field); Modified: trunk/jaxx-validator/src/main/resources/i18n/jaxx-validator_en_GB.properties =================================================================== --- trunk/jaxx-validator/src/main/resources/i18n/jaxx-validator_en_GB.properties 2012-07-27 14:33:56 UTC (rev 2443) +++ trunk/jaxx-validator/src/main/resources/i18n/jaxx-validator_en_GB.properties 2012-07-27 14:34:35 UTC (rev 2444) @@ -1,3 +1,6 @@ +validator.bean.header=Object +validator.bean.header.tip=Object on which message occurs +validator.bean.tip= validator.field.header=Field validator.field.header.tip=The field involved validator.field.tip=Property '%1$s' Modified: trunk/jaxx-validator/src/main/resources/i18n/jaxx-validator_es_ES.properties =================================================================== --- trunk/jaxx-validator/src/main/resources/i18n/jaxx-validator_es_ES.properties 2012-07-27 14:33:56 UTC (rev 2443) +++ trunk/jaxx-validator/src/main/resources/i18n/jaxx-validator_es_ES.properties 2012-07-27 14:34:35 UTC (rev 2444) @@ -1,3 +1,6 @@ +validator.bean.header= +validator.bean.header.tip= +validator.bean.tip= validator.field.header=Campo validator.field.header.tip=El campo sobre el que interviene el mensaje validator.field.tip=Propiedad '%1$s' @@ -4,6 +7,9 @@ validator.message.header=Mensaje validator.message.header.tip=El texto del mensaje validator.message.tip=Mensaje \: %1$s +validator.row.header= +validator.row.header.tip= +validator.row.tip= validator.scope.header=... validator.scope.header.tip=El tipo de mensaje validator.scope.tip=Type de message \: '%1$s' Modified: trunk/jaxx-validator/src/main/resources/i18n/jaxx-validator_fr_FR.properties =================================================================== --- trunk/jaxx-validator/src/main/resources/i18n/jaxx-validator_fr_FR.properties 2012-07-27 14:33:56 UTC (rev 2443) +++ trunk/jaxx-validator/src/main/resources/i18n/jaxx-validator_fr_FR.properties 2012-07-27 14:34:35 UTC (rev 2444) @@ -1,3 +1,6 @@ +validator.bean.header=Objet +validator.bean.header.tip=L'objet +validator.bean.tip= validator.field.header=Champ validator.field.header.tip=Le champ surquel intervient le message validator.field.tip=Propriété '%1$s'
participants (1)
-
tchemit@users.nuiton.org