Author: tchemit Date: 2013-10-02 18:26:49 +0200 (Wed, 02 Oct 2013) New Revision: 1266 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/1266 Log: fixes #3333: [CAMPAGNE] pouvoir ajouter plusieur engins professionnels de m?\195?\170me type ?\195?\160 une campagne Added: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrder.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrderBean.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrders.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/caracteristics/GearCaracteristicListCellRenderer.java Removed: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/Gears.java Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceService.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/TuttiExportService.java trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/ValidationServiceTest.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditGearCaracteristicsAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/GearCaracteristicsEditorUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/SaveCruiseAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ViewGearCaracteristicsAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -24,6 +24,7 @@ * #L% */ +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; import fr.ifremer.tutti.persistence.entities.data.Attachment; @@ -421,7 +422,9 @@ @Transactional(readOnly = false) Cruise saveCruise(Cruise bean); - Gear getGearWithCaracteristics(Gear gear, Cruise cruise); + CaracteristicMap getGearCaracteristics(String cruiseId, + String gearId, + short rankOrder); @Transactional(readOnly = false) void saveGearCaracteristics(Gear gear, Cruise cruise); Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -31,6 +31,7 @@ import fr.ifremer.adagio.core.dao.technical.VersionNotFoundException; import fr.ifremer.adagio.core.service.technical.CacheService; import fr.ifremer.tutti.TuttiTechnicalException; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; @@ -562,8 +563,8 @@ } @Override - public Gear getGearWithCaracteristics(Gear gear, Cruise cruise) { - return cruiseService.getGearWithCaracteristics(gear, cruise); + public CaracteristicMap getGearCaracteristics(String cruiseId, String gearId, short rankOrder) { + return cruiseService.getGearCaracteristics(cruiseId, gearId, rankOrder); } @Override Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -24,6 +24,7 @@ * #L% */ +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; import fr.ifremer.tutti.persistence.entities.data.Attachment; @@ -360,7 +361,7 @@ } @Override - public Gear getGearWithCaracteristics(Gear gear, Cruise cruise) { + public CaracteristicMap getGearCaracteristics(String cruiseId, String gearId, short rankOrder) { throw notImplemented(); } Added: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrder.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrder.java (rev 0) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrder.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -0,0 +1,14 @@ +package fr.ifremer.tutti.persistence.entities.referential; + +import javax.annotation.Generated; + +@Generated(value = "org.nuiton.eugene.java.SimpleJavaBeanTransformer", date = "Wed Oct 02 14:29:49 CEST 2013") +public interface GearWithOriginalRankOrder extends Gear { + + String PROPERTY_ORIGINAL_RANK_ORDER = "originalRankOrder"; + + Short getOriginalRankOrder(); + + void setOriginalRankOrder(Short originalRankOrder); + +} //GearWithOriginalRankOrder Property changes on: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrder.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrderBean.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrderBean.java (rev 0) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrderBean.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -0,0 +1,38 @@ +package fr.ifremer.tutti.persistence.entities.referential; + +import org.apache.commons.lang3.ObjectUtils; + +import javax.annotation.Generated; + +@Generated(value = "org.nuiton.eugene.java.SimpleJavaBeanTransformer", date = "Wed Oct 02 14:23:47 CEST 2013") +public class GearWithOriginalRankOrderBean extends GearBean implements GearWithOriginalRankOrder { + + private static final long serialVersionUID = 1L; + + protected Short originalRankOrder; + + @Override + public Short getOriginalRankOrder() { + return originalRankOrder; + } + + @Override + public void setOriginalRankOrder(Short originalRankOrder) { + this.originalRankOrder = originalRankOrder; + } + + @Override + public boolean equals(Object o) { + boolean result = super.equals(o); + if (result) { + result = ObjectUtils.equals(rankOrder, ((GearWithOriginalRankOrder) o).getRankOrder()); + } + return result; + } + + @Override + public int hashCode() { + return super.hashCode() + 13 * (rankOrder == null ? 0 : rankOrder.hashCode()); + } + +} //GearWithOriginalRankOrderBean Property changes on: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrderBean.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrders.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrders.java (rev 0) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrders.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -0,0 +1,18 @@ +package fr.ifremer.tutti.persistence.entities.referential; + +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +import javax.annotation.Generated; + +@Generated(value = "org.nuiton.eugene.java.SimpleJavaBeanTransformer", date = "Wed Oct 02 14:29:49 CEST 2013") +public class GearWithOriginalRankOrders extends AbstractGearWithOriginalRankOrders { + + public static <BeanType extends GearWithOriginalRankOrder> BeanType newGearWithOriginalRankOrder(Gear source) { + Class<BeanType> sourceType = typeOfGearWithOriginalRankOrder(); + Binder<Gear,BeanType> binder = BinderFactory.newBinder(Gear.class, sourceType); + BeanType result = (BeanType) newGearWithOriginalRankOrder(); + binder.copy(source, result); + return result; + } +} //GearWithOriginalRankOrders Property changes on: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/GearWithOriginalRankOrders.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Deleted: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/Gears.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/Gears.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/Gears.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -1,65 +0,0 @@ -package fr.ifremer.tutti.persistence.entities.referential; - -/* - * #%L - * Tutti :: Persistence - * $Id$ - * $HeadURL:$ - * %% - * Copyright (C) 2012 - 2013 Ifremer - * %% - * 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 3 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, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import org.apache.commons.lang3.ObjectUtils; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; - -import javax.annotation.Generated; - -@Generated(value = "org.nuiton.eugene.java.SimpleJavaBeanTransformer", date = "Mon Sep 30 14:14:53 CEST 2013") -public class Gears extends AbstractGears { - - public static boolean equals(Gear g0, Gear g1) { - return ObjectUtils.equals(g0.getId(), g1.getId()) && ObjectUtils.equals(g0.getRankOrder(), g1.getRankOrder()); - } - - public static Gear newGearWithRankOrder(Gear gear) { - Binder<Gear, Gear> binder = BinderFactory.newBinder(Gear.class); - GearBean2 result = new GearBean2(); - binder.copy(gear, result); - return result; - } - - - public static class GearBean2 extends GearBean { - - @Override - public boolean equals(Object o) { - boolean result = super.equals(o); - if (result) { - result = ObjectUtils.equals(rankOrder, ((GearBean2) o).rankOrder); - } - return result; - } - - @Override - public int hashCode() { - return super.hashCode() + 13 * (rankOrder == null ? 0 : rankOrder.hashCode()); - } - - } -} //Gears Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceService.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceService.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceService.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -25,6 +25,7 @@ */ import fr.ifremer.tutti.persistence.TuttiPersistenceServiceImplementor; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.referential.Gear; import org.springframework.transaction.annotation.Transactional; @@ -50,7 +51,7 @@ @Transactional(readOnly = false) Cruise saveCruise(Cruise bean); - Gear getGearWithCaracteristics(Gear gear, Cruise cruise); + CaracteristicMap getGearCaracteristics(String cruiseId, String gearId, short rankOrder); @Transactional(readOnly = false) void saveGearCaracteristics(Gear gear, Cruise cruise); Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -68,6 +68,8 @@ import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrder; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrders; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.Vessel; @@ -226,11 +228,12 @@ "cruiseId", IntegerType.INSTANCE, Integer.valueOf(id), "pmfmIdTrawlNet", IntegerType.INSTANCE, enumeration.PMFM_ID_MULTIRIG_NUMBER); - List<Gear> gears = Lists.newArrayList(); + List<GearWithOriginalRankOrder> gears = Lists.newArrayList(); int maxMultirigNumberFound = 0; while (list.hasNext()) { Object[] gearRow = list.next(); - Gear target = referentialService.getGear((Integer) gearRow[0]); + Gear simpleGear = referentialService.getGear((Integer) gearRow[0]); + GearWithOriginalRankOrder target = GearWithOriginalRankOrders.newGearWithOriginalRankOrder(simpleGear); target.setRankOrder((Short) gearRow[1]); Float multirigNumber = (Float) gearRow[2]; if (multirigNumber != null && multirigNumber.intValue() > maxMultirigNumberFound) { @@ -329,30 +332,22 @@ } @Override - public Gear getGearWithCaracteristics(Gear gear, Cruise cruise) { - Preconditions.checkNotNull(cruise); - Preconditions.checkNotNull(cruise.getId(), "Cruise 'id' must not be null or empty"); - Preconditions.checkNotNull(gear); - Preconditions.checkNotNull(gear.getId(), "Gear 'id' must not be null or empty"); + public CaracteristicMap getGearCaracteristics(String cruiseId, + String gearId, + short rankOrder) { + Preconditions.checkNotNull(cruiseId, "Cruise 'id' must not be null or empty"); + Preconditions.checkNotNull(gearId, "Gear 'id' must not be null or empty"); - short rankOrder; - - if (gear.getRankOrder() == null) { - rankOrder = 1; - } else { - rankOrder = gear.getRankOrder(); - } - if (log.isInfoEnabled()) { - log.info("Get caracteristic for gear " + gear.getIdAsInt() + " - " + rankOrder); + log.info("Get caracteristic for gear " + gearId + " - " + rankOrder); } CaracteristicMap result = new CaracteristicMap(); Iterator<GearPhysicalMeasurement> list = queryListTyped( "gearCaracteristics", - "cruiseId", IntegerType.INSTANCE, cruise.getIdAsInt(), - "gearId", IntegerType.INSTANCE, gear.getIdAsInt(), + "cruiseId", IntegerType.INSTANCE, Integer.valueOf(cruiseId), + "gearId", IntegerType.INSTANCE, Integer.valueOf(gearId), "rankOrder", ShortType.INSTANCE, rankOrder); while (list.hasNext()) { @@ -381,9 +376,7 @@ result.put(caracteristic, value); } } - - gear.setCaracteristics(result); - return gear; + return result; } @Override @@ -566,9 +559,31 @@ short gearRankOrder = 1; // Create or update a geaPhysicalFeatures for each gears in the cruise - for (Gear gear : source.getGear()) { + for (GearWithOriginalRankOrder gear : source.getGear()) { + Short rankOrder = gear.getRankOrder(); - GearPhysicalFeatures guf = gearPhysicalFeaturesDao.getGearPhysicalfeatures(fishingTrip, gear.getIdAsInt(), rankOrder, true); + + GearPhysicalFeatures guf; + + // try first to get the guf with originalRankOrder + guf = gearPhysicalFeaturesDao.getGearPhysicalfeatures(fishingTrip, gear.getIdAsInt(), gear.getOriginalRankOrder(), false); + + if (guf == null) { + + // try with new rankOrder + // in facts, only means create a new one + guf = gearPhysicalFeaturesDao.getGearPhysicalfeatures(fishingTrip, gear.getIdAsInt(), rankOrder, true); + if (log.isInfoEnabled()) { + log.info("Will create guf: " + guf.getId() + " for gear: " + gear.getId() + " - " + gear.getRankOrder()); + } + } else { + + // got an old guf to update + if (log.isInfoEnabled()) { + log.info("Will update guf: " + guf.getId() + " for gear: " + gear.getId() + " - " + gear.getOriginalRankOrder() + ", new rankOrder: " + gear.getRankOrder()); + } + } + notChangedGearPhysicalFeatures.remove(guf); guf.setStartDate(fishingTrip.getDepartureDateTime()); Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -70,7 +70,7 @@ import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType; import fr.ifremer.tutti.persistence.entities.referential.Gear; -import fr.ifremer.tutti.persistence.entities.referential.Gears; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrders; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.Vessel; @@ -160,10 +160,8 @@ public int getFishingOperationCount(String cruiseId) { Preconditions.checkNotNull(cruiseId); Iterator<Object[]> list = queryList( - "allFishingOperations", - "cruiseId", IntegerType.INSTANCE, Integer.valueOf(cruiseId), - "pmfmIdStationNumber", IntegerType.INSTANCE, enumeration.PMFM_ID_STATION_NUMBER, - "pmfmIdMultirigAggregation", IntegerType.INSTANCE, enumeration.PMFM_ID_MULTIRIG_AGGREGATION + "allFishingOperationIds", + "cruiseId", IntegerType.INSTANCE, Integer.valueOf(cruiseId) ); int result = 0; while (list.hasNext()) { @@ -320,9 +318,13 @@ Gear gear = referentialService.getGear(gearId); Preconditions.checkNotNull(gear); // use a copy of it with rankOrder - Gear toSet = Gears.newGear(gear); + Gear toSet = GearWithOriginalRankOrders.newGearWithOriginalRankOrder(gear); toSet.setRankOrder(rankOrder); + if (log.isInfoEnabled()) { + log.info("FishingOperation: " + id + ", use gear: " + gearId + " - " + rankOrder); + } + result.setGear(toSet); } Modified: trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo =================================================================== (Binary files differ) Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -34,6 +34,7 @@ import fr.ifremer.tutti.persistence.TuttiPersistence; import fr.ifremer.tutti.persistence.TuttiPersistenceNoDbImpl; import fr.ifremer.tutti.persistence.config.TuttiPersistenceConfig; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; @@ -885,10 +886,15 @@ } @Override - public Gear getGearWithCaracteristics(Gear gear, Cruise cruise) { - return driver.getGearWithCaracteristics(gear, cruise); + public CaracteristicMap getGearCaracteristics(String cruiseId, String gearId, short rankOrder) { + return driver.getGearCaracteristics(cruiseId, gearId, rankOrder); } +// @Override +// public Gear getGearWithCaracteristics(Gear gear, short rankOrder, Cruise cruise) { +// return driver.getGearWithCaracteristics(gear, rankOrder, cruise); +// } + @Override public void saveGearCaracteristics(Gear gear, Cruise cruise) { driver.saveGearCaracteristics(gear, cruise); Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/TuttiExportService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/TuttiExportService.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/TuttiExportService.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -33,6 +33,7 @@ import fr.ifremer.tutti.TuttiIOUtil; import fr.ifremer.tutti.TuttiTechnicalException; import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.BatchContainer; import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; @@ -45,6 +46,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.Gears; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.service.AbstractTuttiService; @@ -364,7 +366,14 @@ for (Gear gear : cruise.getGear()) { - Gear gearWithCaracteristics = persistenceService.getGearWithCaracteristics(gear, cruise); + CaracteristicMap caracteristics = + persistenceService.getGearCaracteristics( + cruise.getId(), + gear.getId(), + gear.getRankOrder()); + + Gear gearWithCaracteristics = Gears.newGear(gear); + gearWithCaracteristics.setCaracteristics(caracteristics); exportContext.gearCaracteristicsModel.prepareRows(rows, cruise, gearWithCaracteristics); } Modified: trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/ValidationServiceTest.java =================================================================== --- trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/ValidationServiceTest.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/ValidationServiceTest.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -32,7 +32,7 @@ import fr.ifremer.tutti.persistence.entities.data.Programs; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; -import fr.ifremer.tutti.persistence.entities.referential.Gears; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrders; import fr.ifremer.tutti.persistence.entities.referential.Persons; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocations; @@ -86,7 +86,7 @@ c.setReturnLocation(TuttiLocations.newTuttiLocation()); c.setProgram(Programs.newProgram()); c.setVessel(Vessels.newVessel()); - c.setGear(Lists.newArrayList(Gears.newGear())); + c.setGear(Lists.newArrayList(GearWithOriginalRankOrders.newGearWithOriginalRankOrder())); c.setHeadOfMission(Lists.newArrayList(Persons.newPerson())); c.setHeadOfSortRoom(Lists.newArrayList(Persons.newPerson())); assertIsValid(service.validateCruise(c)); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -31,7 +31,8 @@ import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.referential.Gear; -import fr.ifremer.tutti.persistence.entities.referential.Gears; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrder; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrders; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.Vessel; import fr.ifremer.tutti.service.DecoratorService; @@ -39,6 +40,8 @@ import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; import fr.ifremer.tutti.ui.swing.util.CloseableUI; import fr.ifremer.tutti.ui.swing.util.TuttiUI; +import jaxx.runtime.JAXXUtil; +import jaxx.runtime.context.JAXXContextEntryDef; import jaxx.runtime.swing.editor.bean.BeanDoubleListModel; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.logging.Log; @@ -122,6 +125,16 @@ model.fromBean(cruise); + if (!model.isGearEmpty()) { + + // load gear caracteristics + set originalRankOrder + for (GearWithOriginalRankOrder gear : model.getGear()) { + + // original rank order is the incoming rank order + gear.setOriginalRankOrder(gear.getRankOrder()); + } + } + // load attachments List<Attachment> attachments = persistenceService.getAllAttachments( model.getObjectType(), model.getObjectId()); @@ -256,14 +269,20 @@ @Override public void addToSelected(Gear item) { - Gear target = Gears.newGearWithRankOrder(item); - // rank order = position in list - int rankOrder = getSelectedListSize(); - target.setRankOrder((short) rankOrder); - if (log.isInfoEnabled()) { - log.info("Add to selected " + target.getRankOrder() + " - " + target.getName()); + // always use a copy (with original rank order) + GearWithOriginalRankOrder target = + GearWithOriginalRankOrders.newGearWithOriginalRankOrder(item); + + Short originalRankOrder = null; + + if (item instanceof GearWithOriginalRankOrder) { + // take the incoming original rank order + originalRankOrder = ((GearWithOriginalRankOrder) item).getOriginalRankOrder(); } - + if (originalRankOrder == null) { + originalRankOrder = 0; + } + target.setOriginalRankOrder(originalRankOrder); super.addToSelected(target); rebuildRankOrder(); } @@ -312,7 +331,7 @@ }); initBeanList(ui.getGearList(), allGearList, - model.getGear(), + (List) model.getGear(), getDecorator(Gear.class, DecoratorService.GEAR_WITH_RANK_ORDER)); // add more actions on selected gear popup @@ -346,7 +365,7 @@ jList.clearSelection(); } - Gear gear = (Gear) jList.getSelectedValue(); + GearWithOriginalRankOrder gear = (GearWithOriginalRankOrder) jList.getSelectedValue(); updateGearActionsAndShowPoup(gear, jList, e.getX(), e.getY()); } @@ -372,7 +391,7 @@ Point p = new Point(r.x + r.width / 2, r.y + r.height); Object[] gears = source.getSelectedValues(); - Gear gear = gears != null && gears.length == 1 ? (Gear) gears[0] : null; + GearWithOriginalRankOrder gear = gears != null && gears.length == 1 ? (GearWithOriginalRankOrder) gears[0] : null; updateGearActionsAndShowPoup(gear, source, p.x, p.y); } } @@ -437,17 +456,21 @@ model.setName(name); } - protected void updateGearActionsAndShowPoup(Gear gear, + public static final JAXXContextEntryDef<GearWithOriginalRankOrder> GEAR_EDIT_CONTEXT = + JAXXUtil.newContextEntryDef("editGear", GearWithOriginalRankOrder.class); + + protected void updateGearActionsAndShowPoup(GearWithOriginalRankOrder gear, JComponent source, int x, int y) { boolean editMenuEnabled = false; boolean viewMenuEnabled = false; if (gear != null) { - editMenuEnabled = !getModel().isCreate() && !getModel().isModify() - && (!gear.isScientificGear() || persistenceService.isTemporary(gear)); + editMenuEnabled = !getModel().isCreate() && + !getModel().isModify() && + (!gear.isScientificGear() || persistenceService.isTemporary(gear)); viewMenuEnabled = true; - ui.setContextValue(gear); + GEAR_EDIT_CONTEXT.setContextValue(ui, gear); } getModel().setCanEditGearCatacteristic(editMenuEnabled); getModel().setCanShowGearCatacteristic(viewMenuEnabled); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -30,7 +30,7 @@ import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.Cruises; import fr.ifremer.tutti.persistence.entities.data.Program; -import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrder; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.Vessel; @@ -356,12 +356,12 @@ } @Override - public List<Gear> getGear() { + public List<GearWithOriginalRankOrder> getGear() { return editObject.getGear(); } @Override - public void setGear(List<Gear> gear) { + public void setGear(List<GearWithOriginalRankOrder> gear) { editObject.setGear(gear); firePropertyChange(PROPERTY_GEAR, null, gear); } @@ -389,46 +389,48 @@ } @Override - public Gear getGear(int index) { - return null; + public GearWithOriginalRankOrder getGear(int index) { + return editObject.getGear(index); } @Override public boolean isGearEmpty() { - return false; + return editObject.isGearEmpty(); } @Override public int sizeGear() { - return 0; + return editObject.sizeGear(); } @Override - public void addGear(Gear gear) { + public void addGear(GearWithOriginalRankOrder gear) { + editObject.addGear(gear); } @Override - public void addAllGear(Collection<Gear> gear) { + public void addAllGear(Collection<GearWithOriginalRankOrder> gear) { + editObject.addAllGear(gear); } @Override - public boolean removeGear(Gear gear) { - return false; + public boolean removeGear(GearWithOriginalRankOrder gear) { + return editObject.removeGear(gear); } @Override - public boolean removeAllGear(Collection<Gear> gear) { - return false; + public boolean removeAllGear(Collection<GearWithOriginalRankOrder> gear) { + return editObject.removeAllGear(gear); } @Override - public boolean containsGear(Gear gear) { - return false; + public boolean containsGear(GearWithOriginalRankOrder gear) { + return editObject.containsGear(gear); } @Override - public boolean containsAllGear(Collection<Gear> gear) { - return false; + public boolean containsAllGear(Collection<GearWithOriginalRankOrder> gear) { + return editObject.containsAllGear(gear); } @Override Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditGearCaracteristicsAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditGearCaracteristicsAction.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditGearCaracteristicsAction.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -24,8 +24,9 @@ * #L% */ -import fr.ifremer.tutti.persistence.entities.referential.Gear; -import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrder; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrders; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; import org.apache.commons.logging.Log; @@ -53,13 +54,24 @@ GearCaracteristicsEditorUI editor = getUI().getGearCaracteristicsEditor(); editor.getModel().setEditable(true); - Gear gear = getUI().getContextValue(Gear.class); - gear = persistenceService.getGearWithCaracteristics(gear, getDataContext().getCruise()); + GearWithOriginalRankOrder gear = + EditCruiseUIHandler.GEAR_EDIT_CONTEXT.getContextValue(getUI()); + CaracteristicMap caracteristics = + persistenceService.getGearCaracteristics( + getDataContext().getCruise().getId(), + gear.getId(), + gear.getOriginalRankOrder()); + + GearWithOriginalRankOrder gearToView = + GearWithOriginalRankOrders.newGearWithOriginalRankOrder(gear); + gearToView.setCaracteristics(caracteristics); + if (log.isInfoEnabled()) { - log.info("Will edit gear " + decorate(gear, DecoratorService.GEAR_WITH_RANK_ORDER)); + log.info("Will edit gear " + decorate(gearToView) + + " with " + gearToView.getCaracteristics().size() + " caracteristics."); } - editor.getModel().setGear(gear); + editor.getModel().setGear(gearToView); getUI().getMainPanelLayout().setSelected(EditCruiseUIHandler.GEAR_CARACTERISTICS_CARD); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/GearCaracteristicsEditorUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/GearCaracteristicsEditorUIHandler.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/GearCaracteristicsEditorUIHandler.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -91,10 +91,20 @@ @Override protected void onAfterSelectedRowChanged(int oldRowIndex, GearCaracteristicsEditorRowModel oldRow, int newRowIndex, GearCaracteristicsEditorRowModel newRow) { super.onAfterSelectedRowChanged(oldRowIndex, oldRow, newRowIndex, newRow); - getModel().setRemoveCaracteristicEnabled(newRowIndex >= 0); + if (newRow != null) { + recomputeRowValidState(newRow); + } +// getModel().setRemoveCaracteristicEnabled(newRowIndex >= 0); } @Override + protected void beforeOpenPopup(int rowIndex, int columnIndex) { + super.beforeOpenPopup(rowIndex, columnIndex); + + getModel().setRemoveCaracteristicEnabled(rowIndex != -1); + } + + @Override protected void saveSelectedRowIfRequired(TuttiBeanMonitor<GearCaracteristicsEditorRowModel> rowMonitor, GearCaracteristicsEditorRowModel row) { if (row.isValid()) { @@ -115,7 +125,8 @@ @Override public void beforeInitUI() { - GearCaracteristicsEditorUIModel model = createModel(); + GearCaracteristicsEditorUIModel model = + new GearCaracteristicsEditorUIModel(); getUI().setContextValue(model); model.addPropertyChangeListener(GearCaracteristicsEditorUIModel.PROPERTY_GEAR, new PropertyChangeListener() { @@ -205,10 +216,6 @@ return ui.getNewRowKey(); } - protected GearCaracteristicsEditorUIModel createModel() { - return new GearCaracteristicsEditorUIModel(); - } - protected void saveRow(GearCaracteristicsEditorRowModel row) { if (row.isValid()) { @@ -296,6 +303,8 @@ if (caracteristicMap == null) { caracteristicMap = new CaracteristicMap(); } + // always clear caracteristic map before all + model.getCaracteristicMap().clear(); model.getCaracteristicMap().putAll(caracteristicMap); List<GearCaracteristicsEditorRowModel> rows = Lists.newArrayList(); @@ -326,6 +335,10 @@ keyCombo.getHandler().reset(); model.setModify(false); + } else { + cleanrRowMonitor(); + getModel().setRows(Lists.<GearCaracteristicsEditorRowModel>newArrayList()); + getTable().clearSelection(); } } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/SaveCruiseAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/SaveCruiseAction.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/SaveCruiseAction.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -26,6 +26,7 @@ import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrder; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; @@ -97,6 +98,10 @@ context.setProgramId(saved.getProgram().getId()); context.setCruiseId(saved.getId()); + // update originalRankOrder for all gears of the cruise + for (GearWithOriginalRankOrder gear : model.getGear()) { + gear.setOriginalRankOrder(gear.getRankOrder()); + } model.setModify(false); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ViewGearCaracteristicsAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ViewGearCaracteristicsAction.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ViewGearCaracteristicsAction.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -24,8 +24,9 @@ * #L% */ -import fr.ifremer.tutti.persistence.entities.referential.Gear; -import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrder; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrders; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; import org.apache.commons.logging.Log; @@ -53,14 +54,25 @@ GearCaracteristicsEditorUI editor = getUI().getGearCaracteristicsEditor(); editor.getModel().setEditable(false); - Gear gear = getUI().getContextValue(Gear.class); - gear = persistenceService.getGearWithCaracteristics(gear, getDataContext().getCruise()); + GearWithOriginalRankOrder gear = + EditCruiseUIHandler.GEAR_EDIT_CONTEXT.getContextValue(getUI()); + CaracteristicMap caracteristics = + persistenceService.getGearCaracteristics( + getDataContext().getCruise().getId(), + gear.getId(), + gear.getOriginalRankOrder()); + + GearWithOriginalRankOrder gearToEdit = + GearWithOriginalRankOrders.newGearWithOriginalRankOrder(gear); + gearToEdit.setCaracteristics(caracteristics); + if (log.isInfoEnabled()) { - log.info("Will view gear " + decorate(gear, DecoratorService.GEAR_WITH_RANK_ORDER)); + log.info("Will edit gear " + decorate(gearToEdit) + + " with " + gearToEdit.getCaracteristics().size() + " caracteristics."); } - editor.getModel().setGear(gear); + editor.getModel().setGear(gearToEdit); getUI().getMainPanelLayout().setSelected(EditCruiseUIHandler.GEAR_CARACTERISTICS_CARD); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -26,6 +26,7 @@ import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.InvalidBatchModelException; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; @@ -34,7 +35,7 @@ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.FishingOperations; import fr.ifremer.tutti.persistence.entities.referential.Gear; -import fr.ifremer.tutti.persistence.entities.referential.Gears; +import fr.ifremer.tutti.persistence.entities.referential.GearWithOriginalRankOrders; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.service.PersistenceService; @@ -349,19 +350,19 @@ log.info("Edit in ui fishingOperation: " + fishingOperation); } - // get the rankorder of the gear from cruise gears - Gear gear = fishingOperation == null ? null : fishingOperation.getGear(); - if (gear != null) { - Gear newGear = Gears.newGearWithRankOrder(gear); - fishingOperation.setGear(newGear); - Cruise cruise = getDataContext().getCruise(); - for (Gear cruiseGear : cruise.getGear()) { - if (Gears.equals(cruiseGear, newGear)) { - newGear.setRankOrder(cruiseGear.getRankOrder()); - break; - } - } - } +// // get the rankorder of the gear from cruise gears +// Gear gear = fishingOperation == null ? null : fishingOperation.getGear(); +// if (gear != null) { +// Gear newGear = Gears.newGearWithRankOrder(gear); +// fishingOperation.setGear(newGear); +// Cruise cruise = getDataContext().getCruise(); +// for (Gear cruiseGear : cruise.getGear()) { +// if (Gears.equals(cruiseGear, newGear)) { +// newGear.setRankOrder(cruiseGear.getRankOrder()); +// break; +// } +// } +// } // now fishing operation is edited model.setEditFishingOperation(fishingOperation); @@ -459,8 +460,16 @@ // add a equals on id + rankOrder List<Gear> gears = Lists.newArrayList(); for (Gear gear : cruise.getGear()) { - Gear gearWithCaracteristics = persistenceService.getGearWithCaracteristics(gear, cruise); - gears.add(Gears.newGearWithRankOrder(gearWithCaracteristics)); + CaracteristicMap caracteristics = + persistenceService.getGearCaracteristics( + cruise.getId(), + gear.getId(), + gear.getRankOrder()); + + Gear toKeep = GearWithOriginalRankOrders.newGearWithOriginalRankOrder(gear); + toKeep.setCaracteristics(caracteristics); + + gears.add(toKeep); } ui.getGearComboBox().setData(gears); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -39,7 +39,6 @@ import fr.ifremer.tutti.persistence.entities.referential.Vessel; import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.PersistenceService; -import fr.ifremer.tutti.service.TuttiCsvUtil; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.fishing.AbstractCaracteristicTabUIModel; import fr.ifremer.tutti.ui.swing.content.operation.fishing.GearUseFeatureTabUIModel; @@ -49,6 +48,7 @@ import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; +import fr.ifremer.tutti.ui.swing.util.caracteristics.GearCaracteristicListCellRenderer; import fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.collections.CollectionUtils; @@ -56,8 +56,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXDatePicker; -import org.nuiton.csv.ValueFormatter; -import org.nuiton.decorator.Decorator; import javax.swing.JButton; import javax.swing.JComboBox; @@ -71,7 +69,6 @@ import java.awt.event.ItemListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.io.Serializable; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -273,7 +270,13 @@ null, DecoratorService.GEAR_WITH_RANK_ORDER); - final JComboBox combobox = ui.getGearComboBox().getCombobox(); + + JComboBox combobox = ui.getGearComboBox().getCombobox(); + combobox.setRenderer(new GearCaracteristicListCellRenderer( + combobox.getRenderer(), + getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT), + getDecorator(Gear.class, DecoratorService.GEAR_WITH_RANK_ORDER), + true)); combobox.addItemListener(new ItemListener() { Map<Gear, String> tips = Maps.newHashMap(); @@ -281,52 +284,23 @@ public void itemStateChanged(ItemEvent e) { Object item = e.getItem(); if (e.getStateChange() == ItemEvent.SELECTED) { - if (log.isInfoEnabled()) { - log.info("itemStateChanged selected " + item + " - " + (item != null ? item.getClass() : null)); + if (log.isDebugEnabled()) { + log.debug("itemStateChanged selected " + item + " - " + (item != null ? item.getClass() : null)); } - JComponent jC = (JComponent) combobox.getEditor().getEditorComponent(); - String toolTipText; + JComboBox combo = (JComboBox) e.getSource(); + JComponent jC = (JComponent) combo.getEditor().getEditorComponent(); - if (item == null) { - toolTipText = ""; - } else { + GearCaracteristicListCellRenderer renderer = (GearCaracteristicListCellRenderer) combo.getRenderer(); - Gear gear = (Gear) item; + String toolTipText = renderer.getToolTipText((Gear) item); - if (tips.containsKey(gear)) { - - toolTipText = tips.get(gear); - } else { - - Decorator<Caracteristic> decorator = getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT); - ValueFormatter<Serializable> caracteristicValueFormatter = TuttiCsvUtil.CARACTERISTIC_VALUE_FORMATTER; - StringBuilder sb = new StringBuilder("<html><body>"); - if (gear.getCaracteristics() != null && !gear.getCaracteristics().isEmpty() ) { - - // got some caracteristics - sb.append("<ul>"); - for (Map.Entry<Caracteristic, Serializable> entry : gear.getCaracteristics().entrySet()) { - Caracteristic key = entry.getKey(); - String keyStr = decorator.toString(key); - Serializable value = entry.getValue(); - String valueStr = caracteristicValueFormatter.format(value); - sb.append("<li><strong>").append(keyStr).append("</strong> :"); - sb.append(valueStr).append("</li>"); - } - sb.append("</ul>"); - } else { - - sb.append("<i>").append("Pas de caractéristiques").append("</i>"); - } - sb.append("</body></html>"); - - toolTipText = sb.toString(); - tips.put(gear, toolTipText); - } - } - jC.setToolTipText(toolTipText); + } else { + JComboBox combo = (JComboBox) e.getSource(); + JComponent jC = (JComponent) combo.getEditor().getEditorComponent(); + + jC.setToolTipText(null); } } }); @@ -713,4 +687,5 @@ getModel().removeAllAttachment(getModel().getAttachment()); getModel().addAllAttachment(attachments); } + } Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/caracteristics/GearCaracteristicListCellRenderer.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/caracteristics/GearCaracteristicListCellRenderer.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/caracteristics/GearCaracteristicListCellRenderer.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -0,0 +1,120 @@ +package fr.ifremer.tutti.ui.swing.util.caracteristics; + +import com.google.common.collect.Maps; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.service.TuttiCsvUtil; +import org.apache.commons.collections.MapUtils; +import org.nuiton.csv.ValueFormatter; +import org.nuiton.decorator.Decorator; + +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.ListCellRenderer; +import java.awt.Component; +import java.io.Serializable; +import java.util.Map; + +import static org.nuiton.i18n.I18n._; + +/** + * Created on 10/2/13. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 2.7 + */ +public class GearCaracteristicListCellRenderer implements ListCellRenderer { + + private final ListCellRenderer delegate; + + private final Decorator<Caracteristic> decorator; + + private final Decorator<Gear> gearDecorator; + + protected final Map<Gear, String> cache; + + protected final boolean useCache; + + public GearCaracteristicListCellRenderer(ListCellRenderer delegate, + Decorator<Caracteristic> decorator, + Decorator<Gear> gearDecorator, boolean useCache) { + this.gearDecorator = gearDecorator; + this.useCache = useCache; + this.delegate = delegate; + this.decorator = decorator; + this.cache = Maps.newHashMap(); + } + + public void clear() { + cache.clear(); + } + + @Override + public Component getListCellRendererComponent(JList list, + Object item, + int index, + boolean isSelected, + boolean cellHasFocus) { + + String toolTipText = getToolTipText((Gear) item); + + Component result = delegate.getListCellRendererComponent(list, item, index, isSelected, cellHasFocus); + ((JComponent) result).setToolTipText(toolTipText); + return result; + } + + public String getToolTipText(Gear gear) { + String toolTipText; + + if (gear == null) { + toolTipText = ""; + } else { + + if (useCache) { + if (cache.containsKey(gear)) { + + toolTipText = cache.get(gear); + } else { + toolTipText = buildTip(gear); + cache.put(gear, toolTipText); + } + } else { + toolTipText = buildTip(gear); + } + } + return toolTipText; + } + + protected String buildTip(Gear gear) { + String toolTipText; + + ValueFormatter<Serializable> caracteristicValueFormatter = TuttiCsvUtil.CARACTERISTIC_VALUE_FORMATTER; + StringBuilder sb = new StringBuilder("<html><body>"); + + String gearStr = gearDecorator.toString(gear); + sb.append("<h3>").append(_("tutti.gear.withCaracteristics", gearStr)).append("</h3></hr>"); + + if (MapUtils.isNotEmpty(gear.getCaracteristics())) { + + // got some caracteristics + + sb.append("<ul>"); + for (Map.Entry<Caracteristic, Serializable> entry : gear.getCaracteristics().entrySet()) { + Caracteristic key = entry.getKey(); + String keyStr = decorator.toString(key); + Serializable value = entry.getValue(); + String valueStr = caracteristicValueFormatter.format(value); + sb.append("<li>").append(keyStr).append(" :"); + sb.append(valueStr).append("</strong></li>"); + } + sb.append("</ul>"); + } else { + + sb.append("<i>").append(_("tutti.gear.noCaracteristics")).append("</i>"); + } + sb.append("</body></html>"); + + toolTipText = sb.toString(); + return toolTipText; + } +} Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/caracteristics/GearCaracteristicListCellRenderer.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java 2013-10-02 10:08:19 UTC (rev 1265) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java 2013-10-02 16:26:49 UTC (rev 1266) @@ -353,40 +353,42 @@ // need this for the first modification when no selection, // otherwise monitor is set after the first alter, so won't be // save directly... - //if (!e.getValueIsAdjusting()) { - ListSelectionModel source = (ListSelectionModel) e.getSource(); + if (!e.getValueIsAdjusting()) { + ListSelectionModel source = (ListSelectionModel) e.getSource(); - int oldRowIndex = selectedRowIndex; - int newRowIndex = source.getLeadSelectionIndex(); - if (oldRowIndex == newRowIndex) { - return; - } - R oldRow = rowMonitor.getBean(); + int oldRowIndex = selectedRowIndex; + int newRowIndex = source.getLeadSelectionIndex(); + boolean skip = rowMonitor.getBean() != null && + oldRowIndex == newRowIndex; + if (skip) { + return; + } + R oldRow = rowMonitor.getBean(); - R newRow; + R newRow; - if (source.isSelectionEmpty()) { + if (source.isSelectionEmpty()) { - newRow = null; - } else { - newRow = getTableModel().getEntry(newRowIndex); - } + newRow = null; + } else { + newRow = getTableModel().getEntry(newRowIndex); + } - // save selected entry if required + // save selected entry if required // saveSelectedRowIfNeeded(); - if (log.isDebugEnabled()) { - log.debug("Will monitor entry: " + newRow); - } - rowMonitor.setBean(newRow); + if (log.isDebugEnabled()) { + log.debug("Will monitor entry: " + newRow); + } + rowMonitor.setBean(newRow); - selectedRowIndex = newRowIndex; + selectedRowIndex = newRowIndex; - onAfterSelectedRowChanged(oldRowIndex, - oldRow, - selectedRowIndex, - rowMonitor.getBean()); - //} + onAfterSelectedRowChanged(oldRowIndex, + oldRow, + selectedRowIndex, + rowMonitor.getBean()); + } } };