r113 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing/content/operation java/fr/ifremer/tutti/ui/swing/content/protocol java/fr/ifremer/tutti/ui/swing/util resources/i18n
Author: kmorin Date: 2012-12-27 18:52:49 +0100 (Thu, 27 Dec 2012) New Revision: 113 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/113 Log: refs #1810 Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/HydrologicCaracteristicUtil.java Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java 2012-12-27 17:49:54 UTC (rev 112) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java 2012-12-27 17:52:49 UTC (rev 113) @@ -31,17 +31,15 @@ import fr.ifremer.tutti.ui.swing.AbstractTuttiUIHandler; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; -import org.apache.commons.lang3.time.DateUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.util.decorator.Decorator; - import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Date; import java.util.List; - +import org.apache.commons.lang3.time.DateUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import static org.nuiton.i18n.I18n._; +import org.nuiton.util.decorator.Decorator; /** * Handler of UI {@link FishingOperationsUI}. @@ -200,7 +198,7 @@ } public void saveFishingOperation(FishingOperation toSave) { - + // persist the fishingOperation boolean create = toSave.getId() == null; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIModel.java 2012-12-27 17:49:54 UTC (rev 112) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIModel.java 2012-12-27 17:52:49 UTC (rev 113) @@ -26,10 +26,11 @@ import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.jdesktop.beans.AbstractSerializableBean; -import java.util.List; - /** * Model fo UI {@link FishingOperationsUI}. * @@ -38,6 +39,8 @@ */ public class FishingOperationsUIModel extends AbstractSerializableBean { + private static final Log log = LogFactory.getLog(FishingOperationsUIModel.class); + private static final long serialVersionUID = 1L; public static final String PROPERTY_FISHING_OPERATION = "fishingOperation"; @@ -57,8 +60,9 @@ } public void setFishingOperation(List<FishingOperation> fishingOperation) { + Object oldValue = getFishingOperation(); this.fishingOperation = fishingOperation; - firePropertyChange(PROPERTY_FISHING_OPERATION, null, fishingOperation); + firePropertyChange(PROPERTY_FISHING_OPERATION, oldValue, fishingOperation); } public FishingOperation getSelectedFishingOperation() { Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java (from rev 107, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentRowModel.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java 2012-12-27 17:52:49 UTC (rev 113) @@ -0,0 +1,128 @@ +package fr.ifremer.tutti.ui.swing.content.protocol; + +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; +import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +/** + * + * @author kmorin + * @since 0.3 + */ +public class EditProtocolSpeciesRowModel extends AbstractTuttiBeanUIModel<SpeciesProtocol, EditProtocolSpeciesRowModel> { + + private static final Log log = LogFactory.getLog(EditProtocolSpeciesRowModel.class); + + public static final String PROPERTY_SPECIES = "species"; + + public static final String PROPERTY_SORTED_UNSORTED_ENABLED = "sortedUnsortedEnabled"; + + public static final String PROPERTY_SIZE_CATEGORY_ENABLED = "sizeCategoryEnabled"; + + public static final String PROPERTY_SEX_ENABLED = "sexEnabled"; + + public static final String PROPERTY_MATURITY_ENABLED = "maturityEnabled"; + + public static final String PROPERTY_SIZE_FRENQUENCY_PMFM = "sizeFrenquencyPmfm"; + + protected Species species; + + protected boolean sortedUnsortedEnabled; + + protected boolean sizeCategoryEnabled; + + protected boolean sexEnabled; + + protected boolean maturityEnabled; + + protected Caracteristic sizeFrenquencyPmfm; + + protected static final Binder<SpeciesProtocol, EditProtocolSpeciesRowModel> fromBeanBinder = + BinderFactory.newBinder(SpeciesProtocol.class, + EditProtocolSpeciesRowModel.class); + + protected static final Binder<EditProtocolSpeciesRowModel, SpeciesProtocol> toBeanBinder = + BinderFactory.newBinder(EditProtocolSpeciesRowModel.class, + SpeciesProtocol.class); + + public EditProtocolSpeciesRowModel(Species species, Caracteristic sizeFrenquencyPmfm) { + super(SpeciesProtocol.class, fromBeanBinder, toBeanBinder); + this.species = species; + this.sizeFrenquencyPmfm = sizeFrenquencyPmfm; + } + + public String getSpeciesId() { + return species.getId(); + } + + public Species getSpecies() { + return species; + } + + public void setSpecies(Species species) { + Object oldValue = getSpecies(); + this.species = species; + firePropertyChange(PROPERTY_SPECIES, oldValue, species); + } + + public boolean isSortedUnsortedEnabled() { + return sortedUnsortedEnabled; + } + + public void setSortedUnsortedEnabled(boolean sortedUnsortedEnabled) { + Object oldValue = isSortedUnsortedEnabled(); + this.sortedUnsortedEnabled = sortedUnsortedEnabled; + firePropertyChange(PROPERTY_SORTED_UNSORTED_ENABLED, oldValue, sortedUnsortedEnabled); + } + + public boolean isSizeCategoryEnabled() { + return sizeCategoryEnabled; + } + + public void setSizeCategoryEnabled(boolean sizeCategoryEnabled) { + Object oldValue = isSizeCategoryEnabled(); + this.sizeCategoryEnabled = sizeCategoryEnabled; + firePropertyChange(PROPERTY_SIZE_CATEGORY_ENABLED, oldValue, sizeCategoryEnabled); + } + + public boolean isSexEnabled() { + return sexEnabled; + } + + public void setSexEnabled(boolean sexEnabled) { + Object oldValue = isSexEnabled(); + this.sexEnabled = sexEnabled; + firePropertyChange(PROPERTY_SEX_ENABLED, oldValue, sexEnabled); + } + + public boolean isMaturityEnabled() { + return maturityEnabled; + } + + public void setMaturityEnabled(boolean maturityEnabled) { + Object oldValue = isMaturityEnabled(); + this.maturityEnabled = maturityEnabled; + firePropertyChange(PROPERTY_MATURITY_ENABLED, oldValue, maturityEnabled); + } + + public String getSizeFrenquencyPmfmId() { + return sizeFrenquencyPmfm != null ? sizeFrenquencyPmfm.getId() : null; + } + + public Caracteristic getSizeFrenquencyPmfm() { + return sizeFrenquencyPmfm; + } + + public void setSizeFrenquencyPmfm(Caracteristic sizeFrenquencyPmfm) { + Object oldValue = getSizeFrenquencyPmfm(); + this.sizeFrenquencyPmfm = sizeFrenquencyPmfm; + firePropertyChange(PROPERTY_SIZE_FRENQUENCY_PMFM, oldValue, sizeFrenquencyPmfm); + } + +} Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesTableModel.java (from rev 107, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTableModel.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesTableModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesTableModel.java 2012-12-27 17:52:49 UTC (rev 113) @@ -0,0 +1,59 @@ +package fr.ifremer.tutti.ui.swing.content.protocol; + +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel; +import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; +import javax.swing.table.TableColumnModel; + +import static org.nuiton.i18n.I18n.n_; + +/** + * + * @author kmorin + * since 0.3 + */ +public class EditProtocolSpeciesTableModel extends AbstractTuttiTableModel<EditProtocolSpeciesRowModel> { + + public static final ColumnIdentifier<EditProtocolSpeciesRowModel> SPECIES_ID = ColumnIdentifier.newId( + EditProtocolSpeciesRowModel.PROPERTY_SPECIES, + n_("tutti.table.protocol.species.header.speciesId"), + n_("tutti.table.protocol.species.header.speciesId")); + + public static final ColumnIdentifier<EditProtocolSpeciesRowModel> SORTED_UNSORTED_ENABLED = ColumnIdentifier.newId( + EditProtocolSpeciesRowModel.PROPERTY_SORTED_UNSORTED_ENABLED, + n_("tutti.table.protocol.species.header.sortedUnsorted"), + n_("tutti.table.protocol.species.header.sortedUnsorted")); + + public static final ColumnIdentifier<EditProtocolSpeciesRowModel> SIZE_CATEGORY_ENABLED = ColumnIdentifier.newId( + EditProtocolSpeciesRowModel.PROPERTY_SIZE_CATEGORY_ENABLED, + n_("tutti.table.protocol.species.header.sizeCategory"), + n_("tutti.table.protocol.species.header.sizeCategory")); + + public static final ColumnIdentifier<EditProtocolSpeciesRowModel> SEX_ENABLED = ColumnIdentifier.newId( + EditProtocolSpeciesRowModel.PROPERTY_SEX_ENABLED, + n_("tutti.table.protocol.species.header.sex"), + n_("tutti.table.protocol.species.header.sex")); + + public static final ColumnIdentifier<EditProtocolSpeciesRowModel> MATURITY_ENABLED = ColumnIdentifier.newId( + EditProtocolSpeciesRowModel.PROPERTY_MATURITY_ENABLED, + n_("tutti.table.protocol.species.header.maturity"), + n_("tutti.table.protocol.species.header.maturity")); + + public static final ColumnIdentifier<EditProtocolSpeciesRowModel> SIZE_FRENQUENCY_PMFM_ID = ColumnIdentifier.newId( + EditProtocolSpeciesRowModel.PROPERTY_SIZE_FRENQUENCY_PMFM, + n_("tutti.table.protocol.species.header.sizeFrequency"), + n_("tutti.table.protocol.species.header.sizeFrequency")); + + public EditProtocolSpeciesTableModel(TableColumnModel columnModel) { + super(columnModel); + + setNoneEditableCols(SPECIES_ID); + } + + @Override + protected EditProtocolSpeciesRowModel createNewRow() { + EditProtocolSpeciesRowModel result = new EditProtocolSpeciesRowModel(null, null); + return result; + } + +} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css 2012-12-27 17:49:54 UTC (rev 112) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css 2012-12-27 17:52:49 UTC (rev 113) @@ -81,3 +81,28 @@ selectionMode: 0; model: {errorTableModel}; } + +#speciesTable { + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; +} + +#gearList { + bean: {model}; + property: gearPmfm; + border: {BorderFactory.createTitledBorder(_("tutti.label.tab.fishingOperation.gearShooting"))}; +} + +#environmentList { + bean: {model}; + property: environmentPmfm; + border: {BorderFactory.createTitledBorder(_("tutti.label.tab.fishingOperation.environment"))}; +} + +#hydrologyList { + bean: {model}; + property: hydrologyPmfm; + border: {BorderFactory.createTitledBorder(_("tutti.label.tab.fishingOperation.hydrology"))}; +} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx 2012-12-27 17:49:54 UTC (rev 112) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx 2012-12-27 17:52:49 UTC (rev 113) @@ -25,15 +25,22 @@ implements='fr.ifremer.tutti.ui.swing.TuttiUI<EditProtocolUIModel, EditProtocolUIHandler>'> <import> + fr.ifremer.tutti.persistence.entities.referential.Caracteristic fr.ifremer.tutti.persistence.entities.referential.Zone fr.ifremer.tutti.ui.swing.TuttiUIContext jaxx.runtime.swing.editor.bean.BeanComboBox + jaxx.runtime.swing.editor.bean.BeanDoubleList jaxx.runtime.validator.swing.SwingValidatorUtil jaxx.runtime.validator.swing.SwingValidatorMessageTableModel java.awt.Dimension - + java.awt.Color + + javax.swing.ListSelectionModel + + org.jdesktop.swingx.JXTable + static org.nuiton.i18n.I18n._ static jaxx.runtime.SwingUtil.getStringValue @@ -68,42 +75,83 @@ <JSplitPane id='splitPane' constraints='BorderLayout.CENTER'> - <Table id='form' fill='both'> + <JPanel layout='{new BorderLayout()}'> + <JTabbedPane constraints='BorderLayout.CENTER'> + <tab title='tutti.label.tab.protocol.info'> + <Table id='protocolInfoForm' fill='both'> - <!-- protocol name --> - <row> - <cell anchor='west'> - <JLabel id='nameLabel'/> - </cell> - <cell weightx='1.0'> - <JTextField id='nameField' - onKeyReleased='handler.setText(event, "name")'/> - </cell> - </row> + <!-- protocol name --> + <row> + <cell anchor='west'> + <JLabel id='nameLabel'/> + </cell> + <cell weightx='1.0'> + <JTextField id='nameField' + onKeyReleased='handler.setText(event, "name")'/> + </cell> + </row> - <!-- program comment --> - <row weighty='0.8'> - <cell columns='2'> - <JScrollPane id='commentPane' - onFocusGained='commentField.requestFocus()'> - <JTextArea id='commentField' - onKeyReleased='handler.setText(event, "comment")'/> - </JScrollPane> - </cell> - </row> + <!-- program comment --> + <row weighty='0.8'> + <cell columns='2'> + <JScrollPane id='commentPane' + onFocusGained='commentField.requestFocus()'> + <JTextArea id='commentField' + onKeyReleased='handler.setText(event, "comment")'/> + </JScrollPane> + </cell> + </row> + </Table> + </tab> + + <tab title='tutti.label.tab.protocol.species'> + <Table fill='both'> + <row fill='both'> + <cell fill='both' weightx='1'> + <JComboBox id='newSpeciesRowCombo'/> + </cell> + <cell fill='both'> + <JButton id='addRow' actionIcon='add' + onActionPerformed='handler.addRow()'/> + </cell> + </row> + <row fill='both' weighty='1'> + <cell fill='both' columns='2'> + <JScrollPane> + <JXTable id='speciesTable'/> + </JScrollPane> + </cell> + </row> + </Table> + </tab> + + <tab title='tutti.label.tab.protocol.pmfm'> + <Table fill='both' weightx='1'> + <row fill='both' weighty='1'> + <cell fill='both'> + <BeanDoubleList id='gearList' genericType='Caracteristic'/> + </cell> + </row> + <row fill='both' weighty='1'> + <cell fill='both'> + <BeanDoubleList id='environmentList' genericType='Caracteristic'/> + </cell> + </row> + <row fill='both' weighty='1'> + <cell fill='both'> + <BeanDoubleList id='hydrologyList' genericType='Caracteristic'/> + </cell> + </row> + </Table> + </tab> + </JTabbedPane> - <!-- actions --> - <row anchor='south'> - <cell columns='2'> - <JPanel layout='{new GridLayout(1, 0)}'> - <JButton id='cancelButton' onActionPerformed='handler.cancel()'/> - <JButton id='saveButton' onActionPerformed='handler.save()'/> - </JPanel> - </cell> - </row> - </Table> - - <!-- validation messages --> + <JPanel layout='{new GridLayout(1, 0)}' constraints='BorderLayout.SOUTH'> + <JButton id='cancelButton' onActionPerformed='handler.cancel()'/> + <JButton id='saveButton' onActionPerformed='handler.save()'/> + </JPanel> + + </JPanel> <JPanel id='messagePanel' layout='{new GridLayout()}'> <JScrollPane columnHeaderView='{errorTable.getTableHeader()}'> <JTable id='errorTable' /> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2012-12-27 17:49:54 UTC (rev 112) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2012-12-27 17:52:49 UTC (rev 113) @@ -24,24 +24,50 @@ * #L% */ +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.PersistenceService; -import fr.ifremer.tutti.ui.swing.AbstractTuttiUIHandler; import fr.ifremer.tutti.ui.swing.TuttiScreen; import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.util.HydrologicCaracteristicUtil; +import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel; +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; +import fr.ifremer.tutti.ui.swing.util.table.TableRowModificationListener; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JComboBox; +import javax.swing.event.ListDataEvent; +import javax.swing.event.ListDataListener; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.TableColumnModel; +import jaxx.runtime.swing.editor.bean.BeanDoubleList; import jaxx.runtime.validator.swing.SwingValidatorMessageTableRenderer; import jaxx.runtime.validator.swing.SwingValidatorUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.table.DefaultTableColumnModelExt; +import org.nuiton.util.decorator.JXPathDecorator; + /** * TODO * * @author tchemit <chemit@codelutin.com> * @since 0.3 */ -public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUIModel> { +public class EditProtocolUIHandler extends AbstractTuttiTableUIHandler<EditProtocolSpeciesRowModel, EditProtocolUIModel> { /** Logger. */ private static final Log log = @@ -60,6 +86,12 @@ * @since 0.3 */ private final PersistenceService persistenceService; + + protected Map<String, Species> allSpecies; + + protected Map<String, Caracteristic> allLengthStepPmfm; + + protected Multimap<String, String> hydroCaracteristics; public EditProtocolUIHandler(TuttiUIContext context, EditProtocolUI ui) { super(context); @@ -68,6 +100,93 @@ } @Override + protected EditProtocolUIModel getModel() { + return ui.getModel(); + } + + @Override + protected JXTable getTable() { + return ui.getSpeciesTable(); + } + + @Override + protected AbstractTuttiTableModel<EditProtocolSpeciesRowModel> getTableModel() { + return (AbstractTuttiTableModel) getTable().getModel(); + } + + @Override + protected void onRowModified(EditProtocolSpeciesRowModel row, String propertyName, Object oldValue, Object newValue) { + log.info("onRowModified"); + ui.getModel().setModify(true); + } + + @Override + protected void onRowValidStateChanged(EditProtocolSpeciesRowModel row, Boolean oldValue, Boolean newValue) { + log.info("onRowValidStateChanged"); + } + + @Override + protected void onRowModifyStateChanged(EditProtocolSpeciesRowModel row, Boolean oldValue, Boolean newValue) { + log.info("onRowModifyStateChanged"); + } + + @Override + protected TableColumnModel createTableColumnModel() { + JXTable table = ui.getSpeciesTable(); + DecoratorService decoratorService = context.getService(DecoratorService.class); + JXPathDecorator<Caracteristic> decorator = + (JXPathDecorator<Caracteristic>) decoratorService.getDecoratorByType(Caracteristic.class); + DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + + { + + addColumnToModel(columnModel, + null, + newTableCellRender(Species.class), + EditProtocolSpeciesTableModel.SPECIES_ID); + } + + { + + addBooleanColumnToModel(columnModel, + EditProtocolSpeciesTableModel.SORTED_UNSORTED_ENABLED, + table); + } + + { + + addBooleanColumnToModel(columnModel, + EditProtocolSpeciesTableModel.SIZE_CATEGORY_ENABLED, + table); + } + + { + + addBooleanColumnToModel(columnModel, + EditProtocolSpeciesTableModel.SEX_ENABLED, + table); + } + + { + + addBooleanColumnToModel(columnModel, + EditProtocolSpeciesTableModel.MATURITY_ENABLED, + table); + } + + { + + addComboDataColumnToModel(columnModel, + EditProtocolSpeciesTableModel.SIZE_FRENQUENCY_PMFM_ID, + decorator, + Lists.newArrayList(allLengthStepPmfm.values())); + } + + + return columnModel; + } + + @Override public void beforeInitUI() { EditProtocolUIModel model = new EditProtocolUIModel(); @@ -93,6 +212,26 @@ } listModelIsModify(model); ui.setContextValue(model); + + List<Species> species = persistenceService.getAllSpecies(); + allSpecies = Maps.newHashMap(); + for (Species s : species) { + allSpecies.put(s.getId(), s); + } + + List<Caracteristic> lengthStepCaracteristics = + persistenceService.getAllSpeciesLengthStepCaracteristic(); + allLengthStepPmfm = Maps.newHashMap(); + for (Caracteristic c : lengthStepCaracteristics) { + allLengthStepPmfm.put(c.getId(), c); + } + + List<Caracteristic> hydrologyPmfm = persistenceService.getAllFishingOperationHydrologicCaracteristic(); + hydroCaracteristics = HashMultimap.create(); + for (Caracteristic caracteristic : hydrologyPmfm) { + String name = HydrologicCaracteristicUtil.getGlobalName(caracteristic.getName()); + hydroCaracteristics.put(name, caracteristic.getId()); + } } @Override @@ -106,20 +245,128 @@ new SwingValidatorMessageTableRenderer()); listenValidatorValid(ui.getValidator(), model); + + // Species + final JComboBox speciesCombo = ui.getNewSpeciesRowCombo(); + speciesCombo.setRenderer(newListCellRender(Species.class)); + speciesCombo.setModel(new DefaultComboBoxModel()); + for (Species species : allSpecies.values()) { + speciesCombo.addItem(species); + } + speciesCombo.getModel().addListDataListener(new ListDataListener() { + public void intervalAdded(ListDataEvent e) { + speciesCombo.setEnabled(true); + ui.getAddRow().setEnabled(true); + } + + public void intervalRemoved(ListDataEvent e) { + if (speciesCombo.getItemCount() == 0) { + speciesCombo.setEnabled(false); + ui.getAddRow().setEnabled(false); + } + } + + public void contentsChanged(ListDataEvent e) { + speciesCombo.setEnabled(true); + ui.getAddRow().setEnabled(true); + } + }); + + JXTable table = ui.getSpeciesTable(); + TableColumnModel columnModel = createTableColumnModel(); + EditProtocolSpeciesTableModel tableModel = + new EditProtocolSpeciesTableModel(columnModel); + + List<SpeciesProtocol> speciesProtocol = model.getSpecies(); + if (speciesProtocol == null) { + speciesProtocol = Lists.newArrayList(); + } + List<EditProtocolSpeciesRowModel> rows = Lists.newArrayList(); + for (SpeciesProtocol protocol : speciesProtocol) { + Species species = allSpecies.get(protocol.getSpeciesId()); + speciesCombo.removeItem(species); + EditProtocolSpeciesRowModel row = new EditProtocolSpeciesRowModel( + species, + allLengthStepPmfm.get(protocol.getSizeFrenquencyPmfmId())); + row.fromBean(protocol); + rows.add(row); + } + tableModel.setRows(rows, false); + table.setModel(tableModel); + table.setColumnModel(columnModel); + ListSelectionListener listener = new TableRowModificationListener<EditProtocolSpeciesRowModel>( + tableModel, getRowMonitor()) { + + @Override + protected void saveSelectedRow() { + TuttiBeanMonitor<EditProtocolSpeciesRowModel> monitor = getRowMonitor(); + EditProtocolSpeciesRowModel row = monitor.getBean(); + if (row != null && monitor.wasModified()) { + ui.getModel().setModify(true); + } + } + }; + table.getSelectionModel().addListSelectionListener(listener); + + // PMFM + List<Caracteristic> gearPmfm = persistenceService.getAllFishingOperationGearCaracteristic(); + initDoubleList(ui.getGearList(), gearPmfm, model.getGearPmfmId()); + List<Caracteristic> environmentPmfm = persistenceService.getAllFishingOperationEnvironmentCaracteristic(); + initDoubleList(ui.getEnvironmentList(), environmentPmfm, model.getEnvironmentPmfmId()); + //hydro + List<Caracteristic> selection = Lists.newArrayList(); + Collection<String> availableCaracteristicNames = hydroCaracteristics.keySet(); + List<Caracteristic> availableCaracteristics = Lists.newArrayList(); + for (String name : availableCaracteristicNames) { + Caracteristic caracteristic = HydrologicCaracteristicUtil.createGlobalCaracteristic(name); + availableCaracteristics.add(caracteristic); + } + List<String> hydrologyPmfm = model.getHydrologyPmfmId(); + if (hydrologyPmfm != null) { + for (String caracteristicName : availableCaracteristicNames) { + Collection<String> ids = hydroCaracteristics.get(caracteristicName); + for (String caracteristicId : hydrologyPmfm) { + if (ids.contains(caracteristicId)) { + Caracteristic caracteristic = HydrologicCaracteristicUtil.createGlobalCaracteristic(caracteristicName); + selection.add(caracteristic); + break; + } + } + } + } + DecoratorService decoratorService = + context.getService(DecoratorService.class); + JXPathDecorator<Caracteristic> decorator = + (JXPathDecorator<Caracteristic>) decoratorService.getDecoratorByType(Caracteristic.class); + ui.getHydrologyList().init(decorator, availableCaracteristics, selection); + // if new protocol can already cancel his creation model.setModify(model.isCreate()); } + + protected void initDoubleList(BeanDoubleList<Caracteristic> widget, + List<Caracteristic> availableCaracteristics, + List<String> selectedCaracteristics) { + List<Caracteristic> selection = Lists.newArrayList(); + if (selectedCaracteristics != null) { + for (Caracteristic caracteristic : availableCaracteristics) { + if (selectedCaracteristics.contains(caracteristic.getId())) { + selection.add(caracteristic); + } + } + } + DecoratorService decoratorService = + context.getService(DecoratorService.class); + JXPathDecorator<Caracteristic> decorator = + (JXPathDecorator<Caracteristic>) decoratorService.getDecoratorByType(Caracteristic.class); + widget.init(decorator, availableCaracteristics, selection); + } @Override public void onCloseUI() { } - @Override - protected EditProtocolUIModel getModel() { - return ui.getModel(); - } - public void cancel() { context.setScreen(TuttiScreen.SELECT_CRUISE); @@ -130,7 +377,25 @@ EditProtocolUIModel model = ui.getModel(); TuttiProtocol bean = model.toBean(); - + + // get the species protocols from the table + List<SpeciesProtocol> protocols = Lists.newArrayList(); + List<EditProtocolSpeciesRowModel> rows = + ((AbstractTuttiTableModel<EditProtocolSpeciesRowModel>)ui.getSpeciesTable().getModel()).getRows(); + for (EditProtocolSpeciesRowModel row : rows) { + SpeciesProtocol protocol = row.toBean(); + protocols.add(protocol); + } + bean.setSpecies(protocols); + + // split the hydro grouped pmfm + List<String> hydroPmfm = bean.getHydrologyPmfmId(); + List<String> allIds = Lists.newArrayList(); + for (String id : hydroPmfm) { + allIds.addAll(hydroCaracteristics.get(id)); + } + bean.setHydrologyPmfmId(allIds); + TuttiProtocol saved; if (TuttiEntities.isNew(bean)) { @@ -143,4 +408,18 @@ context.setScreen(TuttiScreen.SELECT_CRUISE); } + + public void addRow() { + JComboBox<Species> speciesCombo = ui.getNewSpeciesRowCombo(); + Species species = (Species) speciesCombo.getSelectedItem(); + EditProtocolSpeciesRowModel protocol = new EditProtocolSpeciesRowModel(species, null); + protocol.setMaturityEnabled(true); + protocol.setSizeCategoryEnabled(true); + protocol.setSexEnabled(true); + protocol.setSortedUnsortedEnabled(true); + + getTableModel().addNewRow(getTable().getRowCount(), protocol); + speciesCombo.removeItem(species); + ui.getModel().setModify(true); + } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java 2012-12-27 17:49:54 UTC (rev 112) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java 2012-12-27 17:52:49 UTC (rev 113) @@ -24,8 +24,12 @@ * #L% */ +import com.google.common.collect.Lists; +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; -import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; +import java.util.List; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; @@ -33,18 +37,34 @@ * @author tchemit <chemit@codelutin.com> * @since 0.3 */ -public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, EditProtocolUIModel> { +public class EditProtocolUIModel extends AbstractTuttiTableUIModel<TuttiProtocol, EditProtocolSpeciesRowModel, EditProtocolUIModel> { private static final long serialVersionUID = 1L; public static final String PROPERTY_COMMENT = "comment"; public static final String PROPERTY_NAME = "name"; + + public static final String PROPERTY_GEAR_PMFM_ID = "gearPmfmId"; + public static final String PROPERTY_ENVIRONMENT_PMFM_ID = "environmentPmfmId"; + + public static final String PROPERTY_HYDROLOGY_PMFM_ID = "hydrologyPmfmId"; + + public static final String PROPERTY_SPECIES = "species"; + protected String name; protected String comment; + + protected List<String> gearPmfmId; + protected List<String> environmentPmfmId; + + protected List<String> hydrologyPmfmId; + + protected List<SpeciesProtocol> species; + protected static Binder<EditProtocolUIModel, TuttiProtocol> toBeanBinder = BinderFactory.newBinder(EditProtocolUIModel.class, TuttiProtocol.class); @@ -77,4 +97,67 @@ firePropertyChange(PROPERTY_COMMENT, oldValue, comment); } + public List<String> getGearPmfmId() { + return gearPmfmId; + } + + public void setGearPmfmId(List<String> gearPmfmId) { + Object oldValue = getGearPmfmId(); + this.gearPmfmId = gearPmfmId; + firePropertyChange(PROPERTY_GEAR_PMFM_ID, oldValue, gearPmfmId); + } + + public void setGearPmfm(List<Caracteristic> gearPmfm) { + List<String> gearPmfmId = Lists.newArrayList(); + for (Caracteristic caracteristic : gearPmfm) { + gearPmfmId.add(caracteristic.getId()); + } + setGearPmfmId(gearPmfmId); + } + + public List<String> getEnvironmentPmfmId() { + return environmentPmfmId; + } + + public void setEnvironmentPmfmId(List<String> environmentPmfmId) { + Object oldValue = getEnvironmentPmfmId(); + this.environmentPmfmId = environmentPmfmId; + firePropertyChange(PROPERTY_ENVIRONMENT_PMFM_ID, oldValue, environmentPmfmId); + } + + public void setEnvironmentPmfm(List<Caracteristic> environmentPmfm) { + List<String> environmentPmfmId = Lists.newArrayList(); + for (Caracteristic caracteristic : environmentPmfm) { + environmentPmfmId.add(caracteristic.getId()); + } + setEnvironmentPmfmId(environmentPmfmId); + } + + public List<String> getHydrologyPmfmId() { + return hydrologyPmfmId; + } + + public void setHydrologyPmfmId(List<String> hydrologyPmfmId) { + Object oldValue = getHydrologyPmfmId(); + this.hydrologyPmfmId = hydrologyPmfmId; + firePropertyChange(PROPERTY_HYDROLOGY_PMFM_ID, oldValue, hydrologyPmfmId); + } + + public void setHydrologyPmfm(List<Caracteristic> hydrologyPmfm) { + List<String> hydrologyPmfmId = Lists.newArrayList(); + for (Caracteristic caracteristic : hydrologyPmfm) { + hydrologyPmfmId.add(caracteristic.getId()); + } + setHydrologyPmfmId(hydrologyPmfmId); + } + + public List<SpeciesProtocol> getSpecies() { + return species; + } + + public void setSpecies(List<SpeciesProtocol> species) { + Object oldValue = getSpecies(); + this.species = species; + firePropertyChange(PROPERTY_SPECIES, oldValue, species); + } } \ No newline at end of file Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/HydrologicCaracteristicUtil.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/HydrologicCaracteristicUtil.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/HydrologicCaracteristicUtil.java 2012-12-27 17:52:49 UTC (rev 113) @@ -0,0 +1,25 @@ + +package fr.ifremer.tutti.ui.swing.util; + +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; + +/** + * + * @author kmorin <kmorin@codelutin.com> + */ +public class HydrologicCaracteristicUtil { + + public static String getGlobalName(String name) { + if (name.charAt(name.length() - 2) == '_') { + name = name.substring(0, name.length() - 2); + } + return name; + } + + public static Caracteristic createGlobalCaracteristic(String name) { + Caracteristic caracteristic = new Caracteristic(); + caracteristic.setName(name); + caracteristic.setId(name); + return caracteristic; + } +} Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2012-12-27 17:49:54 UTC (rev 112) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2012-12-27 17:52:49 UTC (rev 113) @@ -146,6 +146,9 @@ tutti.label.tab.macroDechet=Macro déchets tutti.label.tab.observationIndividuel=Observations individuelles tutti.label.tab.plancton=Plancton +tutti.label.tab.protocol.info=Informations générales +tutti.label.tab.protocol.pmfm=PMFM +tutti.label.tab.protocol.species=Espèces tutti.label.tab.species=Espèces tutti.label.traitReminder=Trait \: %s tutti.legend.catch.benthos=Benthos @@ -228,6 +231,12 @@ tutti.table.plankton.batch.header.speciesByGenusCode=Espèce tutti.table.plankton.batch.header.toConfirm=A Confirmer tutti.table.plankton.batch.header.weight=Poids +tutti.table.protocol.species.header.maturity=Maturité +tutti.table.protocol.species.header.sex=Sexe +tutti.table.protocol.species.header.sizeCategory=Catégorie Taille +tutti.table.protocol.species.header.sizeFrequency=Fréquence Taile +tutti.table.protocol.species.header.sortedUnsorted=Vrac / Hors Vrac +tutti.table.protocol.species.header.speciesId=Espèce tutti.table.species.batch.header.age=Age tutti.table.species.batch.header.comment=Commentaire tutti.table.species.batch.header.computedNumber=Nombre calculé
participants (1)
-
kmorin@users.forge.codelutin.com