Author: tchemit Date: 2013-03-24 14:03:42 +0100 (Sun, 24 Mar 2013) New Revision: 673 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/673 Log: fixes #2056: [TECH] Am?\195?\169liorer le processus de mise ?\195?\160 jour de l'application fixes #2190: [TECH] ajouter un onglet ?\195?\160 l'?\195?\169cran *?\195?\128 propos* pour r?\195?\169capituler les mises ?\195?\160 jour des modules Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java Removed: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateReferentialAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/InstallDbAction.java Modified: trunk/pom.xml trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/AbstractChangeScreenAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/CloseApplicationAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ReloadTuttiAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateApplicationAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/config/TuttiConfigUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ExportAndCleanDbAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/SampleCategoryColumnIdentifier.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/SpeciesBatchRootRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/action/TuttiActionHelper.java trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/create/CreateBenthosBatchUIModel-error-validation.xml trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/pom.xml 2013-03-24 13:03:42 UTC (rev 673) @@ -120,8 +120,8 @@ <!-- libraries version --> - <nuitonUtilsVersion>2.6.11</nuitonUtilsVersion> - <nuitonUpdaterVersion>2.6.11.2</nuitonUpdaterVersion> + <nuitonUtilsVersion>2.6.12-SNAPSHOT</nuitonUtilsVersion> + <nuitonUpdaterVersion>2.6.12-SNAPSHOT</nuitonUpdaterVersion> <nuitonI18nVersion>2.5</nuitonI18nVersion> <eugenePluginVersion>2.6.1</eugenePluginVersion> Modified: trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties =================================================================== --- trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties 2013-03-24 13:03:42 UTC (rev 673) @@ -1,3 +1,26 @@ +### +# #%L +# Tutti :: UI +# $Id$ +# $HeadURL$ +# %% +# Copyright (C) 2012 - 2013 Ifremer +# %% +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program. If not, see +# <http://www.gnu.org/licenses/gpl-3.0.html>. +# #L% +### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo #Sat Mar 23 16:49:12 CET 2013 tutti.createBenthosBatch.action.addSpecies.help= Modified: trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties =================================================================== --- trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties 2013-03-24 13:03:42 UTC (rev 673) @@ -1,3 +1,26 @@ +### +# #%L +# Tutti :: UI +# $Id$ +# $HeadURL$ +# %% +# Copyright (C) 2012 - 2013 Ifremer +# %% +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program. If not, see +# <http://www.gnu.org/licenses/gpl-3.0.html>. +# #L% +### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo #Sat Mar 23 16:49:12 CET 2013 tutti.createBenthosBatch.action.addSpecies.help=createBenthosBatch.html\#actions Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java 2013-03-24 13:03:42 UTC (rev 673) @@ -52,6 +52,8 @@ public static final int UPATE_EXIT_CODE = 88; + public static final int NORMAL_EXIT_CODE = 0; + public static void main(String... args) { if (log.isInfoEnabled()) { @@ -86,6 +88,8 @@ UIManager.put("Table.focusCellHighlightBorder", new BorderUIResource.LineBorderUIResource(Color.BLACK)); + boolean reload = false; + if (config.isFullLaunchMode()) { if (log.isInfoEnabled()) { @@ -93,14 +97,19 @@ } // try to update jre - i18n - application - help and exit if so - TuttiActionHelper.runActionAndWait(new MainUIHandler(context), - UpdateApplicationAction.class); + UpdateApplicationAction logicAction = TuttiActionHelper.createLogicAction(new MainUIHandler(context), + UpdateApplicationAction.class); + TuttiActionHelper.runActionAndWait(logicAction); + + reload = logicAction.isReload(); } - if (log.isInfoEnabled()) { - log.info("Will start Tutti..."); + if (!reload) { + if (log.isInfoEnabled()) { + log.info("Will start Tutti..."); + } + startTutti(context, true); } - startTutti(context, true); } public static void startTutti(TuttiUIContext context, boolean openContext) { @@ -114,19 +123,19 @@ mainUI.setVisible(true); } - public static void closeTutti(MainUI ui, boolean exit) { + public static void closeTutti(MainUIHandler handler, Integer exitCode) { - TuttiUIContext context = ui.getHandler().getContext(); + TuttiUIContext context = handler.getContext(); // close ui - ui.getHandler().onCloseUI(); + handler.onCloseUI(); //close context context.getSwingSession().save(); context.close(); - if (exit) { - System.exit(0); + if (exitCode != null) { + System.exit(exitCode); } } } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiApplicationUpdaterCallBack.java 2013-03-24 13:03:42 UTC (rev 673) @@ -27,6 +27,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import fr.ifremer.tutti.LabelAware; import fr.ifremer.tutti.TuttiIOUtil; import fr.ifremer.tutti.TuttiTechnicalException; import fr.ifremer.tutti.persistence.ProgressionModel; @@ -50,6 +51,9 @@ import java.util.List; import java.util.Map; +import static org.nuiton.i18n.I18n._; +import static org.nuiton.i18n.I18n.n_; + /** * CallBack to update jre, application, i18n or db. * @@ -62,13 +66,23 @@ private static final Log log = LogFactory.getLog(TuttiApplicationUpdaterCallBack.class); + public enum UpdateType implements LabelAware { + JRE(n_("tutti.update.jre")), + TUTTI(n_("tutti.update.tutti")), + I18N(n_("tutti.update.i18n")), + HELP(n_("tutti.update.help")), + DB(n_("tutti.update.db")); - public enum UpdateType { - JRE, - TUTTI, - I18N, - HELP, - DB + private final String i18nKey; + + private UpdateType(String i18nKey) { + this.i18nKey = i18nKey; + } + + @Override + public String getLabel() { + return _(i18nKey); + } } protected final TuttiUIContext context; @@ -79,6 +93,8 @@ protected boolean applicationUpdated; + protected boolean dbInstalled; + protected boolean dbUpdated; protected final AbstractTuttiAction action; @@ -102,6 +118,10 @@ return dbUpdated; } + public boolean isDbInstalled() { + return dbInstalled; + } + @Override public Map<String, ApplicationInfo> updateToDo(Map<String, ApplicationInfo> appToUpdate) { Map<String, ApplicationInfo> result = Maps.newHashMap(); @@ -122,11 +142,22 @@ if (types.contains(UpdateType.DB)) { ApplicationInfo info = getInfo(UpdateType.DB, result); - dbUpdated = info != null; + + if (info == null) { + dbInstalled = false; + dbUpdated = false; + } else { + if (ApplicationUpdater.ZERO_VERSION.equals(info.oldVersion)) { + dbInstalled = true; + } else { + dbUpdated = true; + } + } } return result; } + @Override public void startUpdate(ApplicationInfo info) { if (UpdateType.DB.name().toLowerCase().equals(info.name)) { @@ -172,10 +203,6 @@ } } - public void restart() { - System.exit(RunTutti.UPATE_EXIT_CODE); - } - @Override public void aborted(String propertiesURL, Exception eee) { if (log.isErrorEnabled()) { @@ -334,7 +361,7 @@ persistenceConfig.generateExternalDbFiles(true); - if (Version.VZERO.toString().equals(info.oldVersion)) { + if (ApplicationUpdater.ZERO_VERSION.equals(info.oldVersion)) { // first database, just copy it to correct directory @@ -429,12 +456,12 @@ // replace the version.appup file content File target = context.getConfig().getServiceConfig().getPersistenceConfig().getDbDirectory(); - File versionFile = new File(target, ApplicationUpdater.VERSION_FILE); + File versionFile = ApplicationUpdater.getVersionFile(target); if (log.isInfoEnabled()) { log.info("Replace content of file " + versionFile + " with " + info.newVersion); } try { - FileUtils.writeStringToFile(versionFile, info.newVersion); + ApplicationUpdater.storeVersionFile(target, info.newVersion); } catch (IOException e) { throw new TuttiTechnicalException("Could not write back new db version to file " + versionFile); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-03-24 13:03:42 UTC (rev 673) @@ -321,7 +321,7 @@ public TuttiProtocolImportExportService getTuttiProtocolImportExportService() { return serviceContext.getService(TuttiProtocolImportExportService.class); } - + public TuttiPupitriImportExportService getTuttiPupitriImportExportService() { return serviceContext.getService(TuttiPupitriImportExportService.class); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/AbstractChangeScreenAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/AbstractChangeScreenAction.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/AbstractChangeScreenAction.java 2013-03-24 13:03:42 UTC (rev 673) @@ -90,10 +90,12 @@ try { TuttiScreen previousScreen = context.getScreen(); - if (previousScreen == null) { - PREVIOUS_SCREEN.removeContextValue(getUI()); - } else { - PREVIOUS_SCREEN.setContextValue(getUI(), previousScreen); + if (getUI() != null) { + if (previousScreen == null) { + PREVIOUS_SCREEN.removeContextValue(getUI()); + } else { + PREVIOUS_SCREEN.setContextValue(getUI(), previousScreen); + } } // clean current screen Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/CloseApplicationAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/CloseApplicationAction.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/CloseApplicationAction.java 2013-03-24 13:03:42 UTC (rev 673) @@ -26,6 +26,8 @@ import fr.ifremer.tutti.ui.swing.RunTutti; +import static org.nuiton.i18n.I18n._; + /** * To close Tutti Application. * @@ -34,16 +36,30 @@ */ public class CloseApplicationAction extends AbstractChangeScreenAction { + protected int exitCode = RunTutti.NORMAL_EXIT_CODE; + public CloseApplicationAction(MainUIHandler handler) { super(handler, false, null); setSkipCheckCurrentScreen(true); + setActionDescription(_("tutti.main.action.exit.tip")); } + public void setExitCode(int exitCode) { + this.exitCode = exitCode; + } + @Override protected void doAction() throws Exception { super.doAction(); - RunTutti.closeTutti(getUI(), true); + RunTutti.closeTutti(getHandler(), exitCode); } + + + @Override + protected void releaseAction() { + exitCode = RunTutti.NORMAL_EXIT_CODE; + super.releaseAction(); + } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css 2013-03-24 13:03:42 UTC (rev 673) @@ -222,6 +222,7 @@ toolTipText: "tutti.main.action.about.tip"; actionIcon: about; i18nMnemonic: "tutti.main.action.about.mnemonic"; + _tuttiAction: {ShowAboutAction.class}; _help: {"tutti.main.menu.action.about.help"}; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx 2013-03-24 13:03:42 UTC (rev 673) @@ -91,8 +91,7 @@ onActionPerformed="handler.showHelp()"/> <JMenuItem id='menuHelpSite' onActionPerformed='handler.gotoSite()'/> - <JMenuItem id='menuHelpAbout' - onActionPerformed='handler.showAbout()'/> + <JMenuItem id='menuHelpAbout'/> <JMenu id='menuChangeLocale'> <JMenuItem id='menuChangeLocaleUK'/> <JMenuItem id='menuChangeLocaleFR'/> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-03-24 13:03:42 UTC (rev 673) @@ -54,25 +54,20 @@ import fr.ifremer.tutti.ui.swing.util.action.TuttiActionUI; import fr.ifremer.tutti.ui.swing.util.action.TuttiUIAction; import jaxx.runtime.SwingUtil; -import jaxx.runtime.swing.AboutPanel; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.i18n.I18n; -import org.nuiton.util.config.ApplicationConfig; import org.nuiton.widget.SwingSession; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JComponent; -import javax.swing.JEditorPane; import javax.swing.JLabel; -import javax.swing.JScrollPane; import javax.swing.JToolBar; import java.awt.Cursor; import java.beans.PropertyChangeEvent; import java.net.URL; -import java.util.Calendar; import java.util.Locale; import static org.nuiton.i18n.I18n._; @@ -223,9 +218,13 @@ context.removeMessageNotifier(this); TuttiUIUtil.closeBean(context); - TuttiUIUtil.closeUI(ui); - ui.setVisible(false); - ui.dispose(); + + if (ui != null) { + + TuttiUIUtil.closeUI(ui); + ui.setVisible(false); + ui.dispose(); + } } @Override @@ -240,7 +239,7 @@ public void reloadUI() { //close ui - getUI().getHandler().onCloseUI(); + onCloseUI(); // restart ui RunTutti.startTutti(getContext(), false); @@ -265,58 +264,6 @@ reloadUI(); } - public void showAbout() { - - ApplicationConfig applicationConfig = - context.getConfig().getApplicationConfig(); - - String iconPath = applicationConfig.getOption("application.icon.path"); - String name = "tutti"; - String licensePath = "META-INF/" + name + "-LICENSE.txt"; - String thirdPartyPath = "META-INF/" + name + "-THIRD-PARTY.txt"; - - AboutPanel about = new AboutPanel(); - about.setTitle(_("tutti.about.title")); - about.setAboutText(_("tutti.about.message")); - - TuttiApplicationConfig config = context.getConfig(); - int currentYear = Calendar.getInstance().get(Calendar.YEAR); - int inceptionYear = config.getInceptionYear(); - String years; - if (currentYear != inceptionYear) { - years = inceptionYear + "-" + currentYear; - } else { - years = inceptionYear + ""; - } - - about.setBottomText(_("tutti.about.bottomText", - config.getOrganizationName(), - years, - config.getVersion())); - about.setIconPath(iconPath); - about.setLicenseFile(licensePath); - about.setThirdpartyFile(thirdPartyPath); - about.buildTopPanel(); - - JScrollPane component = new JScrollPane(); - JEditorPane translateArea = new JEditorPane(); - translateArea.setContentType("text/html"); - translateArea.setEditable(false); - if (translateArea.getFont() != null) { - translateArea.setFont(translateArea.getFont().deriveFont((float) 11)); - } - translateArea.setBorder(null); - String text = _("tutti.about.translate.content"); - translateArea.setText(text); - component.getViewport().add(translateArea); - about.getTabs().add(_("tutti.about.translate.title"), component); - about.init(); - about.showInDialog(ui, true); - - // register on swing session - context.getSwingSession().add(about); - } - public void gotoSite() { TuttiApplicationConfig config = context.getConfig(); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ReloadTuttiAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ReloadTuttiAction.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ReloadTuttiAction.java 2013-03-24 13:03:42 UTC (rev 673) @@ -45,7 +45,7 @@ protected void doAction() throws Exception { // Close the application - RunTutti.closeTutti(getUI(), false); + RunTutti.closeTutti(getHandler(), null); // Restart RunTutti.startTutti(getContext(), true); Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.java 2013-03-24 13:03:42 UTC (rev 673) @@ -0,0 +1,268 @@ +package fr.ifremer.tutti.ui.swing.content; + +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.base.Joiner; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack; +import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; +import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; +import jaxx.runtime.swing.AboutPanel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.config.ApplicationConfig; +import org.nuiton.util.updater.ApplicationInfo; +import org.nuiton.util.updater.ApplicationUpdater; + +import javax.swing.JEditorPane; +import javax.swing.JScrollPane; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import java.io.File; +import java.net.URL; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +import static org.nuiton.i18n.I18n._; + +/** + * To show about panel. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.2 + */ +public class ShowAboutAction extends AbstractMainUITuttiAction { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ShowAboutAction.class); + + protected AboutPanel about; + + public ShowAboutAction(MainUIHandler handler) { + super(handler, false); + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + + about.showInDialog(getUI(), true); + + // register on swing session + getContext().getSwingSession().add(about); + } + + @Override + protected void doAction() throws Exception { + + about = null; + + ApplicationConfig applicationConfig = + getContext().getConfig().getApplicationConfig(); + + String iconPath = applicationConfig.getOption("application.icon.path"); + String name = "tutti"; + String licensePath = "META-INF/" + name + "-LICENSE.txt"; + String thirdPartyPath = "META-INF/" + name + "-THIRD-PARTY.txt"; + + about = new AboutPanel(); + about.setTitle(_("tutti.about.title")); + about.setAboutText(_("tutti.about.message")); + + TuttiApplicationConfig config = getContext().getConfig(); + int currentYear = Calendar.getInstance().get(Calendar.YEAR); + int inceptionYear = config.getInceptionYear(); + String years; + if (currentYear != inceptionYear) { + years = inceptionYear + "-" + currentYear; + } else { + years = inceptionYear + ""; + } + + about.setBottomText(_("tutti.about.bottomText", + config.getOrganizationName(), + years, + config.getVersion())); + about.setIconPath(iconPath); + about.setLicenseFile(licensePath); + about.setThirdpartyFile(thirdPartyPath); + about.buildTopPanel(); + + // + // translate tab + // + + JScrollPane translatePane = new JScrollPane(); + JEditorPane translateArea = new JEditorPane(); + translateArea.setContentType("text/html"); + translateArea.setEditable(false); + if (translateArea.getFont() != null) { + translateArea.setFont(translateArea.getFont().deriveFont((float) 11)); + } + + translateArea.setBorder(null); + File csvFile = new File(config.getI18nDirectory(), "tutti-i18n.csv"); + String translateText = _("tutti.about.translate.content", csvFile.toURI().toURL()); + translateArea.setText(translateText); + translatePane.getViewport().add(translateArea); + translateArea.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if (HyperlinkEvent.EventType.ACTIVATED == e.getEventType()) { + URL url = e.getURL(); + if (log.isInfoEnabled()) { + log.info("edit url: " + url); + } + TuttiUIUtil.openLink(url); + } + } + }); + + about.getTabs().add(_("tutti.about.translate.title"), translatePane); + + // + // update tab + // + + String url = config.getUpdateUrl(); + File current = config.getTuttiBasedir(); + + ApplicationUpdater up = new ApplicationUpdater(); + + // get application updates + Map<String, ApplicationInfo> applicationVersions = up.getVersions(url, current); + + // get db updates + Map<String, ApplicationInfo> dbVersions = up.getVersions(url, config.getDataDirectory()); + + // create final update map + final Map<String, ApplicationInfo> versions = Maps.newTreeMap(); + addUpdate(applicationVersions, versions, + UpdateApplicationAction.ALL_APPLICATION_TYPES); + addUpdate(dbVersions, versions, + TuttiApplicationUpdaterCallBack.UpdateType.DB); + + JScrollPane updatePane = new JScrollPane(); + JEditorPane updateArea = new JEditorPane(); + updateArea.setContentType("text/html"); + updateArea.setEditable(false); + if (updateArea.getFont() != null) { + updateArea.setFont(updateArea.getFont().deriveFont((float) 11)); + } + updateArea.setBorder(null); + + List<String> params = Lists.newArrayList(); + for (TuttiApplicationUpdaterCallBack.UpdateType type : TuttiApplicationUpdaterCallBack.UpdateType.values()) { + String appName = type.name().toLowerCase(); + ApplicationInfo info = versions.get(appName); + String oldVersion = info.oldVersion; + String newVersion = info.newVersion; + String appLabel = type.getLabel(); + + if (log.isInfoEnabled()) { + log.info(String.format( + "Module %s, version courante %s, nouvelle version %s", + appLabel, oldVersion, newVersion)); + } + if (newVersion == null) { + + // no update + params.add(_("tutti.about.update.app.noup.detail", appLabel, oldVersion)); + } else { + // update exists + params.add(_("tutti.about.update.app.up.detail", appLabel, oldVersion, newVersion, appName)); + } + } + String updateText = _("tutti.about.update.content", url, Joiner.on("\n").join(params)); + updateArea.setText(updateText); + updatePane.getViewport().add(updateArea); + updateArea.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if (HyperlinkEvent.EventType.ACTIVATED == e.getEventType()) { + URL url = e.getURL(); + if (url != null) { + TuttiUIUtil.openLink(url); + } else { + String appType = e.getDescription(); + TuttiApplicationUpdaterCallBack.UpdateType updateType = + TuttiApplicationUpdaterCallBack.UpdateType.valueOf(appType.toUpperCase()); + + if (log.isInfoEnabled()) { + log.info("Open url: " + updateType); + } + AbstractTuttiAction action; + + switch (updateType) { + case DB: { + UpdateDbAction logicAction = TuttiActionHelper.createLogicAction(getHandler(), UpdateDbAction.class); + action = logicAction; + ApplicationInfo info = versions.get(appType); + if (ApplicationUpdater.ZERO_VERSION.equals(info.oldVersion)) { + + // install db + action.setActionDescription( + _("tutti.dbManager.action.installDb.tip")); + } + } + break; + default: { + UpdateApplicationAction logicAction = TuttiActionHelper.createLogicAction(getHandler(), UpdateApplicationAction.class); + logicAction.setTypes(updateType); + logicAction.setActionDescription(_("tutti.main.action.updateSpecificApplication.tip", updateType.getLabel())); + action = logicAction; + } + } + // close this dialog + TuttiActionHelper.runAction(about.getClose()); + + // do update + TuttiActionHelper.runAction(action); + } + + } + } + }); + about.getTabs().add(_("tutti.about.update.title"), updatePane); + + about.init(); + } + + protected void addUpdate(Map<String, ApplicationInfo> source, + Map<String, ApplicationInfo> target, + TuttiApplicationUpdaterCallBack.UpdateType... types) { + for (TuttiApplicationUpdaterCallBack.UpdateType type : types) { + String appName = type.name().toLowerCase(); + ApplicationInfo info = source.get(appName); + target.put(appName, info); + } + } + + +} Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ShowAboutAction.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/UpdateApplicationAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateApplicationAction.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateApplicationAction.java 2013-03-24 13:03:42 UTC (rev 673) @@ -25,11 +25,12 @@ */ import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.ui.swing.RunTutti; import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; -import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.util.updater.ApplicationUpdater; @@ -50,14 +51,34 @@ private static final Log log = LogFactory.getLog(UpdateApplicationAction.class); + public static final TuttiApplicationUpdaterCallBack.UpdateType[] ALL_APPLICATION_TYPES = new TuttiApplicationUpdaterCallBack.UpdateType[]{ + TuttiApplicationUpdaterCallBack.UpdateType.JRE, + TuttiApplicationUpdaterCallBack.UpdateType.I18N, + TuttiApplicationUpdaterCallBack.UpdateType.TUTTI, + TuttiApplicationUpdaterCallBack.UpdateType.HELP + }; + public UpdateApplicationAction(MainUIHandler handler) { super(handler, true); setActionDescription(_("tutti.main.action.updateApplication.tip")); + types = ALL_APPLICATION_TYPES; } + protected TuttiApplicationUpdaterCallBack.UpdateType[] types; + + protected boolean reload; + @Override + protected void releaseAction() { + super.releaseAction(); + types = ALL_APPLICATION_TYPES; + } + + @Override protected void doAction() throws Exception { + reload = false; + TuttiUIContext context = getContext(); TuttiApplicationConfig config = context.getConfig(); @@ -79,40 +100,65 @@ ProgressionModel progressionModel = new ProgressionModel(); context.getActionUI().getModel().setProgressionModel(progressionModel); - progressionModel.setMessage("Recherche de mises à jour de JRE / Tutti / I18N / Help"); + progressionModel.setMessage("Recherche de mises à jour"); TuttiApplicationUpdaterCallBack callback = new TuttiApplicationUpdaterCallBack(this, progressionModel); - callback.setTypes(TuttiApplicationUpdaterCallBack.UpdateType.JRE, - TuttiApplicationUpdaterCallBack.UpdateType.I18N, - TuttiApplicationUpdaterCallBack.UpdateType.TUTTI, - TuttiApplicationUpdaterCallBack.UpdateType.HELP); + callback.setTypes(types); + ApplicationUpdater up = new ApplicationUpdater(); - up.setDownloadMonitor(progressionModel); up.update(url, current, dest, false, - callback); + callback, + progressionModel); if (callback.isApplicationUpdated()) { - // tell user restart will be done + reload = true; - TuttiUIUtil.showSuccessMessage( - getUI(), - "Redémarrage de Tutti nécessaire...", - "La mise à jour nécessite le rédémarrage du Tutti.\nL'application va se fermer puis se réouvrir automatiquement." - ); - - callback.restart(); - } else { sendMessage("Aucune mise à jour de l'application détectée."); } -// getContext().getActionUI().getModel().clear(); } } + + public void setTypes(TuttiApplicationUpdaterCallBack.UpdateType... types) { + this.types = types; + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + + if (reload) { + // wait 1 second to be sure action ui is up + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + if (log.isWarnEnabled()) { + log.warn("Could not wait 1 second...", e); + } + } + + // tell user restart will be done + + getHandler().showSuccessMessage( + "Redémarrage de Tutti nécessaire...", + "La mise à jour nécessite le rédémarrage du Tutti.\nL'application va se fermer puis se réouvrir automatiquement." + ); + + CloseApplicationAction action = TuttiActionHelper.createLogicAction( + getHandler(), CloseApplicationAction.class); + action.setExitCode(RunTutti.UPATE_EXIT_CODE); + TuttiActionHelper.runAction(action); + } + } + + public boolean isReload() { + return reload; + } } \ No newline at end of file Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java (from rev 665, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateReferentialAction.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateDbAction.java 2013-03-24 13:03:42 UTC (rev 673) @@ -0,0 +1,105 @@ +package fr.ifremer.tutti.ui.swing.content; + +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ifremer.tutti.persistence.ProgressionModel; +import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; +import fr.ifremer.tutti.ui.swing.content.db.OpenDbAction; +import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.updater.ApplicationUpdater; + +import java.io.File; + +import static org.nuiton.i18n.I18n._; + +/** + * To update - install database. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.0 + */ +public class UpdateDbAction extends AbstractMainUITuttiAction { + + /** Logger. */ + private static final Log log = + LogFactory.getLog(UpdateDbAction.class); + + public UpdateDbAction(MainUIHandler handler) { + super(handler, true); + setActionDescription(_("tutti.dbManager.action.upgradeDb.tip")); + } + + @Override + protected void doAction() { + TuttiUIContext context = getContext(); + TuttiApplicationConfig config = context.getConfig(); + + File current = config.getDataDirectory(); + String url = config.getUpdateUrl(); + + if (log.isInfoEnabled()) { + log.info(String.format("Try to install / update db (current data location: %s), using update url: %s", current, url)); + } + + File dest = new File(config.getTuttiBasedir(), "NEW"); + ProgressionModel progressionModel = new ProgressionModel(); + context.getActionUI().getModel().setProgressionModel(progressionModel); + progressionModel.setMessage("Recherche de mises à jour de base"); + TuttiApplicationUpdaterCallBack callback = + new TuttiApplicationUpdaterCallBack(this, progressionModel); + callback.setTypes(TuttiApplicationUpdaterCallBack.UpdateType.DB); + ApplicationUpdater up = new ApplicationUpdater(); + up.update(url, + current, + dest, + false, + callback, + progressionModel); + + if (callback.isDbInstalled()) { + + progressionModel.setMessage("Ouverture de la base de données"); + + getContext().setDbExist(true); + + // open db + TuttiActionHelper.runInternalAction(getHandler(), OpenDbAction.class); + + } else if (callback.isDbUpdated()) { + + progressionModel.setMessage("Rechargement de la base de données"); + + // open db + TuttiActionHelper.runInternalAction(getHandler(), OpenDbAction.class); + + } else { + sendMessage("Aucune mise à jour de base détectée."); + } + } +} \ No newline at end of file Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateReferentialAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateReferentialAction.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/UpdateReferentialAction.java 2013-03-24 13:03:42 UTC (rev 673) @@ -1,94 +0,0 @@ -package fr.ifremer.tutti.ui.swing.content; - -/* - * #%L - * Tutti :: UI - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2012 - 2013 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack; -import fr.ifremer.tutti.ui.swing.TuttiUIContext; -import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.util.updater.ApplicationUpdater; - -import java.io.File; - -/** - * To update referential using the {@link ApplicationUpdater} mecanism. - * - * @author tchemit <chemit@codelutin.com> - * @since 1.0 - */ -public class UpdateReferentialAction extends AbstractMainUITuttiAction { - - /** Logger. */ - private static final Log log = - LogFactory.getLog(UpdateReferentialAction.class); - - public UpdateReferentialAction(MainUIHandler handler) { - super(handler, true); - } - - @Override - protected void doAction() { - TuttiUIContext context = getContext(); - TuttiApplicationConfig config = context.getConfig(); - - File current = config.getDataDirectory(); - String url = config.getUpdateUrl(); - - if (log.isInfoEnabled()) { - log.info(String.format("Try to update db (current data location: %s), using update url: %s", current, url)); - } - - File dest = new File(config.getTuttiBasedir(), "NEW"); - ProgressionModel progressionModel = new ProgressionModel(); - context.getActionUI().getModel().setProgressionModel(progressionModel); - progressionModel.setMessage("Recherche de mises à jour de base"); - TuttiApplicationUpdaterCallBack callback = - new TuttiApplicationUpdaterCallBack(this, progressionModel); - callback.setTypes(TuttiApplicationUpdaterCallBack.UpdateType.DB); - ApplicationUpdater up = new ApplicationUpdater(); - up.setDownloadMonitor(progressionModel); - up.update(url, - current, - dest, - false, - callback); - - if (callback.isDbUpdated()) { - - progressionModel.setMessage("Rechargement de la base de données"); - - context.setDbLoaded(true); - context.reloadPersistenceService(); - - // make sure title is reloaded - getUI().getHandler().changeTitle(); - - } else { - sendMessage("Aucune mise à jour de base détectée."); - } - } -} \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/config/TuttiConfigUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/config/TuttiConfigUIHandler.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/config/TuttiConfigUIHandler.java 2013-03-24 13:03:42 UTC (rev 673) @@ -30,12 +30,10 @@ import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfigOption; import fr.ifremer.tutti.ui.swing.content.GoToPreviousScreenAction; -import fr.ifremer.tutti.ui.swing.content.MainUIHandler; import fr.ifremer.tutti.ui.swing.content.ReloadTuttiAction; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; import fr.ifremer.tutti.ui.swing.util.TuttiUI; import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; -import fr.ifremer.tutti.ui.swing.util.action.TuttiUIAction; import fr.ifremer.tutti.ui.swing.util.editor.VesselTableCell; import jaxx.runtime.SwingUtil; import jaxx.runtime.swing.config.ConfigUI; @@ -160,14 +158,6 @@ .addOption(TuttiApplicationConfigOption.DATE_FORMAT) .addOption(TuttiApplicationConfigOption.COORDINATE_EDITOR_TYPE); - // SHORTCUT - - /*helper.addCategory(n_("tutti.config.category.shortcuts"), - n_("tutti.config.category.shortcuts.description"), - CALLBACK_SHORTCUT) - .addOption(TuttiApplicationConfigOption.SHORTCUT_CLOSE_POPUP); - */ - helper.addCategory(n_("tutti.config.category.technical"), n_("tutti.config.category.technical.description")) .addOption(TuttiServiceConfigOption.BASEDIR) @@ -191,8 +181,9 @@ @Override public void run() { - TuttiActionHelper.runAction( - getContext().getMainUI().getHandler(), GoToPreviousScreenAction.class); + TuttiActionHelper.runInternalAction( + TuttiConfigUIHandler.this, + GoToPreviousScreenAction.class); } }); @@ -212,12 +203,7 @@ } protected void reloadApplication() { - MainUIHandler handler = getContext().getMainUI().getHandler(); - - TuttiUIAction<ReloadTuttiAction> action = - TuttiActionHelper.createUIAction(handler, ReloadTuttiAction.class); - action.launchActionAndWait(); - action.actionPerformed(null); + TuttiActionHelper.runActionAndWait(this, ReloadTuttiAction.class); } protected void reloadUI() { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.css 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.css 2013-03-24 13:03:42 UTC (rev 673) @@ -39,9 +39,9 @@ #installDbButton { actionIcon: install-db; text: "tutti.dbManager.action.installDb"; + toolTipText: "tutti.dbManager.action.installDb.tip"; i18nMnemonic: "tutti.dbManager.action.installDb.mnemonic"; - _tuttiAction: {InstallDbAction.class}; - toolTipText: "tutti.dbManager.action.installDb.tip"; + _tuttiAction: {UpdateDbAction.class}; _help: {"tutti.dbManager.action.installDb.help"}; } @@ -73,7 +73,7 @@ text: "tutti.dbManager.action.upgradeDb"; i18nMnemonic: "tutti.dbManager.action.upgradeDb.mnemonic"; enabled: {model.isDbLoaded()}; - _tuttiAction: {UpdateReferentialAction.class}; + _tuttiAction: {UpdateDbAction.class}; toolTipText: "tutti.dbManager.action.upgradeDb.tip"; _help: {"tutti.dbManager.action.upgradeDb.help"}; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.jaxx 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/DbManagerUI.jaxx 2013-03-24 13:03:42 UTC (rev 673) @@ -27,7 +27,7 @@ <import> fr.ifremer.tutti.ui.swing.TuttiHelpBroker fr.ifremer.tutti.ui.swing.TuttiUIContext - fr.ifremer.tutti.ui.swing.content.UpdateReferentialAction + fr.ifremer.tutti.ui.swing.content.UpdateDbAction fr.ifremer.tutti.ui.swing.util.TuttiUI static org.nuiton.i18n.I18n._ Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ExportAndCleanDbAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ExportAndCleanDbAction.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ExportAndCleanDbAction.java 2013-03-24 13:03:42 UTC (rev 673) @@ -105,7 +105,7 @@ progressionModel.setMessage("Fermeture de la base courante"); - TuttiActionHelper.runAction(getHandler(), CloseDbAction.class); + TuttiActionHelper.runInternalAction(getHandler(), CloseDbAction.class); PersistenceService persistenceService = getContext().getPersistenceService(); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java 2013-03-24 13:03:42 UTC (rev 673) @@ -109,7 +109,7 @@ progressionModel.increments(1); progressionModel.setMessage("Ouverture de la base de données"); - TuttiActionHelper.runAction(getHandler(), OpenDbAction.class); + TuttiActionHelper.runInternalAction(getHandler(), OpenDbAction.class); } @Override Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/InstallDbAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/InstallDbAction.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/InstallDbAction.java 2013-03-24 13:03:42 UTC (rev 673) @@ -1,99 +0,0 @@ -package fr.ifremer.tutti.ui.swing.content.db; - -/* - * #%L - * Tutti :: UI - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2012 - 2013 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import fr.ifremer.tutti.persistence.ProgressionModel; -import fr.ifremer.tutti.persistence.config.TuttiPersistenceConfig; -import fr.ifremer.tutti.ui.swing.TuttiApplicationUpdaterCallBack; -import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; -import fr.ifremer.tutti.ui.swing.content.AbstractMainUITuttiAction; -import fr.ifremer.tutti.ui.swing.content.MainUIHandler; -import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.util.updater.ApplicationUpdater; - -import java.io.File; - -import static org.nuiton.i18n.I18n._; - -/** - * To install db when no db is attached to Tutti. - * - * @author tchemit <chemit@codelutin.com> - * @since 1.0 - */ -public class InstallDbAction extends AbstractMainUITuttiAction { - - /** Logger. */ - private static final Log log = LogFactory.getLog(InstallDbAction.class); - - public InstallDbAction(MainUIHandler handler) { - super(handler, true); - } - - @Override - protected void doAction() throws Exception { - TuttiApplicationConfig config = getContext().getConfig(); - - File current = config.getDataDirectory(); - String url = config.getUpdateUrl(); - - if (log.isInfoEnabled()) { - log.info(String.format("Try to install db (current data location: %s), using update url: %s", current, url)); - } - ApplicationUpdater up = new ApplicationUpdater(); - - File dest = new File(config.getTuttiBasedir(), "NEW"); - ProgressionModel progressionModel = new ProgressionModel(); - up.setDownloadMonitor(progressionModel); - setProgressionModel(progressionModel); - progressionModel.setMessage("Recherche de mises à jour de base"); - - TuttiApplicationUpdaterCallBack callback = - new TuttiApplicationUpdaterCallBack(this, progressionModel); - callback.setTypes(TuttiApplicationUpdaterCallBack.UpdateType.DB); - - up.update(url, current, dest, false, callback); - - progressionModel.setMessage("Ouverture de la base de données"); - - getContext().setDbExist(true); - - // open db - TuttiActionHelper.runAction(getHandler(), OpenDbAction.class); - } - - @Override - public void postSuccessAction() { - super.postSuccessAction(); - String jdbcUrl = TuttiPersistenceConfig.getInstance().getJdbcUrl(); - - sendMessage(_("tutti.flash.info.db.installed", jdbcUrl)); - - // make sure title is reloaded - getUI().getHandler().changeTitle(); - } -} \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriAction.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriAction.java 2013-03-24 13:03:42 UTC (rev 673) @@ -208,7 +208,7 @@ @Override public void postSuccessAction() { super.postSuccessAction(); - sendMessage(_("")); + sendMessage("TODO"); } @Override Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/SampleCategoryColumnIdentifier.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/SampleCategoryColumnIdentifier.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/SampleCategoryColumnIdentifier.java 2013-03-24 13:03:42 UTC (rev 673) @@ -1,5 +1,29 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches; +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + import fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/SpeciesBatchRootRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/SpeciesBatchRootRowModel.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/SpeciesBatchRootRowModel.java 2013-03-24 13:03:42 UTC (rev 673) @@ -1,5 +1,29 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches; +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java 2013-03-24 13:03:42 UTC (rev 673) @@ -317,6 +317,31 @@ return result; } + public void showSuccessMessage(String title, String message) { + + Component topestUI = getTopestUI(); + boolean alwaysOnTop = false; + + if (topestUI instanceof JDialog) { + alwaysOnTop = ((JDialog) topestUI).isAlwaysOnTop(); + } + + if (alwaysOnTop) { + ((JDialog) topestUI).setAlwaysOnTop(false); + } + try { + + TuttiUIUtil.showSuccessMessage( + topestUI, + title, + message); + } finally { + if (alwaysOnTop) { + ((JDialog) topestUI).setAlwaysOnTop(true); + } + } + } + protected Component getTopestUI() { Component result; TuttiActionUI actionUI = getContext().getActionUI(); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java 2013-03-24 13:03:42 UTC (rev 673) @@ -256,6 +256,30 @@ } } + public static void editLink(File uri) { + + try { + if (!Desktop.isDesktopSupported()) { + throw new TuttiTechnicalException( + _("swing.error.desktop.not.supported")); + } + + + Desktop desktop = Desktop.getDesktop(); + + if (!desktop.isSupported(Desktop.Action.EDIT)) { + + throw new TuttiTechnicalException( + _("swing.error.desktop.browse.not.supported")); + } + + desktop.edit(uri); + } catch (Exception e) { + + throw new TuttiTechnicalException("Could not open link: " + uri, e); + } + } + public static void closeBean(AbstractBean bean) { PropertyChangeListener[] propertyChangeListeners = bean.getPropertyChangeListeners(); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/action/TuttiActionHelper.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/action/TuttiActionHelper.java 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/action/TuttiActionHelper.java 2013-03-24 13:03:42 UTC (rev 673) @@ -1,5 +1,29 @@ package fr.ifremer.tutti.ui.swing.util.action; +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + import com.google.common.base.Preconditions; import fr.ifremer.tutti.TuttiTechnicalException; import fr.ifremer.tutti.ui.swing.content.AbstractMainUITuttiAction; @@ -8,7 +32,6 @@ import javax.swing.AbstractButton; import javax.swing.Action; -import java.awt.event.ActionEvent; /** * Useful method around TuttiUIAction. @@ -18,11 +41,9 @@ */ public class TuttiActionHelper { - public static <A extends AbstractTuttiAction> void runAction(AbstractTuttiUIHandler handler, - Class<A> actionName) { + public static <A extends AbstractTuttiAction> void runInternalAction(A action) { Throwable error = null; - A action = createLogicAction(handler, actionName); try { action.doAction(); action.postSuccessAction(); @@ -37,23 +58,35 @@ } } + public static <A extends AbstractTuttiAction> void runInternalAction(AbstractTuttiUIHandler handler, + Class<A> actionName) { + A action = createLogicAction(handler, actionName); + runInternalAction(action); + } + + public static <A extends AbstractTuttiAction> void runAction(A action) { + TuttiUIAction<A> uiAction = createUIAction(null, action); + uiAction.actionPerformed(null); + } + public static void runAction(AbstractButton button) { button.getAction().actionPerformed(null); } - public static <A extends AbstractTuttiAction> TuttiUIAction<A> runActionAndWait(AbstractTuttiUIHandler handler, - Class<A> actionName) { - TuttiUIAction<A> uiAction = createUIAction(handler, null, actionName); + public static <A extends AbstractTuttiAction> void runActionAndWait(A action) { + TuttiUIAction<A> uiAction = createUIAction(null, action); uiAction.launchActionAndWait(); - return uiAction; + } + public static <A extends AbstractTuttiAction> void runActionAndWait(AbstractTuttiUIHandler handler, + Class<A> actionName) { + A logicAction = createLogicAction(handler, actionName); + runActionAndWait(logicAction); } - public static <A extends AbstractTuttiAction> TuttiUIAction<A> createUIAction(AbstractTuttiUIHandler handler, Class<A> actionName) { - return createUIAction(handler, null,actionName); - + return createUIAction(handler, null, actionName); } @@ -66,8 +99,7 @@ A logicAction = createLogicAction(handler, actionName); // create ui action - TuttiUIAction<A> result = new TuttiUIAction<A>(abstractButton, - logicAction); + TuttiUIAction<A> result = createUIAction(abstractButton, logicAction); return result; } catch (Exception e) { throw new TuttiTechnicalException( @@ -76,6 +108,17 @@ } + public static <A extends AbstractTuttiAction> TuttiUIAction<A> createUIAction(AbstractButton abstractButton, + A logicAction) { + + // create ui action + TuttiUIAction<A> result = new TuttiUIAction<A>(abstractButton, + logicAction); + return result; + + + } + public static <A extends AbstractTuttiAction> A createLogicAction(AbstractTuttiUIHandler handler, Class<A> actionName) { try { Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/action/TuttiActionHelper.java ___________________________________________________________________ Modified: svn:keywords - Author Date Id Revision + Author Date Id Revision HeadURL Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/create/CreateBenthosBatchUIModel-error-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/create/CreateBenthosBatchUIModel-error-validation.xml 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/create/CreateBenthosBatchUIModel-error-validation.xml 2013-03-24 13:03:42 UTC (rev 673) @@ -2,7 +2,7 @@ #%L Tutti :: UI $Id$ - $HeadURL: http://svn.forge.codelutin.com/svn/tutti/trunk/tutti-ui-swing/src/main/resou... $ + $HeadURL$ %% Copyright (C) 2012 - 2013 Ifremer %% Property changes on: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/create/CreateBenthosBatchUIModel-error-validation.xml ___________________________________________________________________ Modified: svn:keywords - Author Date Id Revision + Author Date Id Revision HeadURL Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-03-24 13:03:42 UTC (rev 673) @@ -1,4 +1,3 @@ -= swing.error.desktop.browse.not.supported= swing.error.desktop.not.supported= tutti.about.bottomText= @@ -6,6 +5,10 @@ tutti.about.title= tutti.about.translate.content= tutti.about.translate.title= +tutti.about.update.app.noup.detail= +tutti.about.update.app.up.detail= +tutti.about.update.content= +tutti.about.update.title= tutti.action.cancel= tutti.action.removeCaracteristic= tutti.action.validate= @@ -755,6 +758,7 @@ tutti.main.action.updateApplication= tutti.main.action.updateApplication.mnemonic= tutti.main.action.updateApplication.tip= +tutti.main.action.updateSpecificApplication.tip= tutti.main.action.validateCatches= tutti.main.action.validateCatches.mnemonic= tutti.main.action.validateCatches.tip= @@ -924,6 +928,11 @@ tutti.splitSpeciesBatch.title= tutti.timeeditor.H= tutti.to.be.done= +tutti.update.db= +tutti.update.help= +tutti.update.i18n= +tutti.update.jre= +tutti.update.tutti= tutti.validator.error.comment.too.long= tutti.validator.error.createSpeciesBatch.batchWeight.invalidValue= tutti.validator.error.createSpeciesBatch.sortedUnsortedCategory.required= 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 2013-03-24 12:59:45 UTC (rev 672) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-03-24 13:03:42 UTC (rev 673) @@ -1,11 +1,14 @@ -= swing.error.desktop.browse.not.supported= swing.error.desktop.not.supported= tutti.about.bottomText=Copyright %s - %s - version %s tutti.about.message=<h3>Tutti</h3><p><strong>Outil de saisie de données d'opérations et de captures au cours des campagnes halieutiques.</strong></p><br/><p>Ce logiciel permettra la saisie en mer des données d'opération de pêche (positions, environnement, engin, etc) et des captures associées (composition de la capture en espèces scientifiques avec poids, nombres, tailles etc) pour l'ensemble des campagnes halieutiques réalisées par l'Ifremer.</p><p>Ce projet a été initiée en 2012 par l'<a href\="http\://www.ifremer.fr">Ifremer</a> et réalisé par la société <a href\="http\://codelutin.com">Codelutin</a>.</p><hr/><br/><p>Pour plus d'informations, vous pouvez visiter le <a href\="http\://maven-site.forge.codelutin.com/tutti">site du projet</a>.</p><p>Projet hébergé sur la forge <a href\="http\://forge.codelutin.com/projects/tutti">Forge.codelutin.com</a>.</p> tutti.about.title=À propos de Tutti -tutti.about.translate.content=<h2>Comment traduire Tutti</h2>Vous pouvez nous aider à traduire Tutti.<hr/><br/><ul><li>Récupérer le fichier <strong>tutti-i18n.csv</strong> dans le répertoire <strong>i18n</strong></li><li>ouvrez le avec un tableur (le caractère séprateur est une Tabultation)</li><li>Traduisez, Améliorer, ...</li><li>Enfin renvoyez-le nous</li></ul><br/>Nous intégrerons vos modifications avant la prochaine version. +tutti.about.translate.content=<h2>Comment traduire Tutti</h2>Vous pouvez nous aider à traduire Tutti.<hr/><br/><ul><li>Récupérer le fichier <a href\="%s">tutti-i18n.csv</a> dans le répertoire <strong>i18n</strong></li><li>ouvrez le avec un tableur (le caractère séprateur est une Tabultation)</li><li>Traduisez, Améliorer, ...</li><li>Enfin renvoyez-le nous</li></ul><br/>Nous intégrerons vos modifications avant la prochaine version. tutti.about.translate.title=Traduire Tutti +tutti.about.update.app.noup.detail=<tr><td>%1$s</td><td>%2$s</td><td>%2$s<td><td></td></tr> +tutti.about.update.app.up.detail=<tr><td>%1$s</td><td>%2$s</td><td><strong>%3$s</strong></td><td><a href\="%4$s">Mettre à jour</a><td></tr> +tutti.about.update.content=<h2>Mise à jour de Tutti</h2><p>Fichier des mises à jour \: <a href\="%1$s">%1$s</a></p><br/><hr/><br/><table><CAPTION><EM>Mises à jour des modules</EM></CAPTION><tr><th>Module</th><th>Version installée</th><th>Dernière version</th><th></th></tr>%2$s</table> +tutti.about.update.title=Mise à jour Tutti tutti.attachmentEditor.action.add.mnemonic=A tutti.attachmentEditor.action.add.tip=Ajouter une pièce jointe tutti.attachmentEditor.action.close=Fermer @@ -767,6 +770,7 @@ tutti.main.action.updateApplication=Vérifier les mises à jour tutti.main.action.updateApplication.mnemonic=V tutti.main.action.updateApplication.tip=Vérifier les mises à jour logicielles +tutti.main.action.updateSpecificApplication.tip=Mettre à jour le module <strong>%s</strong> tutti.main.action.validateCatches=Valider les captures tutti.main.action.validateCatches.mnemonic=V tutti.main.action.validateCatches.tip=Valider les captures @@ -936,6 +940,11 @@ tutti.splitSpeciesBatch.title=Catégorisation du lot tutti.timeeditor.H=H tutti.to.be.done=< A FAIRE > +tutti.update.db=Base de données +tutti.update.help=Aide en ligne +tutti.update.i18n=Traductions +tutti.update.jre=Java +tutti.update.tutti=Tutti tutti.validator.error.comment.too.long=Taille de commentaire trop longue (limitée à %s caractères) tutti.validator.error.createSpeciesBatch.batchWeight.invalidValue=Le poids du lot doit être strictement positif tutti.validator.error.createSpeciesBatch.sortedUnsortedCategory.required=La catégorie Vrac / Hors Vrac est obligatoire