Author: tchemit Date: 2008-05-13 15:48:42 +0000 (Tue, 13 May 2008) New Revision: 659 Added: trunk/lutinui/src/main/java/org/codelutin/ui/config/ trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUI.java trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUIHandler.java trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUIModel.java Removed: trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUI.java trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUIHandler.java trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUIModel.java Log: create config package Deleted: trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUI.java =================================================================== --- trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUI.java 2008-05-13 14:24:27 UTC (rev 658) +++ trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUI.java 2008-05-13 15:48:42 UTC (rev 659) @@ -1,94 +0,0 @@ -/** - * ##% Copyright (C) 2008 Code Lutin, Tony Chemit - * This program is free software; you - * can redistribute it and/or modify it under the terms of the GNU General - * Public License as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. This program is - * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public License for more details. You - * should have received a copy of the GNU General Public License along with this - * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - * - Suite 330, Boston, MA 02111-1307, USA. - * ##% - */ -package org.codelutin.ui; - -import javax.swing.*; -import java.util.Arrays; - -/** - * A abstract dialog contract to be realised by a dialogUI (WindowEvent adapter) - * <p/> - * TODO : make jaxx authorized implementing interface for root tag :) - * - * @author chemit - */ -public abstract class DialogConfigUI<E extends Enum<E>, H extends DialogConfigUIHandler<E, ?, ?>> extends DialogUI<H> { - - public abstract AbstractButton getOk(); - - public abstract AbstractButton getReset(); - - public abstract AbstractButton getCancel(); - - public JComponent getElement(E element) { - return (JComponent) getObjectById(element.name()); - } - - public String getElementValue(E element) { - JComponent o = getElement(element); - if (o instanceof JPasswordField) { - return Arrays.toString(((JPasswordField) o).getPassword()); - } - if (o instanceof JTextField) { - return ((JTextField) o).getText(); - } - if (o instanceof JRadioButton) { - return String.valueOf(((JRadioButton) o).isSelected()); - } - if (o instanceof JCheckBox) { - return String.valueOf(((JCheckBox) o).isSelected()); - } - return ""; - } - - public void setElementValue(E key, Object value) { - JComponent o = getElement(key); - if (o instanceof JPasswordField) { - ((JPasswordField) o).setText(value + ""); - } - if (o instanceof JTextField) { - ((JTextField) o).setText(value + ""); - } - if (o instanceof JRadioButton) { - ((JRadioButton) o).setSelected(Boolean.valueOf(value + "")); - } - if (o instanceof JCheckBox) { - ((JCheckBox) o).setSelected(Boolean.valueOf(value + "")); - } - } - - public JLabel getElementLabel(E element) { - return (JLabel) getObjectById(element.name() + "Label"); - } - - public boolean isConfigValid() { - return getHandler().isConfigValid(); - } - - protected void reset() { - getHandler().reset(); - } - - protected void save() { - getHandler().save(); - dispose(); - } - - protected void doCheck(E element) { - getHandler().doCheck(element); - } - - -} \ No newline at end of file Deleted: trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUIHandler.java =================================================================== --- trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUIHandler.java 2008-05-13 14:24:27 UTC (rev 658) +++ trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUIHandler.java 2008-05-13 15:48:42 UTC (rev 659) @@ -1,155 +0,0 @@ -/** - * ##% Copyright (C) 2008 Code Lutin, Tony Chemit - * This program is free software; you - * can redistribute it and/or modify it under the terms of the GNU General - * Public License as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. This program is - * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public License for more details. You - * should have received a copy of the GNU General Public License along with this - * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - * - Suite 330, Boston, MA 02111-1307, USA. - * ##% - */ -package org.codelutin.ui; - -import javax.swing.text.JTextComponent; -import javax.swing.*; -import java.util.List; -import java.util.ArrayList; -import java.util.Map; -import java.util.EnumMap; -import java.beans.PropertyChangeEvent; -import java.awt.*; - -/** - * DialogUI handler - * - * @author chemit - */ -public abstract class DialogConfigUIHandler<E extends Enum<E>, M extends DialogConfigUIModel<E,?>, U extends DialogConfigUI<E,? extends DialogConfigUIHandler<E,M,U>>> extends DialogUIHandler<M, U> { - - protected DialogConfigUIHandler(U ui, M model) { - super(ui, model); - errors = new ArrayList<E>(); - } - - - protected List<E> errors; - - public void propertyChange(PropertyChangeEvent evt) { - if (log.isDebugEnabled()) { - log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); - } - String action = evt.getPropertyName(); - - if (DialogConfigUIModel.CONFIG_PROPERTY_CHANGED.equals(action)) { - // update ui with model values, - populateUI(); - doCheck(null); - return; - } - - if (DialogConfigUIModel.MODIFIED_PROPERTY_CHANGED.equals(action)) { - Boolean newValue = (Boolean) evt.getNewValue(); - boolean modified = newValue != null && newValue; - getUi().getReset().setEnabled(modified); - return; - } - throw new IllegalStateException("unimplemented property changed : " + evt + " for " + this); - } - - public synchronized List<E> validateModel(E element) { - errors.clear(); - U ui = getUi(); - if (element != null) { - // compute modifed - setModified(element, ui); - } - - //checkData(ui.getFirstName(), firstName); - //checkData(ui.getLastName(), lastName); - //checkData(ui.getEmail(), email); - - return errors; - } - - public void setModified(E element, U ui) { - boolean modify = false; - M model = getModel(); - - String value = ui.getElementValue(element); - //TODO - if (modify) { - model.addModified(element); - } else if (model.getModifieds().contains(element)) { - model.removeModified(element); - } - } - - public void doCheck(E element) { - List<E> errors = validateModel(element); - updateUI(errors); - } - - public boolean isConfigValid() { - return errors.isEmpty(); - } - - public void reset() { - getModel().reset(); - } - - protected void populateUI() { - U ui = getUi(); - M model = getModel(); - EnumMap<E,Object> map = model.getCurrent().getProperties(); - for (Map.Entry<E, Object> entry : map.entrySet()) { - ui.setElementValue(entry.getKey(), entry.getValue()); - } - //ui.getFirstName().setText(model.getCurrent().getFirstName()); - //ui.getLastName().setText(model.getCurrent().getLastName()); - //ui.getEmail().setText(model.getCurrent().getEmail()); - } - - protected void updateUI(List<E> errors) { - U ui = getUi(); - boolean valid = isConfigValid(); - ui.getOk().setEnabled(valid && getModel().isModified()); - for (E element : errors) { - setLabelColor(errors, element); - } - } - - protected void checkData(JTextComponent component, E errorName) { - if (component.getText().isEmpty()) { - errors.add(errorName); - } - } - - protected void checkData(boolean notValid, E errorName) { - if (notValid) { - errors.add(errorName); - } - } - - protected void setLabelColor(List<E> errors, E element) { - JComponent component = getUi().getElementLabel(element); - if (component != null && component.isVisible()) { - component.setForeground(errors.contains(element) ? Color.red : Color.black); - } - } - - public void save() { - if (!getModel().isModified()) { - log.warn("nothing to save"); - } - for (E element : getModel().getModifieds()) { - String value = getUi().getElementValue(element); - //TODO - //getModel().save(element, value); - log.info("save " + element); - } - } -} \ No newline at end of file Deleted: trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUIModel.java =================================================================== --- trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUIModel.java 2008-05-13 14:24:27 UTC (rev 658) +++ trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUIModel.java 2008-05-13 15:48:42 UTC (rev 659) @@ -1,150 +0,0 @@ -/** - * ##% Copyright (C) 2008 Code Lutin, Tony Chemit - * This program is free software; you - * can redistribute it and/or modify it under the terms of the GNU General - * Public License as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. This program is - * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public License for more details. You - * should have received a copy of the GNU General Public License along with this - * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - * - Suite 330, Boston, MA 02111-1307, USA. - * ##% - */ -package org.codelutin.ui; - -import org.codelutin.util.config.Config; - -import java.util.EnumSet; -import java.util.Set; - -/** - * Abstract config ui model. - * - * @author chemit - */ -public abstract class DialogConfigUIModel<E extends Enum<E>, C extends Config<E>> extends DialogUIModel { - - public static final String CONFIG_PROPERTY_CHANGED = "config"; - public static final String MODIFIED_PROPERTY_CHANGED = "modify"; - public static final String UNVALID_PROPERTY_CHANGED = "unvalid"; - - /** - * @return a empty config - */ - protected abstract C newConfig(); - - /** - * object used to init model and save model - */ - protected Object src; - - /** - * current config used in model - */ - protected C current; - - /** - * set of modified properties - */ - protected EnumSet<E> modifieds; - - - /** - * set of unvalid properties - */ - protected EnumSet<E> unvalids; - - public Object getSrc() { - return src; - } - - public C getCurrent() { - return current; - } - - public EnumSet<E> getModifieds() { - return modifieds; - } - - public EnumSet<E> getUnvalids() { - return unvalids; - } - - public Set<E> getUnivserse() { - return getCurrent().getUniverse(); - } - - public boolean isModified() { - return !modifieds.isEmpty(); - } - - - public void populate(Object src) { - this.src = src; - this.current.copyFrom(src); - this.modifieds.clear(); - this.unvalids.clear(); - setModified(false); - firePropertyChange(CONFIG_PROPERTY_CHANGED, null, this); - } - - public void setModified(boolean modified) { - if (!modified) { - modifieds.clear(); - } - firePropertyChange(MODIFIED_PROPERTY_CHANGED, null, modified); - } - - public void setUnvalid(boolean unvalid) { - firePropertyChange(UNVALID_PROPERTY_CHANGED, null, unvalid); - } - - public void reset() { - populate(src); - } - - public void addModified(E names) { - if (!modifieds.contains(names)) { - modifieds.add(names); - } - setModified(!modifieds.isEmpty()); - } - - public void removeModified(E... names) { - for (E elementname : names) { - if (modifieds.contains(elementname)) { - modifieds.remove(elementname); - } - } - setModified(!modifieds.isEmpty()); - } - - public void addUnvalid(E names) { - if (!unvalids.contains(names)) { - unvalids.add(names); - } - setUnvalid(!unvalids.isEmpty()); - } - - public void removeUnvalid(E... names) { - for (E elementname : names) { - if (unvalids.contains(elementname)) { - unvalids.remove(elementname); - } - } - setUnvalid(!unvalids.isEmpty()); - } - - - protected DialogConfigUIModel(Class<E> klass) { - - current = newConfig(); - - modifieds = EnumSet.noneOf(klass); - - unvalids = EnumSet.noneOf(klass); - } - -} \ No newline at end of file Copied: trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUI.java (from rev 657, trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUI.java) =================================================================== --- trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUI.java (rev 0) +++ trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUI.java 2008-05-13 15:48:42 UTC (rev 659) @@ -0,0 +1,96 @@ +/** + * ##% Copyright (C) 2008 Code Lutin, Tony Chemit + * This program is free software; you + * can redistribute it and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU General Public License for more details. You + * should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place + * - Suite 330, Boston, MA 02111-1307, USA. + * ##% + */ +package org.codelutin.ui.config; + +import org.codelutin.ui.DialogUI; + +import javax.swing.*; +import java.util.Arrays; + +/** + * A abstract dialog contract to be realised by a dialogUI (WindowEvent adapter) + * <p/> + * TODO : make jaxx authorized implementing interface for root tag :) + * + * @author chemit + */ +public abstract class DialogConfigUI<E extends Enum<E>, H extends DialogConfigUIHandler<E, ?, ?>> extends DialogUI<H> { + + public abstract AbstractButton getOk(); + + public abstract AbstractButton getReset(); + + public abstract AbstractButton getCancel(); + + public JComponent getElement(E element) { + return (JComponent) getObjectById(element.name()); + } + + public String getElementValue(E element) { + JComponent o = getElement(element); + if (o instanceof JPasswordField) { + return Arrays.toString(((JPasswordField) o).getPassword()); + } + if (o instanceof JTextField) { + return ((JTextField) o).getText(); + } + if (o instanceof JRadioButton) { + return String.valueOf(((JRadioButton) o).isSelected()); + } + if (o instanceof JCheckBox) { + return String.valueOf(((JCheckBox) o).isSelected()); + } + return ""; + } + + public void setElementValue(E key, Object value) { + JComponent o = getElement(key); + if (o instanceof JPasswordField) { + ((JPasswordField) o).setText(value + ""); + } + if (o instanceof JTextField) { + ((JTextField) o).setText(value + ""); + } + if (o instanceof JRadioButton) { + ((JRadioButton) o).setSelected(Boolean.valueOf(value + "")); + } + if (o instanceof JCheckBox) { + ((JCheckBox) o).setSelected(Boolean.valueOf(value + "")); + } + } + + public JLabel getElementLabel(E element) { + return (JLabel) getObjectById(element.name() + "Label"); + } + + public boolean isConfigValid() { + return getHandler().isConfigValid(); + } + + protected void reset() { + getHandler().reset(); + } + + protected void save() { + getHandler().save(); + dispose(); + } + + protected void doCheck(E element) { + getHandler().doCheck(element); + } + + +} \ No newline at end of file Copied: trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUIHandler.java (from rev 657, trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUIHandler.java) =================================================================== --- trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUIHandler.java (rev 0) +++ trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUIHandler.java 2008-05-13 15:48:42 UTC (rev 659) @@ -0,0 +1,157 @@ +/** + * ##% Copyright (C) 2008 Code Lutin, Tony Chemit + * This program is free software; you + * can redistribute it and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU General Public License for more details. You + * should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place + * - Suite 330, Boston, MA 02111-1307, USA. + * ##% + */ +package org.codelutin.ui.config; + +import org.codelutin.ui.DialogUIHandler; + +import javax.swing.text.JTextComponent; +import javax.swing.*; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.EnumMap; +import java.beans.PropertyChangeEvent; +import java.awt.*; + +/** + * DialogUI handler + * + * @author chemit + */ +public abstract class DialogConfigUIHandler<E extends Enum<E>, M extends DialogConfigUIModel<E,?>, U extends DialogConfigUI<E,? extends DialogConfigUIHandler<E,M,U>>> extends DialogUIHandler<M, U> { + + protected DialogConfigUIHandler(U ui, M model) { + super(ui, model); + errors = new ArrayList<E>(); + } + + + protected List<E> errors; + + public void propertyChange(PropertyChangeEvent evt) { + if (log.isDebugEnabled()) { + log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + } + String action = evt.getPropertyName(); + + if (DialogConfigUIModel.CONFIG_PROPERTY_CHANGED.equals(action)) { + // update ui with model values, + populateUI(); + doCheck(null); + return; + } + + if (DialogConfigUIModel.MODIFIED_PROPERTY_CHANGED.equals(action)) { + Boolean newValue = (Boolean) evt.getNewValue(); + boolean modified = newValue != null && newValue; + getUi().getReset().setEnabled(modified); + return; + } + throw new IllegalStateException("unimplemented property changed : " + evt + " for " + this); + } + + public synchronized List<E> validateModel(E element) { + errors.clear(); + U ui = getUi(); + if (element != null) { + // compute modifed + setModified(element, ui); + } + + //checkData(ui.getFirstName(), firstName); + //checkData(ui.getLastName(), lastName); + //checkData(ui.getEmail(), email); + + return errors; + } + + public void setModified(E element, U ui) { + boolean modify = false; + M model = getModel(); + + String value = ui.getElementValue(element); + //TODO + if (modify) { + model.addModified(element); + } else if (model.getModifieds().contains(element)) { + model.removeModified(element); + } + } + + public void doCheck(E element) { + List<E> errors = validateModel(element); + updateUI(errors); + } + + public boolean isConfigValid() { + return errors.isEmpty(); + } + + public void reset() { + getModel().reset(); + } + + protected void populateUI() { + U ui = getUi(); + M model = getModel(); + EnumMap<E,Object> map = model.getCurrent().getProperties(); + for (Map.Entry<E, Object> entry : map.entrySet()) { + ui.setElementValue(entry.getKey(), entry.getValue()); + } + //ui.getFirstName().setText(model.getCurrent().getFirstName()); + //ui.getLastName().setText(model.getCurrent().getLastName()); + //ui.getEmail().setText(model.getCurrent().getEmail()); + } + + protected void updateUI(List<E> errors) { + U ui = getUi(); + boolean valid = isConfigValid(); + ui.getOk().setEnabled(valid && getModel().isModified()); + for (E element : errors) { + setLabelColor(errors, element); + } + } + + protected void checkData(JTextComponent component, E errorName) { + if (component.getText().isEmpty()) { + errors.add(errorName); + } + } + + protected void checkData(boolean notValid, E errorName) { + if (notValid) { + errors.add(errorName); + } + } + + protected void setLabelColor(List<E> errors, E element) { + JComponent component = getUi().getElementLabel(element); + if (component != null && component.isVisible()) { + component.setForeground(errors.contains(element) ? Color.red : Color.black); + } + } + + public void save() { + if (!getModel().isModified()) { + log.warn("nothing to save"); + } + for (E element : getModel().getModifieds()) { + String value = getUi().getElementValue(element); + //TODO + //getModel().save(element, value); + log.info("save " + element); + } + } +} \ No newline at end of file Copied: trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUIModel.java (from rev 657, trunk/lutinui/src/main/java/org/codelutin/ui/DialogConfigUIModel.java) =================================================================== --- trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUIModel.java (rev 0) +++ trunk/lutinui/src/main/java/org/codelutin/ui/config/DialogConfigUIModel.java 2008-05-13 15:48:42 UTC (rev 659) @@ -0,0 +1,151 @@ +/** + * ##% Copyright (C) 2008 Code Lutin, Tony Chemit + * This program is free software; you + * can redistribute it and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU General Public License for more details. You + * should have received a copy of the GNU General Public License along with this + * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place + * - Suite 330, Boston, MA 02111-1307, USA. + * ##% + */ +package org.codelutin.ui.config; + +import org.codelutin.util.config.Config; +import org.codelutin.ui.DialogUIModel; + +import java.util.EnumSet; +import java.util.Set; + +/** + * Abstract config ui model. + * + * @author chemit + */ +public abstract class DialogConfigUIModel<E extends Enum<E>, C extends Config<E>> extends DialogUIModel { + + public static final String CONFIG_PROPERTY_CHANGED = "config"; + public static final String MODIFIED_PROPERTY_CHANGED = "modify"; + public static final String UNVALID_PROPERTY_CHANGED = "unvalid"; + + /** + * @return a empty config + */ + protected abstract C newConfig(); + + /** + * object used to init model and save model + */ + protected Object src; + + /** + * current config used in model + */ + protected C current; + + /** + * set of modified properties + */ + protected EnumSet<E> modifieds; + + + /** + * set of unvalid properties + */ + protected EnumSet<E> unvalids; + + public Object getSrc() { + return src; + } + + public C getCurrent() { + return current; + } + + public EnumSet<E> getModifieds() { + return modifieds; + } + + public EnumSet<E> getUnvalids() { + return unvalids; + } + + public Set<E> getUnivserse() { + return getCurrent().getUniverse(); + } + + public boolean isModified() { + return !modifieds.isEmpty(); + } + + + public void populate(Object src) { + this.src = src; + this.current.copyFrom(src); + this.modifieds.clear(); + this.unvalids.clear(); + setModified(false); + firePropertyChange(CONFIG_PROPERTY_CHANGED, null, this); + } + + public void setModified(boolean modified) { + if (!modified) { + modifieds.clear(); + } + firePropertyChange(MODIFIED_PROPERTY_CHANGED, null, modified); + } + + public void setUnvalid(boolean unvalid) { + firePropertyChange(UNVALID_PROPERTY_CHANGED, null, unvalid); + } + + public void reset() { + populate(src); + } + + public void addModified(E names) { + if (!modifieds.contains(names)) { + modifieds.add(names); + } + setModified(!modifieds.isEmpty()); + } + + public void removeModified(E... names) { + for (E elementname : names) { + if (modifieds.contains(elementname)) { + modifieds.remove(elementname); + } + } + setModified(!modifieds.isEmpty()); + } + + public void addUnvalid(E names) { + if (!unvalids.contains(names)) { + unvalids.add(names); + } + setUnvalid(!unvalids.isEmpty()); + } + + public void removeUnvalid(E... names) { + for (E elementname : names) { + if (unvalids.contains(elementname)) { + unvalids.remove(elementname); + } + } + setUnvalid(!unvalids.isEmpty()); + } + + + protected DialogConfigUIModel(Class<E> klass) { + + current = newConfig(); + + modifieds = EnumSet.noneOf(klass); + + unvalids = EnumSet.noneOf(klass); + } + +} \ No newline at end of file
participants (1)
-
tchemit@users.labs.libre-entreprise.org