r2447 - in trunk: jaxx-demo/src/main/java/jaxx/demo/feature/validation/list jaxx-validator jaxx-validator/src/main/java/jaxx/runtime/validator/swing
Author: tchemit Date: 2012-07-30 09:30:24 +0200 (Mon, 30 Jul 2012) New Revision: 2447 Url: http://nuiton.org/repositories/revision/jaxx/2447 Log: add some ui stuff for BeanListValidator and test it jaxx-demo Added: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorHighlightPredicate.java Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/ListBeanValidationDemo.jaxx trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/ListBeanValidationDemoHandler.java trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/PeopleTableModel.java trunk/jaxx-validator/pom.xml trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorUtil.java Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/ListBeanValidationDemo.jaxx =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/ListBeanValidationDemo.jaxx 2012-07-27 14:44:28 UTC (rev 2446) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/ListBeanValidationDemo.jaxx 2012-07-30 07:30:24 UTC (rev 2447) @@ -26,6 +26,7 @@ <jaxx.demo.DemoPanel layout='{new BorderLayout()}'> <import> + org.jdesktop.swingx.JXTable javax.swing.JOptionPane static org.nuiton.i18n.I18n.n_ jaxx.demo.entities.People @@ -69,7 +70,7 @@ <JPanel border='{BorderFactory.createTitledBorder("Form")}' layout='{new GridLayout()}' width='250' height='120'> <JScrollPane id='dataTableScrollePane' constraints='BorderLayout.CENTER'> - <JTable id='dataTable' model='{model}' autoCreateRowSorter='true'/> + <JXTable id='dataTable' model='{model}' autoCreateRowSorter='true'/> </JScrollPane> </JPanel> </cell> @@ -78,9 +79,9 @@ <cell fill="both"> <JPanel layout='{new GridLayout(1,3,0,0)}'> <JButton id='addIdentity' text='jaxx.demo.action.add' - onActionPerformed='handler.addIdentity()'/> + onActionPerformed='handler.addPeople()'/> <JButton id='removeIdentity' text='jaxx.demo.action.remove' - onActionPerformed='handler.removeIdentity()'/> + onActionPerformed='handler.removePeople()'/> <JButton id='ok' text='jaxx.demo.action.ok' onActionPerformed='JOptionPane.showMessageDialog(this, ok.getText() + " clicked!", "onActionPerformed", JOptionPane.INFORMATION_MESSAGE);'/> Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/ListBeanValidationDemoHandler.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/ListBeanValidationDemoHandler.java 2012-07-27 14:44:28 UTC (rev 2446) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/ListBeanValidationDemoHandler.java 2012-07-30 07:30:24 UTC (rev 2447) @@ -4,15 +4,12 @@ import jaxx.demo.entities.People; import jaxx.runtime.SwingUtil; import jaxx.runtime.validator.swing.SwingListValidatorDataLocator; -import jaxx.runtime.validator.swing.SwingListValidatorMessageTableModel; -import jaxx.runtime.validator.swing.SwingListValidatorMessageTableMouseListener; import jaxx.runtime.validator.swing.SwingListValidatorMessageTableRenderer; -import jaxx.runtime.validator.swing.SwingListValidatorTableEditorModelListener; import jaxx.runtime.validator.swing.SwingValidatorUtil; import org.apache.commons.lang3.tuple.Pair; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; import org.nuiton.util.decorator.Decorator; +import org.nuiton.validator.NuitonValidatorScope; import org.nuiton.validator.bean.list.BeanListValidator; import javax.swing.JTable; @@ -32,10 +29,6 @@ */ public class ListBeanValidationDemoHandler { - /** Logger. */ - private static final Log log = - LogFactory.getLog(ListBeanValidationDemoHandler.class); - private final ListBeanValidationDemo ui; public ListBeanValidationDemoHandler(ListBeanValidationDemo ui) { @@ -46,7 +39,7 @@ // customize data table - JTable dataTable = ui.getDataTable(); + JXTable dataTable = ui.getDataTable(); dataTable.getRowSorter().setSortKeys( Arrays.asList(new RowSorter.SortKey(0, SortOrder.ASCENDING))); @@ -64,55 +57,65 @@ SwingUtil.fixTableColumnWidth(dataTable, 3, 35); // register validator - ui.getErrorTableModel().registerValidator(ui.getValidator()); + BeanListValidator<People> validator = ui.getValidator(); + ui.getErrorTableModel().registerValidator(validator); // customize error table JTable errorTable = ui.getErrorTable(); - SwingValidatorUtil.installUI(errorTable, new SwingListValidatorMessageTableRenderer() { + IdentityValidatorDataLocator dataLocator = new IdentityValidatorDataLocator(); - private static final long serialVersionUID = 1L; + SwingValidatorUtil.installUI( + validator, dataTable, errorTable, dataLocator, + new SwingListValidatorMessageTableRenderer() { - Decorator<People> decorator - = new DemoDecoratorProvider().getDecoratorByType(People.class); + private static final long serialVersionUID = 1L; - @Override - protected String decorateBean(Object bean) { - return decorator.toString(bean); - } - }); + Decorator<People> decorator + = new DemoDecoratorProvider().getDecoratorByType(People.class); - IdentityValidatorDataLocator dataLocator = new IdentityValidatorDataLocator(); + @Override + protected String decorateBean(Object bean) { + return decorator.toString(bean); + } + }); - // add click listener to go to cell - errorTable.addMouseListener(new SwingListValidatorMessageTableMouseListener( - dataTable, - dataLocator - )); + SwingValidatorUtil.addHightLighterOnEditor( + validator, dataTable, dataLocator, + NuitonValidatorScope.ERROR, + NuitonValidatorScope.WARNING); - ui.getModel().addTableModelListener( - new SwingListValidatorTableEditorModelListener<People>(ui.getValidator(), dataLocator)); + // add some datas in model + + People a = new People("0", "Jack", "Black", 12, "/jaxx/demo/images/jack.jpg"); + People a2 = new People("1", "Héctor", "Jiménez", 28, "/jaxx/demo/images/hector.jpg"); + People a3 = new People("2", "Ana", "de la Reguera", 34, "/jaxx/demo/images/ana.jpg"); + + addPeople(a); + addPeople(a2); + addPeople(a3); } - public void addIdentity() { - + public void addPeople() { People bean = new People(); bean.setId(UUID.randomUUID().toString()); + addPeople(bean); + } + + public void addPeople(People bean) { PeopleTableModel model = ui.getModel(); model.addBean(bean); - } - public void removeIdentity() { + public void removePeople() { int selectedRow = ui.getDataTable().getSelectedRow(); PeopleTableModel model = ui.getModel(); model.removeBean(selectedRow); } public void updateOkEnabled() { - SwingListValidatorMessageTableModel model = ui.getErrorTableModel(); BeanListValidator<People> validator = ui.getValidator(); boolean valid = !validator.hasErrors(); ui.getOk().setEnabled(valid); @@ -127,7 +130,7 @@ PeopleTableModel model = (PeopleTableModel) tableModel; Pair<Integer, Integer> cell = - model.getCell((People) bean, fieldName); + model.getCell(bean, fieldName); return cell; } Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/PeopleTableModel.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/PeopleTableModel.java 2012-07-27 14:44:28 UTC (rev 2446) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/feature/validation/list/PeopleTableModel.java 2012-07-30 07:30:24 UTC (rev 2447) @@ -37,6 +37,12 @@ } @Override + public String getColumnName(int column) { + SwingUtil.ensureColumnIndex(this, column); + return columnNames.get(column); + } + + @Override public int getColumnCount() { return columnNames.size(); } Modified: trunk/jaxx-validator/pom.xml =================================================================== --- trunk/jaxx-validator/pom.xml 2012-07-27 14:44:28 UTC (rev 2446) +++ trunk/jaxx-validator/pom.xml 2012-07-30 07:30:24 UTC (rev 2447) @@ -82,6 +82,11 @@ </dependency> <dependency> + <groupId>org.swinglabs.swingx</groupId> + <artifactId>swingx-core</artifactId> + </dependency> + + <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <scope>test</scope> Added: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorHighlightPredicate.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorHighlightPredicate.java (rev 0) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingListValidatorHighlightPredicate.java 2012-07-30 07:30:24 UTC (rev 2447) @@ -0,0 +1,114 @@ +package jaxx.runtime.validator.swing; + +import org.jdesktop.swingx.decorator.ComponentAdapter; +import org.jdesktop.swingx.decorator.HighlightPredicate; +import org.nuiton.validator.NuitonValidatorScope; +import org.nuiton.validator.bean.list.BeanListValidator; + +import javax.swing.JTable; +import java.awt.Component; + +/** + * HighLight predicates for a table editor using {@link BeanListValidator} of + * his data. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.5.3 + */ +public class SwingListValidatorHighlightPredicate<O> implements HighlightPredicate { + + /** + * Filtering scope. + * + * @since 2.5.3 + */ + protected final NuitonValidatorScope scope; + + /** + * Validator (contains data). + * + * @since 2.5.3 + */ + protected final BeanListValidator<O> validator; + + /** + * Data locator to find back data in editor. + * + * @since 2.5.3 + */ + protected final SwingListValidatorDataLocator<O> dataLocator; + + public static <O> SwingListValidatorHighlightPredicate<O> newFatalPredicate( + BeanListValidator<O> validator, + SwingListValidatorDataLocator<O> dataLocator) { + return newPredicate( + NuitonValidatorScope.FATAL, + validator, + dataLocator + ); + } + + public static <O> SwingListValidatorHighlightPredicate<O> newErrorPredicate( + BeanListValidator<O> validator, + SwingListValidatorDataLocator<O> dataLocator) { + return newPredicate( + NuitonValidatorScope.ERROR, + validator, + dataLocator + ); + } + + public static <O> SwingListValidatorHighlightPredicate<O> newWarningPredicate( + BeanListValidator<O> validator, + SwingListValidatorDataLocator<O> dataLocator) { + return newPredicate( + NuitonValidatorScope.WARNING, + validator, + dataLocator + ); + } + + public static <O> SwingListValidatorHighlightPredicate<O> newInfoPredicate( + BeanListValidator<O> validator, + SwingListValidatorDataLocator<O> dataLocator) { + return newPredicate( + NuitonValidatorScope.INFO, + validator, + dataLocator + ); + } + + public static <O> SwingListValidatorHighlightPredicate<O> newPredicate( + NuitonValidatorScope scope, + BeanListValidator<O> validator, + SwingListValidatorDataLocator<O> dataLocator) { + return new SwingListValidatorHighlightPredicate<O>( + scope, + validator, + dataLocator + ); + } + + public SwingListValidatorHighlightPredicate(NuitonValidatorScope scope, + BeanListValidator<O> validator, + SwingListValidatorDataLocator<O> dataLocator) { + this.scope = scope; + this.validator = validator; + this.dataLocator = dataLocator; + } + + @Override + public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { + + int columnIndex = adapter.convertColumnIndexToModel(adapter.column); + + String fieldName = adapter.getColumnName(columnIndex); + + int rowIndex = adapter.convertRowIndexToModel(adapter.row); + JTable component = (JTable) adapter.getComponent(); + O bean = dataLocator.locateBean(component.getModel(), rowIndex); + BeanListValidator.NuitonValidatorContext<O> context = validator.getContext(bean); + NuitonValidatorScope highestScope = context.getHighestScope(fieldName); + return scope == highestScope; + } +} 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:44:28 UTC (rev 2446) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorUtil.java 2012-07-30 07:30:24 UTC (rev 2447) @@ -24,6 +24,7 @@ */ package jaxx.runtime.validator.swing; +import com.google.common.collect.Sets; import jaxx.runtime.JAXXObject; import jaxx.runtime.JAXXValidator; import jaxx.runtime.SwingUtil; @@ -31,9 +32,13 @@ import jaxx.runtime.validator.swing.meta.ValidatorField; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.decorator.ColorHighlighter; +import org.jdesktop.swingx.decorator.Highlighter; import org.nuiton.util.ReflectUtil; import org.nuiton.validator.NuitonValidatorScope; import org.nuiton.validator.bean.BeanValidatorUtil; +import org.nuiton.validator.bean.list.BeanListValidator; import javax.swing.ImageIcon; import javax.swing.JComponent; @@ -54,6 +59,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import static org.nuiton.i18n.I18n.n_; @@ -287,9 +293,14 @@ * * @param errorTable the table where to display validators messages * @param render renderer to use + * @since 2.5.3 */ - public static void installUI(JTable errorTable, - SwingListValidatorMessageTableRenderer render) { + public static <O> void installUI(BeanListValidator<O> validator, + JTable dataTable, + JTable errorTable, + SwingListValidatorDataLocator<O> dataLocator, + SwingListValidatorMessageTableRenderer render) { + errorTable.setDefaultRenderer(Object.class, render); errorTable.getRowSorter().setSortKeys( Arrays.asList(new RowSorter.SortKey(0, SortOrder.ASCENDING))); @@ -305,10 +316,50 @@ n_("validator.message.header.tip")); SwingUtil.fixTableColumnWidth(errorTable, 0, 25); -// SwingUtil.fixTableColumnWidth(errorTable, 1, 25); + // add click listener to go to cell + errorTable.addMouseListener(new SwingListValidatorMessageTableMouseListener( + dataTable, + dataLocator + )); + + // listen on editor model to add / remove bean into validator + dataTable.getModel().addTableModelListener( + new SwingListValidatorTableEditorModelListener<O>(validator, dataLocator)); } /** + * Add hightlighters on the editor of beans. + * + * @param validator the validator where to find bean states + * @param editor the editor of beans + * @param dataLocator the data locator + * @param scopes scopes to hightlight + * @param <O> type of bean to validate + * @since 2.5.3 + */ + public static <O> void addHightLighterOnEditor(BeanListValidator<O> validator, + JXTable editor, + SwingListValidatorDataLocator<O> dataLocator, + NuitonValidatorScope... scopes) { + + Set<ColorHighlighter> highlighters = Sets.newHashSet(); + for (NuitonValidatorScope scope : scopes) { + + SwingListValidatorHighlightPredicate<O> predicate = SwingListValidatorHighlightPredicate.newPredicate( + scope, + validator, dataLocator + ); + + ColorHighlighter highlighter = new ColorHighlighter(predicate); + highlighter.setBackground(SwingValidatorUtil.getColor(scope)); + highlighters.add(highlighter); + } + + editor.setHighlighters( + highlighters.toArray(new Highlighter[highlighters.size()])); + } + + /** * 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 @@ -458,6 +509,7 @@ } return text; } + /** * Method to listen the modification of the context name and at each time * reload fields of the ui.
participants (1)
-
tchemit@users.nuiton.org