Author: chatellier Date: 2010-12-01 12:57:49 +0000 (Wed, 01 Dec 2010) New Revision: 318 Log: Duplication des 4 tables pour que la restauration de la taille des colonnes fonctionne. Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/Coser.java trunk/coser-ui/src/main/java/fr/ifremer/coser/CoserConfig.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/util/ErrorHelper.java trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/Coser.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/Coser.java 2010-12-01 10:05:30 UTC (rev 317) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/Coser.java 2010-12-01 12:57:49 UTC (rev 318) @@ -112,7 +112,6 @@ SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - // init LAF (from configuration) try { String lafClassName = coserConfig.getLookAndFeel(); Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/CoserConfig.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/CoserConfig.java 2010-12-01 10:05:30 UTC (rev 317) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/CoserConfig.java 2010-12-01 12:57:49 UTC (rev 318) @@ -78,6 +78,15 @@ return result; } + public void setsmtpHost(String smtpHost) { + setOption(CoserOption.SMTP_HOST.key, smtpHost); + } + + public String getSmtpHost() { + String result = getOption(CoserOption.SMTP_HOST.key); + return result; + } + public void setSupportEmail(String supportEmail) { setOption(CoserOption.SUPPORT_EMAIL.key, supportEmail); } @@ -93,6 +102,7 @@ LOCALE("coser.locale", _("coser.config.locale.description"), Locale.FRANCE.toString(), Locale.class, false, false), LOOKANDFEEL("coser.lookandfeel", _("coser.config.lookandfeel.description"), "Nimbus", String.class, false, false), APPLICATION_VERSION("coser.application.version", _("coser.config.application.version.description"), null, String.class, false, false), + SMTP_HOST("coser.smtp.host", _("coser.config.smtp.host.description"), "smtp", String.class, false, false), SUPPORT_EMAIL("coser.support.email", _("coser.config.support.email.description"), "support at codelutin.com", String.class, false, false); protected String key; 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-12-01 10:05:30 UTC (rev 317) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java 2010-12-01 12:57:49 UTC (rev 318) @@ -176,6 +176,11 @@ modelBuilder.addOption(CoserBusinessConfig.CoserBusinessOption.CONTROL_TYPE_FISH); modelBuilder.addOption(CoserBusinessConfig.CoserBusinessOption.SELECTION_FILTER_OCCURRENCE); modelBuilder.addOption(CoserBusinessConfig.CoserBusinessOption.SELECTION_FILTER_DENSITY); + + // category misc + modelBuilder.addCategory(_("coser.config.category.misc"), _("coser.config.category.misc.description")); + modelBuilder.addOption(CoserConfig.CoserOption.SMTP_HOST); + modelBuilder.addOption(CoserConfig.CoserOption.SUPPORT_EMAIL); ConfigUI configUI = modelBuilder.buildUI(view, _("coser.config.category.path")); JDialog dialogUI = new JDialog(view, _("coser.ui.config.title")); Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java 2010-12-01 10:05:30 UTC (rev 317) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java 2010-12-01 12:57:49 UTC (rev 318) @@ -47,15 +47,18 @@ protected DataStorage data; + protected Category category; + protected String[] header; - public ControlDataTableModel(ControlView controlView) { + public ControlDataTableModel(ControlView controlView, Category category) { + super(); + this.category = category; updateData(controlView); } - public void updateData(ControlView controlView) { + protected void updateData(ControlView controlView) { Project project = controlView.getContextValue(Project.class); - Category category = (Category)controlView.getCategoryComboBoxModel().getSelectedItem(); switch (category) { case CATCH: Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-12-01 10:05:30 UTC (rev 317) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-12-01 12:57:49 UTC (rev 318) @@ -53,6 +53,7 @@ import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.JViewport; +import javax.swing.ListSelectionModel; import javax.swing.SwingWorker; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; @@ -76,16 +77,16 @@ import fr.ifremer.coser.CoserConstants.ValidationLevel; import fr.ifremer.coser.CoserException; import fr.ifremer.coser.bean.Project; +import fr.ifremer.coser.control.ControlError; import fr.ifremer.coser.control.ControlErrorGroup; -import fr.ifremer.coser.control.ControlError; import fr.ifremer.coser.data.AbstractDataEntity; import fr.ifremer.coser.data.Catch; import fr.ifremer.coser.data.Haul; import fr.ifremer.coser.data.Length; import fr.ifremer.coser.data.Strata; +import fr.ifremer.coser.services.ControlService; import fr.ifremer.coser.services.ProjectService; import fr.ifremer.coser.services.PublicationService; -import fr.ifremer.coser.services.ControlService; /** * Control handler for control view. @@ -101,17 +102,61 @@ private static final Log log = LogFactory.getLog(ControlHandler.class); /** + * Return l'intance de la table qui est selectionnée. + * + * Les 4 table sont dupliquées juste pour concerver l'etat des colonnes. + * + * @param view view + * @return la table affichée (suivante la categorie) + */ + protected JTable getControlDataTable(ControlView controlView) { + Category category = (Category)controlView.getCategoryComboBox().getSelectedItem(); + JTable controlDataTable = null; + + switch (category) { + case CATCH: + controlDataTable = controlView.getControlDataTableCatch(); + break; + case HAUL: + controlDataTable = controlView.getControlDataTableHaul(); + break; + case LENGTH: + controlDataTable = controlView.getControlDataTableLength(); + break; + case STRATA: + controlDataTable = controlView.getControlDataTableStrata(); + break; + } + return controlDataTable; + } + + /** * Selection d'une nouvelle categories dans la liste des categories. * - * @param view view + * @param controlView controlView * @param event event */ - public void categoryChanged(ControlView view, ActionEvent event) { - ControlDataTableModel model = (ControlDataTableModel)view.getControlDataTable().getModel(); - model.updateData(view); + public void categoryChanged(ControlView controlView, ActionEvent event) { + Category category = (Category)controlView.getCategoryComboBox().getSelectedItem(); + controlView.getControlTablesLayout().show(controlView.getControlTablesPanel(), category.toString()); + clearAllSelection(controlView); } /** + * Vide la selection des 4 tables pour que le bean en cours d'edition + * soit vidé et que le changement de categories n'arrive pas + * dans un etat de selection incoherent. + * + * @param controlView controlView + */ + protected void clearAllSelection(ControlView controlView) { + controlView.getControlDataTableSelectionModelCatch().clearSelection(); + controlView.getControlDataTableSelectionModelHaul().clearSelection(); + controlView.getControlDataTableSelectionModelLength().clearSelection(); + controlView.getControlDataTableSelectionModelStrata().clearSelection(); + } + + /** * Affiche le menu contextuel de la table qui contient les données. * * @param controlView view @@ -121,15 +166,16 @@ // clic contextuel if (event.getButton() == MouseEvent.BUTTON3) { - int[] dataSelectedRows = controlView.getControlDataTable().getSelectedRows(); - final int columnIndex = controlView.getControlDataTable().getColumnModel().getColumnIndexAtX(event.getX()); + JTable displayedTable = getControlDataTable(controlView); + int[] dataSelectedRows = displayedTable.getSelectedRows(); + final int columnIndex = displayedTable.getColumnModel().getColumnIndexAtX(event.getX()); JPopupMenu popupMenu = new JPopupMenu(_("coser.ui.control.dataMenuLabel")); // plusieurs lignes selectionnées et pas la premiere colonne (Line index) if (dataSelectedRows.length > 0 && columnIndex > 0) { - ControlDataTableModel controlDataModel = controlView.getControlDataTableModel(); - final String columnName = controlView.getControlDataTable().getColumnName(columnIndex); + ControlDataTableModel controlDataModel = (ControlDataTableModel)displayedTable.getModel(); + final String columnName = displayedTable.getColumnName(columnIndex); final String firstValue = (String)controlDataModel.getValueAt(dataSelectedRows[0], columnIndex); // replace in selection @@ -152,7 +198,7 @@ // replace in everywhere if (columnIndex > 0) { - final String columnName = controlView.getControlDataTable().getColumnName(columnIndex); + final String columnName = displayedTable.getColumnName(columnIndex); JMenuItem replaceAllMenu = new JMenuItem(_("coser.ui.control.dataMenuReplaceAll", columnName)); replaceAllMenu.addActionListener(new ActionListener() { @Override @@ -181,7 +227,7 @@ popupMenu.add(deleteSelectedMenu); } - popupMenu.show(controlView.getControlDataTable(), event.getX(), event.getY()); + popupMenu.show(displayedTable, event.getX(), event.getY()); } } @@ -192,7 +238,7 @@ */ protected void deletedSelectedDataLines(ControlView controlView) { - JTable controlDataTable = controlView.getControlDataTable(); + JTable controlDataTable = getControlDataTable(controlView); int[] selectedLines = controlDataTable.getSelectedRows(); if (ArrayUtils.isNotEmpty(selectedLines)) { @@ -238,7 +284,8 @@ ControlView controlView = replaceView.getContextValue(ControlView.class, JAXXUtil.PARENT); Category category = (Category)controlView.getCategoryComboBox().getSelectedItem(); - ControlDataTableModel controlDataModel = controlView.getControlDataTableModel(); + JTable displayedTable = getControlDataTable(controlView); + ControlDataTableModel controlDataModel = (ControlDataTableModel)displayedTable.getModel(); ProjectService projectService = replaceView.getContextValue(ProjectService.class); Project project = replaceView.getContextValue(Project.class); @@ -277,7 +324,7 @@ if (replaceView.isReplaceInSelection()) { // on suppose que la fenetre est modale, et // que la selection ne peut pas avoir changée - int[] dataSelectedRows = controlView.getControlDataTable().getSelectedRows(); + int[] dataSelectedRows = displayedTable.getSelectedRows(); for (int dataSelectedRow : dataSelectedRows) { String[] data = controlDataModel.getDataAt(dataSelectedRow); boolean replaced = projectService.replaceFieldValue(project, category, field, find, replace, data, false, commandUUID); @@ -289,7 +336,7 @@ } } else { - int rowCount = controlView.getControlDataTableModel().getRowCount(); + int rowCount = controlDataModel.getRowCount(); for (int rowIndex = 0 ; rowIndex < rowCount ; ++rowIndex) { String[] data = controlDataModel.getDataAt(rowIndex); boolean replaced = projectService.replaceFieldValue(project, category, field, find, replace, data, false, commandUUID); @@ -319,7 +366,7 @@ /** * Check project. * - * @param view + * @param view view */ public void checkData(final ControlView view) { final ControlService validationService = view.getContextValue(ControlService.class); @@ -372,16 +419,6 @@ }; task.execute(); } - - /** - * Called when selection change. - * - * @param view - * @param event - */ - public void controlDataTableSelectionChanged(ControlView view, ListSelectionEvent event) { - controlDataTableSelectionChanged(view); - } /** * Called when selection change to display selected bean @@ -391,10 +428,9 @@ */ public void controlDataTableSelectionChanged(ControlView view) { - JTable table = view.getControlDataTable(); + JTable table = getControlDataTable(view); int[] selectedRows = table.getSelectedRows(); if (selectedRows.length == 1) { - int selectedRow = selectedRows[0]; Project project = view.getContextValue(Project.class); Category category = (Category)view.getCategoryComboBox().getSelectedItem(); @@ -424,9 +460,7 @@ updateEditionPanel(view, category, header, line); } else { - if (log.isDebugEnabled()) { - log.debug("Clear edition row panel"); - } + // clear edition panel updateEditionPanel(view, null, null, null); } } @@ -455,17 +489,20 @@ Set<String> errorLineNumbers = error.getLineNumbers(); // peut être vide, si l'erreur ne porte pas sur un bean en particulier if (errorLineNumbers != null) { - view.getControlDataTableSelectionModel().clearSelection(); + JTable displayedTable = getControlDataTable(view); + ControlDataTableModel tableModel = (ControlDataTableModel)displayedTable.getModel(); + ListSelectionModel selectionModel = displayedTable.getSelectionModel(); + selectionModel.clearSelection(); boolean first = true; for (String errorLineNumber : errorLineNumbers) { - int errorLineIndex = view.getControlDataTableModel().getRealIndexOfLine(errorLineNumber); + int errorLineIndex = tableModel.getRealIndexOfLine(errorLineNumber); // ca peut arriver si la ligne a été supprimée if (errorLineIndex >= 0) { - view.getControlDataTableSelectionModel().addSelectionInterval(errorLineIndex, errorLineIndex); + selectionModel.addSelectionInterval(errorLineIndex, errorLineIndex); if (first) { - scrollToVisible(view.getControlDataTable(), errorLineIndex, 0); + scrollToVisible(displayedTable, errorLineIndex, 0); first = false; } } @@ -538,7 +575,10 @@ // select all lines GlobalControlErrorModel model = controlView.getGlobalControlErrorModel(); - controlView.getControlDataTableSelectionModel().clearSelection(); + JTable displayedTable = getControlDataTable(controlView); + ControlDataTableModel tableModel = (ControlDataTableModel)displayedTable.getModel(); + ListSelectionModel selectionModel = displayedTable.getSelectionModel(); + selectionModel.clearSelection(); boolean first = true; int childCount = model.getChildCount(validationGroup); for (int indexChild = 0 ; indexChild < childCount ; ++indexChild) { @@ -546,13 +586,13 @@ Set<String> errorLineNumbers = validationError.getLineNumbers(); for (String errorLineNumber : errorLineNumbers) { - int errorLineIndex = controlView.getControlDataTableModel().getRealIndexOfLine(errorLineNumber); + int errorLineIndex = tableModel.getRealIndexOfLine(errorLineNumber); // ca peut arriver si la ligne a été supprimée if (errorLineIndex >= 0) { - controlView.getControlDataTableSelectionModel().addSelectionInterval(errorLineIndex, errorLineIndex); + selectionModel.addSelectionInterval(errorLineIndex, errorLineIndex); if (first) { - scrollToVisible(controlView.getControlDataTable(), errorLineIndex, 0); + scrollToVisible(displayedTable, errorLineIndex, 0); first = false; } } @@ -610,6 +650,16 @@ } } + /** + * Contruit le panel d'edition du bean. + * + * Vide le panel si line est {@code null}. + * + * @param view view + * @param category category + * @param header header + * @param line line to edit + */ protected void updateEditionPanel(ControlView view, Category category, String[] header, String[] line) { JPanel panel = view.getEditionPanel(); @@ -821,7 +871,7 @@ Project project = view.getContextValue(Project.class); ProjectService projectService = view.getContextValue(ProjectService.class); - JTable controlDataTable = view.getControlDataTable(); + JTable controlDataTable = getControlDataTable(view); ControlDataTableModel model = (ControlDataTableModel)controlDataTable.getModel(); int selectedLine = controlDataTable.getSelectedRow(); Category category = (Category)view.getCategoryComboBox().getSelectedItem(); @@ -882,9 +932,9 @@ Project project = view.getContextValue(Project.class); ProjectService projectService = view.getContextValue(ProjectService.class); - + // get selected row, and selected csv line index - JTable controlDataTable = view.getControlDataTable(); + JTable controlDataTable = getControlDataTable(view); ControlDataTableModel model = (ControlDataTableModel)controlDataTable.getModel(); int selectedLine = controlDataTable.getSelectedRow(); Category category = (Category)view.getCategoryComboBox().getSelectedItem(); Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx 2010-12-01 10:05:30 UTC (rev 317) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx 2010-12-01 12:57:49 UTC (rev 318) @@ -23,6 +23,7 @@ #L% --> <Table name="controlView"> + <import>fr.ifremer.coser.CoserConstants.Category</import> <script><![CDATA[ void $afterCompleteSetup() { // bean validation @@ -67,13 +68,33 @@ <row> <cell fill="both" weightx="1" weighty="1" columns="2"> <JSplitPane name="splitpaneDataDetails" orientation="{JSplitPane.VERTICAL_SPLIT}"> - <JScrollPane> - <fr.ifremer.coser.ui.control.ControlDataTableModel id="controlDataTableModel" constructorParams="this" /> - <JTable id='controlDataTable' model="{controlDataTableModel}" - onMouseClicked="getHandler().showDataTableContextMenu(this, event)"/> - <ListSelectionModel id="controlDataTableSelectionModel" javaBean="controlDataTable.getSelectionModel()" - onValueChanged="getHandler().controlDataTableSelectionChanged(this, event)" /> - </JScrollPane> + <CardLayout id="controlTablesLayout" /> + <JPanel id="controlTablesPanel" layout="{controlTablesLayout}"> + <JScrollPane constraints="Category.CATCH.toString()"> + <JTable id='controlDataTableCatch' model="{new fr.ifremer.coser.ui.control.ControlDataTableModel(this, Category.CATCH)}" + onMouseClicked="getHandler().showDataTableContextMenu(this, event)" /> + <ListSelectionModel id="controlDataTableSelectionModelCatch" javaBean="controlDataTableCatch.getSelectionModel()" + onValueChanged="getHandler().controlDataTableSelectionChanged(this)" /> + </JScrollPane> + <JScrollPane constraints="Category.STRATA.toString()"> + <JTable id='controlDataTableStrata' model="{new fr.ifremer.coser.ui.control.ControlDataTableModel(this, Category.STRATA)}" + onMouseClicked="getHandler().showDataTableContextMenu(this, event)" /> + <ListSelectionModel id="controlDataTableSelectionModelStrata" javaBean="controlDataTableStrata.getSelectionModel()" + onValueChanged="getHandler().controlDataTableSelectionChanged(this)" /> + </JScrollPane> + <JScrollPane constraints="Category.HAUL.toString()"> + <JTable id='controlDataTableHaul' model="{new fr.ifremer.coser.ui.control.ControlDataTableModel(this, Category.HAUL)}" + onMouseClicked="getHandler().showDataTableContextMenu(this, event)" /> + <ListSelectionModel id="controlDataTableSelectionModelHaul" javaBean="controlDataTableHaul.getSelectionModel()" + onValueChanged="getHandler().controlDataTableSelectionChanged(this)" /> + </JScrollPane> + <JScrollPane constraints="Category.LENGTH.toString()"> + <JTable id='controlDataTableLength' model="{new fr.ifremer.coser.ui.control.ControlDataTableModel(this, Category.LENGTH)}" + onMouseClicked="getHandler().showDataTableContextMenu(this, event)" /> + <ListSelectionModel id="controlDataTableSelectionModelLength" javaBean="controlDataTableLength.getSelectionModel()" + onValueChanged="getHandler().controlDataTableSelectionChanged(this)" /> + </JScrollPane> + </JPanel> <JSplitPane name="splitpaneDetail" orientation="{JSplitPane.VERTICAL_SPLIT}"> <JSplitPane name="splitpaneDataDetailError"> Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/util/ErrorHelper.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/util/ErrorHelper.java 2010-12-01 10:05:30 UTC (rev 317) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/util/ErrorHelper.java 2010-12-01 12:57:49 UTC (rev 318) @@ -116,11 +116,11 @@ MultiPartEmail email = new MultiPartEmail(); // smtp - email.setHostName("smtp"); + email.setHostName(coserConfig.getSmtpHost()); // to email.addTo(emailTo, "Support"); // from - email.setFrom("no-reply at nuiton.org", "Coser"); + email.setFrom("no-reply at labs.libre-entreprise.org", "Coser"); // subject email.setSubject("Project error notification : Coser"); @@ -152,9 +152,9 @@ email.setContent(message.toString(), "text/plain; charset=ISO-8859-9"); // send mail - //email.send(); - - JOptionPane.showMessageDialog(null, "A report message has been sent to " + emailTo); + email.send(); + + JOptionPane.showMessageDialog(null, _("coser.ui.error.reportSendTo", emailTo)); } catch (EmailException ex) { if (log.isErrorEnabled()) { log.error("Can't send report email" ,ex); Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties =================================================================== --- trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties 2010-12-01 10:05:30 UTC (rev 317) +++ trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties 2010-12-01 12:57:49 UTC (rev 318) @@ -1,11 +1,14 @@ coser.config.application.version.description=Application's version coser.config.category.configuration=Configuration coser.config.category.configuration.description=Configuration (numerics data) +coser.config.category.misc=Misc +coser.config.category.misc.description=Misc coser.config.category.path=Path coser.config.category.path.description=File and directory configuration coser.config.config.file.description=Coser configuration file coser.config.locale.description=Application's locale coser.config.lookandfeel.description=Application's swing theme +coser.config.smtp.host.description=SMTP host address coser.config.support.email.description=Support email address coser.ui.common.cancel=Cancel coser.ui.common.comment=Comment @@ -54,6 +57,7 @@ coser.ui.control.validcontrol=Valid control coser.ui.control.validcontroltip=Mark control as validated. Can be done only after data check ended without errors. coser.ui.error.htmlmessage=An error occurs \: %s +coser.ui.error.reportSendTo=A repport has been sent to %s coser.ui.error.title=Global application error coser.ui.graph.compareNumberCatchSize=Comparison Catch/Length coser.ui.graph.lengthStructure=Length structure 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-12-01 10:05:30 UTC (rev 317) +++ trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties 2010-12-01 12:57:49 UTC (rev 318) @@ -1,12 +1,15 @@ coser.config.application.version.description=Version de l'application coser.config.category.configuration=Configuration coser.config.category.configuration.description=Configuration (donn\u00E9es num\u00E9riques) +coser.config.category.misc=Disers +coser.config.category.misc.description=Divers coser.config.category.path=Chemins coser.config.category.path.description=Configuration des fichiers et r\u00E9pertoires coser.config.config.file.description=Fichier de configuration de Coser coser.config.locale.description=Langue de l'application coser.config.lookandfeel.description=Themes graphique Swing de l'application -coser.config.support.email.description=Adresse de suport pour l'envoi des erreurs +coser.config.smtp.host.description=Adresse du serveur SMTP pour envoyer les mails +coser.config.support.email.description=Adresse de support pour l'envoi des erreurs coser.ui.common.cancel=Annuler coser.ui.common.comment=Commentaire coser.ui.common.selectAll=S\u00E9lectionner tout @@ -54,6 +57,7 @@ coser.ui.control.validcontrol=Valider le contr\u00F4le coser.ui.control.validcontroltip=Marque le contr\u00F4le comme valid\u00E9. Ne peut \u00EAtre effectu\u00E9 qu'apr\u00E8s une v\u00E9rification des donn\u00E9es termin\u00E9e sans erreurs. coser.ui.error.htmlmessage=Une erreur s'est produite \: %s +coser.ui.error.reportSendTo=Un rapport a \u00E9t\u00E9 envoy\u00E9 \u00E0 %s coser.ui.error.title=Erreur globale coser.ui.graph.compareNumberCatchSize=Comparaison Captures/Tailles coser.ui.graph.lengthStructure=Structures en taille