Author: chatellier Date: 2010-11-04 15:53:12 +0000 (Thu, 04 Nov 2010) New Revision: 168 Log: Ajout du chargement du fichier de code types des especes. Filtrage de la liste des especes par leur type. Added: trunk/coser-business/src/test/resources/csv/correct/testtypeespeces.csv trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/TypeSpecyListModel.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/CoserBusinessConfig.java trunk/coser-business/src/main/java/fr/ifremer/coser/CoserConstants.java trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListCheckBoxRenderer.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListRenderer.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListSelectionModel.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListTestModel.java trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/CoserBusinessConfig.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/CoserBusinessConfig.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/CoserBusinessConfig.java 2010-11-04 15:53:12 UTC (rev 168) @@ -81,6 +81,11 @@ String result = getOption(CoserBusinessOption.REFERENCE_ZONES.key); return result; } + + public String getReferenceTypeEspecesPath() { + String result = getOption(CoserBusinessOption.REFERENCE_TYPE_ESPECES.key); + return result; + } public double getObervationNobsmin() { double result = getOptionAsDouble(CoserBusinessOption.OBSERVATION_NOBSMIN.key); @@ -95,6 +100,7 @@ REFERENCE_SPECIES("coser.reference.species", _("coser.config.reference.species.description"), "", String.class, false, false), REFERENCE_ZONES("coser.reference.zones", _("coser.config.reference.zones.description"), "", String.class, false, false), + REFERENCE_TYPE_ESPECES("coser.reference.typeEspeces", _("coser.config.reference.typeEspeces.description"), "", String.class, false, false), OBSERVATION_NOBSMIN("coser.observation.nobsmin", _("coser.config.observation.nobsmin.description"), "1.0", Double.class, false, false); Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/CoserConstants.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/CoserConstants.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/CoserConstants.java 2010-11-04 15:53:12 UTC (rev 168) @@ -77,7 +77,8 @@ STRATA(n_("coser.business.category.strata"), "strata"), HAUL(n_("coser.business.category.haul"), "haul"), LENGTH(n_("coser.business.category.length"), "length"), - REFTAX_SPECIES(n_("coser.business.category.reftax.species"), "reftaxSpecies", false); + REFTAX_SPECIES(n_("coser.business.category.reftax.species"), "reftaxSpecies", false), + TYPE_ESPECES(n_("coser.business.category.typeEspece"), "codeTypeEspeces", false); protected String translationKey; protected String storageFileName; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java 2010-11-04 15:53:12 UTC (rev 168) @@ -52,6 +52,10 @@ "C_Perm","NumSys","NivSys","C_VALIDE","L_VALIDE","AA_VALIDE","C_TxP\u00E8re","Taxa" }; + public static final String[] TYPE_ESPECE_HEADER = { + "Types","Commentaire","NumSys min","NumSys max" + }; + public static final String PROPERTY_SELECTIONS="selections"; protected String name; @@ -62,6 +66,9 @@ /** Reftax SIH. */ protected DataStorage refTaxSpecies; + + /** Type especes */ + protected DataStorage typeEspeces; public String getName() { return name; @@ -105,6 +112,14 @@ this.refTaxSpecies = refTaxSpecies; } + public DataStorage getTypeEspeces() { + return typeEspeces; + } + + public void setTypeEspeces(DataStorage typeEspeces) { + this.typeEspeces = typeEspeces; + } + /** * Force all container data clear to force free memory. */ Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java 2010-11-04 15:53:12 UTC (rev 168) @@ -173,6 +173,9 @@ case REFTAX_SPECIES: enHeaders = Project.REFTAX_SPECIES_HEADER; break; + case TYPE_ESPECES: + enHeaders = Project.TYPE_ESPECE_HEADER; + break; } if (frHeaders != null) { Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-11-04 15:53:12 UTC (rev 168) @@ -43,6 +43,7 @@ import java.util.TreeSet; import org.apache.commons.beanutils.PropertyUtils; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -221,21 +222,25 @@ Project project = new Project(); project.setName(projectName); - // load additional files - File inputFile = new File(projectDirectory, - Category.REFTAX_SPECIES.getStorageFileName() + - CoserConstants.STORAGE_CSV_EXTENSION); + for (Category category : Category.values()) { + // load only additional files + if (!category.isDataCategory()) { + File inputFile = new File(projectDirectory, + category.getStorageFileName() + + CoserConstants.STORAGE_CSV_EXTENSION); + + if (inputFile.isFile()) { + DataStorage dataStorage = importService.loadCSVFile(project, category, inputFile, false); + addProjectContent(project, null, category, dataStorage, false); + } + else { + // si on arrive ici et qu'un fichier de reference + // n'existe pas, c'est grave + throw new CoserBusinessException(_("Missing file %s", inputFile)); + } + } + } - if (inputFile.isFile()) { - DataStorage dataStorage = importService.loadCSVFile(project, Category.REFTAX_SPECIES, inputFile, true); - addProjectContent(project, null, Category.REFTAX_SPECIES, dataStorage, false); - } - else { - // si on arrive ici et qu'un fichier original - // n'existe pas, c'est grave - throw new CoserBusinessException(_("Missing file %s", inputFile)); - } - // reload selection without data Map<String, Selection> selections = new HashMap<String, Selection>(); File selectionsDirectory = new File(projectDirectory, CoserConstants.STORAGE_SELECTION_DIRECTORY); @@ -600,6 +605,9 @@ case REFTAX_SPECIES: project.setRefTaxSpecies(content); break; + case TYPE_ESPECES: + project.setTypeEspeces(content); + break; } } @@ -786,6 +794,31 @@ } /** + * Retourne la liste des type d'especes definie dans le projet. + * + * @param project project to search into + * @return project species type + */ + public List<String> getProjectSpeciesTypes(Project project) { + List<String> types = new ArrayList<String>(); + + // "Types","Commentaire","NumSys min","NumSys max" + + Iterator<String[]> itTuples = project.getTypeEspeces().iterator(); + itTuples.next(); // skip headers + + while (itTuples.hasNext()) { + String[] tuple = itTuples.next(); + + String type = tuple[0]; + types.add(type); + } + + Collections.sort(types); + return types; + } + + /** * Find all defined year in model. * * Le parcours est fait sur le fichier "haul", c'est potentiellement @@ -855,14 +888,18 @@ * Les especes sont determinées : * - en lisant les traits pour determiner les traits à partir des zones * - en lisant les captures pour determiner les especes à partir des traits + * - en filtrant la liste des especes * + * @param project project * @param container data container * @param zoneName zone name - * @param beginYear begin year (can be null) - * @param endYear end year (can be null) + * @param beginYear begin year + * @param endYear end year + * @param filterSpecyType filterSpecyType * @return species */ - public List<Specy> getProjectSpecies(AbstractDataContainer container, List<String> zoneName, Integer beginYear, Integer endYear) { + public List<String> getProjectSpecies(Project project, AbstractDataContainer container, List<String> zoneName, + Integer beginYear, Integer endYear, List<String> filterSpecyType) { // first get traits list Set<String> traits = new HashSet<String>(); @@ -892,7 +929,7 @@ } // second get species with trait list - SortedMap<String, Specy> result = new TreeMap<String, Specy>(); + List<String> result = new ArrayList<String>(); itTuple = container.getCatch().iterator(); itTuple.next(); // skip header while (itTuple.hasNext()) { @@ -906,10 +943,8 @@ String haul = tuple[Catch.INDEX_HAUL]; if (intAnnee >= beginYear && intAnnee <= endYear && traits.contains(haul)) { String species = tuple[Catch.INDEX_SPECIES]; - if (!result.containsKey(species)) { - Specy specy = new Specy(); - specy.setName(species); - result.put(species, specy); + if (!result.contains(species)) { + result.add(species); } } } @@ -920,8 +955,61 @@ } } - List<Specy> resultList = new ArrayList<Specy>(result.values()); - return resultList; + // third, filter specy list with specy types filter + if (CollectionUtils.isNotEmpty(filterSpecyType)) { + // load map SpecyName > numSys + Map<String, Integer> map = new HashMap<String, Integer>(); + Iterator<String[]> refTaxIterator = project.getRefTaxSpecies().iterator(); + refTaxIterator.next(); // skip header + while (refTaxIterator.hasNext()) { + // "C_Perm";"NumSys";"NivSys";"C_VALIDE";"L_VALIDE";"AA_VALIDE";"C_TxPère";"Taxa" + String[] tuple = refTaxIterator.next(); + String specyName = tuple[3]; + Integer iNumSys = Integer.valueOf(tuple[1]); + map.put(specyName, iNumSys); + } + + // load specy type map SpecyTypeName > [min, max] + // iteration sur les type d'especes + Map<String, Integer[]> mapType = new HashMap<String, Integer[]>(); + Iterator<String[]> itTypeSpecies = project.getTypeEspeces().iterator(); + itTypeSpecies.next(); // skip header + while (itTypeSpecies.hasNext()) { + // "Types";"Commentaire";"NumSys min";"NumSys max" + String[] tuple = itTypeSpecies.next(); + String specyType = tuple[0]; + + if (filterSpecyType.contains(specyType)) { + Integer iMinNumSys = Integer.valueOf(tuple[2]); + Integer iMaxNumSys = Integer.valueOf(tuple[3]); + mapType.put(specyType, new Integer[]{iMinNumSys, iMaxNumSys}); + } + } + + // iteration sur les especes trouvées + Iterator<String> itSpecies = result.iterator(); + while (itSpecies.hasNext()) { + String specy = itSpecies.next(); + Integer specyNumSys = map.get(specy); + + // test si le numsys est dans les bornes d'un + // des type d'espece demandé + boolean foundInFilter = false; + for (Integer[] bornes : mapType.values()) { + if (specyNumSys >= bornes[0] + && specyNumSys <= bornes[1]){ + foundInFilter = true; + } + } + + if (!foundInFilter) { + itSpecies.remove(); + } + } + } + + Collections.sort(result); + return result; } /** @@ -976,4 +1064,94 @@ return project; } + + /** + * Effort d'échantillonnage: nombre de traits par strate par année. + * + * lengthunique=function(x){length(unique(x))} # nombre d'éléments unique dans x + * + * haulcount=tapply(TRAITS$Trait,list(stratum=TRAITS$Strate,year=TRAITS$Anneer),FUN=lengthunique) + * haulcount[is.na(haulcount)]=0 + * total=apply(haulcount,2,sum) + * haulcount=rbind(haulcount,total) + * if(language==2) tab=cbind(Strate=dimnames(haulcount)[[1]],haulcount) + * else tab=cbind(Stratum=dimnames(haulcount)[[1]],haulcount) + * + * @param project + * @param selection + */ + public void getSamplingEffort(Project project, Selection selection) { + + } + + /** + * Occurrence : pourcentage des traits dans lesquels une espèce est présentes + * + * years=seq(min(CAPTURES$Annee), max(CAPTURES$Annee)) + * nyears=length(years) + * catch=CAPTURES[CAPTURES$Nombre>0,] #prendre seulement données positives + * + * #compter nombre de traits par année où chaque espèce est présent + * occurence=tapply(catch$Trait,list(species=catch$Espece,year=catch$Annee),lengthunique) + * occurrence[is.na(occurence)]<-0 + * + * rapport.func=function(x,v) {return (x/v);} + * + * #diviser nombre de traits avec présence par nombre total de traits + * pct.occur=apply(occurence,1,rapport.func,v=haulcount)# haulcount de 1) + * pct.occur=t(round(pct.occur*100,2)) # multiplier par 100 et arrondir à 2 décimales + * + * colnames(pct.occur)=colnames(haulcount) #affectation noms colonnes matrice + * rownames(pct.occur)=rownames(occur) #nom des espèces + * + * #calculerl l'occurrence moyenne à travers les années + * provi.oc=round(apply(pct.occur,1,mean),2) + * pct.occur=cbind(pct.occur,MeanOccurence=provi.oc) + * + * @param project + * @param selection + */ + public void getOccurence(Project project, Selection selection) { + + } + + /** + * Densité: nombre par km2 par espèce par année + * + * years=sort(unique(TRAITS$Annee)) + * + * #surface total pour toutes les strates + * totsurface=sum(STRATES$Surface) + * + * #ordonner table STRATES par nom des strates + * STRATES=STRATES[order(STRATES$Strate),] + * + * #combiner les 3 tables de données dans une seule table tab + * tab=merge(CAPTURES,STRATES,by.x=c("Annee","Trait"),by.y=c("Annee","Trait")) + * tab=merge(tab,TRAITS, by.x=c("Annee","Trait"),by.y=c("Annee","Trait")) + * + * species=sort(unique(CAPTURES$Espece)) + * + * #calculer la densité moyenne par année par strate par espèce + * densparstrate=tapply(tab$Nombre/tab$SurfaceBalayee,list(tab$Espece, tab$Annee, tab$Strate), mean) + * densparstrate[is.na(densparstrate)]=0 # remplace NA par 0 + * + * #surface par annee et strate et espèce + * surfaceparstrate=tapply(tab$Surface, list(tab$Espece, tab$Annee, tab$Strate), unique) + * + * #multiplier la densité par la surface de la strate pour obtenir nombre par année-strate + * nombreparstrate= surfaceparstrate* densparstrate + * + * #sommer nombre sur strates par année pour chaque espèce et diviser par surface totale + * densiteparannee=apply(nombreparstrate,c(1,2),sum)/totsurface + * + * #densité moyenne pour la période + * densitemoyenneespece=apply(densiteparanne,1,mean) + * + * @param project project + * @param selection selection + */ + public void getDensity(Project project, Selection selection) { + + } } Modified: trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties =================================================================== --- trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties 2010-11-04 15:53:12 UTC (rev 168) @@ -31,6 +31,7 @@ coser.business.category.length=Length coser.business.category.reftax.species= coser.business.category.strata=Stata +coser.business.category.typeEspece=Specy type code coser.business.chart.compareCatchLengthNumberTitle= coser.business.common.number= coser.business.common.year= @@ -46,6 +47,7 @@ coser.config.observation.nobsmin.description= coser.config.projects.directory.description= coser.config.reference.species.description= +coser.config.reference.typeEspeces.description= coser.config.reference.zones.description= coser.config.validator.directory.description= lat\ attribute\ is\ not\ a\ valid\ double= Modified: trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties =================================================================== --- trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties 2010-11-04 15:53:12 UTC (rev 168) @@ -31,6 +31,7 @@ coser.business.category.length=Tailles coser.business.category.reftax.species=Reftax (esp\u00E8ce) coser.business.category.strata=Strates +coser.business.category.typeEspece=Code type des esp\u00E8ces coser.business.chart.compareCatchLengthNumberTitle=Comparaison des nombre dans Capture et Taille coser.business.common.number=Nombre coser.business.common.year=Ann\u00E9e @@ -46,6 +47,7 @@ coser.config.observation.nobsmin.description=Nombre minimal d'observation coser.config.projects.directory.description=Emplacement des projets Coser coser.config.reference.species.description=Emplacement du fichier de r\u00E9f\u00E9rence des esp\u00E8ces +coser.config.reference.typeEspeces.description=Emplacement du fichier de code type des esp\u00E8ces coser.config.reference.zones.description=Emplacement du fichier de r\u00E9f\u00E9rence des zones coser.config.validator.directory.description=Emplacement des fichiers de validations lat\ attribute\ is\ not\ a\ valid\ double= Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java 2010-11-04 15:53:12 UTC (rev 168) @@ -78,6 +78,15 @@ FileUtils.deleteDirectory(testDirectory); } + /** + * Create an initialized project with csv file in test resources. + * + * Project is filled with control data (not selections). + * + * @param projectService + * @return + * @throws CoserBusinessException + */ protected Project createTestProject(ProjectService projectService) throws CoserBusinessException { Project project = new Project(); @@ -88,6 +97,7 @@ File testLength = new File(CoserTestAbstract.class.getResource("/csv/correct/testlength.csv").getFile()); File testStrata = new File(CoserTestAbstract.class.getResource("/csv/correct/teststrata.csv").getFile()); File testReftax = new File(CoserTestAbstract.class.getResource("/csv/correct/testreftax.csv").getFile()); + File testTypeEspeces = new File(CoserTestAbstract.class.getResource("/csv/correct/testtypeespeces.csv").getFile()); Map<Category, File> categoriesAndFile = new HashMap<Category, File>(); categoriesAndFile.put(Category.CATCH, testCatch); @@ -95,7 +105,8 @@ categoriesAndFile.put(Category.LENGTH, testLength); categoriesAndFile.put(Category.STRATA, testStrata); categoriesAndFile.put(Category.REFTAX_SPECIES, testReftax); - + categoriesAndFile.put(Category.TYPE_ESPECES, testTypeEspeces); + project = projectService.createProject(project, categoriesAndFile); project = projectService.loadControlData(project); Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-11-04 15:53:12 UTC (rev 168) @@ -227,21 +227,21 @@ allZones.add("STR5"); allZones.add("STR6"); - List<Specy> species = service.getProjectSpecies(selection, allZones, 2010, 2011); + List<String> species = service.getProjectSpecies(project, selection, allZones, 2010, 2011, null); Assert.assertEquals(4, species.size()); - species = service.getProjectSpecies(selection, allZones, 2011, 2011); + species = service.getProjectSpecies(project, selection, allZones, 2011, 2011, null); Assert.assertEquals(4, species.size()); - species = service.getProjectSpecies(selection, allZones, 2009, 2009); + species = service.getProjectSpecies(project, selection, allZones, 2009, 2009, null); Assert.assertEquals(0, species.size()); // test with no zones - species = service.getProjectSpecies(selection, new ArrayList<String>(), 2010, 2011); + species = service.getProjectSpecies(project, selection, new ArrayList<String>(), 2010, 2011, null); Assert.assertEquals(0, species.size()); // test with only one zone - species = service.getProjectSpecies(selection, Collections.singletonList("STR6"), 2010, 2011); + species = service.getProjectSpecies(project, selection, Collections.singletonList("STR6"), 2010, 2011, null); Assert.assertEquals(4, species.size()); } Added: trunk/coser-business/src/test/resources/csv/correct/testtypeespeces.csv =================================================================== --- trunk/coser-business/src/test/resources/csv/correct/testtypeespeces.csv (rev 0) +++ trunk/coser-business/src/test/resources/csv/correct/testtypeespeces.csv 2010-11-04 15:53:12 UTC (rev 168) @@ -0,0 +1,4 @@ +"Types";"Commentaire";"NumSys min";"NumSys max" +"Type1";;"00001";"00002" +"Type2";;"00003";"00005" +"Type3";;"00006";"00010" Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java 2010-11-04 15:53:12 UTC (rev 168) @@ -150,6 +150,7 @@ modelBuilder.addCategory(_("coser.config.category.main"), _("coser.config.category.main.description")); modelBuilder.addOption(CoserBusinessConfig.CoserBusinessOption.REFERENCE_SPECIES); modelBuilder.addOption(CoserBusinessConfig.CoserBusinessOption.REFERENCE_ZONES); + modelBuilder.addOption(CoserBusinessConfig.CoserBusinessOption.REFERENCE_TYPE_ESPECES); // category control modelBuilder.addCategory(_("coser.config.category.control"), _("coser.config.category.control.description")); @@ -225,12 +226,16 @@ reftaxSpeciesPath = config.getReferenceSpeciesPath(); } + // get correct codeTypeEspece file to use + String codeTypeEspecePath = config.getReferenceTypeEspecesPath(); + // convert to file File capturesFile = new File(capturesPath); File stratesFile = new File(stratesPath); File traitsFile = new File(traitsPath); File taillesFile = new File(taillesPath); File reftaxSpeciesFile = new File(reftaxSpeciesPath); + File codeTypeEspeceFile = new File(codeTypeEspecePath); // package in map final Map<Category, File> fileToLoad = new HashMap<Category, File>(); @@ -239,6 +244,7 @@ fileToLoad.put(Category.LENGTH, taillesFile); fileToLoad.put(Category.STRATA, stratesFile); fileToLoad.put(Category.REFTAX_SPECIES, reftaxSpeciesFile); + fileToLoad.put(Category.TYPE_ESPECES, codeTypeEspeceFile); // disable create button projectView.getCreateProjectButton().setEnabled(false); Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx 2010-11-04 15:53:12 UTC (rev 168) @@ -109,7 +109,10 @@ <row> <cell fill="horizontal" weightx="1" weighty="1" columns="2"> <JScrollPane> - <JList /> + <TypeSpecyListModel id="typeSpecyModel" constructorParams="this" /> + <JList id="typeSpecyList" model="{typeSpecyModel}" + selectionModel="{new OneClicListSelectionModel(typeSpecyList.getSelectionModel(), typeSpecyModel)}" + onValueChanged="getHandler().updateSelectionSpecies(this)"/> </JScrollPane> </cell> </row> Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java 2010-11-04 15:53:12 UTC (rev 168) @@ -31,11 +31,9 @@ import java.util.ArrayList; import java.util.List; -import javax.swing.JList; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; -import javax.swing.event.ListSelectionEvent; import jaxx.runtime.JAXXUtil; @@ -87,14 +85,16 @@ } /** - * Rafraichit la liste des especes avec les dates sélectionnées. + * Rafraichit la liste des especes avec les dates sélectionnées + * et les zones selectionnées ET filtrées par la liste + * des type d'especes. * * Appelé lorsque la selection de la liste des zones change. * * @param view view */ public void updateSelectionSpecies(SelectionDetailsView view) { - //Project project = view.getContextValue(Project.class); + Project project = view.getContextValue(Project.class); Selection selection = view.getContextValue(Selection.class); ProjectService projectService = view.getContextValue(ProjectService.class); @@ -105,12 +105,19 @@ zones.add((String)selectedZone); } + // get selected specy types + Object[] selectedSpecyTypes = view.getTypeSpecyList().getSelectedValues(); + List<String> specyTypes = new ArrayList<String>(); + for (Object selectedSpecyType : selectedSpecyTypes) { + specyTypes.add((String)selectedSpecyType); + } + Integer beginYear = (Integer)view.getSelectionDetailsBeginYearField().getSelectedItem(); Integer endYear = (Integer)view.getSelectionDetailsEndYearField().getSelectedItem(); // il est possible que l'evenement fasse suite a une seule des selections if (beginYear != null && endYear != null) { - List<Specy> species = projectService.getProjectSpecies(selection, zones, beginYear, endYear); + List<String> species = projectService.getProjectSpecies(project, selection, zones, beginYear, endYear, specyTypes); view.getSpecyListModel().setSpecy(species); } } Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListCheckBoxRenderer.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListCheckBoxRenderer.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListCheckBoxRenderer.java 2010-11-04 15:53:12 UTC (rev 168) @@ -61,16 +61,16 @@ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - Specy specy = (Specy)value; + String specy = (String)value; //JCheckBox comboBox = new JCheckBox(); String stringValue = null; - if (displayOccurrenceAndDensity) { + /*if (displayOccurrenceAndDensity) { stringValue = "<html>" + specy.getName() + " <span style='font-size:85%;color:gray;'>(X=44, Y=21)</span><html>"; } - else { - stringValue = specy.getName(); - } + else {*/ + stringValue = specy; + //} //comboBox.setText(stringValue); return super.getListCellRendererComponent(list, stringValue, index, isSelected, cellHasFocus); Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListRenderer.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListRenderer.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListRenderer.java 2010-11-04 15:53:12 UTC (rev 168) @@ -50,11 +50,11 @@ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - Specy specy = (Specy)value; - String stringValue = specy.getName(); + String specy = (String)value; + //String stringValue = specy.getName(); //JCheckBox checkBox = new JCheckBox(stringValue); //checkBox.setSelected(isSelected); - return super.getListCellRendererComponent(list, stringValue, index, isSelected, cellHasFocus); + return super.getListCellRendererComponent(list, specy, index, isSelected, cellHasFocus); } } Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListSelectionModel.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListSelectionModel.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListSelectionModel.java 2010-11-04 15:53:12 UTC (rev 168) @@ -90,14 +90,12 @@ @Override public void contentsChanged(ListDataEvent e) { clearSelection(); - System.out.println("clear : " + selectedObjects); Iterator<Object> itO = selectedObjects.iterator(); while (itO.hasNext()) { Object o = itO.next(); int index = specyListModel.getIndexOf(o); - - System.out.println(((Specy)o).getName() + " index = " + index); + if (index >= 0) { addSelectionInterval(index, index); } Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListTestModel.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListTestModel.java 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SpecyListTestModel.java 2010-11-04 15:53:12 UTC (rev 168) @@ -54,9 +54,9 @@ private final static Log log = LogFactory.getLog(SpecyListTestModel.class); - protected List<Specy> species = new ArrayList<Specy>(); + protected List<String> species = new ArrayList<String>(); - public void setSpecy(List<Specy> species) { + public void setSpecy(List<String> species) { this.species = species; fireContentsChanged(this, 0, species.size()); } @@ -99,7 +99,7 @@ Object[] selectedValues = source.getSelectedValues(); species.clear(); for (Object selectedValue : selectedValues) { - Specy specy = (Specy)selectedValue; + String specy = (String)selectedValue; species.add(specy); } fireContentsChanged(this, 0, species.size() - 1); Added: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/TypeSpecyListModel.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/TypeSpecyListModel.java (rev 0) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/TypeSpecyListModel.java 2010-11-04 15:53:12 UTC (rev 168) @@ -0,0 +1,82 @@ +/* + * #%L + * + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser 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 Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + +package fr.ifremer.coser.ui.selection; + +import java.util.List; + +import javax.swing.AbstractListModel; + +import fr.ifremer.coser.bean.Project; +import fr.ifremer.coser.services.ProjectService; + +/** + * Affiche la liste des types d'especes définie dans le projet. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class TypeSpecyListModel extends AbstractListModel { + + /** serialVersionUID. */ + private static final long serialVersionUID = 441910182067909029L; + + protected SelectionDetailsView view; + + protected List<String> types; + + public TypeSpecyListModel(SelectionDetailsView view) { + super(); + this.view = view; + } + + protected List<String> getTypes() { + if (types == null) { + Project project = view.getContextValue(Project.class); + ProjectService service = view.getContextValue(ProjectService.class); + types = service.getProjectSpeciesTypes(project); + } + return types; + } + + /* + * @see javax.swing.ListModel#getSize() + */ + @Override + public int getSize() { + return getTypes().size(); + } + + /* + * @see javax.swing.ListModel#getElementAt(int) + */ + @Override + public Object getElementAt(int index) { + return getTypes().get(index); + } +} Property changes on: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/TypeSpecyListModel.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties =================================================================== --- trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties 2010-11-04 13:35:35 UTC (rev 167) +++ trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties 2010-11-04 15:53:12 UTC (rev 168) @@ -97,7 +97,7 @@ coser.ui.selection.details.showSpreciesTip=Afficher la table des esp\u00E8ces coser.ui.selection.details.species=Esp\u00E8ces \: coser.ui.selection.details.technicalComment=Commentaire technique -coser.ui.selection.details.type=Type \: +coser.ui.selection.details.type=Filtrer par type \: coser.ui.selection.details.zone=Zone \: coser.ui.selection.filter.density=Densit\u00E9 \: coser.ui.selection.filter.filter=Filtrer