Index: tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/InstallAndUpdateToolsMacro.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/InstallAndUpdateToolsMacro.groovy	(revision 3204)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/InstallAndUpdateToolsMacro.groovy	(revision 3205)
@@ -13,41 +13,33 @@
 	return;
 }
 
-//def macros = [
-//"AjouterDesSujetsAuCorpusOkapiMacro.groovy",
-//"BuildAFMetadataMacro.groovy",
-//"ExporterSousCorpusSujetsDansOkapiMacro.groovy",
-//"FixINATRSMacro.groovy",
-//"ImporterCorpusOkapiMacro.groovy",
-//"InstallAndUpdateToolsMacro.groovy",
-//"ListerCorpusOkapiMacro.groovy",
-//"ListerIdentifiantsSujetsMacro.groovy",
-//"OkapiSaphirAPI.groovy",
-//"PrepareAFVOIXOFFCorpusMacro.groovy",
-//"WordProperty2WordMacro.groovy"]
-
 String svn = "http://forge.cbp.ens-lyon.fr/svn/txm/tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/"
+try {
+	macros = IOUtils.getText(new URL(svn+"tools.txt"), "UTF-8")
+	macros = macros.split("\n")
+} catch(Exception e2) {
+	monitorShowError("La liste des outils ${svn+"tools.txt"} n'a pas pu être récupérée (raison : $e2).\nAbandon.")
+	return
+}
 
-def macros = IOUtils.getText(new URL(svn+"tools.txt"), "UTF-8")
-macros = macros.split("\n")
-
-println "Copyping ${macros.size()} files..."
-ConsoleProgressBar cpb = new ConsoleProgressBar(macros.size())
+println "Copyping ${macros.size()} files: "
 for (def m : macros) {
+	def f = new File(groovyUserDirectory.getAbsolutePath()+"/"+m)
 	try {
-	String remoteUrl = svn+m
-	def file = new FileOutputStream(groovyUserDirectory.getAbsolutePath()+"/"+m)
-	def out = new BufferedOutputStream(file)
-	out << new URL(remoteUrl).openStream()
-	out.close()
+		String remoteUrl = svn+m
+		
+		if (f.exists()) print "."
+		else print "*"
+		
+		def file = new FileOutputStream(f)
+		def out = new BufferedOutputStream(file)
+		out << new URL(remoteUrl).openStream()
+		out.close()
 	} catch(Exception e ) {
-		println "Error: $e"
+		println "\nErreur lors de la récupération de $f: $e"
 	}
-	
-	cpb.tick()
 }
-cpb.done()
-println "Antract tools updated \\o/"
+println "\nAntract tools updated \\o/"
 
 def monitorShowError(String message) {
 	monitor.syncExec(new Runnable() {
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ImporterCorpusOkapiMacro.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ImporterCorpusOkapiMacro.groovy	(revision 3204)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ImporterCorpusOkapiMacro.groovy	(revision 3205)
@@ -27,7 +27,7 @@
 //def identifiant_corpus_okapi
 
 if (!(corpusViewSelection instanceof CQPCorpus)) {
-	println "Erreur: la sélection n'est pas un corpus."
+	monitorShowError("Erreur: la sélection n'est pas un corpus.")
 	return false
 } 
 
@@ -42,7 +42,7 @@
 } else if (parentCorpusName.startsWith("AFNOTICES") || parentCorpusName.startsWith("AF-NOTICES")) {
 	
 } else {
-	println "Erreur: le corpus n'est pas un corpus d'AF-VOIX-OFF ni AFNOTICE"
+	monitorShowError("Erreur: le corpus n'est pas un corpus d'AF-VOIX-OFF ni AFNOTICE")
 	return false
 }
 
@@ -94,7 +94,7 @@
 String query = "[_.$prop=\"$liste_identifiants_sujets\"] expand to $prop"
 println "CQL=$query"
 if (query.length() > 15500) {
-	println "Erreur : la requête CQL est trop longue (${query.length()})."
+	monitorShowError("Erreur : la requête CQL est trop longue (${query.length()}).")
 	return
 }
 Subcorpus sub = parentCorpus.createSubcorpus(new CQLQuery(query), nom_sous_corpus)
@@ -109,7 +109,7 @@
 					}
 				});
 } else {
-	println "Error: the created corpus is empty!"
+	monitorShowError("Erreur: the created corpus is empty!")
 }
 
 // UTILS UTILS UTILS UTILS UTILS UTILS UTILS
@@ -183,3 +183,11 @@
 	return s
 }
 
+def monitorShowError(String message) {
+	monitor.syncExec(new Runnable() {
+		public void run() {
+			org.eclipse.jface.dialogs.MessageDialog.openError(org.eclipse.swt.widgets.Display.getCurrent().getActiveShell(), "Erreur", message)
+		}
+	});
+}
+
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ListerCorpusOkapiMacro.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ListerCorpusOkapiMacro.groovy	(revision 3204)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ListerCorpusOkapiMacro.groovy	(revision 3205)
@@ -35,7 +35,7 @@
 
 String sessionID = OkapiSaphirAPI.login(user, password)
 if (sessionID.length() == 0) {
-	println "Erreur : La session Okapi n'a pu être démarrée."
+	monitorShowError("Erreur : La session Okapi n'a pu être démarrée.")
 	System.setProperty(BackToMediaPreferences.MEDIA_AUTH_LOGIN, "")
 	System.setProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD, "")
 }
@@ -45,6 +45,14 @@
 	println "CORPORA"
 	println corpora
 } else {
-	println "Erreur : la liste des corpus n'a pas pu être récupérée."
+	monitorShowError("Erreur : la liste des corpus n'a pas pu être récupérée.")
 }
 
