r77 - in trunk: tutti-persistence/src/main/java/fr/ifremer/tutti/persistence tutti-persistence/src/main/resources/META-INF/services tutti-persistence/src/main/xmi tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence tutti-service/src/main/java/fr/ifremer/tutti/service tutti-service/src/main/resources/i18n tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing
Author: tchemit Date: 2012-12-15 17:05:45 +0100 (Sat, 15 Dec 2012) New Revision: 77 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/77 Log: add new entities (macroWasteCategory, SortedUnsortedCategory) improve batch handler design add filter on batch tables improve longtext editor improve attachment editor Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/AbstractTuttiBatchTableUIHandler.java trunk/tutti-ui-swing/src/main/resources/icons/action-edit-attachment.png trunk/tutti-ui-swing/src/main/resources/icons/action-edit-comment.png Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevFixtures.java trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java trunk/tutti-persistence/src/main/resources/META-INF/services/fr.ifremer.tutti.persistence.entities.IdAware trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchTreeModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextEditorUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextEditorUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 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 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java 2012-12-15 16:05:45 UTC (rev 77) @@ -36,9 +36,11 @@ import fr.ifremer.tutti.persistence.entities.referential.BeaufortScale; import fr.ifremer.tutti.persistence.entities.referential.Country; import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.MacroWasteCategory; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.SeaState; import fr.ifremer.tutti.persistence.entities.referential.Sex; +import fr.ifremer.tutti.persistence.entities.referential.SortedUnsortedCategory; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Strata; import fr.ifremer.tutti.persistence.entities.referential.Vessel; @@ -72,6 +74,8 @@ //-- Referential methods --// //------------------------------------------------------------------------// + List<SortedUnsortedCategory> getAllSortedUnsortedCategory(); + List<WeightCategory> getAllWeightCategory(); List<Sex> getAllSex(); @@ -94,6 +98,8 @@ List<Person> getAllPerson(); + List<MacroWasteCategory> getAllMacroWasteCategory(); + //------------------------------------------------------------------------// //-- Program methods --// //------------------------------------------------------------------------// Modified: trunk/tutti-persistence/src/main/resources/META-INF/services/fr.ifremer.tutti.persistence.entities.IdAware =================================================================== --- trunk/tutti-persistence/src/main/resources/META-INF/services/fr.ifremer.tutti.persistence.entities.IdAware 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-persistence/src/main/resources/META-INF/services/fr.ifremer.tutti.persistence.entities.IdAware 2012-12-15 16:05:45 UTC (rev 77) @@ -1,3 +1,4 @@ +fr.ifremer.tutti.persistence.entities.data.Attachment fr.ifremer.tutti.persistence.entities.data.AccidentalBatch fr.ifremer.tutti.persistence.entities.data.BenthosBatch fr.ifremer.tutti.persistence.entities.data.FishingOperation @@ -10,9 +11,11 @@ fr.ifremer.tutti.persistence.entities.referential.BeaufortScale fr.ifremer.tutti.persistence.entities.referential.Country fr.ifremer.tutti.persistence.entities.referential.Gear +fr.ifremer.tutti.persistence.entities.referential.MacroWasteCategory fr.ifremer.tutti.persistence.entities.referential.Person fr.ifremer.tutti.persistence.entities.referential.SeaState fr.ifremer.tutti.persistence.entities.referential.Sex +fr.ifremer.tutti.persistence.entities.referential.SortedUnsortedCategory fr.ifremer.tutti.persistence.entities.referential.Species fr.ifremer.tutti.persistence.entities.referential.Strata fr.ifremer.tutti.persistence.entities.referential.Vessel Modified: trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo =================================================================== (Binary files differ) Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java 2012-12-15 16:05:45 UTC (rev 77) @@ -36,9 +36,11 @@ import fr.ifremer.tutti.persistence.entities.referential.BeaufortScale; import fr.ifremer.tutti.persistence.entities.referential.Country; import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.MacroWasteCategory; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.SeaState; import fr.ifremer.tutti.persistence.entities.referential.Sex; +import fr.ifremer.tutti.persistence.entities.referential.SortedUnsortedCategory; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Strata; import fr.ifremer.tutti.persistence.entities.referential.Vessel; @@ -69,6 +71,11 @@ } @Override + public List<SortedUnsortedCategory> getAllSortedUnsortedCategory() { + return null; + } + + @Override public List<WeightCategory> getAllWeightCategory() { return null; } @@ -124,6 +131,11 @@ } @Override + public List<MacroWasteCategory> getAllMacroWasteCategory() { + return null; + } + + @Override public List<Program> getAllProgram() { return null; } Modified: trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevFixtures.java =================================================================== --- trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevFixtures.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevFixtures.java 2012-12-15 16:05:45 UTC (rev 77) @@ -26,14 +26,16 @@ import com.google.common.collect.ArrayListMultimap; import fr.ifremer.tutti.persistence.entities.IdAware; -import fr.ifremer.tutti.persistence.entities.referential.Person; -import fr.ifremer.tutti.persistence.entities.referential.Strata; import fr.ifremer.tutti.persistence.entities.referential.BeaufortScale; import fr.ifremer.tutti.persistence.entities.referential.Country; import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.MacroWasteCategory; +import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.SeaState; import fr.ifremer.tutti.persistence.entities.referential.Sex; +import fr.ifremer.tutti.persistence.entities.referential.SortedUnsortedCategory; import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.persistence.entities.referential.Strata; import fr.ifremer.tutti.persistence.entities.referential.Vessel; import fr.ifremer.tutti.persistence.entities.referential.WeightCategory; import fr.ifremer.tutti.persistence.entities.referential.Zone; @@ -257,6 +259,39 @@ wc.setName("Gros"); cache.put(WeightCategory.class, wc); + SortedUnsortedCategory suc; + + suc = new SortedUnsortedCategory(); + suc.setId(UUID.randomUUID().toString()); + suc.setName("Vrac"); + cache.put(SortedUnsortedCategory.class, suc); + + suc = new SortedUnsortedCategory(); + suc.setId(UUID.randomUUID().toString()); + suc.setName("Hors Vrac"); + cache.put(SortedUnsortedCategory.class, suc); + + MacroWasteCategory mwc; + + mwc = new MacroWasteCategory(); + mwc.setId(UUID.randomUUID().toString()); + mwc.setName("Pneu"); + cache.put(MacroWasteCategory.class, mwc); + + mwc = new MacroWasteCategory(); + mwc.setId(UUID.randomUUID().toString()); + mwc.setName("Plastique"); + cache.put(MacroWasteCategory.class, mwc); + + mwc = new MacroWasteCategory(); + mwc.setId(UUID.randomUUID().toString()); + mwc.setName("Machine à laver"); + cache.put(MacroWasteCategory.class, mwc); + + mwc = new MacroWasteCategory(); + mwc.setId(UUID.randomUUID().toString()); + mwc.setName("Métal"); + cache.put(MacroWasteCategory.class, mwc); } public List<Zone> zone() { @@ -304,7 +339,15 @@ return getData(WeightCategory.class); } - protected <B extends IdAware> List<B> getData(Class<B> entityType) { + public List<SortedUnsortedCategory> sortedUnsortedCategory() { + return getData(SortedUnsortedCategory.class); + } + + public List<MacroWasteCategory> macroWasteCategory() { + return getData(MacroWasteCategory.class); + } + + public <B extends IdAware> List<B> getData(Class<B> entityType) { List<B> result = (List<B>) cache.get(entityType); return result; } Modified: trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java =================================================================== --- trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java 2012-12-15 16:05:45 UTC (rev 77) @@ -48,9 +48,11 @@ import fr.ifremer.tutti.persistence.entities.referential.BeaufortScale; import fr.ifremer.tutti.persistence.entities.referential.Country; import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.MacroWasteCategory; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.SeaState; import fr.ifremer.tutti.persistence.entities.referential.Sex; +import fr.ifremer.tutti.persistence.entities.referential.SortedUnsortedCategory; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Strata; import fr.ifremer.tutti.persistence.entities.referential.Vessel; @@ -171,6 +173,13 @@ //------------------------------------------------------------------------// @Override + public List<SortedUnsortedCategory> getAllSortedUnsortedCategory() { + List<SortedUnsortedCategory> result = + getDataInNewList(SortedUnsortedCategory.class); + return result; + } + + @Override public List<WeightCategory> getAllWeightCategory() { List<WeightCategory> result = getDataInNewList(WeightCategory.class); @@ -220,6 +229,13 @@ } @Override + public List<MacroWasteCategory> getAllMacroWasteCategory() { + List<MacroWasteCategory> result = + getDataInNewList(MacroWasteCategory.class); + return result; + } + + @Override public List<SeaState> getAllSeaState() { List<SeaState> result = getDataInNewList(SeaState.class); return result; Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java 2012-12-15 16:05:45 UTC (rev 77) @@ -24,17 +24,20 @@ * #L% */ +import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.referential.Person; -import fr.ifremer.tutti.persistence.entities.referential.Strata; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.referential.BeaufortScale; import fr.ifremer.tutti.persistence.entities.referential.Country; import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.MacroWasteCategory; +import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.SeaState; import fr.ifremer.tutti.persistence.entities.referential.Sex; +import fr.ifremer.tutti.persistence.entities.referential.SortedUnsortedCategory; import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.persistence.entities.referential.Strata; import fr.ifremer.tutti.persistence.entities.referential.Vessel; import fr.ifremer.tutti.persistence.entities.referential.WeightCategory; import fr.ifremer.tutti.persistence.entities.referential.Zone; @@ -57,6 +60,8 @@ public static final String BY_NAME = "byName"; + public static final String SEPARATOR = "#"; + /** Delegate decorator provider. */ protected DecoratorProvider decoratorProvider; @@ -84,23 +89,26 @@ @Override protected void loadDecorators() { - registerMultiJXPathDecorator(Program.class, "${name}$s", "#", " - "); - registerMultiJXPathDecorator(Cruise.class, "${name}$s", "#", " - "); - registerMultiJXPathDecorator(FishingOperation.class, "${stationNumber}$s#${fishingOperationNumber}$s#${date}$td/%3$tm/%3$tY", "#", " - "); - registerMultiJXPathDecorator(Zone.class, "${name}$s", "#", " - "); - registerMultiJXPathDecorator(Vessel.class, "${name}$s#", "#", " - "); - registerMultiJXPathDecorator(Country.class, "${name}$s", "#", " - "); - registerMultiJXPathDecorator(Gear.class, "${name}$s", "#", " - "); - registerMultiJXPathDecorator(Person.class, "${firstName}$s#${lastName}$s", "#", " "); - registerMultiJXPathDecorator(BeaufortScale.class, "${name}$s", "#", " - "); - registerMultiJXPathDecorator(SeaState.class, "${name}$s", "#", " - "); - registerMultiJXPathDecorator(Strata.class, "${name}$s", "#", " - "); - registerMultiJXPathDecorator(Sex.class, "${name}$s", "#", " - "); - registerMultiJXPathDecorator(Species.class, "${codeMemo}#${genusSpecies}$s", "#", " - "); - registerJXPathDecorator(Species.class, SPECIES_BY_CODE, "${codeMemo}$s"); - registerJXPathDecorator(Species.class, SPECIES_BY_GENUS, "${genusSpecies}$s"); - registerJXPathDecorator(WeightCategory.class, BY_NAME, "${name}$s"); - registerJXPathDecorator(Sex.class, BY_NAME, "${name}$s"); + registerMultiJXPathDecorator(Program.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Cruise.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(FishingOperation.class, "${stationNumber}$s#${fishingOperationNumber}$s#${date}$td/%3$tm/%3$tY", SEPARATOR, " - "); + registerMultiJXPathDecorator(Zone.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Vessel.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Country.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Gear.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Person.class, "${firstName}$s#${lastName}$s", SEPARATOR, " "); + registerMultiJXPathDecorator(BeaufortScale.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(SeaState.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Strata.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Sex.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(SortedUnsortedCategory.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(MacroWasteCategory.class, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Species.class, "${codeMemo}$s#${genusSpecies}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Species.class, SPECIES_BY_CODE, "${codeMemo}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Species.class, SPECIES_BY_GENUS, "${genusSpecies}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(WeightCategory.class, BY_NAME, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Sex.class, BY_NAME, "${name}$s", SEPARATOR, " - "); + registerMultiJXPathDecorator(Attachment.class, "${name}$s", SEPARATOR, " - "); } }; } @@ -124,6 +132,9 @@ n_("tutti.property.strata"); n_("tutti.property.codeMemo"); n_("tutti.property.genusSpecies"); + n_("tutti.property.sortedUnsortedCategory"); + n_("tutti.property.macroWasteCategory"); + n_("tutti.property.attachment"); } } 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 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2012-12-15 16:05:45 UTC (rev 77) @@ -38,9 +38,11 @@ import fr.ifremer.tutti.persistence.entities.referential.BeaufortScale; import fr.ifremer.tutti.persistence.entities.referential.Country; import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.MacroWasteCategory; import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.SeaState; import fr.ifremer.tutti.persistence.entities.referential.Sex; +import fr.ifremer.tutti.persistence.entities.referential.SortedUnsortedCategory; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Strata; import fr.ifremer.tutti.persistence.entities.referential.Vessel; @@ -133,6 +135,12 @@ //------------------------------------------------------------------------// @Override + public List<SortedUnsortedCategory> getAllSortedUnsortedCategory() { + checkDriverExists(); + return driver.getAllSortedUnsortedCategory(); + } + + @Override public List<WeightCategory> getAllWeightCategory() { checkDriverExists(); return driver.getAllWeightCategory(); @@ -181,6 +189,12 @@ } @Override + public List<MacroWasteCategory> getAllMacroWasteCategory() { + checkDriverExists(); + return driver.getAllMacroWasteCategory(); + } + + @Override public List<SeaState> getAllSeaState() { checkDriverExists(); return driver.getAllSeaState(); Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2012-12-15 16:05:45 UTC (rev 77) @@ -3,6 +3,7 @@ tutti.config.data.directory=Répertoire de données de l'application. Vous pouvez utiliser l'expression ${tutti.data.directory} pour le référence dans d'autres propriétés de configuration (ex\: ${tutti.data.directory}/tmp). tutti.config.license.organizationName=Nom de l'organisation dans la licence tutti.config.tmp.directory=Répertoire temporaire utilisée par l'application (est nettoyé à chaque démarrage de l'application) +tutti.property.attachment=Pièce jointe tutti.property.beaufortScale=Vent beaufort tutti.property.codeMemo=Code Memo tutti.property.country=Pays @@ -13,9 +14,11 @@ tutti.property.gear=Engin tutti.property.genusSpecies=Nom scientifique tutti.property.lastName=Nom de Famille +tutti.property.macroWasteCategory=Type de macro déchet tutti.property.name=Nom tutti.property.program=Série de campagne tutti.property.seaState=État de la mer +tutti.property.sortedUnsortedCategory=Vrac / Hors Vrac tutti.property.stationNumber=Numéro de station tutti.property.strata=Strate d'association tutti.property.user=Utilisateur Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2012-12-15 16:05:45 UTC (rev 77) @@ -33,10 +33,9 @@ import fr.ifremer.tutti.ui.swing.config.TuttiConfig; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.editor.SimpleTimeEditor; -import jaxx.runtime.swing.OneClicListSelectionModel; import jaxx.runtime.swing.editor.NumberEditor; import jaxx.runtime.swing.editor.bean.BeanComboBox; -import jaxx.runtime.swing.editor.bean.BeanListHeader; +import jaxx.runtime.swing.editor.bean.BeanDoubleList; import jaxx.runtime.swing.renderer.DecoratorListCellRenderer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -62,7 +61,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import jaxx.runtime.swing.editor.bean.BeanDoubleList; /** * Contract of any UI handler. @@ -186,7 +184,9 @@ * Prépare un component de choix d'entités pour un type d'entité donné et * pour un service de persistance donné. * - * @param listHeader le component graphique à initialiser + * @param list le component graphique à initialiser + * @param data + * @param selectedData */ protected <E extends IdAware> void initBeanList( BeanDoubleList<E> list, @@ -206,7 +206,7 @@ // add data list to combo box list.init((JXPathDecorator<E>) decorator, data, selectedData); - + // OneClicListSelectionModel.installModel(listHeader.getList()); // updateIndices(listHeader.getList(), selectedData); Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/AbstractTuttiBatchTableUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/AbstractTuttiBatchTableUIHandler.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/AbstractTuttiBatchTableUIHandler.java 2012-12-15 16:05:45 UTC (rev 77) @@ -0,0 +1,197 @@ +package fr.ifremer.tutti.ui.swing.content.operation; + +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 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 com.ezware.oxbow.swingbits.table.filter.DistinctColumnItem; +import com.ezware.oxbow.swingbits.table.filter.IFilterChangeListener; +import com.ezware.oxbow.swingbits.table.filter.ITableFilter; +import com.ezware.oxbow.swingbits.table.filter.JTableFilter; +import com.ezware.oxbow.swingbits.table.filter.TableRowFilterSupport; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; +import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; +import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +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.AbstractTuttiTableUIModel; +import fr.ifremer.tutti.ui.swing.util.table.TableRowModificationListener; +import jaxx.runtime.SwingUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.decorator.ComponentAdapter; +import org.jdesktop.swingx.decorator.HighlightPredicate; +import org.jdesktop.swingx.decorator.Highlighter; +import org.jdesktop.swingx.sort.TableSortController; + +import javax.swing.event.ListSelectionListener; +import javax.swing.table.TableColumnModel; +import javax.swing.table.TableModel; +import java.awt.Color; +import java.awt.Component; +import java.awt.event.FocusEvent; +import java.util.Collection; + +/** + * Abstract ui handler forbatch ui. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.2 + */ +public abstract class AbstractTuttiBatchTableUIHandler<R extends AbstractTuttiBeanUIModel, M extends AbstractTuttiTableUIModel<?, R, M>> extends AbstractTuttiTableUIHandler<R, M> { + + + /** Logger. */ + private static final Log log = + LogFactory.getLog(AbstractTuttiBatchTableUIHandler.class); + + protected abstract void saveSelectedRowIfRequired(); + + protected abstract boolean isRowValid(R row); + + protected abstract void saveRow(R row); + + protected abstract FishingOperation getFishingOperation(); + + public abstract void selectFishingOperation(FishingOperation bean); + + /** + * Persistence service. + * + * @since 0.2 + */ + protected final PersistenceService persistenceService; + + /** + * To monitor changes on the fishing operation. + * + * @since 0.2 + */ + protected final TuttiBeanMonitor<M> fishingOperationMonitor; + + protected AbstractTuttiBatchTableUIHandler(FishingOperationsUI parentUi, + String[] fishingProperties, + String... properties) { + super(parentUi.getHandler().getContext(), properties); + this.persistenceService = context.getService(PersistenceService.class); + this.fishingOperationMonitor = new TuttiBeanMonitor<M>( + fishingProperties); + } + + public final void saveSelectedRowIfRequired(FocusEvent event) { + + Component oppositeComponent = event.getOppositeComponent(); + + JXTable parentContainer = null; + + if (oppositeComponent != null) { + + // check out if still on table + parentContainer = SwingUtil.getParentContainer( + oppositeComponent, JXTable.class); + } + + if (parentContainer == null) { + + // out of the table can save + if (getFishingOperation() != null) { + saveSelectedRowIfRequired(); + } + } + } + + protected void initBatchTable(JXTable table, + TableColumnModel columnModel, + AbstractTuttiTableModel<R> tableModel) { + + installTableKeyListener(columnModel, table); + table.getTableHeader().setReorderingAllowed(false); + + JTableFilter tableFilter = new JTableFilter(table); + TableRowFilterSupport.forFilter(tableFilter).searchable(true).useTableRenderers(true).actions(true).apply(); + + tableFilter.addChangeListener(new IFilterChangeListener() { + @Override + public void filterChanged(ITableFilter<?> filter) { + if (log.isInfoEnabled()) { + log.info("Filter changed " + filter); + } + TableModel model = filter.getTable().getModel(); + int columnCount = model.getColumnCount(); + for (int i = 0; i < columnCount; i++) { + if (filter.isFiltered(i)) { + Collection<DistinctColumnItem> filterState = filter.getFilterState(i); + if (log.isInfoEnabled()) { + log.info("Column " + i + " is filtered: " + filterState); + } + } + } + } + }); + + TableSortController<TableModel> sorter = new TableSortController<TableModel>(tableModel); + sorter.setSortable(false); + + table.setRowSorter(sorter); + + Highlighter readOnlyHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( + HighlightPredicate.READ_ONLY, Color.LIGHT_GRAY); + + table.addHighlighter(readOnlyHighlighter); + Highlighter validHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( + new HighlightPredicate.AndHighlightPredicate(HighlightPredicate.EDITABLE, new HighlightPredicate() { + @Override + public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { + + boolean result = false; + if (adapter.isEditable()) { + int rowIndex = adapter.convertRowIndexToModel(adapter.row); + R row = getTableModel().getEntry(rowIndex); + result = !row.isValid(); + } + return result; + } + }), Color.RED); + table.addHighlighter(validHighlighter); + + // when model datas change let's propagate it table model + listenRowsFromModel(); + + // save when row chaged and was modified + ListSelectionListener listener = new TableRowModificationListener<R>( + tableModel, getRowMonitor()) { + @Override + protected void saveSelectedRow() { + saveSelectedRowIfRequired(); + } + }; + table.getSelectionModel().addListSelectionListener(listener); + + // always scroll to selected row + SwingUtil.scrollToTableSelection(table); + } + +} Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/AbstractTuttiBatchTableUIHandler.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchRowModel.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchRowModel.java 2012-12-15 16:05:45 UTC (rev 77) @@ -25,11 +25,14 @@ */ import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; +import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import java.util.List; + /** * Define a benthos batch row. * @@ -46,6 +49,8 @@ public static final String PROPERTY_COMMENT = "comment"; + public static final String PROPERTY_ATTACHMENTS = "attachments"; + /** * Species observed. * @@ -67,6 +72,13 @@ */ protected String comment; + /** + * Attachments + * + * @since 0.2 + */ + protected List<Attachment> attachments; + protected static final Binder<AccidentalBatch, AccidentalBatchRowModel> fromBeanBinder = BinderFactory.newBinder(AccidentalBatch.class, AccidentalBatchRowModel.class); @@ -113,4 +125,14 @@ this.comment = comment; firePropertyChange(PROPERTY_COMMENT, oldValue, comment); } + + public List<Attachment> getAttachments() { + return attachments; + } + + public void setAttachments(List<Attachment> attachments) { + Object oldValue = getAttachments(); + this.attachments = attachments; + firePropertyChange(PROPERTY_ATTACHMENTS, oldValue, attachments); + } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchTableModel.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchTableModel.java 2012-12-15 16:05:45 UTC (rev 77) @@ -42,36 +42,34 @@ public static final ColumnIdentifier<AccidentalBatchRowModel> SPECIES_BY_CODE = ColumnIdentifier.newId( BenthosBatchRowModel.PROPERTY_SPECIES, - n_("tutti.table.benthos.batch.header.speciesByCode"), - n_("tutti.table.benthos.batch.header.speciesByCode")); + n_("tutti.table.accidental.batch.header.speciesByCode"), + n_("tutti.table.accidental.batch.header.speciesByCode")); public static final ColumnIdentifier<AccidentalBatchRowModel> SPECIES_BY_GENUS_CODE = ColumnIdentifier.newId( BenthosBatchRowModel.PROPERTY_SPECIES, - n_("tutti.table.benthos.batch.header.speciesByGenusCode"), - n_("tutti.table.benthos.batch.header.speciesByGenusCode")); + n_("tutti.table.accidental.batch.header.speciesByGenusCode"), + n_("tutti.table.accidental.batch.header.speciesByGenusCode")); public static final ColumnIdentifier<AccidentalBatchRowModel> WEIGHT = ColumnIdentifier.newId( BenthosBatchRowModel.PROPERTY_WEIGHT, - n_("tutti.table.benthos.batch.header.weight"), - n_("tutti.table.benthos.batch.header.weight")); + n_("tutti.table.accidental.batch.header.weight"), + n_("tutti.table.accidental.batch.header.weight")); public static final ColumnIdentifier<AccidentalBatchRowModel> COMMENT = ColumnIdentifier.newId( BenthosBatchRowModel.PROPERTY_COMMENT, - n_("tutti.table.benthos.batch.header.comment"), - n_("tutti.table.benthos.batch.header.comment")); + n_("tutti.table.accidental.batch.header.comment"), + n_("tutti.table.accidental.batch.header.comment")); - public static final ColumnIdentifier<AccidentalBatchRowModel> FILE = ColumnIdentifier.newId( - null, - n_("tutti.table.benthos.batch.header.file"), - n_("tutti.table.benthos.batch.header.file")); + public static final ColumnIdentifier<AccidentalBatchRowModel> ATTACHMENTS = ColumnIdentifier.newId( + AccidentalBatchRowModel.PROPERTY_ATTACHMENTS, + n_("tutti.table.accidental.batch.header.file"), + n_("tutti.table.accidental.batch.header.file")); public AccidentalBatchTableModel(TableColumnModel columnModel) { super(columnModel); - setNoneEditableCols( - FILE - ); + setNoneEditableCols(); } @Override @@ -94,14 +92,12 @@ if (propertyName == SPECIES_BY_CODE) { // update also other columns - fireTableCellUpdated(rowIndex, - SPECIES_BY_GENUS_CODE); + fireTableCellUpdated(rowIndex, SPECIES_BY_GENUS_CODE); } else if (propertyName == SPECIES_BY_GENUS_CODE) { // update also other columns - fireTableCellUpdated(rowIndex, - SPECIES_BY_CODE); + fireTableCellUpdated(rowIndex, SPECIES_BY_CODE); } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchUI.jaxx 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchUI.jaxx 2012-12-15 16:05:45 UTC (rev 77) @@ -30,6 +30,7 @@ fr.ifremer.tutti.ui.swing.TuttiUIContext fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI fr.ifremer.tutti.ui.swing.util.editor.LongTextEditorUI + fr.ifremer.tutti.ui.swing.util.editor.AttachmentEditorUI jaxx.runtime.swing.editor.NumberEditor @@ -61,10 +62,12 @@ <AccidentalBatchUIModel id='model' initializer='getContextValue(AccidentalBatchUIModel.class)'/> - <LongTextEditorUI id='longTextEditorUI'/> + <LongTextEditorUI id='longTextEditor'/> + + <AttachmentEditorUI id='attachmentEditor'/> <JScrollPane id='tableScrollPane' constraints='BorderLayout.CENTER'> - <JXTable id='table' onFocusLost='handler.saveSelectedRowIfRequired(event);'/> + <JXTable id='table' onFocusLost='handler.saveSelectedRowIfRequired(event)'/> </JScrollPane> </JPanel> \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchUIHandler.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/accidental/AccidentalBatchUIHandler.java 2012-12-15 16:05:45 UTC (rev 77) @@ -27,42 +27,37 @@ import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; +import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; 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.TuttiUI; +import fr.ifremer.tutti.ui.swing.content.operation.AbstractTuttiBatchTableUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; -import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.editor.AttachmentCellComponent; import fr.ifremer.tutti.ui.swing.util.editor.LongTextCellComponent; -import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; -import fr.ifremer.tutti.ui.swing.util.table.TableRowModificationListener; -import jaxx.runtime.SwingUtil; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; -import org.jdesktop.swingx.decorator.ComponentAdapter; -import org.jdesktop.swingx.decorator.HighlightPredicate; -import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.nuiton.util.decorator.Decorator; -import javax.swing.event.ListSelectionListener; import javax.swing.table.TableColumnModel; -import java.awt.Color; -import java.awt.Component; -import java.awt.event.FocusEvent; import java.util.List; +import static org.nuiton.i18n.I18n.n_; + /** * @author tchemit <chemit@codelutin.com> * @since 0.2 */ -public class AccidentalBatchUIHandler extends AbstractTuttiTableUIHandler<AccidentalBatchRowModel, AccidentalBatchUIModel> { +public class AccidentalBatchUIHandler extends AbstractTuttiBatchTableUIHandler<AccidentalBatchRowModel, AccidentalBatchUIModel> { /** Logger. */ - private static final Log log = LogFactory.getLog(AccidentalBatchUIHandler.class); + private static final Log log = + LogFactory.getLog(AccidentalBatchUIHandler.class); /** * UI. @@ -71,28 +66,13 @@ */ private final AccidentalBatchUI ui; - /** - * Persistence service. - * - * @since 0.2 - */ - private final PersistenceService persistenceService; - - /** - * To monitor changes on the fishing operation. - * - * @since 0.2 - */ - private final TuttiBeanMonitor<AccidentalBatchUIModel> fishingOperationMonitor; - - public AccidentalBatchUIHandler(FishingOperationsUI parentUi, AccidentalBatchUI ui) { - super(parentUi.getHandler().getContext(), + public AccidentalBatchUIHandler(FishingOperationsUI parentUi, + AccidentalBatchUI ui) { + super(parentUi, ArrayUtils.EMPTY_STRING_ARRAY, AccidentalBatchRowModel.PROPERTY_SPECIES, AccidentalBatchRowModel.PROPERTY_WEIGHT, AccidentalBatchRowModel.PROPERTY_COMMENT); this.ui = ui; - this.persistenceService = context.getService(PersistenceService.class); - this.fishingOperationMonitor = new TuttiBeanMonitor<AccidentalBatchUIModel>(); } //------------------------------------------------------------------------// @@ -115,6 +95,11 @@ } @Override + protected FishingOperation getFishingOperation() { + return getModel().getFishingOperation(); + } + + @Override protected TableColumnModel createTableColumnModel() { DefaultTableColumnModelExt columnModel = @@ -155,15 +140,19 @@ { // Comment column addColumnToModel(columnModel, - LongTextCellComponent.newEditor(ui.getLongTextEditorUI()), - LongTextCellComponent.newRender(), + LongTextCellComponent.newEditor(ui.getLongTextEditor()), + LongTextCellComponent.newRender(n_("tutti.tooltip.comment.none")), AccidentalBatchTableModel.COMMENT); } { // File column addColumnToModel(columnModel, - AccidentalBatchTableModel.FILE); + AttachmentCellComponent.newEditor(ui.getAttachmentEditor()), + AttachmentCellComponent.newRender( + getDecorator(Attachment.class, null), + n_("tutti.tooltip.attachment.none")), + AccidentalBatchTableModel.ATTACHMENTS); } return columnModel; } @@ -212,118 +201,71 @@ } } - //------------------------------------------------------------------------// - //-- AbstractTuttiUIHandler methods --// - //------------------------------------------------------------------------// - @Override - public void beforeInitUI() { + protected void saveSelectedRowIfRequired() { - if (log.isInfoEnabled()) { - log.info("beforeInit: " + ui); - } + TuttiBeanMonitor<AccidentalBatchRowModel> rowMonitor = getRowMonitor(); - AccidentalBatchUIModel model = new AccidentalBatchUIModel(); - ui.setContextValue(model); + AccidentalBatchRowModel bean = rowMonitor.getBean(); + if (bean != null) { - fishingOperationMonitor.setBean(model); - } + if (bean.isValid()) { + // there is a valid bean attached to the monitor - @Override - public void afterInitUI() { + if (rowMonitor.wasModified()) { - if (log.isInfoEnabled()) { - log.info("afterInit: " + ui); - } + // monitored bean was modified, save it + if (log.isInfoEnabled()) { + log.info("Row " + bean + " was modified, will save it"); + } - initUI(ui); + saveRow(bean); - JXTable table = getTable(); + // clear modified flag on the monitor + rowMonitor.clearModified(); + } + } else { - // create table column model - TableColumnModel columnModel = createTableColumnModel(); + // row is not valid can not save it - // create table model - AccidentalBatchTableModel tableModel = - new AccidentalBatchTableModel(columnModel); + AccidentalBatch catchBean = bean.toBean(); - table.setModel(tableModel); - table.setColumnModel(columnModel); - installTableKeyListener(columnModel, table); + if (!TuttiEntities.isNew(catchBean)) { - table.getTableHeader().setReorderingAllowed(false); - - - Highlighter readOnlyHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - HighlightPredicate.READ_ONLY, Color.LIGHT_GRAY); - - table.addHighlighter(readOnlyHighlighter); - Highlighter validHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - new HighlightPredicate.AndHighlightPredicate(HighlightPredicate.EDITABLE, new HighlightPredicate() { - @Override - public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { - - boolean result = false; - if (adapter.isEditable()) { - int rowIndex = adapter.convertRowIndexToModel(adapter.row); - AccidentalBatchRowModel row = getTableModel().getEntry(rowIndex); - result = !row.isValid(); - } - return result; - } - }), Color.RED); - table.addHighlighter(validHighlighter); - - // when model datas change let's propagate it table model - listenRowsFromModel(); - - // save when row chaged and was modified - ListSelectionListener listener = new TableRowModificationListener<AccidentalBatchRowModel>( - getTableModel(), getRowMonitor()) { - @Override - protected void saveSelectedRow() { - saveSelectedRowIfRequired(); + // remove this + persistenceService.deleteAccidentalBatch(catchBean.getId()); + } } - }; - table.getSelectionModel().addListSelectionListener(listener); - - // always scroll to selected row - SwingUtil.scrollToTableSelection(getTable()); + } } @Override - public void onCloseUI() { - if (log.isInfoEnabled()) { - log.info("closing: " + ui); - } + protected boolean isRowValid(AccidentalBatchRowModel row) { + boolean result = row.getSpecies() != null && row.getWeight() != null; + return result; } - //------------------------------------------------------------------------// - //-- Public methods --// - //------------------------------------------------------------------------// + @Override + protected void saveRow(AccidentalBatchRowModel row) { - public void saveSelectedRowIfRequired(FocusEvent event) { + AccidentalBatch catchBean = row.toBean(); - Component oppositeComponent = event.getOppositeComponent(); - - JXTable parentContainer = null; - - if (oppositeComponent != null) { - - // check out if still on table - parentContainer = SwingUtil.getParentContainer( - oppositeComponent, JXTable.class); + FishingOperation fishingOperation = getModel().getFishingOperation(); + catchBean.setFishingOperation(fishingOperation); + if (log.isInfoEnabled()) { + log.info("Selected fishingOperation: " + fishingOperation.getId()); } - if (parentContainer == null) { + if (TuttiEntities.isNew(catchBean)) { - // out of the table can save - if (getModel().getFishingOperation() != null) { - saveSelectedRowIfRequired(); - } + catchBean = persistenceService.createAccidentalBatch(catchBean); + row.setId(catchBean.getId()); + } else { + persistenceService.saveAccidentalBatch(catchBean); } } + @Override public void selectFishingOperation(FishingOperation bean) { JXTable table = getTable(); @@ -387,81 +329,60 @@ fishingOperationMonitor.clearModified(); } - public void cancel() { + //------------------------------------------------------------------------// + //-- AbstractTuttiUIHandler methods --// + //------------------------------------------------------------------------// - if (log.isInfoEnabled()) { - log.info("Cancel edition"); - } - } + @Override + public void beforeInitUI() { - public void save() { if (log.isInfoEnabled()) { - log.info("Will save"); + log.info("beforeInit: " + ui); } - } - //------------------------------------------------------------------------// - //-- Internal methods --// - //------------------------------------------------------------------------// + AccidentalBatchUIModel model = new AccidentalBatchUIModel(); + ui.setContextValue(model); - protected boolean isRowValid(AccidentalBatchRowModel row) { - boolean result = row.getSpecies() != null && row.getWeight() != null; - return result; + fishingOperationMonitor.setBean(model); } - protected void saveSelectedRowIfRequired() { + @Override + public void afterInitUI() { - TuttiBeanMonitor<AccidentalBatchRowModel> rowMonitor = getRowMonitor(); + if (log.isInfoEnabled()) { + log.info("afterInit: " + ui); + } - AccidentalBatchRowModel bean = rowMonitor.getBean(); - if (bean != null) { + initUI(ui); - if (bean.isValid()) { - // there is a valid bean attached to the monitor + JXTable table = getTable(); - if (rowMonitor.wasModified()) { + // create table column model + TableColumnModel columnModel = createTableColumnModel(); - // monitored bean was modified, save it - if (log.isInfoEnabled()) { - log.info("Row " + bean + " was modified, will save it"); - } + // create table model + AccidentalBatchTableModel tableModel = + new AccidentalBatchTableModel(columnModel); - saveRow(bean); + table.setModel(tableModel); + table.setColumnModel(columnModel); - // clear modified flag on the monitor - rowMonitor.clearModified(); - } - } else { - - // row is not valid can not save it - - AccidentalBatch catchBean = bean.toBean(); - - if (!TuttiEntities.isNew(catchBean)) { - - // remove this - persistenceService.deleteAccidentalBatch(catchBean.getId()); - } - } - } + initBatchTable(table, columnModel, tableModel); } - protected void saveRow(AccidentalBatchRowModel row) { - - AccidentalBatch catchBean = row.toBean(); - - FishingOperation fishingOperation = getModel().getFishingOperation(); - catchBean.setFishingOperation(fishingOperation); + @Override + public void onCloseUI() { if (log.isInfoEnabled()) { - log.info("Selected fishingOperation: " + fishingOperation.getId()); + log.info("closing: " + ui); } + } - if (TuttiEntities.isNew(catchBean)) { + //------------------------------------------------------------------------// + //-- Public methods --// + //------------------------------------------------------------------------// - catchBean = persistenceService.createAccidentalBatch(catchBean); - row.setId(catchBean.getId()); - } else { - persistenceService.saveAccidentalBatch(catchBean); - } - } + //------------------------------------------------------------------------// + //-- Internal methods --// + //------------------------------------------------------------------------// + } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchRowModel.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchRowModel.java 2012-12-15 16:05:45 UTC (rev 77) @@ -24,12 +24,15 @@ * #L% */ +import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import java.util.List; + /** * Define a benthos batch row. * @@ -52,6 +55,8 @@ public static final String PROPERTY_COMMENT = "comment"; + public static final String PROPERTY_ATTACHMENTS = "attachments"; + /** * Species observed. * @@ -94,6 +99,13 @@ */ protected String comment; + /** + * Attachments + * + * @since 0.2 + */ + protected List<Attachment> attachments; + protected static final Binder<BenthosBatch, BenthosBatchRowModel> fromBeanBinder = BinderFactory.newBinder(BenthosBatch.class, BenthosBatchRowModel.class); @@ -170,4 +182,15 @@ this.comment = comment; firePropertyChange(PROPERTY_COMMENT, oldValue, comment); } + + public List<Attachment> getAttachments() { + return attachments; + } + + public void setAttachments(List<Attachment> attachments) { + Object oldValue = getAttachments(); + this.attachments = attachments; + firePropertyChange(PROPERTY_ATTACHMENTS, oldValue, attachments); + } + } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchTableModel.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchTableModel.java 2012-12-15 16:05:45 UTC (rev 77) @@ -24,6 +24,7 @@ * #L% */ +import fr.ifremer.tutti.ui.swing.content.operation.species.SpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel; import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; @@ -75,8 +76,8 @@ n_("tutti.table.benthos.batch.header.comment"), n_("tutti.table.benthos.batch.header.comment")); - public static final ColumnIdentifier<BenthosBatchRowModel> FILE = ColumnIdentifier.newId( - null, + public static final ColumnIdentifier<BenthosBatchRowModel> ATTACHMENTS = ColumnIdentifier.newId( + SpeciesBatchRowModel.PROPERTY_ATTACHMENTS, n_("tutti.table.benthos.batch.header.file"), n_("tutti.table.benthos.batch.header.file")); @@ -84,11 +85,7 @@ public BenthosBatchTableModel(TableColumnModel columnModel) { super(columnModel); - setNoneEditableCols( - SAMPLE_WEIGHT, - SAMPLING_RATIO, - FILE - ); + setNoneEditableCols(SAMPLE_WEIGHT, SAMPLING_RATIO); } @Override Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchUI.jaxx 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchUI.jaxx 2012-12-15 16:05:45 UTC (rev 77) @@ -30,6 +30,7 @@ fr.ifremer.tutti.ui.swing.TuttiUIContext fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI fr.ifremer.tutti.ui.swing.util.editor.LongTextEditorUI + fr.ifremer.tutti.ui.swing.util.editor.AttachmentEditorUI jaxx.runtime.swing.editor.NumberEditor @@ -72,8 +73,10 @@ <field name='sampleTotalWeight' component='sampleTotalWeightField'/> </BeanValidator> - <LongTextEditorUI id='longTextEditorUI'/> + <LongTextEditorUI id='longTextEditor'/> + <AttachmentEditorUI id='attachmentEditor'/> + <Table id='form' fill='both' constraints='BorderLayout.NORTH'> <!-- Poids total --> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchUIHandler.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/benthos/BenthosBatchUIHandler.java 2012-12-15 16:05:45 UTC (rev 77) @@ -26,43 +26,37 @@ import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; 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.TuttiUI; +import fr.ifremer.tutti.ui.swing.content.operation.AbstractTuttiBatchTableUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; -import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.editor.AttachmentCellComponent; import fr.ifremer.tutti.ui.swing.util.editor.LongTextCellComponent; -import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; -import fr.ifremer.tutti.ui.swing.util.table.TableRowModificationListener; -import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; -import org.jdesktop.swingx.decorator.ComponentAdapter; -import org.jdesktop.swingx.decorator.HighlightPredicate; -import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.nuiton.util.decorator.Decorator; -import javax.swing.event.ListSelectionListener; import javax.swing.table.TableColumnModel; -import java.awt.Color; -import java.awt.Component; -import java.awt.event.FocusEvent; import java.util.List; +import static org.nuiton.i18n.I18n.n_; + /** * @author tchemit <chemit@codelutin.com> * @since 0.1 */ -public class BenthosBatchUIHandler extends AbstractTuttiTableUIHandler<BenthosBatchRowModel, BenthosBatchUIModel> { +public class BenthosBatchUIHandler extends AbstractTuttiBatchTableUIHandler<BenthosBatchRowModel, BenthosBatchUIModel> { /** Logger. */ - private static final Log log = LogFactory.getLog(BenthosBatchUIHandler.class); + private static final Log log = + LogFactory.getLog(BenthosBatchUIHandler.class); /** * UI. @@ -71,32 +65,17 @@ */ private final BenthosBatchUI ui; - /** - * Persistence service. - * - * @since 0.2 - */ - private final PersistenceService persistenceService; - - /** - * To monitor changes on the fishing operation. - * - * @since 0.2 - */ - private final TuttiBeanMonitor<BenthosBatchUIModel> fishingOperationMonitor; - - public BenthosBatchUIHandler(FishingOperationsUI parentUi, BenthosBatchUI ui) { - super(parentUi.getHandler().getContext(), + public BenthosBatchUIHandler(FishingOperationsUI parentUi, + BenthosBatchUI ui) { + super(parentUi, + new String[]{BenthosBatchUIModel.PROPERTY_TOTAL_WEIGHT, + BenthosBatchUIModel.PROPERTY_SAMPLE_TOTAL_WEIGHT}, BenthosBatchRowModel.PROPERTY_SPECIES_TO_CONFIRM, BenthosBatchRowModel.PROPERTY_SPECIES, BenthosBatchRowModel.PROPERTY_WEIGHT, BenthosBatchRowModel.PROPERTY_COMMENT); this.ui = ui; - this.persistenceService = context.getService(PersistenceService.class); - this.fishingOperationMonitor = new TuttiBeanMonitor<BenthosBatchUIModel>( - BenthosBatchUIModel.PROPERTY_TOTAL_WEIGHT, - BenthosBatchUIModel.PROPERTY_SAMPLE_TOTAL_WEIGHT - ); + } //------------------------------------------------------------------------// @@ -119,6 +98,11 @@ } @Override + protected FishingOperation getFishingOperation() { + return getModel().getFishingOperation(); + } + + @Override protected String[] getRowPropertiesToIgnore() { return new String[]{ BenthosBatchRowModel.PROPERTY_SAMPLE_WEIGHT, @@ -187,15 +171,19 @@ { // Comment column addColumnToModel(columnModel, - LongTextCellComponent.newEditor(ui.getLongTextEditorUI()), - LongTextCellComponent.newRender(), + LongTextCellComponent.newEditor(ui.getLongTextEditor()), + LongTextCellComponent.newRender(n_("tutti.tooltip.comment.none")), BenthosBatchTableModel.COMMENT); } { // File column addColumnToModel(columnModel, - BenthosBatchTableModel.FILE); + AttachmentCellComponent.newEditor(ui.getAttachmentEditor()), + AttachmentCellComponent.newRender( + getDecorator(Attachment.class, null), + n_("tutti.tooltip.attachment.none")), + BenthosBatchTableModel.ATTACHMENTS); } return columnModel; } @@ -244,118 +232,71 @@ } } - //------------------------------------------------------------------------// - //-- AbstractTuttiUIHandler methods --// - //------------------------------------------------------------------------// - @Override - public void beforeInitUI() { + protected void saveSelectedRowIfRequired() { - if (log.isInfoEnabled()) { - log.info("beforeInit: " + ui); - } + TuttiBeanMonitor<BenthosBatchRowModel> rowMonitor = getRowMonitor(); - BenthosBatchUIModel model = new BenthosBatchUIModel(); - ui.setContextValue(model); + BenthosBatchRowModel bean = rowMonitor.getBean(); + if (bean != null) { - fishingOperationMonitor.setBean(model); - } + if (bean.isValid()) { + // there is a valid bean attached to the monitor - @Override - public void afterInitUI() { + if (rowMonitor.wasModified()) { - if (log.isInfoEnabled()) { - log.info("afterInit: " + ui); - } + // monitored bean was modified, save it + if (log.isInfoEnabled()) { + log.info("Row " + bean + " was modified, will save it"); + } - initUI(ui); + saveRow(bean); - JXTable table = getTable(); + // clear modified flag on the monitor + rowMonitor.clearModified(); + } + } else { - // create table column model - TableColumnModel columnModel = createTableColumnModel(); + // row is not valid can not save it - // create table model - BenthosBatchTableModel tableModel = - new BenthosBatchTableModel(columnModel); + BenthosBatch catchBean = bean.toBean(); - table.setModel(tableModel); - table.setColumnModel(columnModel); - installTableKeyListener(columnModel, table); + if (!TuttiEntities.isNew(catchBean)) { - table.getTableHeader().setReorderingAllowed(false); - - - Highlighter readOnlyHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - HighlightPredicate.READ_ONLY, Color.LIGHT_GRAY); - - table.addHighlighter(readOnlyHighlighter); - Highlighter validHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - new HighlightPredicate.AndHighlightPredicate(HighlightPredicate.EDITABLE, new HighlightPredicate() { - @Override - public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { - - boolean result = false; - if (adapter.isEditable()) { - int rowIndex = adapter.convertRowIndexToModel(adapter.row); - BenthosBatchRowModel row = getTableModel().getEntry(rowIndex); - result = !row.isValid(); - } - return result; - } - }), Color.RED); - table.addHighlighter(validHighlighter); - - // when model datas change let's propagate it table model - listenRowsFromModel(); - - // save when row chaged and was modified - ListSelectionListener listener = new TableRowModificationListener<BenthosBatchRowModel>( - getTableModel(), getRowMonitor()) { - @Override - protected void saveSelectedRow() { - saveSelectedRowIfRequired(); + // remove this + persistenceService.deleteBenthosBatch(catchBean.getId()); + } } - }; - table.getSelectionModel().addListSelectionListener(listener); - - // always scroll to selected row - SwingUtil.scrollToTableSelection(getTable()); + } } @Override - public void onCloseUI() { - if (log.isInfoEnabled()) { - log.info("closing: " + ui); - } + protected boolean isRowValid(BenthosBatchRowModel row) { + boolean result = row.getSpecies() != null && row.getWeight() != null; + return result; } - //------------------------------------------------------------------------// - //-- Public methods --// - //------------------------------------------------------------------------// + @Override + protected void saveRow(BenthosBatchRowModel row) { - public void saveSelectedRowIfRequired(FocusEvent event) { + BenthosBatch catchBean = row.toBean(); - Component oppositeComponent = event.getOppositeComponent(); - - JXTable parentContainer = null; - - if (oppositeComponent != null) { - - // check out if still on table - parentContainer = SwingUtil.getParentContainer( - oppositeComponent, JXTable.class); + FishingOperation fishingOperation = getModel().getFishingOperation(); + catchBean.setFishingOperation(fishingOperation); + if (log.isInfoEnabled()) { + log.info("Selected fishingOperation: " + fishingOperation.getId()); } - if (parentContainer == null) { + if (TuttiEntities.isNew(catchBean)) { - // out of the table can save - if (getModel().getFishingOperation() != null) { - saveSelectedRowIfRequired(); - } + catchBean = persistenceService.createBenthosBatch(catchBean); + row.setId(catchBean.getId()); + } else { + persistenceService.saveBenthosBatch(catchBean); } } + @Override public void selectFishingOperation(FishingOperation bean) { JXTable table = getTable(); @@ -419,81 +360,61 @@ fishingOperationMonitor.clearModified(); } - public void cancel() { - if (log.isInfoEnabled()) { - log.info("Cancel edition"); - } - } + //------------------------------------------------------------------------// + //-- AbstractTuttiUIHandler methods --// + //------------------------------------------------------------------------// - public void save() { + @Override + public void beforeInitUI() { + if (log.isInfoEnabled()) { - log.info("Will save"); + log.info("beforeInit: " + ui); } - } - //------------------------------------------------------------------------// - //-- Internal methods --// - //------------------------------------------------------------------------// + BenthosBatchUIModel model = new BenthosBatchUIModel(); + ui.setContextValue(model); - protected boolean isRowValid(BenthosBatchRowModel row) { - boolean result = row.getSpecies() != null && row.getWeight() != null; - return result; + fishingOperationMonitor.setBean(model); } - protected void saveSelectedRowIfRequired() { + @Override + public void afterInitUI() { - TuttiBeanMonitor<BenthosBatchRowModel> rowMonitor = getRowMonitor(); + if (log.isInfoEnabled()) { + log.info("afterInit: " + ui); + } - BenthosBatchRowModel bean = rowMonitor.getBean(); - if (bean != null) { + initUI(ui); - if (bean.isValid()) { - // there is a valid bean attached to the monitor + JXTable table = getTable(); - if (rowMonitor.wasModified()) { + // create table column model + TableColumnModel columnModel = createTableColumnModel(); - // monitored bean was modified, save it - if (log.isInfoEnabled()) { - log.info("Row " + bean + " was modified, will save it"); - } + // create table model + BenthosBatchTableModel tableModel = + new BenthosBatchTableModel(columnModel); - saveRow(bean); + table.setModel(tableModel); + table.setColumnModel(columnModel); - // clear modified flag on the monitor - rowMonitor.clearModified(); - } - } else { - - // row is not valid can not save it - - BenthosBatch catchBean = bean.toBean(); - - if (!TuttiEntities.isNew(catchBean)) { - - // remove this - persistenceService.deleteBenthosBatch(catchBean.getId()); - } - } - } + initBatchTable(table, columnModel, tableModel); } - protected void saveRow(BenthosBatchRowModel row) { - - BenthosBatch catchBean = row.toBean(); - - FishingOperation fishingOperation = getModel().getFishingOperation(); - catchBean.setFishingOperation(fishingOperation); + @Override + public void onCloseUI() { if (log.isInfoEnabled()) { - log.info("Selected fishingOperation: " + fishingOperation.getId()); + log.info("closing: " + ui); } + } - if (TuttiEntities.isNew(catchBean)) { + //------------------------------------------------------------------------// + //-- Public methods --// + //------------------------------------------------------------------------// - catchBean = persistenceService.createBenthosBatch(catchBean); - row.setId(catchBean.getId()); - } else { - persistenceService.saveBenthosBatch(catchBean); - } - } + //------------------------------------------------------------------------// + //-- Internal methods --// + //------------------------------------------------------------------------// + } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchRowModel.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchRowModel.java 2012-12-15 16:05:45 UTC (rev 77) @@ -24,12 +24,15 @@ * #L% */ +import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.MacroWasteBatch; -import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.persistence.entities.referential.MacroWasteCategory; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import java.util.List; + /** * Define a benthos batch row. * @@ -40,18 +43,20 @@ private static final long serialVersionUID = 1L; - public static final String PROPERTY_SPECIES = "species"; + public static final String PROPERTY_MACRO_WASTE_CATEGORY = "macroWasteCategory"; public static final String PROPERTY_WEIGHT = "weight"; public static final String PROPERTY_COMMENT = "comment"; + public static final String PROPERTY_ATTACHMENTS = "attachments"; + /** - * Species observed. + * macroWaste category. * * @since 0.2 */ - protected Species species; + protected MacroWasteCategory macroWasteCategory; /** * Observed weight. @@ -61,12 +66,19 @@ protected Float weight; /** - * Comment on this catches. + * Comment on this batch. * * @since 0.2 */ protected String comment; + /** + * Attachments. + * + * @since 0.2 + */ + protected List<Attachment> attachments; + protected static final Binder<MacroWasteBatch, MacroWasteBatchRowModel> fromBeanBinder = BinderFactory.newBinder(MacroWasteBatch.class, MacroWasteBatchRowModel.class); @@ -84,14 +96,14 @@ fromBean(aBatch); } - public Species getSpecies() { - return species; + public MacroWasteCategory getMacroWasteCategory() { + return macroWasteCategory; } - public void setSpecies(Species species) { - Object oldValue = getSpecies(); - this.species = species; - firePropertyChange(PROPERTY_SPECIES, oldValue, species); + public void setMacroWasteCategory(MacroWasteCategory macroWasteCategory) { + Object oldValue = getMacroWasteCategory(); + this.macroWasteCategory = macroWasteCategory; + firePropertyChange(PROPERTY_MACRO_WASTE_CATEGORY, oldValue, macroWasteCategory); } public Float getWeight() { @@ -113,4 +125,14 @@ this.comment = comment; firePropertyChange(PROPERTY_COMMENT, oldValue, comment); } + + public List<Attachment> getAttachments() { + return attachments; + } + + public void setAttachments(List<Attachment> attachments) { + Object oldValue = getAttachments(); + this.attachments = attachments; + firePropertyChange(PROPERTY_ATTACHMENTS, oldValue, attachments); + } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchTableModel.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchTableModel.java 2012-12-15 16:05:45 UTC (rev 77) @@ -39,16 +39,11 @@ private static final long serialVersionUID = 1L; - public static final ColumnIdentifier<MacroWasteBatchRowModel> SPECIES_BY_CODE = ColumnIdentifier.newId( - MacroWasteBatchRowModel.PROPERTY_SPECIES, - n_("tutti.table.macrowaste.batch.header.speciesByCode"), - n_("tutti.table.macrowaste.batch.header.speciesByCode")); + public static final ColumnIdentifier<MacroWasteBatchRowModel> MACRO_WASTE_CATEGORY = ColumnIdentifier.newId( + MacroWasteBatchRowModel.PROPERTY_MACRO_WASTE_CATEGORY, + n_("tutti.table.macrowaste.batch.header.macroWasteCategory"), + n_("tutti.table.macrowaste.batch.header.macroWasteCategory")); - public static final ColumnIdentifier<MacroWasteBatchRowModel> SPECIES_BY_GENUS_CODE = ColumnIdentifier.newId( - MacroWasteBatchRowModel.PROPERTY_SPECIES, - n_("tutti.table.macrowaste.batch.header.speciesByGenusCode"), - n_("tutti.table.macrowaste.batch.header.speciesByGenusCode")); - public static final ColumnIdentifier<MacroWasteBatchRowModel> WEIGHT = ColumnIdentifier.newId( MacroWasteBatchRowModel.PROPERTY_WEIGHT, n_("tutti.table.macrowaste.batch.header.weight"), @@ -59,16 +54,15 @@ n_("tutti.table.macrowaste.batch.header.comment"), n_("tutti.table.macrowaste.batch.header.comment")); - public static final ColumnIdentifier<MacroWasteBatchRowModel> FILE = ColumnIdentifier.newId( - null, + public static final ColumnIdentifier<MacroWasteBatchRowModel> ATTACHMENTS = ColumnIdentifier.newId( + MacroWasteBatchRowModel.PROPERTY_ATTACHMENTS, n_("tutti.table.macrowaste.batch.header.file"), n_("tutti.table.macrowaste.batch.header.file")); - public MacroWasteBatchTableModel(TableColumnModel columnModel) { super(columnModel); - setNoneEditableCols(FILE); + setNoneEditableCols(); } @Override @@ -80,25 +74,4 @@ return result; } - @Override - public void setValueAt(Object aValue, - int rowIndex, - int columnIndex, - ColumnIdentifier<MacroWasteBatchRowModel> propertyName, - MacroWasteBatchRowModel entry) { - super.setValueAt(aValue, rowIndex, columnIndex, propertyName, entry); - - if (propertyName == SPECIES_BY_CODE) { - - // update also other columns - fireTableCellUpdated(rowIndex, - SPECIES_BY_GENUS_CODE); - - } else if (propertyName == SPECIES_BY_GENUS_CODE) { - - // update also other columns - fireTableCellUpdated(rowIndex, - SPECIES_BY_CODE); - } - } } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchUI.jaxx 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchUI.jaxx 2012-12-15 16:05:45 UTC (rev 77) @@ -30,6 +30,7 @@ fr.ifremer.tutti.ui.swing.TuttiUIContext fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI fr.ifremer.tutti.ui.swing.util.editor.LongTextEditorUI + fr.ifremer.tutti.ui.swing.util.editor.AttachmentEditorUI jaxx.runtime.swing.editor.NumberEditor @@ -71,8 +72,10 @@ <field name='totalWeight' component='totalWeightField'/> </BeanValidator> - <LongTextEditorUI id='longTextEditorUI'/> + <LongTextEditorUI id='longTextEditor'/> + <AttachmentEditorUI id='attachmentEditor'/> + <Table id='form' fill='both' constraints='BorderLayout.NORTH'> <!-- Poids total --> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchUIHandler.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/macrowaste/MacroWasteBatchUIHandler.java 2012-12-15 16:05:45 UTC (rev 77) @@ -26,43 +26,36 @@ import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.MacroWasteBatch; -import fr.ifremer.tutti.persistence.entities.referential.Species; -import fr.ifremer.tutti.service.DecoratorService; -import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.persistence.entities.referential.MacroWasteCategory; import fr.ifremer.tutti.ui.swing.TuttiUI; +import fr.ifremer.tutti.ui.swing.content.operation.AbstractTuttiBatchTableUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; -import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.editor.AttachmentCellComponent; import fr.ifremer.tutti.ui.swing.util.editor.LongTextCellComponent; -import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; -import fr.ifremer.tutti.ui.swing.util.table.TableRowModificationListener; -import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; -import org.jdesktop.swingx.decorator.ComponentAdapter; -import org.jdesktop.swingx.decorator.HighlightPredicate; -import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.nuiton.util.decorator.Decorator; -import javax.swing.event.ListSelectionListener; import javax.swing.table.TableColumnModel; -import java.awt.Color; -import java.awt.Component; -import java.awt.event.FocusEvent; import java.util.List; +import static org.nuiton.i18n.I18n.n_; + /** * @author tchemit <chemit@codelutin.com> * @since 0.2 */ -public class MacroWasteBatchUIHandler extends AbstractTuttiTableUIHandler<MacroWasteBatchRowModel, MacroWasteBatchUIModel> { +public class MacroWasteBatchUIHandler extends AbstractTuttiBatchTableUIHandler<MacroWasteBatchRowModel, MacroWasteBatchUIModel> { /** Logger. */ - private static final Log log = LogFactory.getLog(MacroWasteBatchUIHandler.class); + private static final Log log = + LogFactory.getLog(MacroWasteBatchUIHandler.class); /** * UI. @@ -71,31 +64,13 @@ */ private final MacroWasteBatchUI ui; - /** - * Persistence service. - * - * @since 0.2 - */ - private final PersistenceService persistenceService; - - /** - * To monitor changes on the fishing operation. - * - * @since 0.2 - */ - private final TuttiBeanMonitor<MacroWasteBatchUIModel> fishingOperationMonitor; - - public MacroWasteBatchUIHandler(FishingOperationsUI parentUi, MacroWasteBatchUI ui) { - super(parentUi.getHandler().getContext(), - MacroWasteBatchRowModel.PROPERTY_SPECIES, + super(parentUi, + new String[]{MacroWasteBatchUIModel.PROPERTY_TOTAL_WEIGHT}, + MacroWasteBatchRowModel.PROPERTY_MACRO_WASTE_CATEGORY, MacroWasteBatchRowModel.PROPERTY_WEIGHT, MacroWasteBatchRowModel.PROPERTY_COMMENT); this.ui = ui; - this.persistenceService = context.getService(PersistenceService.class); - this.fishingOperationMonitor = new TuttiBeanMonitor<MacroWasteBatchUIModel>( - MacroWasteBatchUIModel.PROPERTY_TOTAL_WEIGHT - ); } //------------------------------------------------------------------------// @@ -118,36 +93,27 @@ } @Override + protected FishingOperation getFishingOperation() { + return getModel().getFishingOperation(); + } + + @Override protected TableColumnModel createTableColumnModel() { DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); - List<Species> allSpecies = persistenceService.getAllSpecies(); - { - // Species (by code) column + // MacroWaste Category column - Decorator<Species> decorator = getDecorator( - Species.class, DecoratorService.SPECIES_BY_CODE); + Decorator<MacroWasteCategory> decorator = getDecorator( + MacroWasteCategory.class, null); addComboDataColumnToModel(columnModel, - MacroWasteBatchTableModel.SPECIES_BY_CODE, - decorator, allSpecies); + MacroWasteBatchTableModel.MACRO_WASTE_CATEGORY, + decorator, persistenceService.getAllMacroWasteCategory()); } - { - // Species (by genusCode) column - - Decorator<Species> decorator = getDecorator( - Species.class, DecoratorService.SPECIES_BY_GENUS); - - addComboDataColumnToModel(columnModel, - MacroWasteBatchTableModel.SPECIES_BY_GENUS_CODE, - decorator, allSpecies); - - } - { // Weight column addFloatColumnToModel(columnModel, @@ -158,15 +124,19 @@ { // Comment column addColumnToModel(columnModel, - LongTextCellComponent.newEditor(ui.getLongTextEditorUI()), - LongTextCellComponent.newRender(), + LongTextCellComponent.newEditor(ui.getLongTextEditor()), + LongTextCellComponent.newRender(n_("tutti.tooltip.comment.none")), MacroWasteBatchTableModel.COMMENT); } { // File column addColumnToModel(columnModel, - MacroWasteBatchTableModel.FILE); + AttachmentCellComponent.newEditor(ui.getAttachmentEditor()), + AttachmentCellComponent.newRender( + getDecorator(Attachment.class, null), + n_("tutti.tooltip.attachment.none")), + MacroWasteBatchTableModel.ATTACHMENTS); } return columnModel; } @@ -215,118 +185,72 @@ } } - //------------------------------------------------------------------------// - //-- AbstractTuttiUIHandler methods --// - //------------------------------------------------------------------------// - @Override - public void beforeInitUI() { + protected void saveSelectedRowIfRequired() { - if (log.isInfoEnabled()) { - log.info("beforeInit: " + ui); - } + TuttiBeanMonitor<MacroWasteBatchRowModel> rowMonitor = getRowMonitor(); - MacroWasteBatchUIModel model = new MacroWasteBatchUIModel(); - ui.setContextValue(model); + MacroWasteBatchRowModel bean = rowMonitor.getBean(); + if (bean != null) { - fishingOperationMonitor.setBean(model); - } + if (bean.isValid()) { + // there is a valid bean attached to the monitor - @Override - public void afterInitUI() { + if (rowMonitor.wasModified()) { - if (log.isInfoEnabled()) { - log.info("afterInit: " + ui); - } + // monitored bean was modified, save it + if (log.isInfoEnabled()) { + log.info("Row " + bean + " was modified, will save it"); + } - initUI(ui); + saveRow(bean); - JXTable table = getTable(); + // clear modified flag on the monitor + rowMonitor.clearModified(); + } + } else { - // create table column model - TableColumnModel columnModel = createTableColumnModel(); + // row is not valid can not save it - // create table model - MacroWasteBatchTableModel tableModel = - new MacroWasteBatchTableModel(columnModel); + MacroWasteBatch catchBean = bean.toBean(); - table.setModel(tableModel); - table.setColumnModel(columnModel); - installTableKeyListener(columnModel, table); + if (!TuttiEntities.isNew(catchBean)) { - table.getTableHeader().setReorderingAllowed(false); - - - Highlighter readOnlyHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - HighlightPredicate.READ_ONLY, Color.LIGHT_GRAY); - - table.addHighlighter(readOnlyHighlighter); - Highlighter validHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - new HighlightPredicate.AndHighlightPredicate(HighlightPredicate.EDITABLE, new HighlightPredicate() { - @Override - public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { - - boolean result = false; - if (adapter.isEditable()) { - int rowIndex = adapter.convertRowIndexToModel(adapter.row); - MacroWasteBatchRowModel row = getTableModel().getEntry(rowIndex); - result = !row.isValid(); - } - return result; - } - }), Color.RED); - table.addHighlighter(validHighlighter); - - // when model datas change let's propagate it table model - listenRowsFromModel(); - - // save when row chaged and was modified - ListSelectionListener listener = new TableRowModificationListener<MacroWasteBatchRowModel>( - getTableModel(), getRowMonitor()) { - @Override - protected void saveSelectedRow() { - saveSelectedRowIfRequired(); + // remove this + persistenceService.deleteMacroWasteBatch(catchBean.getId()); + } } - }; - table.getSelectionModel().addListSelectionListener(listener); - - // always scroll to selected row - SwingUtil.scrollToTableSelection(getTable()); + } } @Override - public void onCloseUI() { - if (log.isInfoEnabled()) { - log.info("closing: " + ui); - } + protected boolean isRowValid(MacroWasteBatchRowModel row) { + boolean result = row.getMacroWasteCategory() != null && + row.getWeight() != null; + return result; } - //------------------------------------------------------------------------// - //-- Public methods --// - //------------------------------------------------------------------------// + @Override + protected void saveRow(MacroWasteBatchRowModel row) { - public void saveSelectedRowIfRequired(FocusEvent event) { + MacroWasteBatch catchBean = row.toBean(); - Component oppositeComponent = event.getOppositeComponent(); - - JXTable parentContainer = null; - - if (oppositeComponent != null) { - - // check out if still on table - parentContainer = SwingUtil.getParentContainer( - oppositeComponent, JXTable.class); + FishingOperation fishingOperation = getModel().getFishingOperation(); + catchBean.setFishingOperation(fishingOperation); + if (log.isInfoEnabled()) { + log.info("Selected fishingOperation: " + fishingOperation.getId()); } - if (parentContainer == null) { + if (TuttiEntities.isNew(catchBean)) { - // out of the table can save - if (getModel().getFishingOperation() != null) { - saveSelectedRowIfRequired(); - } + catchBean = persistenceService.createMacroWasteBatch(catchBean); + row.setId(catchBean.getId()); + } else { + persistenceService.saveMacroWasteBatch(catchBean); } } + @Override public void selectFishingOperation(FishingOperation bean) { JXTable table = getTable(); @@ -390,81 +314,60 @@ fishingOperationMonitor.clearModified(); } - public void cancel() { + //------------------------------------------------------------------------// + //-- AbstractTuttiUIHandler methods --// + //------------------------------------------------------------------------// - if (log.isInfoEnabled()) { - log.info("Cancel edition"); - } - } + @Override + public void beforeInitUI() { - public void save() { if (log.isInfoEnabled()) { - log.info("Will save"); + log.info("beforeInit: " + ui); } - } - //------------------------------------------------------------------------// - //-- Internal methods --// - //------------------------------------------------------------------------// + MacroWasteBatchUIModel model = new MacroWasteBatchUIModel(); + ui.setContextValue(model); - protected boolean isRowValid(MacroWasteBatchRowModel row) { - boolean result = row.getSpecies() != null && row.getWeight() != null; - return result; + fishingOperationMonitor.setBean(model); } - protected void saveSelectedRowIfRequired() { + @Override + public void afterInitUI() { - TuttiBeanMonitor<MacroWasteBatchRowModel> rowMonitor = getRowMonitor(); + if (log.isInfoEnabled()) { + log.info("afterInit: " + ui); + } - MacroWasteBatchRowModel bean = rowMonitor.getBean(); - if (bean != null) { + initUI(ui); - if (bean.isValid()) { - // there is a valid bean attached to the monitor + JXTable table = getTable(); - if (rowMonitor.wasModified()) { + // create table column model + TableColumnModel columnModel = createTableColumnModel(); - // monitored bean was modified, save it - if (log.isInfoEnabled()) { - log.info("Row " + bean + " was modified, will save it"); - } + // create table model + MacroWasteBatchTableModel tableModel = + new MacroWasteBatchTableModel(columnModel); - saveRow(bean); + table.setModel(tableModel); + table.setColumnModel(columnModel); - // clear modified flag on the monitor - rowMonitor.clearModified(); - } - } else { - - // row is not valid can not save it - - MacroWasteBatch catchBean = bean.toBean(); - - if (!TuttiEntities.isNew(catchBean)) { - - // remove this - persistenceService.deleteMacroWasteBatch(catchBean.getId()); - } - } - } + initBatchTable(table, columnModel, tableModel); } - protected void saveRow(MacroWasteBatchRowModel row) { - - MacroWasteBatch catchBean = row.toBean(); - - FishingOperation fishingOperation = getModel().getFishingOperation(); - catchBean.setFishingOperation(fishingOperation); + @Override + public void onCloseUI() { if (log.isInfoEnabled()) { - log.info("Selected fishingOperation: " + fishingOperation.getId()); + log.info("closing: " + ui); } + } - if (TuttiEntities.isNew(catchBean)) { + //------------------------------------------------------------------------// + //-- Public methods --// + //------------------------------------------------------------------------// - catchBean = persistenceService.createMacroWasteBatch(catchBean); - row.setId(catchBean.getId()); - } else { - persistenceService.saveMacroWasteBatch(catchBean); - } - } + //------------------------------------------------------------------------// + //-- Internal methods --// + //------------------------------------------------------------------------// + } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchRowModel.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchRowModel.java 2012-12-15 16:05:45 UTC (rev 77) @@ -24,12 +24,15 @@ * #L% */ +import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.PlanktonBatch; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import java.util.List; + /** * Define a benthos batch row. * @@ -52,6 +55,8 @@ public static final String PROPERTY_COMMENT = "comment"; + public static final String PROPERTY_ATTACHMENTS = "attachments"; + /** * Species observed. * @@ -94,6 +99,13 @@ */ protected String comment; + /** + * Attachments + * + * @since 0.2 + */ + protected List<Attachment> attachments; + protected static final Binder<PlanktonBatch, PlanktonBatchRowModel> fromBeanBinder = BinderFactory.newBinder(PlanktonBatch.class, PlanktonBatchRowModel.class); @@ -170,4 +182,14 @@ this.comment = comment; firePropertyChange(PROPERTY_COMMENT, oldValue, comment); } + + public List<Attachment> getAttachments() { + return attachments; + } + + public void setAttachments(List<Attachment> attachments) { + Object oldValue = getAttachments(); + this.attachments = attachments; + firePropertyChange(PROPERTY_ATTACHMENTS, oldValue, attachments); + } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchTableModel.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchTableModel.java 2012-12-15 16:05:45 UTC (rev 77) @@ -74,20 +74,15 @@ n_("tutti.table.plankton.batch.header.comment"), n_("tutti.table.plankton.batch.header.comment")); - public static final ColumnIdentifier<PlanktonBatchRowModel> FILE = ColumnIdentifier.newId( - null, + public static final ColumnIdentifier<PlanktonBatchRowModel> ATTACHMENTS = ColumnIdentifier.newId( + PlanktonBatchRowModel.PROPERTY_ATTACHMENTS, n_("tutti.table.plankton.batch.header.file"), n_("tutti.table.plankton.batch.header.file")); - public PlanktonBatchTableModel(TableColumnModel columnModel) { super(columnModel); - setNoneEditableCols( - SAMPLE_WEIGHT, - SAMPLING_RATIO, - FILE - ); + setNoneEditableCols(SAMPLE_WEIGHT, SAMPLING_RATIO); } @Override @@ -110,14 +105,12 @@ if (propertyName == SPECIES_BY_CODE) { // update also other columns - fireTableCellUpdated(rowIndex, - SPECIES_BY_GENUS_CODE); + fireTableCellUpdated(rowIndex, SPECIES_BY_GENUS_CODE); } else if (propertyName == SPECIES_BY_GENUS_CODE) { // update also other columns - fireTableCellUpdated(rowIndex, - SPECIES_BY_CODE); + fireTableCellUpdated(rowIndex, SPECIES_BY_CODE); } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchUI.jaxx 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchUI.jaxx 2012-12-15 16:05:45 UTC (rev 77) @@ -30,6 +30,7 @@ fr.ifremer.tutti.ui.swing.TuttiUIContext fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI fr.ifremer.tutti.ui.swing.util.editor.LongTextEditorUI + fr.ifremer.tutti.ui.swing.util.editor.AttachmentEditorUI jaxx.runtime.swing.editor.NumberEditor @@ -72,8 +73,10 @@ <field name='sampleTotalWeight' component='sampleTotalWeightField'/> </BeanValidator> - <LongTextEditorUI id='longTextEditorUI'/> + <LongTextEditorUI id='longTextEditor'/> + <AttachmentEditorUI id='attachmentEditor'/> + <Table id='form' fill='both' constraints='BorderLayout.NORTH'> <!-- Poids total --> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchUIHandler.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/plankton/PlanktonBatchUIHandler.java 2012-12-15 16:05:45 UTC (rev 77) @@ -26,40 +26,33 @@ import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.PlanktonBatch; 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.TuttiUI; +import fr.ifremer.tutti.ui.swing.content.operation.AbstractTuttiBatchTableUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; -import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.editor.AttachmentCellComponent; import fr.ifremer.tutti.ui.swing.util.editor.LongTextCellComponent; -import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; -import fr.ifremer.tutti.ui.swing.util.table.TableRowModificationListener; -import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; -import org.jdesktop.swingx.decorator.ComponentAdapter; -import org.jdesktop.swingx.decorator.HighlightPredicate; -import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.nuiton.util.decorator.Decorator; -import javax.swing.event.ListSelectionListener; import javax.swing.table.TableColumnModel; -import java.awt.Color; -import java.awt.Component; -import java.awt.event.FocusEvent; import java.util.List; +import static org.nuiton.i18n.I18n.n_; + /** * @author tchemit <chemit@codelutin.com> * @since 0.2 */ -public class PlanktonBatchUIHandler extends AbstractTuttiTableUIHandler<PlanktonBatchRowModel, PlanktonBatchUIModel> { +public class PlanktonBatchUIHandler extends AbstractTuttiBatchTableUIHandler<PlanktonBatchRowModel, PlanktonBatchUIModel> { /** Logger. */ private static final Log log = LogFactory.getLog(PlanktonBatchUIHandler.class); @@ -71,32 +64,14 @@ */ private final PlanktonBatchUI ui; - /** - * Persistence service. - * - * @since 0.2 - */ - private final PersistenceService persistenceService; - - /** - * To monitor changes on the fishing operation. - * - * @since 0.2 - */ - private final TuttiBeanMonitor<PlanktonBatchUIModel> fishingOperationMonitor; - public PlanktonBatchUIHandler(FishingOperationsUI parentUi, PlanktonBatchUI ui) { - super(parentUi.getHandler().getContext(), + super(parentUi, new String[]{PlanktonBatchUIModel.PROPERTY_TOTAL_WEIGHT, + PlanktonBatchUIModel.PROPERTY_SAMPLE_TOTAL_WEIGHT}, PlanktonBatchRowModel.PROPERTY_SPECIES_TO_CONFIRM, PlanktonBatchRowModel.PROPERTY_SPECIES, PlanktonBatchRowModel.PROPERTY_WEIGHT, PlanktonBatchRowModel.PROPERTY_COMMENT); this.ui = ui; - this.persistenceService = context.getService(PersistenceService.class); - this.fishingOperationMonitor = new TuttiBeanMonitor<PlanktonBatchUIModel>( - PlanktonBatchUIModel.PROPERTY_TOTAL_WEIGHT, - PlanktonBatchUIModel.PROPERTY_SAMPLE_TOTAL_WEIGHT - ); } //------------------------------------------------------------------------// @@ -119,6 +94,11 @@ } @Override + protected FishingOperation getFishingOperation() { + return getModel().getFishingOperation(); + } + + @Override protected String[] getRowPropertiesToIgnore() { return new String[]{ PlanktonBatchRowModel.PROPERTY_SAMPLE_WEIGHT, @@ -187,15 +167,19 @@ { // Comment column addColumnToModel(columnModel, - LongTextCellComponent.newEditor(ui.getLongTextEditorUI()), - LongTextCellComponent.newRender(), + LongTextCellComponent.newEditor(ui.getLongTextEditor()), + LongTextCellComponent.newRender(n_("tutti.tooltip.comment.none")), PlanktonBatchTableModel.COMMENT); } { // File column addColumnToModel(columnModel, - PlanktonBatchTableModel.FILE); + AttachmentCellComponent.newEditor(ui.getAttachmentEditor()), + AttachmentCellComponent.newRender( + getDecorator(Attachment.class, null), + n_("tutti.tooltip.attachment.none")), + PlanktonBatchTableModel.ATTACHMENTS); } return columnModel; } @@ -244,118 +228,71 @@ } } - //------------------------------------------------------------------------// - //-- AbstractTuttiUIHandler methods --// - //------------------------------------------------------------------------// - @Override - public void beforeInitUI() { + protected void saveSelectedRowIfRequired() { - if (log.isInfoEnabled()) { - log.info("beforeInit: " + ui); - } + TuttiBeanMonitor<PlanktonBatchRowModel> rowMonitor = getRowMonitor(); - PlanktonBatchUIModel model = new PlanktonBatchUIModel(); - ui.setContextValue(model); + PlanktonBatchRowModel bean = rowMonitor.getBean(); + if (bean != null) { - fishingOperationMonitor.setBean(model); - } + if (bean.isValid()) { + // there is a valid bean attached to the monitor - @Override - public void afterInitUI() { + if (rowMonitor.wasModified()) { - if (log.isInfoEnabled()) { - log.info("afterInit: " + ui); - } + // monitored bean was modified, save it + if (log.isInfoEnabled()) { + log.info("Row " + bean + " was modified, will save it"); + } - initUI(ui); + saveRow(bean); - JXTable table = getTable(); + // clear modified flag on the monitor + rowMonitor.clearModified(); + } + } else { - // create table column model - TableColumnModel columnModel = createTableColumnModel(); + // row is not valid can not save it - // create table model - PlanktonBatchTableModel tableModel = - new PlanktonBatchTableModel(columnModel); + PlanktonBatch catchBean = bean.toBean(); - table.setModel(tableModel); - table.setColumnModel(columnModel); - installTableKeyListener(columnModel, table); + if (!TuttiEntities.isNew(catchBean)) { - table.getTableHeader().setReorderingAllowed(false); - - - Highlighter readOnlyHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - HighlightPredicate.READ_ONLY, Color.LIGHT_GRAY); - - table.addHighlighter(readOnlyHighlighter); - Highlighter validHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - new HighlightPredicate.AndHighlightPredicate(HighlightPredicate.EDITABLE, new HighlightPredicate() { - @Override - public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { - - boolean result = false; - if (adapter.isEditable()) { - int rowIndex = adapter.convertRowIndexToModel(adapter.row); - PlanktonBatchRowModel row = getTableModel().getEntry(rowIndex); - result = !row.isValid(); - } - return result; - } - }), Color.RED); - table.addHighlighter(validHighlighter); - - // when model datas change let's propagate it table model - listenRowsFromModel(); - - // save when row chaged and was modified - ListSelectionListener listener = new TableRowModificationListener<PlanktonBatchRowModel>( - getTableModel(), getRowMonitor()) { - @Override - protected void saveSelectedRow() { - saveSelectedRowIfRequired(); + // remove this + persistenceService.deletePlanktonBatch(catchBean.getId()); + } } - }; - table.getSelectionModel().addListSelectionListener(listener); - - // always scroll to selected row - SwingUtil.scrollToTableSelection(getTable()); + } } @Override - public void onCloseUI() { - if (log.isInfoEnabled()) { - log.info("closing: " + ui); - } + protected boolean isRowValid(PlanktonBatchRowModel row) { + boolean result = row.getSpecies() != null && row.getWeight() != null; + return result; } - //------------------------------------------------------------------------// - //-- Public methods --// - //------------------------------------------------------------------------// + @Override + protected void saveRow(PlanktonBatchRowModel row) { - public void saveSelectedRowIfRequired(FocusEvent event) { + PlanktonBatch catchBean = row.toBean(); - Component oppositeComponent = event.getOppositeComponent(); - - JXTable parentContainer = null; - - if (oppositeComponent != null) { - - // check out if still on table - parentContainer = SwingUtil.getParentContainer( - oppositeComponent, JXTable.class); + FishingOperation fishingOperation = getModel().getFishingOperation(); + catchBean.setFishingOperation(fishingOperation); + if (log.isInfoEnabled()) { + log.info("Selected fishingOperation: " + fishingOperation.getId()); } - if (parentContainer == null) { + if (TuttiEntities.isNew(catchBean)) { - // out of the table can save - if (getModel().getFishingOperation() != null) { - saveSelectedRowIfRequired(); - } + catchBean = persistenceService.createPlanktonBatch(catchBean); + row.setId(catchBean.getId()); + } else { + persistenceService.savePlanktonBatch(catchBean); } } + @Override public void selectFishingOperation(FishingOperation bean) { JXTable table = getTable(); @@ -419,81 +356,60 @@ fishingOperationMonitor.clearModified(); } - public void cancel() { + //------------------------------------------------------------------------// + //-- AbstractTuttiUIHandler methods --// + //------------------------------------------------------------------------// - if (log.isInfoEnabled()) { - log.info("Cancel edition"); - } - } + @Override + public void beforeInitUI() { - public void save() { if (log.isInfoEnabled()) { - log.info("Will save"); + log.info("beforeInit: " + ui); } - } - //------------------------------------------------------------------------// - //-- Internal methods --// - //------------------------------------------------------------------------// + PlanktonBatchUIModel model = new PlanktonBatchUIModel(); + ui.setContextValue(model); - protected boolean isRowValid(PlanktonBatchRowModel row) { - boolean result = row.getSpecies() != null && row.getWeight() != null; - return result; + fishingOperationMonitor.setBean(model); } - protected void saveSelectedRowIfRequired() { + @Override + public void afterInitUI() { - TuttiBeanMonitor<PlanktonBatchRowModel> rowMonitor = getRowMonitor(); + if (log.isInfoEnabled()) { + log.info("afterInit: " + ui); + } - PlanktonBatchRowModel bean = rowMonitor.getBean(); - if (bean != null) { + initUI(ui); - if (bean.isValid()) { - // there is a valid bean attached to the monitor + JXTable table = getTable(); - if (rowMonitor.wasModified()) { + // create table column model + TableColumnModel columnModel = createTableColumnModel(); - // monitored bean was modified, save it - if (log.isInfoEnabled()) { - log.info("Row " + bean + " was modified, will save it"); - } + // create table model + PlanktonBatchTableModel tableModel = + new PlanktonBatchTableModel(columnModel); - saveRow(bean); + table.setModel(tableModel); + table.setColumnModel(columnModel); - // clear modified flag on the monitor - rowMonitor.clearModified(); - } - } else { - - // row is not valid can not save it - - PlanktonBatch catchBean = bean.toBean(); - - if (!TuttiEntities.isNew(catchBean)) { - - // remove this - persistenceService.deletePlanktonBatch(catchBean.getId()); - } - } - } + initBatchTable(table, columnModel, tableModel); } - protected void saveRow(PlanktonBatchRowModel row) { - - PlanktonBatch catchBean = row.toBean(); - - FishingOperation fishingOperation = getModel().getFishingOperation(); - catchBean.setFishingOperation(fishingOperation); + @Override + public void onCloseUI() { if (log.isInfoEnabled()) { - log.info("Selected fishingOperation: " + fishingOperation.getId()); + log.info("closing: " + ui); } + } - if (TuttiEntities.isNew(catchBean)) { + //------------------------------------------------------------------------// + //-- Public methods --// + //------------------------------------------------------------------------// - catchBean = persistenceService.createPlanktonBatch(catchBean); - row.setId(catchBean.getId()); - } else { - persistenceService.savePlanktonBatch(catchBean); - } - } + //------------------------------------------------------------------------// + //-- Internal methods --// + //------------------------------------------------------------------------// + } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchRowModel.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchRowModel.java 2012-12-15 16:05:45 UTC (rev 77) @@ -28,8 +28,8 @@ import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; -import fr.ifremer.tutti.persistence.entities.data.VracHorsVracEnum; import fr.ifremer.tutti.persistence.entities.referential.Sex; +import fr.ifremer.tutti.persistence.entities.referential.SortedUnsortedCategory; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.WeightCategory; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; @@ -54,7 +54,7 @@ public static final String PROPERTY_SPECIES_TO_CONFIRM = "speciesToConfirm"; - public static final String PROPERTY_VRAC_HORS_VRAC = "vracHorsVrac"; + public static final String PROPERTY_SORTED_UNSORTED_CATEGORY = "sortedUnsortedCategory"; public static final String PROPERTY_WEIGHT_CATEGORY = "weightCategory"; @@ -99,7 +99,7 @@ * * @since 0.2 */ - protected VracHorsVracEnum vracHorsVrac; + protected SortedUnsortedCategory sortedUnsortedCategory; /** * Weight category (can be null). @@ -254,14 +254,14 @@ firePropertyChange(PROPERTY_SPECIES_TO_CONFIRM, oldValue, speciesToConfirm); } - public VracHorsVracEnum getVracHorsVrac() { - return vracHorsVrac; + public SortedUnsortedCategory getSortedUnsortedCategory() { + return sortedUnsortedCategory; } - public void setVracHorsVrac(VracHorsVracEnum vracHorsVrac) { - Object oldValue = getVracHorsVrac(); - this.vracHorsVrac = vracHorsVrac; - firePropertyChange(PROPERTY_VRAC_HORS_VRAC, oldValue, vracHorsVrac); + public void setSortedUnsortedCategory(SortedUnsortedCategory sortedUnsortedCategory) { + Object oldValue = getSortedUnsortedCategory(); + this.sortedUnsortedCategory = sortedUnsortedCategory; + firePropertyChange(PROPERTY_SORTED_UNSORTED_CATEGORY, oldValue, sortedUnsortedCategory); } public WeightCategory getWeightCategory() { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchTableModel.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchTableModel.java 2012-12-15 16:05:45 UTC (rev 77) @@ -56,10 +56,10 @@ n_("tutti.table.species.batch.header.speciesByGenusCode"), n_("tutti.table.species.batch.header.speciesByGenusCode")); - public static final ColumnIdentifier<SpeciesBatchRowModel> VRAC_HORS_VRAC = ColumnIdentifier.newId( - SpeciesBatchRowModel.PROPERTY_VRAC_HORS_VRAC, - n_("tutti.table.species.batch.header.vracHorsVrac"), - n_("tutti.table.species.batch.header.vracHorsVrac")); + public static final ColumnIdentifier<SpeciesBatchRowModel> SORTED_UNSORTED_CATEGORY = ColumnIdentifier.newId( + SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY, + n_("tutti.table.species.batch.header.sortedUnsortedCategory"), + n_("tutti.table.species.batch.header.sortedUnsortedCategory")); public static final ColumnIdentifier<SpeciesBatchRowModel> WEIGHT_CATEGORY = ColumnIdentifier.newId( SpeciesBatchRowModel.PROPERTY_WEIGHT_CATEGORY, @@ -122,11 +122,7 @@ public SpeciesBatchTableModel(TableColumnModel columnModel) { super(columnModel); - setNoneEditableCols( - SAMPLE_WEIGHT, - SAMPLING_RATIO/*, - FILE*/ - ); + setNoneEditableCols(SAMPLE_WEIGHT, SAMPLING_RATIO); noneEditableColIfNoSpecies = Sets.newHashSet(); noneEditableColIfNoSpecies.add(COMPUTED_NUMBER); noneEditableColIfNoSpecies.add(COMPUTED_WEIGHT); @@ -167,23 +163,19 @@ } else if (propertyName == COMPUTED_NUMBER) { // update also other columns - fireTableCellUpdated(rowIndex, - COMPUTED_WEIGHT); + fireTableCellUpdated(rowIndex, COMPUTED_WEIGHT); } else if (propertyName == COMPUTED_WEIGHT) { // update also other columns - fireTableCellUpdated(rowIndex, - COMPUTED_NUMBER); + fireTableCellUpdated(rowIndex, COMPUTED_NUMBER); } } public void updateSamplingRatio(Set<SpeciesBatchRowModel> rows) { for (SpeciesBatchRowModel row : rows) { int rowIndex = getRows().indexOf(row); - fireTableCellUpdated(rowIndex, - SAMPLE_WEIGHT, - SAMPLING_RATIO); + fireTableCellUpdated(rowIndex, SAMPLE_WEIGHT, SAMPLING_RATIO); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchTreeModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchTreeModel.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchTreeModel.java 2012-12-15 16:05:45 UTC (rev 77) @@ -28,7 +28,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; -import fr.ifremer.tutti.persistence.entities.data.VracHorsVracEnum; +import fr.ifremer.tutti.persistence.entities.referential.SortedUnsortedCategory; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import org.apache.commons.collections.CollectionUtils; @@ -197,8 +197,9 @@ SpeciesBatchRowModel row = getNodeToRow(node); if (row != null) { - VracHorsVracEnum vracHorsVrac = row.getVracHorsVrac(); - if (VracHorsVracEnum.HORS_VRAC.equals(vracHorsVrac)) { + SortedUnsortedCategory sortedUnsortedCategory = row.getSortedUnsortedCategory(); + if (sortedUnsortedCategory != null && + "unsorted".equals(sortedUnsortedCategory.getName())) { // never take account of a such child Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchUI.jaxx 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchUI.jaxx 2012-12-15 16:05:45 UTC (rev 77) @@ -77,11 +77,11 @@ <field name='totalHorsVracWeight' component='totalHorsVracWeightField'/> </BeanValidator> - <SpeciesFrequencyUI id='frequencyUI' constructorParams='handler.getContext()'/> + <SpeciesFrequencyUI id='frequencyEditor' constructorParams='handler.getContext()'/> - <LongTextEditorUI id='longTextEditorUI'/> + <LongTextEditorUI id='longTextEditor'/> - <AttachmentEditorUI id='attachmentEditorUI'/> + <AttachmentEditorUI id='attachmentEditor'/> <Table id='form' fill='both' constraints='BorderLayout.NORTH'> @@ -119,7 +119,7 @@ </Table> <JScrollPane id='tableScrollPane' constraints='BorderLayout.CENTER'> - <JXTable id='table' onFocusLost='handler.saveSelectedRowIfRequired(event);'/> + <JXTable id='table' onFocusLost='handler.saveSelectedRowIfRequired(event)'/> </JScrollPane> </JPanel> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchUIHandler.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/species/SpeciesBatchUIHandler.java 2012-12-15 16:05:45 UTC (rev 77) @@ -28,64 +28,54 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; -import fr.ifremer.tutti.persistence.entities.data.VracHorsVracEnum; import fr.ifremer.tutti.persistence.entities.referential.Sex; +import fr.ifremer.tutti.persistence.entities.referential.SortedUnsortedCategory; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.WeightCategory; import fr.ifremer.tutti.service.DecoratorService; -import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.TuttiUI; +import fr.ifremer.tutti.ui.swing.content.operation.AbstractTuttiBatchTableUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; -import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.editor.AttachmentCellComponent; import fr.ifremer.tutti.ui.swing.util.editor.LongTextCellComponent; -import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; -import fr.ifremer.tutti.ui.swing.util.table.TableRowModificationListener; -import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; -import org.jdesktop.swingx.decorator.ComponentAdapter; -import org.jdesktop.swingx.decorator.HighlightPredicate; -import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.nuiton.util.decorator.Decorator; -import javax.swing.event.ListSelectionListener; import javax.swing.table.TableColumnModel; -import java.awt.Color; -import java.awt.Component; -import java.awt.event.FocusEvent; import java.util.List; import java.util.Set; -import com.ezware.oxbow.swingbits.table.filter.TableRowFilterSupport; +import static org.nuiton.i18n.I18n.n_; + /** * @author tchemit <chemit@codelutin.com> * @since 0.1 */ -public class SpeciesBatchUIHandler extends AbstractTuttiTableUIHandler<SpeciesBatchRowModel, SpeciesBatchUIModel> { +public class SpeciesBatchUIHandler extends AbstractTuttiBatchTableUIHandler<SpeciesBatchRowModel, SpeciesBatchUIModel> { /** Logger. */ - private static final Log log = LogFactory.getLog(SpeciesBatchUIHandler.class); + private static final Log log = + LogFactory.getLog(SpeciesBatchUIHandler.class); public static final Set<String> RECOMPUTE_TOTAL_WEIGHT = Sets.newHashSet( - SpeciesBatchRowModel.PROPERTY_VRAC_HORS_VRAC, - SpeciesBatchRowModel.PROPERTY_WEIGHT - ); + SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY, + SpeciesBatchRowModel.PROPERTY_WEIGHT); public static final Set<String> SAMPLING_PROPERTIES = Sets.newHashSet( SpeciesBatchRowModel.PROPERTY_SPECIES, - SpeciesBatchRowModel.PROPERTY_VRAC_HORS_VRAC, + SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY, SpeciesBatchRowModel.PROPERTY_WEIGHT_CATEGORY, SpeciesBatchRowModel.PROPERTY_SEX, SpeciesBatchRowModel.PROPERTY_MATURITY, - SpeciesBatchRowModel.PROPERTY_AGE - ); + SpeciesBatchRowModel.PROPERTY_AGE); /** * UI. @@ -94,25 +84,18 @@ */ private final SpeciesBatchUI ui; - /** - * Persistence service. - * - * @since 0.2 - */ - private final PersistenceService persistenceService; - - /** - * To monitor changes on the fishing operation. - * - * @since 0.2 - */ - private final TuttiBeanMonitor<SpeciesBatchUIModel> fishingOperationMonitor; - - public SpeciesBatchUIHandler(FishingOperationsUI parentUi, SpeciesBatchUI ui) { - super(parentUi.getHandler().getContext(), + public SpeciesBatchUIHandler(FishingOperationsUI parentUi, + SpeciesBatchUI ui) { + super(parentUi, + new String[]{ + SpeciesBatchUIModel.PROPERTY_SAMPLE_VRAC_WEIGHT, + SpeciesBatchUIModel.PROPERTY_TOTAL_HORS_VRAC_WEIGHT, + SpeciesBatchUIModel.PROPERTY_TOTAL_VRAC_WEIGHT, + SpeciesBatchUIModel.PROPERTY_TOTAL_WEIGHT + }, SpeciesBatchRowModel.PROPERTY_SPECIES_TO_CONFIRM, SpeciesBatchRowModel.PROPERTY_SPECIES, - SpeciesBatchRowModel.PROPERTY_VRAC_HORS_VRAC, + SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY, SpeciesBatchRowModel.PROPERTY_WEIGHT_CATEGORY, SpeciesBatchRowModel.PROPERTY_SEX, SpeciesBatchRowModel.PROPERTY_MATURITY, @@ -122,13 +105,6 @@ SpeciesBatchRowModel.PROPERTY_ATTACHMENTS, SpeciesBatchRowModel.PROPERTY_FREQUENCY); this.ui = ui; - this.persistenceService = context.getService(PersistenceService.class); - this.fishingOperationMonitor = new TuttiBeanMonitor<SpeciesBatchUIModel>( - SpeciesBatchUIModel.PROPERTY_SAMPLE_VRAC_WEIGHT, - SpeciesBatchUIModel.PROPERTY_TOTAL_HORS_VRAC_WEIGHT, - SpeciesBatchUIModel.PROPERTY_TOTAL_VRAC_WEIGHT, - SpeciesBatchUIModel.PROPERTY_TOTAL_WEIGHT - ); } //------------------------------------------------------------------------// @@ -151,6 +127,11 @@ } @Override + protected FishingOperation getFishingOperation() { + return getModel().getFishingOperation(); + } + + @Override protected void onModelRowsChanged(List<SpeciesBatchRowModel> rows) { super.onModelRowsChanged(rows); @@ -163,8 +144,7 @@ return new String[]{ SpeciesBatchRowModel.PROPERTY_SAMPLE_WEIGHT, SpeciesBatchRowModel.PROPERTY_SAMPLING_RATIO, - SpeciesBatchRowModel.PROPERTY_FREQUENCY - }; + SpeciesBatchRowModel.PROPERTY_FREQUENCY}; } @Override @@ -208,13 +188,19 @@ } - if (samplingOrder.contains(SpeciesBatchRowModel.PROPERTY_VRAC_HORS_VRAC)) { + if (samplingOrder.contains(SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY)) { - // Vrac / Hors vrac column + // SortedUnsortedCategory column - addComboEnumColumnToModel(columnModel, - SpeciesBatchTableModel.VRAC_HORS_VRAC, - VracHorsVracEnum.values()); + Decorator<SortedUnsortedCategory> decorator = + getDecorator(SortedUnsortedCategory.class, null); + + List<SortedUnsortedCategory> data = + persistenceService.getAllSortedUnsortedCategory(); + + addComboDataColumnToModel(columnModel, + SpeciesBatchTableModel.SORTED_UNSORTED_CATEGORY, + decorator, data); } if (samplingOrder.contains(SpeciesBatchRowModel.PROPERTY_WEIGHT_CATEGORY)) { @@ -275,7 +261,7 @@ { // Computed weight column (from frequencies) addColumnToModel(columnModel, - FrequencyCellComponent.newEditor(ui.getFrequencyUI()), + FrequencyCellComponent.newEditor(ui.getFrequencyEditor()), FrequencyCellComponent.newRender(), SpeciesBatchTableModel.COMPUTED_WEIGHT); } @@ -283,7 +269,7 @@ { // Computed number column (from frequencies) addColumnToModel(columnModel, - FrequencyCellComponent.newEditor(ui.getFrequencyUI()), + FrequencyCellComponent.newEditor(ui.getFrequencyEditor()), FrequencyCellComponent.newRender(), SpeciesBatchTableModel.COMPUTED_NUMBER); } @@ -303,16 +289,18 @@ { // Comment column addColumnToModel(columnModel, - LongTextCellComponent.newEditor(ui.getLongTextEditorUI()), - LongTextCellComponent.newRender(), + LongTextCellComponent.newEditor(ui.getLongTextEditor()), + LongTextCellComponent.newRender(n_("tutti.tooltip.comment.none")), SpeciesBatchTableModel.COMMENT); } { // File column addColumnToModel(columnModel, - AttachmentCellComponent.newEditor(ui.getAttachmentEditorUI()), - AttachmentCellComponent.newRender(), + AttachmentCellComponent.newEditor(ui.getAttachmentEditor()), + AttachmentCellComponent.newRender( + getDecorator(Attachment.class, null), + n_("tutti.tooltip.attachment.none")), SpeciesBatchTableModel.ATTACHMENTS); } return columnModel; @@ -423,130 +411,91 @@ Boolean newValue) { } - //------------------------------------------------------------------------// - //-- AbstractTuttiUIHandler methods --// - //------------------------------------------------------------------------// - @Override - public void beforeInitUI() { + protected void saveSelectedRowIfRequired() { - if (log.isInfoEnabled()) { - log.info("beforeInit: " + ui); - } + TuttiBeanMonitor<SpeciesBatchRowModel> rowMonitor = getRowMonitor(); - SpeciesBatchUIModel model = new SpeciesBatchUIModel(); - ui.setContextValue(model); + SpeciesBatchRowModel bean = rowMonitor.getBean(); + if (bean != null) { - fishingOperationMonitor.setBean(model); - } + if (bean.isValid()) { + // there is a valid bean attached to the monitor - @Override - public void afterInitUI() { + if (rowMonitor.wasModified()) { - if (log.isInfoEnabled()) { - log.info("afterInit: " + ui); - } + // monitored bean was modified, save it + if (log.isInfoEnabled()) { + log.info("Row " + bean + " was modified, will save it"); + } - initUI(ui); + saveRow(bean); - //TODO Will come from protocol - List<String> samplingOrder = Lists.newArrayList( - SpeciesBatchRowModel.PROPERTY_SPECIES, - SpeciesBatchRowModel.PROPERTY_VRAC_HORS_VRAC, - SpeciesBatchRowModel.PROPERTY_WEIGHT_CATEGORY, - SpeciesBatchRowModel.PROPERTY_SEX - ); + // clear modified flag on the monitor + rowMonitor.clearModified(); + } + } else { - getModel().setSamplingOrder(samplingOrder); + // row is not valid can not save it - JXTable table = getTable(); + SpeciesBatch catchBean = bean.toBean(); - TableRowFilterSupport.forTable(table).searchable(true).useTableRenderers(true).apply(); + if (!TuttiEntities.isNew(catchBean)) { - // create table column model - TableColumnModel columnModel = createTableColumnModel(); + // remove this + persistenceService.deleteSpeciesBatch(catchBean.getId()); + } + } + } + } - // create table model - SpeciesBatchTableModel tableModel = - new SpeciesBatchTableModel(columnModel); + @Override + protected boolean isRowValid(SpeciesBatchRowModel row) { - table.setModel(tableModel); - table.setColumnModel(columnModel); - installTableKeyListener(columnModel, table); + SpeciesBatchUIModel model = getModel(); - table.getTableHeader().setReorderingAllowed(false); - - - Highlighter readOnlyHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - HighlightPredicate.READ_ONLY, Color.LIGHT_GRAY); - - table.addHighlighter(readOnlyHighlighter); - Highlighter validHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - new HighlightPredicate.AndHighlightPredicate(HighlightPredicate.EDITABLE, new HighlightPredicate() { - @Override - public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { - - boolean result = false; - if (adapter.isEditable()) { - int rowIndex = adapter.convertRowIndexToModel(adapter.row); - SpeciesBatchRowModel row = getTableModel().getEntry(rowIndex); - result = !row.isValid(); - } - return result; - } - }), Color.RED); - table.addHighlighter(validHighlighter); - - // when model datas change let's propagate it table model - listenRowsFromModel(); - - // save when row chaged and was modified - ListSelectionListener listener = new TableRowModificationListener<SpeciesBatchRowModel>( - getTableModel(), getRowMonitor()) { - @Override - protected void saveSelectedRow() { - saveSelectedRowIfRequired(); - } - }; - table.getSelectionModel().addListSelectionListener(listener); - - // always scroll to selected row - SwingUtil.scrollToTableSelection(getTable()); + SpeciesBatchTreeModel samplingTreeModel = model.getSamplingTreeModel(); + SpeciesBatchTreeNode node = samplingTreeModel.getSamplingNode(row); + boolean rowValid = samplingTreeModel.isValid(row, node); + return rowValid; } @Override - public void onCloseUI() { + protected void saveRow(SpeciesBatchRowModel row) { + + SpeciesBatch catchBean = row.toBean(); + + FishingOperation fishingOperation = getModel().getFishingOperation(); + catchBean.setFishingOperation(fishingOperation); if (log.isInfoEnabled()) { - log.info("closing: " + ui); + log.info("Selected fishingOperation: " + fishingOperation.getId()); } - } - //------------------------------------------------------------------------// - //-- Public methods --// - //------------------------------------------------------------------------// + if (TuttiEntities.isNew(catchBean)) { - public void saveSelectedRowIfRequired(FocusEvent event) { + catchBean = persistenceService.createSpeciesBatch(catchBean); + row.setId(catchBean.getId()); + } else { + persistenceService.saveSpeciesBatch(catchBean); + } - Component oppositeComponent = event.getOppositeComponent(); + List<SpeciesFrequencyRowModel> frequencyRows = row.getFrequency(); - JXTable parentContainer = null; + List<SpeciesBatchFrequency> frequency = + SpeciesFrequencyRowModel.toBeans(frequencyRows, catchBean); - if (oppositeComponent != null) { - - // check out if still on table - parentContainer = SwingUtil.getParentContainer( - oppositeComponent, JXTable.class); + if (log.isInfoEnabled()) { + log.info("Will save " + frequency.size() + " frequencies."); } + frequency = persistenceService.saveSpeciesBatchFrequency( + catchBean.getId(), frequency); - if (parentContainer == null) { - - // out of the table can save - if (getModel().getFishingOperation() != null) { - saveSelectedRowIfRequired(); - } - } + // push it back to row model + frequencyRows = SpeciesFrequencyRowModel.fromBeans(frequency); + row.setFrequency(frequencyRows); } + @Override public void selectFishingOperation(FishingOperation bean) { JXTable table = ui.getTable(); @@ -613,6 +562,68 @@ } //------------------------------------------------------------------------// + //-- AbstractTuttiUIHandler methods --// + //------------------------------------------------------------------------// + + @Override + public void beforeInitUI() { + + if (log.isInfoEnabled()) { + log.info("beforeInit: " + ui); + } + + SpeciesBatchUIModel model = new SpeciesBatchUIModel(); + ui.setContextValue(model); + + fishingOperationMonitor.setBean(model); + } + + @Override + public void afterInitUI() { + + if (log.isInfoEnabled()) { + log.info("afterInit: " + ui); + } + + initUI(ui); + + //TODO Will come from protocol + List<String> samplingOrder = Lists.newArrayList( + SpeciesBatchRowModel.PROPERTY_SPECIES, + SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY, + SpeciesBatchRowModel.PROPERTY_WEIGHT_CATEGORY, + SpeciesBatchRowModel.PROPERTY_SEX + ); + + getModel().setSamplingOrder(samplingOrder); + + JXTable table = getTable(); + + // create table column model + TableColumnModel columnModel = createTableColumnModel(); + + // create table model + SpeciesBatchTableModel tableModel = + new SpeciesBatchTableModel(columnModel); + + table.setModel(tableModel); + table.setColumnModel(columnModel); + + initBatchTable(table, columnModel, tableModel); + } + + @Override + public void onCloseUI() { + if (log.isInfoEnabled()) { + log.info("closing: " + ui); + } + } + + //------------------------------------------------------------------------// + //-- Public methods --// + //------------------------------------------------------------------------// + + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// @@ -660,7 +671,6 @@ getTableModel().updateSamplingRatio(samplingContext.getSamplingRows()); } - protected void recomputeTotalHorsVrac() { // recompute total hors vrac @@ -668,20 +678,24 @@ Float totalVrac = 0f; for (SpeciesBatchRowModel batch : getModel().getRows()) { - VracHorsVracEnum vracHorsVrac = batch.getVracHorsVrac(); + SortedUnsortedCategory vracHorsVrac = batch.getSortedUnsortedCategory(); + if (vracHorsVrac == null) { // can't sum anything - } else if (vracHorsVrac == VracHorsVracEnum.HORS_VRAC) { - Float weight = batch.getWeight(); - if (weight != null) { - totalHorsVrac += weight; + } else { + boolean unsorted = "unsorted".equals(vracHorsVrac.getName()); + if (unsorted) { + Float weight = batch.getWeight(); + if (weight != null) { + totalHorsVrac += weight; + } + } else { + Float weight = batch.getWeight(); + if (weight != null) { + totalVrac += weight; + } } - } else if (vracHorsVrac == VracHorsVracEnum.VRAC) { - Float weight = batch.getWeight(); - if (weight != null) { - totalVrac += weight; - } } } if (log.isInfoEnabled()) { @@ -692,75 +706,4 @@ //TODO Should we also set the total vrac weight ? // getModel().setTotalVracWeight(totalVrac); } - - protected void saveSelectedRowIfRequired() { - - TuttiBeanMonitor<SpeciesBatchRowModel> rowMonitor = getRowMonitor(); - - SpeciesBatchRowModel bean = rowMonitor.getBean(); - if (bean != null) { - - if (bean.isValid()) { - // there is a valid bean attached to the monitor - - if (rowMonitor.wasModified()) { - - // monitored bean was modified, save it - if (log.isInfoEnabled()) { - log.info("Row " + bean + " was modified, will save it"); - } - - saveRow(bean); - - // clear modified flag on the monitor - rowMonitor.clearModified(); - } - } else { - - // row is not valid can not save it - - SpeciesBatch catchBean = bean.toBean(); - - if (!TuttiEntities.isNew(catchBean)) { - - // remove this - persistenceService.deleteSpeciesBatch(catchBean.getId()); - } - } - } - } - - protected void saveRow(SpeciesBatchRowModel row) { - - SpeciesBatch catchBean = row.toBean(); - - FishingOperation fishingOperation = getModel().getFishingOperation(); - catchBean.setFishingOperation(fishingOperation); - if (log.isInfoEnabled()) { - log.info("Selected fishingOperation: " + fishingOperation.getId()); - } - - if (TuttiEntities.isNew(catchBean)) { - - catchBean = persistenceService.createSpeciesBatch(catchBean); - row.setId(catchBean.getId()); - } else { - persistenceService.saveSpeciesBatch(catchBean); - } - - List<SpeciesFrequencyRowModel> frequencyRows = row.getFrequency(); - - List<SpeciesBatchFrequency> frequency = - SpeciesFrequencyRowModel.toBeans(frequencyRows, catchBean); - - if (log.isInfoEnabled()) { - log.info("Will save " + frequency.size() + " frequencies."); - } - frequency = persistenceService.saveSpeciesBatchFrequency( - catchBean.getId(), frequency); - - // push it back to row model - frequencyRows = SpeciesFrequencyRowModel.fromBeans(frequency); - row.setFrequency(frequencyRows); - } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java 2012-12-15 16:05:45 UTC (rev 77) @@ -25,6 +25,7 @@ */ import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; import fr.ifremer.tutti.ui.swing.util.ComponentMover; import fr.ifremer.tutti.ui.swing.util.ComponentResizer; @@ -36,24 +37,31 @@ import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.util.decorator.Decorator; +import javax.swing.AbstractAction; import javax.swing.AbstractCellEditor; import javax.swing.BorderFactory; import javax.swing.JButton; +import javax.swing.JComponent; import javax.swing.JDialog; +import javax.swing.JRootPane; import javax.swing.JTable; +import javax.swing.KeyStroke; import javax.swing.border.LineBorder; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import java.awt.Color; import java.awt.Component; import java.awt.Frame; +import java.awt.event.ActionEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.util.Collection; import static org.nuiton.i18n.I18n._; @@ -73,11 +81,11 @@ public AttachmentCellComponent() { setContentAreaFilled(false); setOpaque(false); - setIcon(SwingUtil.createActionIcon("edit")); + setIcon(SwingUtil.createActionIcon("edit-attachment")); } - public static TableCellRenderer newRender() { - return new AttachmentCellRenderer(); + public static TableCellRenderer newRender(Decorator<Attachment> decorator, String noneText) { + return new AttachmentCellRenderer(decorator, noneText); } public static TableCellEditor newEditor(AttachmentEditorUI ui) { @@ -145,6 +153,16 @@ editor.setUndecorated(true); editor.add(ui); editor.setResizable(true); + JRootPane rootPane = editor.getRootPane(); + rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ESCAPE"), "close"); + rootPane.getActionMap().put("close", new AbstractAction() { + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + ui.getHandler().close(); + } + }); editor.pack(); ComponentResizer cr = new ComponentResizer(); @@ -250,10 +268,19 @@ protected final AttachmentCellComponent component; + public static final String TEXT_PATTERN = "<html><body>%s</body></html>"; + + private final String noneText; + + private final Decorator<Attachment> decorator; + protected String propertyName; - public AttachmentCellRenderer() { + public AttachmentCellRenderer(Decorator<Attachment> decorator, + String noneText) { component = new AttachmentCellComponent(); + this.noneText = noneText; + this.decorator = decorator; } @Override @@ -264,7 +291,8 @@ int row, int column) { - String text; + String textValue; + if (value == null) { if (propertyName == null) { AbstractTuttiTableModel tableModel = @@ -273,13 +301,18 @@ propertyName = columnIdentifier.getPropertyName(); } // use HTML to show the tooltip in italic - text = "<html><body><i>" + _("tutti.tooltip." + propertyName + ".none") + "</i></body></html>"; + textValue = "<i>" + _(noneText) + "</i>"; } else { + Collection<Attachment> attachments = (Collection<Attachment>) value; + StringBuilder sb = new StringBuilder(); + for (Attachment attachment : attachments) { + sb.append("<br/>").append(decorator.toString(attachment)); + } // use html to display the tooltip on several lines - text = "<html><body>" + String.valueOf(value).replace("\n", "<br/>") + "</body></html>"; + textValue = sb.substring(5); } - + String text = String.format(TEXT_PATTERN, textValue); boolean editable = table.isCellEditable(row, column); component.setEnabled(editable); component.setToolTipText(text); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java 2012-12-15 16:05:45 UTC (rev 77) @@ -34,20 +34,26 @@ import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; import jaxx.runtime.JAXXUtil; import jaxx.runtime.SwingUtil; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import javax.swing.AbstractAction; import javax.swing.AbstractCellEditor; import javax.swing.BorderFactory; import javax.swing.JButton; +import javax.swing.JComponent; import javax.swing.JDialog; +import javax.swing.JRootPane; import javax.swing.JTable; +import javax.swing.KeyStroke; import javax.swing.border.LineBorder; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import java.awt.Color; import java.awt.Component; import java.awt.Frame; +import java.awt.event.ActionEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; @@ -73,11 +79,11 @@ public LongTextCellComponent() { setContentAreaFilled(false); setOpaque(false); - setIcon(SwingUtil.createActionIcon("edit")); + setIcon(SwingUtil.createActionIcon("edit-comment")); } - public static TableCellRenderer newRender() { - return new LongTextCellRenderer(); + public static TableCellRenderer newRender(String noneText) { + return new LongTextCellRenderer(noneText); } public static TableCellEditor newEditor(LongTextEditorUI ui) { @@ -150,7 +156,16 @@ editor.add(ui); editor.setSize(DEFAULT_EDITOR_WIDTH, DEFAULT_EDITOR_HEIGHT); editor.setResizable(true); + JRootPane rootPane = editor.getRootPane(); + rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ESCAPE"), "close"); + rootPane.getActionMap().put("close", new AbstractAction() { + private static final long serialVersionUID = 1L; + @Override + public void actionPerformed(ActionEvent e) { + ui.getHandler().close(); + } + }); ComponentResizer cr = new ComponentResizer(); cr.registerComponent(editor); ComponentMover cm = new ComponentMover(); @@ -256,8 +271,13 @@ protected String propertyName; - public LongTextCellRenderer() { + public static final String TEXT_PATTERN = "<html><body>%s</body></html>"; + + private final String noneText; + + public LongTextCellRenderer(String noneText) { component = new LongTextCellComponent(); + this.noneText = noneText; } @Override @@ -268,22 +288,26 @@ int row, int column) { - String text; - if (value == null) { +// String text; + String textValue; + if (StringUtils.isBlank((String)value)) { if (propertyName == null) { AbstractTuttiTableModel tableModel = (AbstractTuttiTableModel) table.getModel(); - ColumnIdentifier columnIdentifier = tableModel.getPropertyName(column); + ColumnIdentifier columnIdentifier = + tableModel.getPropertyName(column); propertyName = columnIdentifier.getPropertyName(); } // use HTML to show the tooltip in italic - text = "<html><body><i>" + _("tutti.tooltip." + propertyName + ".none") + "</i></body></html>"; + textValue = "<i>" + _(noneText) + "</i>"; } else { // use html to display the tooltip on several lines - text = "<html><body>" + String.valueOf(value).replace("\n", "<br/>") + "</body></html>"; + textValue = String.valueOf(value).replace("\n", "<br/>"); } + String text = String.format(TEXT_PATTERN, textValue); + boolean editable = table.isCellEditable(row, column); component.setEnabled(editable); component.setToolTipText(text); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextEditorUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextEditorUI.jaxx 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextEditorUI.jaxx 2012-12-15 16:05:45 UTC (rev 77) @@ -27,7 +27,7 @@ <String id='property' javaBean='""'/> <!-- bean property --> - <fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel id='bean' javaBean='null'/> + <Object id='bean' javaBean='null'/> <LongTextEditorUIHandler id='handler' constructorParams='this'/> @@ -35,7 +35,7 @@ <cell fill='both' weightx='1'> <JScrollPane> <JTextArea id='textContent' - onKeyReleased='handler.setText()'/> + onKeyReleased='handler.setText(((JTextArea)event.getSource()).getText())'/> </JScrollPane> </cell> </row> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextEditorUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextEditorUIHandler.java 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextEditorUIHandler.java 2012-12-15 16:05:45 UTC (rev 77) @@ -24,7 +24,6 @@ * #L% */ -import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import jaxx.runtime.SwingUtil; import org.apache.commons.lang3.StringUtils; @@ -43,7 +42,8 @@ */ public class LongTextEditorUIHandler { - private static final Log log = LogFactory.getLog(LongTextEditorUIHandler.class); + private static final Log log = + LogFactory.getLog(LongTextEditorUIHandler.class); private final LongTextEditorUI ui; @@ -53,35 +53,23 @@ ui.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { - AbstractTuttiBeanUIModel bean = ui.getBean(); + Object bean = ui.getBean(); String property = ui.getProperty(); if (bean != null && !StringUtils.isEmpty(property)) { Object value = TuttiUIUtil.getProperty(bean, property); - if (value == null) { - value = ""; - } - ui.getTextContent().setText(value.toString()); + ui.getTextContent().setText(SwingUtil.getStringValue(value)); } } }); } /** pushes the typed text in the property of the bean */ - public void setText() { - String value = ui.getTextContent().getText(); - AbstractTuttiBeanUIModel bean = ui.getBean(); + public void setText(String value) { + Object bean = ui.getBean(); String property = ui.getProperty(); TuttiUIUtil.setProperty(bean, property, value); } - public void resetText() { - AbstractTuttiBeanUIModel bean = ui.getBean(); - String property = ui.getProperty(); - TuttiUIUtil.setProperty(bean, property, null); - - ui.getTextContent().setText(""); - } - /** closes the editor */ public void close() { if (log.isInfoEnabled()) { 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 2012-12-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java 2012-12-15 16:05:45 UTC (rev 77) @@ -32,13 +32,13 @@ import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; import jaxx.runtime.SwingUtil; import jaxx.runtime.swing.JAXXWidgetUtil; -import jaxx.runtime.swing.editor.EnumEditor; import jaxx.runtime.swing.editor.bean.BeanUIUtil; import jaxx.runtime.swing.editor.cell.NumberCellEditor; import jaxx.runtime.swing.renderer.DecoratorTableCellRenderer; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.autocomplete.ComboBoxCellEditor; import org.jdesktop.swingx.autocomplete.ObjectToStringConverter; import org.jdesktop.swingx.table.TableColumnExt; @@ -82,7 +82,7 @@ */ private final TuttiBeanMonitor<R> rowMonitor; - protected abstract JTable getTable(); + protected abstract JXTable getTable(); protected abstract AbstractTuttiTableModel<R> getTableModel(); @@ -101,6 +101,7 @@ Boolean oldValue, Boolean newValue); + protected String[] getRowPropertiesToIgnore() { return ArrayUtils.EMPTY_STRING_ARRAY; } @@ -211,7 +212,6 @@ editor.getNumberEditor().getTextField().addKeyListener(keyAdapter); } } - return keyAdapter; } @@ -276,7 +276,8 @@ protected <B> void addComboDataColumnToModel(TableColumnModel model, ColumnIdentifier<R> identifier, - Decorator<B> decorator, List<B> data) { + Decorator<B> decorator, + List<B> data) { JComboBox comboBox = new JComboBox(); comboBox.setRenderer(newListCellRender(decorator)); SwingUtil.fillComboBox(comboBox, data, null); @@ -291,19 +292,6 @@ identifier); } - protected <B extends Enum<B>> void addComboEnumColumnToModel(TableColumnModel model, - ColumnIdentifier<R> identifier, - B[] data) { - EnumEditor<B> comboBox = EnumEditor.newEditor(data); - BeanUIUtil.decorate(comboBox, ObjectToStringConverter.DEFAULT_IMPLEMENTATION); - TableCellEditor editor = new ComboBoxCellEditor(comboBox); - - addColumnToModel(model, - editor, - null, - identifier); - } - protected void listenRowsFromModel() { getModel().addPropertyChangeListener(AbstractTuttiTableUIModel.PROPERTY_ROWS, new PropertyChangeListener() { @Override 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-15 00:14:45 UTC (rev 76) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2012-12-15 16:05:45 UTC (rev 77) @@ -108,6 +108,7 @@ tutti.label.list.gear=Engin(s) tutti.label.list.headOfMission=Chef(s) de mission tutti.label.list.headOfSortRoom=Reponsable(s) de salle de tri +tutti.label.list.saisisseur=Saisisseur(s) tutti.label.list.vessel=Navire(s) tutti.label.macroWaste.totalWeight=Poids total tutti.label.no.fishingOperation.selected=< Aucun trait sélectionné > @@ -146,6 +147,11 @@ tutti.menu.synchronisationImport.tip=Effectuer des imports tutti.menu.synchronisations=Synchronisation tutti.menu.synchronisations.tip=Import/Export +tutti.table.accidental.batch.header.comment=Commentaire +tutti.table.accidental.batch.header.file=Pièces-jointes +tutti.table.accidental.batch.header.speciesByCode=Espèce +tutti.table.accidental.batch.header.speciesByGenusCode=Espèce +tutti.table.accidental.batch.header.weight=Poids observé tutti.table.benthos.batch.header.comment=Commentaire tutti.table.benthos.batch.header.elevationRate=Fraction d'élévation tutti.table.benthos.batch.header.file=Pièces jointes @@ -156,6 +162,7 @@ tutti.table.benthos.batch.header.weight=Poids tutti.table.macrowaste.batch.header.comment=Commentaire tutti.table.macrowaste.batch.header.file=Pièces jointes +tutti.table.macrowaste.batch.header.macroWasteCategory=Catégorie tutti.table.macrowaste.batch.header.speciesByCode=Espèce tutti.table.macrowaste.batch.header.speciesByGenusCode=Espèce tutti.table.macrowaste.batch.header.weight=Poids @@ -176,10 +183,10 @@ tutti.table.species.batch.header.maturity=Maturité tutti.table.species.batch.header.sampleWeight=Poids échantillonné tutti.table.species.batch.header.sex=Sexe +tutti.table.species.batch.header.sortedUnsortedCategory=Vrac / Hors Vrac tutti.table.species.batch.header.speciesByCode=Espèce tutti.table.species.batch.header.speciesByGenusCode=Espèce tutti.table.species.batch.header.toConfirm=A Confirmer -tutti.table.species.batch.header.vracHorsVrac=Vrac / Hors Vrac tutti.table.species.batch.header.weight=Poids tutti.table.species.batch.header.weightCategory=Catégorie Poids tutti.table.species.frequency.header.computedWeight=Poids calculé @@ -200,7 +207,9 @@ tutti.title.selectedCruise=Campagne %s tutti.title.selectedProgram=Série de campagne %s tutti.to.be.done=< A FAIRE > -tutti.tooltip.comment.none=Aucun +tutti.tooltip.= +tutti.tooltip.attachment.none=Pas de pièce-jointes +tutti.tooltip.comment.none=Pas de commentaire tutti.validator.error.cruise.beginDate.required=La date de début est obligatoire tutti.validator.error.cruise.country.required=Le pays est obligatoire tutti.validator.error.cruise.endDate.required=La date de fin est obligatoire Added: trunk/tutti-ui-swing/src/main/resources/icons/action-edit-attachment.png =================================================================== (Binary files differ) Property changes on: trunk/tutti-ui-swing/src/main/resources/icons/action-edit-attachment.png ___________________________________________________________________ Added: svn:mime-type + image/png Added: svn:keywords + Author Date Id Revision HeadURL Added: trunk/tutti-ui-swing/src/main/resources/icons/action-edit-comment.png =================================================================== (Binary files differ) Property changes on: trunk/tutti-ui-swing/src/main/resources/icons/action-edit-comment.png ___________________________________________________________________ Added: svn:mime-type + image/png Added: svn:keywords + Author Date Id Revision HeadURL
participants (1)
-
tchemit@users.forge.codelutin.com