+
+def monitorShowError(String message) {
+	monitor.syncExec(new Runnable() {
+		public void run() {
+			org.eclipse.jface.dialogs.MessageDialog.openError(org.eclipse.swt.widgets.Display.getCurrent().getActiveShell(), "Erreur", message)
+		}
+	});
+}
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ListerIdentifiantsSujetsMacro.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ListerIdentifiantsSujetsMacro.groovy	(revision 3204)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ListerIdentifiantsSujetsMacro.groovy	(revision 3205)
@@ -10,7 +10,7 @@
 import org.txm.searchengine.cqp.CQPSearchEngine
 
 if (!(corpusViewSelection instanceof CQPCorpus)) {
-	println "Erreur: la sélection de la vue Corpus n'est pas un corpus ($corpusViewSelection)."
+	monitorShowError("Erreur: la sélection de la vue Corpus n'est pas un corpus ($corpusViewSelection).")
 	return false
 } 
 
@@ -52,7 +52,7 @@
 	}
 
 } else {
-	println "Erreur: le corpus n'est pas un corpus d'AF-VOIX-OFF ni AFNOTICE"
+	monitorShowError("Erreur: le corpus n'est pas un corpus d'AF-VOIX-OFF ni AFNOTICE")
 	return false
 }
 
@@ -67,3 +67,13 @@
 })
 
 return ids
+
+
+def monitorShowError(String message) {
+	monitor.syncExec(new Runnable() {
+		public void run() {
+			org.eclipse.jface.dialogs.MessageDialog.openError(org.eclipse.swt.widgets.Display.getCurrent().getActiveShell(), "Erreur", message)
+		}
+	});
+}
+
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ExporterSousCorpusSujetsDansOkapiMacro.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ExporterSousCorpusSujetsDansOkapiMacro.groovy	(revision 3204)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/ExporterSousCorpusSujetsDansOkapiMacro.groovy	(revision 3205)
@@ -13,7 +13,7 @@
 import org.txm.backtomedia.preferences.BackToMediaPreferences
 
 if (!(corpusViewSelection instanceof CQPCorpus)) {
-	println "Erreur : la sélection de la vue Corpus n'est pas un corpus ($corpusViewSelection)."
+	monitorShowError("Erreur : la sélection de la vue Corpus n'est pas un corpus ($corpusViewSelection).")
 	return false
 } 
 
@@ -37,7 +37,7 @@
 } else if (parentCorpusName.startsWith("AFNOTICES") || parentCorpusName.startsWith("AF-NOTICES")) {
 	ids = gse.run(ListerIdentifiantsSujetsMacro, ["args":[:], "corpusViewSelection":corpusViewSelection, "monitor":monitor])
 } else {
-	println "Erreur : le corpus n'est pas un corpus d'AF-VOIX-OFF ni AFNOTICE"
+	monitorShowError("Erreur : le corpus n'est pas un corpus d'AF-VOIX-OFF ni AFNOTICE")
 	return false
 }
 
@@ -62,10 +62,18 @@
 		println "Le corpus 'titre_corpus_okapi' son identifiant est $corpusID"
 		println "Lien d'accès direct : "+OkapiSaphirAPI.getDirectAccessURL(corpusID)
 	} else {
-		println "Erreur : Le corpus Okapi n'a pas été créé (code d'erreur=$corpusID)"
+		monitorShowError("Erreur : Le corpus Okapi n'a pas été créé (code d'erreur=$corpusID)")
 	}
 } else {
-	println "Erreur : La session Okapi n'a pu être démarrée."
+	monitorShowError("Erreur : La session Okapi n'a pu être démarrée.")
 	System.setProperty(BackToMediaPreferences.MEDIA_AUTH_LOGIN, "")
 	System.setProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD, "")
-}
\ No newline at end of file
+}
+
+def monitorShowError(String message) {
+	monitor.syncExec(new Runnable() {
+		public void run() {
+			org.eclipse.jface.dialogs.MessageDialog.openError(org.eclipse.swt.widgets.Display.getCurrent().getActiveShell(), "Erreur", message)
+		}
+	});
+}
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/AjouterDesSujetsAuCorpusOkapiMacro.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/AjouterDesSujetsAuCorpusOkapiMacro.groovy	(revision 3204)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/macro/projects/antract/AjouterDesSujetsAuCorpusOkapiMacro.groovy	(revision 3205)
@@ -50,10 +50,18 @@
 	if (corpusID.length() > 0 && corpusID.startsWith("http") && corpusID.equals(identifiant_corpus_okapi)) {
 		println "Le corpus Okapi $identifiant_corpus_okapi a été mis à jour avec $liste_identifiants_sujets"
 	} else {
-		println "Erreur : Le corpus Okapi n'a pas été mis à jour  (session=$sessionID, corpus=$identifiant_corpus_okapi et identifiants=$liste_identifiants_sujets)"
+		monitorShowError("Erreur : Le corpus Okapi n'a pas été mis à jour  (session=$sessionID, corpus=$identifiant_corpus_okapi et identifiants=$liste_identifiants_sujets)")
 	}
 } else {
-	println "Erreur : la session Okapi n'a pas pu être démarrée."
+	monitorShowError("Erreur : la session Okapi n'a pas pu être démarrée.")
 	System.setProperty(BackToMediaPreferences.MEDIA_AUTH_LOGIN, "")
 	System.setProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD, "")
-}
\ No newline at end of file
+}
+
+def monitorShowError(String message) {
+	monitor.syncExec(new Runnable() {
+		public void run() {
+			org.eclipse.jface.dialogs.MessageDialog.openError(org.eclipse.swt.widgets.Display.getCurrent().getActiveShell(), "Erreur", message)
+		}
+	});
+}
