Index: tmp/org.txm.backtomedia.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.backtomedia.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.backtomedia.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -27,4 +27,5 @@
  uk.co.caprica.vlcj.factory.swt,
  uk.co.caprica.vlcj.player.embedded.videosurface.swt,
  vlcplayerrcp
+Automatic-Module-Name: org.txm.backtomedia.rcp
 
Index: tmp/org.txm.annotation.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.annotation.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.annotation.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.annotation.rcp
 
Index: tmp/org.txm.chartsengine.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.chartsengine.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.chartsengine.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.chartsengine.rcp
 
Index: tmp/org.txm.internalview.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.internalview.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.internalview.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -9,4 +9,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.internalview.core
 
Index: tmp/org.txm.utils/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.utils/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.utils/META-INF/MANIFEST.MF	(revision 3063)
@@ -95,4 +95,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.utils.core
 
Index: tmp/org.txm.chartsengine.r.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.chartsengine.r.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.chartsengine.r.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -11,4 +11,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.chartsengine.r.core
 
Index: tmp/org.txm.links.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.links.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.links.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -8,4 +8,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.links.rcp
 
Index: tmp/org.txm.textsbalance.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.textsbalance.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.textsbalance.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.textsbalance.core
 
Index: tmp/org.txm.concordance.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.concordance.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.concordance.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometry.org
+Automatic-Module-Name: org.txm.concordance.core
 
Index: tmp/org.txm.chartsengine.graphstream.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.chartsengine.graphstream.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.chartsengine.graphstream.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -13,4 +13,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.chartsengine.graphstream.rcp
 
Index: tmp/org.txm.statsengine.r.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.statsengine.r.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.statsengine.r.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -14,4 +14,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.statsengine.r.core
 
Index: tmp/org.txm.libs.cqp.win32/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.cqp.win32/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.cqp.win32/META-INF/MANIFEST.MF	(revision 3063)
@@ -7,4 +7,5 @@
 Eclipse-PlatformFilter: (osgi.os=win32)
 Bundle-Vendor: Textometrie.org
 Fragment-Host: org.txm.libs.cqp
+Automatic-Module-Name: org.txm.libs.cqp.win32
 
Index: tmp/org.txm.libs.groovy-all/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.groovy-all/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.groovy-all/META-INF/MANIFEST.MF	(revision 3063)
@@ -82,4 +82,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.libs.groovy-all
 
Index: tmp/org.txm.tigersearch.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.tigersearch.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.tigersearch.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -42,4 +42,5 @@
 Bundle-ClassPath: lib/dom4j-1.6.1.jar,lib/log4j-1.2.12.jar,lib/TigerSe
  arch.jar,.
 Bundle-Activator: tigersearch4txm.Activator
+Automatic-Module-Name: org.txm.tigersearch.rcp
 
Index: tmp/org.txm.tokenizer.core/build.properties
===================================================================
--- tmp/org.txm.tokenizer.core/build.properties	(revision 3062)
+++ tmp/org.txm.tokenizer.core/build.properties	(revision 3063)
@@ -6,3 +6,6 @@
                OSGI-INF/
 source..=src/
 #qualifier=svn
+sourceFileExtensions=*.java, *.groovy
+compilerAdapter=org.codehaus.groovy.eclipse.ant.GroovyCompilerAdapter
+compilerAdapter.useLog=true  # this ensures that exceptions are logged to the proper log file.
\ No newline at end of file
Index: tmp/org.txm.chartsengine.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.chartsengine.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.chartsengine.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -10,4 +10,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.chartsengine.core
 
Index: tmp/org.txm.searchengine.cqp.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.searchengine.cqp.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.searchengine.cqp.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -21,4 +21,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: %Bundle-Vendor
+Automatic-Module-Name: org.txm.searchengine.cqp.core
 
Index: tmp/org.txm.searchengine.cqp.core/src/org/txm/importer/cwb/ReadRegistryFile.java
===================================================================
--- tmp/org.txm.searchengine.cqp.core/src/org/txm/importer/cwb/ReadRegistryFile.java	(revision 3062)
+++ tmp/org.txm.searchengine.cqp.core/src/org/txm/importer/cwb/ReadRegistryFile.java	(revision 3063)
@@ -39,7 +39,7 @@
 	 * reload the informations
 	 */
 	public void read() {
-		pAttributes = new ArrayList();
+		pAttributes = new ArrayList<>();
 		sAttributes = new ArrayList();
 		sattrs = new HashMap<>();
 		sattrsProfs = new HashMap<>();
Index: tmp/org.txm.ca.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.ca.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.ca.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.ca.rcp
 
Index: tmp/org.txm.referencer.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.referencer.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.referencer.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -11,4 +11,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.referencer.core
 
Index: tmp/org.txm.para.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.para.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.para.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -9,4 +9,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.para.core
 
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/filters/Tokeniser/SimpleTokenizerXml.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/filters/Tokeniser/SimpleTokenizerXml.groovy	(revision 3062)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/filters/Tokeniser/SimpleTokenizerXml.groovy	(revision 3063)
@@ -510,7 +510,7 @@
 		text = regLN.matcher(text).replaceAll(WHITESPACE);
 		text = regCTRL.matcher(text).replaceAll(EMPTY);						// remove ctrl characters
 
-				def words = stringTokenizer.processText(text);
+		def words = stringTokenizer.processText(text);
 		for (def word : words) {
 			wordcount++;
 			writer.writeStartElement(word_element_to_create);
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xtz/XTZDefaultPagerStep.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xtz/XTZDefaultPagerStep.groovy	(revision 3062)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xtz/XTZDefaultPagerStep.groovy	(revision 3063)
@@ -163,7 +163,8 @@
 			pagedWriter.writeEndElements();
 			// write notes
 			if (notes.size() > 0) {
-				pagedWriter.writeEmptyElement("hr", ["id":"notes", "width":"20%", "align":"left"]);
+				pagedWriter.writeStartElement("hr", ["id":"notes", "width":"20%", "align":"left"]);
+				pagedWriter.writeEndElement() // </hr>
 				//pagedWriter.writeStartElement("ol");
 				int i = 1;
 				for (String note : notes) {
@@ -328,9 +329,12 @@
 							currentOutOfTextElements << localname
 						}
 					
-						if (paginate && localname == paginationElement) {
-							createNextOutput()
-							wordcount=0;
+						if (localname == paginationElement) {
+							if (paginate) {
+								createNextOutput()
+							}
+							
+							wordcount = 0;
 							pagedWriter.write("\n")
 							if (getAttributeValue(parser, null,"n") != null) {
 								pagedWriter.writeElement("p", ["class":"txmeditionpb", "align":"center"], getAttributeValue(parser, null,"n"))
@@ -441,6 +445,10 @@
 								pagedWriter.write("\n")
 								pagedWriter.writeStartElement("p", ["class":rend])
 								break;
+							case "cb":
+								pagedWriter.write("\n")
+								pagedWriter.writeElement("span", ["class":"txmeditioncb", "align":"center"], getAttributeValue(parser, null,"n")) // element ignored in the END_ELEMENT event
+								break;
 							case "sp":
 								pagedWriter.writeStartElement("p", ["class":"turn"])
 							
@@ -472,8 +480,7 @@
 								break;
 							case "lb":
 							//case "l":
-								pagedWriter.writeStartElement("br", ["class":rend])
-								pagedWriter.writeEndElement()
+								pagedWriter.writeEmptyElement("br", ["class":rend]) 
 								break;
 							case wordTag:
 								wordid = getAttributeValue(parser, null,"id");
@@ -514,6 +521,10 @@
 						localname = parser.getLocalName();
 						if (currentOutOfTextElements.size() > 0) currentOutOfTextElements.pop()
 						writeOutOfTextToEditText = currentOutOfTextElements.size() > 0
+						
+						if (localname == paginationElement) {
+							break; // element already processed in the START_ELEMENT event
+						}
 					
 						switch (localname) {
 							case "text":
@@ -527,6 +538,8 @@
 								pagedWriter.writeEndElement() // </p>
 								pagedWriter.write("\n")
 								break;
+							case "cb":
+								break;
 							case "lb":
 								break;
 							case "div":
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xml/pager.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xml/pager.groovy	(revision 3062)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/xml/pager.groovy	(revision 3063)
@@ -300,8 +300,9 @@
 				case XMLStreamConstants.START_ELEMENT:
 					localname = parser.getLocalName();
 					
-					if (paginate && localname == paginationElement) {
-						createNextOutput();
+					if (localname == paginationElement) {
+						if (paginate) createNextOutput();
+						
 						pagedWriter.write("\n");
 						if (parser.getAttributeValue(null,"n") != null) {
 							pagedWriter.writeElement("p", ["style":"color:red", "align":"center"], "- "+parser.getAttributeValue(null,"n")+" -")
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/transcriber/pager.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/transcriber/pager.groovy	(revision 3062)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/transcriber/pager.groovy	(revision 3063)
@@ -419,8 +419,6 @@
 							break;
 						case "div":
 						
-						
-						
 							if (paginate && paginateSections) {
 								nbBreak++
 								writer.writeEmptyElement("pb");
Index: tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/transcriber/TranscriberTokenizer.groovy
===================================================================
--- tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/transcriber/TranscriberTokenizer.groovy	(revision 3062)
+++ tmp/org.txm.groovy.core/src/groovy/org/txm/scripts/importer/transcriber/TranscriberTokenizer.groovy	(revision 3063)
@@ -86,8 +86,7 @@
 		String text = buffer.toString().trim().replace("\t", " ");
 		text = text.replaceAll("\\p{C}", "");
 		String previousChar = "";
-		for (String s : text.split("[\\p{Z}\\p{C}]+") )	
-		{
+		for (String s : text.split("[\\p{Z}\\p{C}]+") )	{
 			//init transcriber attributes
 			if (troncature)
 				audio = "absent";
@@ -167,17 +166,21 @@
 	}
 	
 	/**
-	 * Iterate.
+	 * Iterate over the String to tokenize it and write words using the 'audio', 'event' and "notation' properties.
 	 *
-	 * @param s the s
+	 * @param s the string to tokenize
 	 * @return the java.lang. object
 	 */
 	protected iterate(String s)
 	{
-		while (s != null && s.length() > 0) {
-			if (DEBUG) {println "  > $s"}
-			s = standardChecks(s);
-			event = "";
+		def words = stringTokenizer.processText(s);
+		for (def word : words) {
+			wordcount++;
+			writer.writeStartElement(word_element_to_create);
+			writeWordAttributes();// id
+			writer.writeCharacters(word);
+			writer.writeEndElement();
+			writer.writeCharacters("\n");
 		}
 	}
 	
Index: tmp/org.txm.groovy.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.groovy.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.groovy.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -13,4 +13,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.groovy.core
 
Index: tmp/org.txm.edition.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.edition.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.edition.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -11,4 +11,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.edition.rcp
 
Index: tmp/org.txm.treetagger.core.win32/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.treetagger.core.win32/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.treetagger.core.win32/META-INF/MANIFEST.MF	(revision 3063)
@@ -6,3 +6,4 @@
 Fragment-Host: org.txm.treetagger.core;bundle-version="1.0.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.treetagger.core.win32
Index: tmp/org.txm.dictionary.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.dictionary.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.dictionary.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -18,4 +18,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.dictionary.rcp
 
Index: tmp/org.txm.internalview.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.internalview.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.internalview.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.internalview.rcp
 
Index: tmp/org.txm.referencer.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.referencer.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.referencer.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -13,4 +13,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.referencer.rcp
 
Index: tmp/org.txm.statsengine.r.core.macosx/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.statsengine.r.core.macosx/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.statsengine.r.core.macosx/META-INF/MANIFEST.MF	(revision 3063)
@@ -7,3 +7,4 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Eclipse-PlatformFilter: (osgi.os=macosx)
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.statsengine.r.core.macosx
Index: tmp/org.txm.libs.cqp.linux/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.cqp.linux/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.cqp.linux/META-INF/MANIFEST.MF	(revision 3063)
@@ -7,4 +7,5 @@
 Eclipse-PlatformFilter: (osgi.os=linux)
 Bundle-Vendor: Textometrie.org
 Fragment-Host: org.txm.libs.cqp
+Automatic-Module-Name: org.txm.libs.cqp.linux
 
Index: tmp/org.txm.queryindex.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.queryindex.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.queryindex.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -21,4 +21,5 @@
 Bundle-Activator: queryindexrcp.Activator
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.queryindex.rcp
 
Index: tmp/org.txm.progression.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.progression.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.progression.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -14,4 +14,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.progression.rcp
 
Index: tmp/org.txm.cooccurrence.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.cooccurrence.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.cooccurrence.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.cooccurrence.rcp
 
Index: tmp/org.txm.index.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.index.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.index.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.index.core
 
Index: tmp/org.txm.concordance.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.concordance.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.concordance.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.concordance.rcp
 
Index: tmp/org.txm.treetagger.core.models/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.treetagger.core.models/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.treetagger.core.models/META-INF/MANIFEST.MF	(revision 3063)
@@ -6,3 +6,4 @@
 Fragment-Host: org.txm.treetagger.core
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.treetagger.core.models
Index: tmp/org.txm.specificities.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.specificities.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.specificities.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -11,4 +11,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.specificities.rcp
 
Index: tmp/org.txm.treetagger.core.macosx/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.treetagger.core.macosx/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.treetagger.core.macosx/META-INF/MANIFEST.MF	(revision 3063)
@@ -6,3 +6,4 @@
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: org.txm.treetagger.core
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Automatic-Module-Name: org.txm.treetagger.core.macosx
Index: tmp/org.txm.ca.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.ca.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.ca.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -15,4 +15,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.ca.core
 
Index: tmp/org.txm.libs.cqp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.cqp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.cqp/META-INF/MANIFEST.MF	(revision 3063)
@@ -9,4 +9,5 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.libs.cqp
 
Index: tmp/org.txm.treetagger.core.linux/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.treetagger.core.linux/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.treetagger.core.linux/META-INF/MANIFEST.MF	(revision 3063)
@@ -5,3 +5,4 @@
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: org.txm.treetagger.core;bundle-version="1.0.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Automatic-Module-Name: org.txm.treetagger.core.linux
Index: tmp/org.txm.properties.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.properties.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.properties.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -13,4 +13,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.properties.rcp
 
Index: tmp/org.txm.cooccurrence.chartsengine/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.cooccurrence.chartsengine/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.cooccurrence.chartsengine/META-INF/MANIFEST.MF	(revision 3063)
@@ -13,3 +13,4 @@
  org.txm.cooccurrence.editors,
  org.txm.cooccurrence.functions,
  org.txm.cooccurrence.handlers
+Automatic-Module-Name: org.txm.cooccurrence.chartsengine
Index: tmp/org.txm.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -153,4 +153,5 @@
 Bundle-Activator: org.txm.rcp.Activator
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: %Bundle-Vendor
+Automatic-Module-Name: org.txm.rcp
 
Index: tmp/org.txm.wordcloud.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.wordcloud.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.wordcloud.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.wordcloud.rcp
 
Index: tmp/org.txm.libs.itext/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.itext/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.itext/META-INF/MANIFEST.MF	(revision 3063)
@@ -15,4 +15,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: itextpdf.com
+Automatic-Module-Name: org.txm.libs.itext
 
Index: tmp/org.txm.core/src/java/org/txm/scripts/importer/StaxStackWriter.groovy
===================================================================
--- tmp/org.txm.core/src/java/org/txm/scripts/importer/StaxStackWriter.groovy	(revision 3062)
+++ tmp/org.txm.core/src/java/org/txm/scripts/importer/StaxStackWriter.groovy	(revision 3063)
@@ -149,16 +149,25 @@
 	 * @throws XMLStreamException
 	 */
 	public void writeElement (String localName, String text) throws XMLStreamException {
-		writer.writeStartElement(localName);
-		writer.writeCharacters(text);
-		writer.writeEndElement();
+		if (text != null && text.length() > 0) {
+			writer.writeStartElement(localName);
+			writer.writeCharacters(text);
+			writer.writeEndElement();
+		} else {
+			writer.writeEmptyElement(localName);
+		}
 	}
 	
 	public void writeElement (String localName, def map, String text) throws XMLStreamException {
-		writer.writeStartElement(localName);
-		for (def key : map.keySet()) writeAttribute(key.toString(), map[key].toString());
-		writer.writeCharacters(text);
-		writer.writeEndElement();
+		if (text != null && text.length() > 0) {
+			writer.writeStartElement(localName);
+			for (def key : map.keySet()) writeAttribute(key.toString(), map[key].toString());
+			writer.writeCharacters(text);
+			writer.writeEndElement();
+		} else {
+			writer.writeEmptyElement(localName);
+			for (def key : map.keySet()) writeAttribute(key.toString(), map[key].toString());
+		}
 	}
 	
 	@Override
@@ -168,8 +177,7 @@
 	
 	public void writeEmptyElement (String localName, def map) throws XMLStreamException {
 		writer.writeEmptyElement(localName);
-		for (def key : map.keySet())
-			writeAttribute(key.toString(), map[key].toString());
+		for (def key : map.keySet()) writeAttribute(key.toString(), map[key].toString());
 	}
 	
 	@Override
Index: tmp/org.txm.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -468,4 +468,5 @@
 Bundle-Activator: org.txm.core.Activator
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.core
 
Index: tmp/org.txm.partition.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.partition.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.partition.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -11,3 +11,4 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.partition.rcp
Index: tmp/org.txm.chartsengine.raster.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.chartsengine.raster.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.chartsengine.raster.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -9,4 +9,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.chartsengine.raster.rcp
 
Index: tmp/org.txm.rcp.about.fragment/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.rcp.about.fragment/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.rcp.about.fragment/META-INF/MANIFEST.MF	(revision 3063)
@@ -10,3 +10,4 @@
  .
 Export-Package: org.eclipse.ui.internal.about
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.rcp.about.fragment
Index: tmp/org.txm.textsbalance.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.textsbalance.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.textsbalance.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -11,4 +11,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.textsbalance.rcp
 
Index: tmp/org.txm.partition.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.partition.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.partition.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -13,4 +13,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.partition.core
 
Index: tmp/org.txm.cooccurrence.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.cooccurrence.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.cooccurrence.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.cooccurrence.core
 
Index: tmp/org.txm.progression.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.progression.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.progression.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -15,4 +15,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.progression.core
 
Index: tmp/org.txm.analec.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.analec.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.analec.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -88,4 +88,5 @@
 Bundle-Activator: analecrcp.Activator
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: %Bundle-Vendor
+Automatic-Module-Name: org.txm.annotation.urs.rcp
 
Index: tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuConversion.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuConversion.java	(revision 3062)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuConversion.java	(revision 3063)
@@ -5,6 +5,7 @@
  */
 
 package visuAnalec.chaines;
+
 import java.awt.*;
 import java.awt.event.*;
 import java.util.*;
@@ -15,301 +16,333 @@
 import visuAnalec.util.GVisu.*;
 import visuAnalec.vue.*;
 import visuAnalec.vue.Vue.*;
+
 /**
  *
  * @author marc
  */
-public class VisuConversion extends JFrame implements VueListener, ActionListener{
-    private Box PanneauCommande = Box.createVerticalBox();
-    private Box PanneauCommandeSource = Box.createVerticalBox();
-    private Vue vue;
-    private PanneauEditeur panneauEditeur;
-    private JList choixModeConversion = new JList();
-    private JButton lancerConversion = new JButton("Convertir");
-    private JTextField nomSchema = new JTextField("Chaine de coréférence");
-    private Val0ComboBox typeSource = new Val0ComboBox("Rien");
-    private Val0ComboBox primaryKey = new Val0ComboBox("Rien");
-    private String[] otherKey = new String[0];
-    private Val0ComboBox addOtherKey = new Val0ComboBox("Rien");
-    private Val0ComboBox removeOtherKey = new Val0ComboBox("Rien");
-    private String[] sourcesPossibles = new String[]{"Type de Relation", "Type d'unité","Propriété d'unité"};
-    private String[] typesSourceDisponibles = new String[0];
-    private ArrayList<String> primaryKeyDisponibles = new ArrayList();
-    private ArrayList<String> otherKeyDisponibles = new ArrayList();
-    private ArrayList<String> otherKeyAjoutees = new ArrayList();
-    public VisuConversion(Container fenetre, Vue vue, PanneauEditeur pEditeur){
-        super("Conversion de données en schéma");
-        Point pos = new Point(fenetre.getX()+20, fenetre.getY()+20);
-        Dimension dim = new Dimension(700, 500);
-        setLocation(pos);
-        setSize(dim);
-        this.vue = vue;
-        vue.addEventListener(this);
-        this.panneauEditeur = pEditeur;
-        choixModeConversion.addMouseListener(new MouseAdapter() {
-        public void mousePressed(MouseEvent e) {//on gère les évènements de la souris
-          check(e);
-        }
-        public void mouseReleased(MouseEvent e) {
-          //check(e);
-        }
-        public void check(MouseEvent e) {
-          if (!e.isPopupTrigger()) {//si on a un clique gauche sur la liste
-            listAction(choixModeConversion.getSelectedIndex());
-          }
-        }
-        });
-        lancerConversion.addActionListener(this);
-        PanneauCommandeSource.add(Box.createVerticalStrut(20));
-        PanneauCommandeSource.add(new JLabel("Choix de la source de donnée :"));
-        PanneauCommandeSource.add(Box.createVerticalStrut(20));
-        PanneauCommandeSource.add(choixModeConversion);
-        PanneauCommandeSource.add(Box.createVerticalStrut(20));
-        PanneauCommandeSource.add(lancerConversion);        
-        JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, PanneauCommandeSource, PanneauCommande);
-        getContentPane().add(split);
-        split.setDividerLocation(1./3);
-        setVisible(true);
-        typeSource.setAlignmentX(0);
-        primaryKey.setAlignmentX(0);
-        addOtherKey.setAlignmentX(0);
-        removeOtherKey.setAlignmentX(0);
-        choixModeConversion.setAlignmentX(0);
-        // Fermeture de la fenêtre
-        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
-        addWindowListener(new WindowAdapter() {
-          @Override
-          public void windowClosing(WindowEvent evt) {
-            fermerFenetre();
-          }
-        });
-        initVide();
-    }
-    public void initVide(){
-        PanneauCommande.removeAll();
-        choixModeConversion.setListData(sourcesPossibles);
-    }
-    public void actionPerformed(ActionEvent evt) {
-        try {
-               if(choixModeConversion.isSelectionEmpty()){
-                   initVide();
-                   return;
-               }
-               else{
-                   switch(choixModeConversion.getSelectedIndex()){
-                       case 0 :
-                            if(evt.getSource().equals(typeSource)){
-                                primaryKeyDisponibles = vue.getListeChamps(Relation.class, typeSource.getSelection());
-                                primaryKey.removeActionListener(this);
-                                primaryKey.setModele(primaryKeyDisponibles.toArray(new String[0]));
-                                primaryKey.addActionListener(this);
-                                return;
-                            }
-                            if(evt.getSource().equals(primaryKey)){
-                                return;
-                            }
-                            if(evt.getSource().equals(lancerConversion)){
-                                if(!typeSource.pasdeSelection() && !primaryKey.pasdeSelection()){
-                                    ChaineUtil.conversion("Relation",nomSchema.getText(),typeSource.getSelection(),
-                                            primaryKey.getSelection(),null,vue);
-                                    fermerFenetre();
-                                }
-                                return;
-                            }
-                       break;
-                       case 1 :
-                            if(evt.getSource().equals(lancerConversion)){
-                                ChaineUtil.conversion("typeUnite",nomSchema.getText(),null,null,new String[0],vue);
-                                fermerFenetre();
-                                return;
-                            }
-                       break;
-                       case 2 :
-                            if(evt.getSource().equals(typeSource)){
-                                if(!typeSource.pasdeSelection()){
-                                    primaryKeyDisponibles = vue.getListeChamps(Unite.class, typeSource.getSelection());
-                                    primaryKey.removeActionListener(this);
-                                    primaryKey.setModele(primaryKeyDisponibles.toArray(new String[0]));
-                                    primaryKey.addActionListener(this);
-                                    otherKeyDisponibles = vue.getListeChamps(Unite.class, typeSource.getSelection());
-                                    addOtherKey.removeActionListener(this);
-                                    addOtherKey.setModele(otherKeyDisponibles.toArray(new String[0]));
-                                    addOtherKey.addActionListener(this);
-                                    otherKeyAjoutees = new ArrayList();
-                                    removeOtherKey.removeActionListener(this);
-                                    removeOtherKey.setModele(otherKeyAjoutees.toArray(new String[0]));
-                                    removeOtherKey.addActionListener(this);
-                                }
-                                return;
-                            }
-                            if(evt.getSource().equals(primaryKey)){
-                                if(!typeSource.pasdeSelection() && !primaryKey.pasdeSelection()){
-                                    otherKeyDisponibles = vue.getListeChamps(Unite.class, typeSource.getSelection());
-                                    otherKeyDisponibles.remove(primaryKey.getSelection());
-                                    for(String key : otherKeyAjoutees){
-                                        otherKeyDisponibles.remove(key);
-                                    }
-                                    otherKeyAjoutees.remove(primaryKey.getSelection());
-                                    addOtherKey.removeActionListener(this);
-                                    removeOtherKey.removeActionListener(this);
-                                    addOtherKey.setModele(otherKeyDisponibles.toArray(new String[0]));
-                                    removeOtherKey.setModele(otherKeyAjoutees.toArray(new String[0]));
-                                    addOtherKey.addActionListener(this);
-                                    removeOtherKey.addActionListener(this);
-                                }
-                                return;
-                            }
-                            if(evt.getSource().equals(lancerConversion)){
-                                if(!typeSource.pasdeSelection() && !primaryKey.pasdeSelection()){
-                                    ChaineUtil.conversion("attributUnite",nomSchema.getText(),typeSource.getSelection(),
-                                            primaryKey.getSelection(),otherKeyAjoutees.toArray(new String[0]),vue);
-                                    fermerFenetre();
-                                }
-                                return;
-                            } 
-                            if(evt.getSource().equals(addOtherKey)){
-                                if(!typeSource.pasdeSelection() && !addOtherKey.pasdeSelection()){
-                                    otherKeyDisponibles.remove(addOtherKey.getSelection());
-                                    otherKeyAjoutees.add(addOtherKey.getSelection());
-                                    addOtherKey.removeActionListener(this);
-                                    removeOtherKey.removeActionListener(this);
-                                    addOtherKey.setModele(otherKeyDisponibles.toArray(new String[0]));
-                                    removeOtherKey.setModele(otherKeyAjoutees.toArray(new String[0]));
-                                    addOtherKey.addActionListener(this);
-                                    removeOtherKey.addActionListener(this);
-                                }
-                                return;
-                            } 
-                            if(evt.getSource().equals(removeOtherKey)){
-                                if(!typeSource.pasdeSelection() && !removeOtherKey.pasdeSelection()){
-                                    otherKeyDisponibles.add(removeOtherKey.getSelection());
-                                    otherKeyAjoutees.remove(removeOtherKey.getSelection());
-                                    addOtherKey.removeActionListener(this);
-                                    removeOtherKey.removeActionListener(this);
-                                    addOtherKey.setModele(otherKeyDisponibles.toArray(new String[0]));
-                                    removeOtherKey.setModele(otherKeyAjoutees.toArray(new String[0]));
-                                    addOtherKey.addActionListener(this);
-                                    removeOtherKey.addActionListener(this);
-                                }
-                                return;
-                            } 
-                       break;
-                       default :
-                           initVide();
-                       break;
-                           
-                    }
-                   
-               }
-          throw new UnsupportedOperationException("Evénement non prévu : "+evt.paramString());
-        } catch (Throwable ex) {
-          GMessages.erreurFatale(ex);
-        }
-    }
-      
-    private void fermerFenetre() {
-      vue.removeEventListener(this);
-      dispose();
-    }
-     public void traiterEvent(Message evt) { // très grossier : à améliorer
-    switch (evt.getType()) {
-      case CLEAR_CORPUS:
-        fermerFenetre();
-        return;
-      case NEW_CORPUS:  // impossible en principe : CLEAR_CORPUS a détruit la fenêtre
-        throw new UnsupportedOperationException("Fenêtre chaines présente lors d'un message NEW_CORPUS ???");
-      case MODIF_TEXTE:
-        fermerFenetre();
-        return;
-      case MODIF_VUE:
-        fermerFenetre();
-        return;
-      case MODIF_STRUCTURE:
-        fermerFenetre();
-        return;
-      case MODIF_ELEMENT:
-//        ElementEvent evtE = (ElementEvent) evt;
-//        if (evtE.getModif() != TypeModifElement.BORNES_UNITE) fermerFenetre();
-        fermerFenetre();
-        return;
-      case CORPUS_SAVED:
-          fermerFenetre();
-          return;
-      default:
-        throw new UnsupportedOperationException("Cas "+evt.getType()+" oublié dans un switch");
-    }
-  }
-     public void listAction(int Index){
-         if(!choixModeConversion.isSelectionEmpty()){
-             PanneauCommande.removeAll();
-             PanneauCommande.add(Box.createVerticalStrut(20));
-             PanneauCommande.add(new JLabel("Saisisez un nom pour votre nouveau type de schéma :"));
-             nomSchema.setMaximumSize(new Dimension(500,50));
-             PanneauCommande.add(Box.createVerticalStrut(20));
-             PanneauCommande.add(nomSchema);
-             switch(Index){
-                 case 0 :
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(new JLabel("Sélectionner un type de relation :"));
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(typeSource);
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(new JLabel("Sélectionner une propriété caractérisant chaque chaine :"));
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(primaryKey);
-                     this.typesSourceDisponibles = vue.getTypesRelationsAVoir();
-                     typeSource.removeActionListener(this);
-                     typeSource.setModele(typesSourceDisponibles);
-                     typeSource.addActionListener(this);
-                     this.primaryKeyDisponibles = new ArrayList();
-                     primaryKey.removeActionListener(this);
-                     this.primaryKey.setModele(this.primaryKeyDisponibles.toArray(new String[0]));
-                     primaryKey.addActionListener(this);
-                     break;
-                 case 1:
-                     break; 
-                 case 2 :
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(new JLabel("Sélectionner un type d'unité :"));
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(typeSource);
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(new JLabel("Sélectionner une propriété caractérisant chaque chaine :"));
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(primaryKey);
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(new JLabel("Sélectionner une propriété des unités à ajouter aux schémas :"));
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(addOtherKey);
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(new JLabel("Sélectionner une propriété des unités à enlever aux schemas :"));
-                     PanneauCommande.add(Box.createVerticalStrut(20));
-                     PanneauCommande.add(removeOtherKey);
-                     this.typesSourceDisponibles = vue.getTypesUnitesAVoir();
-                     typeSource.removeActionListener(this);
-                     typeSource.setModele(typesSourceDisponibles);
-                     typeSource.addActionListener(this);
-                     primaryKey.removeActionListener(this);
-                     this.primaryKeyDisponibles = new ArrayList();
-                     this.primaryKey.setModele(this.primaryKeyDisponibles.toArray(new String[0]));
-                     primaryKey.addActionListener(this);
-                     this.otherKeyDisponibles = new ArrayList();
-                     addOtherKey.removeActionListener(this);
-                     this.addOtherKey.setModele(this.otherKeyDisponibles.toArray(new String[0]));
-                     addOtherKey.addActionListener(this);
-                     this.otherKeyAjoutees = new ArrayList();
-                     removeOtherKey.removeActionListener(this);
-                     this.removeOtherKey.setModele(this.otherKeyAjoutees.toArray(new String[0]));
-                     removeOtherKey.addActionListener(this);
-                     break;
-                 default :
-                     PanneauCommande.removeAll();
-                     break;
-             }
-             revalidate();
-             repaint();
-         }
-     }
-
-    
+public class VisuConversion extends JFrame implements VueListener, ActionListener {
+	
+	private Box PanneauCommande = Box.createVerticalBox();
+	
+	private Box PanneauCommandeSource = Box.createVerticalBox();
+	
+	private Vue vue;
+	
+	private PanneauEditeur panneauEditeur;
+	
+	private JList choixModeConversion = new JList();
+	
+	private JButton lancerConversion = new JButton("Convertir");
+	
+	private JTextField nomSchema = new JTextField("Chaine de coréférence");
+	
+	private Val0ComboBox typeSource = new Val0ComboBox("Rien");
+	
+	private Val0ComboBox primaryKey = new Val0ComboBox("Rien");
+	
+	private String[] otherKey = new String[0];
+	
+	private Val0ComboBox addOtherKey = new Val0ComboBox("Rien");
+	
+	private Val0ComboBox removeOtherKey = new Val0ComboBox("Rien");
+	
+	private String[] sourcesPossibles = new String[] { "Type de Relation", "Type d'unité", "Propriété d'unité" };
+	
+	private String[] typesSourceDisponibles = new String[0];
+	
+	private ArrayList<String> primaryKeyDisponibles = new ArrayList();
+	
+	private ArrayList<String> otherKeyDisponibles = new ArrayList<>();
+	
+	private ArrayList<String> otherKeyAjoutees = new ArrayList();
+	
+	public VisuConversion(Container fenetre, Vue vue, PanneauEditeur pEditeur) {
+		super("Conversion de données en schéma");
+		Point pos = new Point(fenetre.getX() + 20, fenetre.getY() + 20);
+		Dimension dim = new Dimension(700, 500);
+		setLocation(pos);
+		setSize(dim);
+		this.vue = vue;
+		vue.addEventListener(this);
+		this.panneauEditeur = pEditeur;
+		choixModeConversion.addMouseListener(new MouseAdapter() {
+			
+			@Override
+			public void mousePressed(MouseEvent e) {// on gère les évènements de la souris
+				check(e);
+			}
+			
+			@Override
+			public void mouseReleased(MouseEvent e) {
+				// check(e);
+			}
+			
+			public void check(MouseEvent e) {
+				if (!e.isPopupTrigger()) {// si on a un clique gauche sur la liste
+					listAction(choixModeConversion.getSelectedIndex());
+				}
+			}
+		});
+		lancerConversion.addActionListener(this);
+		PanneauCommandeSource.add(Box.createVerticalStrut(20));
+		PanneauCommandeSource.add(new JLabel("Choix de la source de donnée :"));
+		PanneauCommandeSource.add(Box.createVerticalStrut(20));
+		PanneauCommandeSource.add(choixModeConversion);
+		PanneauCommandeSource.add(Box.createVerticalStrut(20));
+		PanneauCommandeSource.add(lancerConversion);
+		JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, PanneauCommandeSource, PanneauCommande);
+		getContentPane().add(split);
+		split.setDividerLocation(1. / 3);
+		setVisible(true);
+		typeSource.setAlignmentX(0);
+		primaryKey.setAlignmentX(0);
+		addOtherKey.setAlignmentX(0);
+		removeOtherKey.setAlignmentX(0);
+		choixModeConversion.setAlignmentX(0);
+		// Fermeture de la fenêtre
+		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+		addWindowListener(new WindowAdapter() {
+			
+			@Override
+			public void windowClosing(WindowEvent evt) {
+				fermerFenetre();
+			}
+		});
+		initVide();
+	}
+	
+	public void initVide() {
+		PanneauCommande.removeAll();
+		choixModeConversion.setListData(sourcesPossibles);
+	}
+	
+	@Override
+	public void actionPerformed(ActionEvent evt) {
+		try {
+			if (choixModeConversion.isSelectionEmpty()) {
+				initVide();
+				return;
+			}
+			else {
+				switch (choixModeConversion.getSelectedIndex()) {
+					case 0:
+						if (evt.getSource().equals(typeSource)) {
+							primaryKeyDisponibles = vue.getListeChamps(Relation.class, typeSource.getSelection());
+							primaryKey.removeActionListener(this);
+							primaryKey.setModele(primaryKeyDisponibles.toArray(new String[0]));
+							primaryKey.addActionListener(this);
+							return;
+						}
+						if (evt.getSource().equals(primaryKey)) {
+							return;
+						}
+						if (evt.getSource().equals(lancerConversion)) {
+							if (!typeSource.pasdeSelection() && !primaryKey.pasdeSelection()) {
+								ChaineUtil.conversion("Relation", nomSchema.getText(), typeSource.getSelection(),
+										primaryKey.getSelection(), null, vue);
+								fermerFenetre();
+							}
+							return;
+						}
+						break;
+					case 1:
+						if (evt.getSource().equals(lancerConversion)) {
+							ChaineUtil.conversion("typeUnite", nomSchema.getText(), null, null, new String[0], vue);
+							fermerFenetre();
+							return;
+						}
+						break;
+					case 2:
+						if (evt.getSource().equals(typeSource)) {
+							if (!typeSource.pasdeSelection()) {
+								primaryKeyDisponibles = vue.getListeChamps(Unite.class, typeSource.getSelection());
+								primaryKey.removeActionListener(this);
+								primaryKey.setModele(primaryKeyDisponibles.toArray(new String[0]));
+								primaryKey.addActionListener(this);
+								otherKeyDisponibles = vue.getListeChamps(Unite.class, typeSource.getSelection());
+								addOtherKey.removeActionListener(this);
+								addOtherKey.setModele(otherKeyDisponibles.toArray(new String[0]));
+								addOtherKey.addActionListener(this);
+								otherKeyAjoutees = new ArrayList();
+								removeOtherKey.removeActionListener(this);
+								removeOtherKey.setModele(otherKeyAjoutees.toArray(new String[0]));
+								removeOtherKey.addActionListener(this);
+							}
+							return;
+						}
+						if (evt.getSource().equals(primaryKey)) {
+							if (!typeSource.pasdeSelection() && !primaryKey.pasdeSelection()) {
+								otherKeyDisponibles = vue.getListeChamps(Unite.class, typeSource.getSelection());
+								otherKeyDisponibles.remove(primaryKey.getSelection());
+								for (String key : otherKeyAjoutees) {
+									otherKeyDisponibles.remove(key);
+								}
+								otherKeyAjoutees.remove(primaryKey.getSelection());
+								addOtherKey.removeActionListener(this);
+								removeOtherKey.removeActionListener(this);
+								addOtherKey.setModele(otherKeyDisponibles.toArray(new String[0]));
+								removeOtherKey.setModele(otherKeyAjoutees.toArray(new String[0]));
+								addOtherKey.addActionListener(this);
+								removeOtherKey.addActionListener(this);
+							}
+							return;
+						}
+						if (evt.getSource().equals(lancerConversion)) {
+							if (!typeSource.pasdeSelection() && !primaryKey.pasdeSelection()) {
+								ChaineUtil.conversion("attributUnite", nomSchema.getText(), typeSource.getSelection(),
+										primaryKey.getSelection(), otherKeyAjoutees.toArray(new String[0]), vue);
+								fermerFenetre();
+							}
+							return;
+						}
+						if (evt.getSource().equals(addOtherKey)) {
+							if (!typeSource.pasdeSelection() && !addOtherKey.pasdeSelection()) {
+								otherKeyDisponibles.remove(addOtherKey.getSelection());
+								otherKeyAjoutees.add(addOtherKey.getSelection());
+								addOtherKey.removeActionListener(this);
+								removeOtherKey.removeActionListener(this);
+								addOtherKey.setModele(otherKeyDisponibles.toArray(new String[0]));
+								removeOtherKey.setModele(otherKeyAjoutees.toArray(new String[0]));
+								addOtherKey.addActionListener(this);
+								removeOtherKey.addActionListener(this);
+							}
+							return;
+						}
+						if (evt.getSource().equals(removeOtherKey)) {
+							if (!typeSource.pasdeSelection() && !removeOtherKey.pasdeSelection()) {
+								otherKeyDisponibles.add(removeOtherKey.getSelection());
+								otherKeyAjoutees.remove(removeOtherKey.getSelection());
+								addOtherKey.removeActionListener(this);
+								removeOtherKey.removeActionListener(this);
+								addOtherKey.setModele(otherKeyDisponibles.toArray(new String[0]));
+								removeOtherKey.setModele(otherKeyAjoutees.toArray(new String[0]));
+								addOtherKey.addActionListener(this);
+								removeOtherKey.addActionListener(this);
+							}
+							return;
+						}
+						break;
+					default:
+						initVide();
+						break;
+					
+				}
+				
+			}
+			throw new UnsupportedOperationException("Evénement non prévu : " + evt.paramString());
+		}
+		catch (Throwable ex) {
+			GMessages.erreurFatale(ex);
+		}
+	}
+	
+	private void fermerFenetre() {
+		vue.removeEventListener(this);
+		dispose();
+	}
+	
+	@Override
+	public void traiterEvent(Message evt) { // très grossier : à améliorer
+		switch (evt.getType()) {
+			case CLEAR_CORPUS:
+				fermerFenetre();
+				return;
+			case NEW_CORPUS:  // impossible en principe : CLEAR_CORPUS a détruit la fenêtre
+				throw new UnsupportedOperationException("Fenêtre chaines présente lors d'un message NEW_CORPUS ???");
+			case MODIF_TEXTE:
+				fermerFenetre();
+				return;
+			case MODIF_VUE:
+				fermerFenetre();
+				return;
+			case MODIF_STRUCTURE:
+				fermerFenetre();
+				return;
+			case MODIF_ELEMENT:
+				// ElementEvent evtE = (ElementEvent) evt;
+				// if (evtE.getModif() != TypeModifElement.BORNES_UNITE) fermerFenetre();
+				fermerFenetre();
+				return;
+			case CORPUS_SAVED:
+				fermerFenetre();
+				return;
+			default:
+				throw new UnsupportedOperationException("Cas " + evt.getType() + " oublié dans un switch");
+		}
+	}
+	
+	public void listAction(int Index) {
+		if (!choixModeConversion.isSelectionEmpty()) {
+			PanneauCommande.removeAll();
+			PanneauCommande.add(Box.createVerticalStrut(20));
+			PanneauCommande.add(new JLabel("Saisisez un nom pour votre nouveau type de schéma :"));
+			nomSchema.setMaximumSize(new Dimension(500, 50));
+			PanneauCommande.add(Box.createVerticalStrut(20));
+			PanneauCommande.add(nomSchema);
+			switch (Index) {
+				case 0:
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(new JLabel("Sélectionner un type de relation :"));
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(typeSource);
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(new JLabel("Sélectionner une propriété caractérisant chaque chaine :"));
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(primaryKey);
+					this.typesSourceDisponibles = vue.getTypesRelationsAVoir();
+					typeSource.removeActionListener(this);
+					typeSource.setModele(typesSourceDisponibles);
+					typeSource.addActionListener(this);
+					this.primaryKeyDisponibles = new ArrayList();
+					primaryKey.removeActionListener(this);
+					this.primaryKey.setModele(this.primaryKeyDisponibles.toArray(new String[0]));
+					primaryKey.addActionListener(this);
+					break;
+				case 1:
+					break;
+				case 2:
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(new JLabel("Sélectionner un type d'unité :"));
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(typeSource);
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(new JLabel("Sélectionner une propriété caractérisant chaque chaine :"));
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(primaryKey);
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(new JLabel("Sélectionner une propriété des unités à ajouter aux schémas :"));
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(addOtherKey);
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(new JLabel("Sélectionner une propriété des unités à enlever aux schemas :"));
+					PanneauCommande.add(Box.createVerticalStrut(20));
+					PanneauCommande.add(removeOtherKey);
+					this.typesSourceDisponibles = vue.getTypesUnitesAVoir();
+					typeSource.removeActionListener(this);
+					typeSource.setModele(typesSourceDisponibles);
+					typeSource.addActionListener(this);
+					primaryKey.removeActionListener(this);
+					this.primaryKeyDisponibles = new ArrayList<>();
+					this.primaryKey.setModele(this.primaryKeyDisponibles.toArray(new String[0]));
+					primaryKey.addActionListener(this);
+					this.otherKeyDisponibles = new ArrayList<>();
+					addOtherKey.removeActionListener(this);
+					this.addOtherKey.setModele(this.otherKeyDisponibles.toArray(new String[0]));
+					addOtherKey.addActionListener(this);
+					this.otherKeyAjoutees = new ArrayList<>();
+					removeOtherKey.removeActionListener(this);
+					this.removeOtherKey.setModele(this.otherKeyAjoutees.toArray(new String[0]));
+					removeOtherKey.addActionListener(this);
+					break;
+				default:
+					PanneauCommande.removeAll();
+					break;
+			}
+			revalidate();
+			repaint();
+		}
+	}
+	
+	
 }
Index: tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuChaines.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuChaines.java	(revision 3062)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuChaines.java	(revision 3063)
@@ -27,1475 +27,1549 @@
  * @author Bernard
  */
 public class VisuChaines extends JFrame implements VueListener, ActionListener {
-  private static final int[] seuilsValsNbElts = {3, 10};
-  private static final Color[] couleursNbElts = {Color.WHITE, GVisu.getCouleurSansValeur(),
-    GVisu.getCouleur(0), GVisu.getCouleur(3), GVisu.getCouleur(1)};
-  private static final int[] TaillesNbElts = {1,2,3,4,4};
-  private static final int[] FormesNbElts = {0,1,2,3,4};
-  private static final String[] TexteNbElts = {"00","01","02","03","04"};
-  private final int colwidth = 50;
-  private final int colheight = 30;
-  private static final String[] labelsNbElements = {
-    "pas de chaîne associée",
-    "chaîne d'un seul chaînon",
-    "chaîne de 2-"+Integer.toString(seuilsValsNbElts[0])+" chaînons",
-    "chaîne de "+Integer.toString(seuilsValsNbElts[0]+1)+"-"
-    +Integer.toString(seuilsValsNbElts[1])+"  chaînons",
-    "chaîne de plus de "+Integer.toString(seuilsValsNbElts[1])+" chaînons"
-  };
-  private final Vue vue;
-  private final ModeleChaines donneesChaines;
-  private String typeChaines;
-  private String typeUnites;
-  private String[] valsAffichees;
-  private String[] valsAffichees1;
-  private String[] valsAffichees2;
-  private String[] valsAffichees3;
-  private String[] valsAffichees4;
-  private HashMap<String,HashMap<String,String>> codeLegende = new HashMap();
-  private final TypeComboBox saisieTypeChaines;
-  private final TypeComboBox saisieTypeUnites;
-  private Val0ComboBox saisieChampAffiche;
-  private Val0ComboBox saisieChampAffiche1;  
-  private Val0ComboBox saisieChampAffiche2;
-  private Val0ComboBox saisieChampAffiche3;
-  private Val0ComboBox saisieChampAffiche4;
-  private final JComboBox saisieTailleLigne;
-  private ChartPanel histochaine;
-  /*private JComboBox saisieTailleLigne;*/
-  private JTable legendeChampAffiche;
-  private LegendeModeleTable legendeChampAfficheModele;
-  private JTable legendeChampAffiche1;
-  private LegendeModeleTable legendeChampAfficheModele1;
-  private JTable legendeChampAffiche2;
-  private LegendeModeleTable legendeChampAfficheModele2;
-  private JTable legendeChampAffiche3;
-  private LegendeModeleTableTexte legendeChampAfficheModele3;
-  private JTable legendeChampAffiche4;
-  private LegendeModeleTableTexte legendeChampAfficheModele4;
-  private JPopupMenu popupChamp = new JPopupMenu();
-  private JPopupMenu popupChamp1 = new JPopupMenu();
-  private JPopupMenu popupChamp2 = new JPopupMenu();
-  private JPopupMenu popupChamp3 = new JPopupMenu();
-  private JPopupMenu popupChamp4 = new JPopupMenu();
-  private final GChaines panneauGraphique;//affichage graphique des chaines
-  private final PanneauEditeur panneauEditeur;
-  private final JCheckBox activeCouperParagraphe;
-  private NgrammesPanel ngrammes;
-  private final JSplitPane split2;
-  private final JMenuBar menuBar = new JMenuBar();
-  public VisuChaines(Container fenetre, Vue vue, PanneauEditeur pEditeur) {
-    super("Analyse des suites d'occurences");
-    Point pos = new Point(fenetre.getX()+20, fenetre.getY()+20);
-    Dimension dim = new Dimension(fenetre.getWidth(), fenetre.getHeight());
-    setLocation(pos);
-    setSize(dim);
-    this.vue = vue;
-    vue.addEventListener(this);
-    this.panneauEditeur = pEditeur;
-    saisieTypeChaines = new TypeComboBox(Schema.class);
-    saisieTypeChaines.setModele(vue.getTypesSchemasAVoir());
-    saisieTypeChaines.addActionListener(this);
-    saisieTypeUnites = new TypeComboBox(Unite.class);
-    saisieTypeUnites.setModele(vue.getTypesUnitesAVoir());
-    saisieTypeUnites.addActionListener(this);
-    saisieTailleLigne = new JComboBox(
-            new String[]{"<tous>", "10", "20", "30", "40", "50"});
-    saisieTailleLigne.setEditable(true);
-    saisieTailleLigne.setMaximumSize(getPreferredSize());
-    saisieTailleLigne.addActionListener(this);
-    saisieChampAffiche = new Val0ComboBox("Nombre de chaînons");
-    saisieChampAffiche.addActionListener(this);
-    saisieChampAffiche1 = new Val0ComboBox("Nombre de chaînons");
-    saisieChampAffiche1.addActionListener(this);
-    saisieChampAffiche2 = new Val0ComboBox("Nombre de chaînons");
-    saisieChampAffiche2.addActionListener(this);
-    saisieChampAffiche3 = new Val0ComboBox("Nombre de chaînons");
-    saisieChampAffiche3.addActionListener(this);
-    saisieChampAffiche4 = new Val0ComboBox("Nombre de chaînons");
-    saisieChampAffiche4.addActionListener(this);
-    // Panneau de présentation du graphique
-    JPanel pGraphique = new JPanel(new BorderLayout());
-    Box commandes = Box.createVerticalBox();
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Chaînes : "));
-    commandes.add(saisieTypeChaines);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Unites : "));
-    commandes.add(saisieTypeUnites);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Nb de chainons par ligne : "));
-    commandes.add(saisieTailleLigne);
-    commandes.add(Box.createVerticalGlue());
-    activeCouperParagraphe = new JCheckBox("Ne pas couper ls paragraphes");
-    commandes.add(activeCouperParagraphe);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Champ à afficher : "));
-    commandes.add(saisieChampAffiche);
-    commandes.add(Box.createVerticalGlue());
-    
-    
-    legendeChampAfficheModele = new LegendeModeleTable();
-    legendeChampAffiche = new JTable(new Object[0][0],new String[]{"Icone","Valeur de champ","Fréquence"});
-    legendeChampAffiche.addMouseListener(new MouseAdapter() {
-      @Override
-      public void mousePressed(MouseEvent e) {//on gère les évènements de la souris
-        check(e);
-      }
-      @Override
-      public void mouseReleased(MouseEvent e) {
-        check(e);
-      }
-      public void check(MouseEvent e) {
-        if (e.isPopupTrigger()) {//if the event shows the menu
-          popupChampInit(legendeChampAffiche.rowAtPoint(e.getPoint()),0);
-          popupChamp.show(legendeChampAffiche, e.getX(), e.getY());
-        }
-      }
-    });
-    
-    commandes.add(legendeChampAffiche);
-    
-    
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Champ à afficher : "));
-    commandes.add(saisieChampAffiche1);
-    commandes.add(Box.createVerticalGlue());
-    
-        legendeChampAfficheModele1 = new LegendeModeleTable();
-        legendeChampAffiche1 = new JTable(legendeChampAfficheModele1);
-    legendeChampAffiche1.addMouseListener(new MouseAdapter() {
-      @Override
-      public void mousePressed(MouseEvent e) {//on gère les évènements de la souris
-        check(e);
-      }
-      @Override
-      public void mouseReleased(MouseEvent e) {
-        check(e);
-      }
-      public void check(MouseEvent e) {
-        if (e.isPopupTrigger()) {//if the event shows the menu
-          popupChampInit(legendeChampAffiche1.rowAtPoint(e.getPoint()),1);
-          popupChamp1.show(legendeChampAffiche1, e.getX(), e.getY());
-        }
-      }
-    });
-    
-    commandes.add(legendeChampAffiche1);
-    
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Champ à afficher : "));
-    commandes.add(saisieChampAffiche2);
-    commandes.add(Box.createVerticalGlue());
-    
-    legendeChampAfficheModele2 = new LegendeModeleTable();
-    legendeChampAffiche2 = new JTable(legendeChampAfficheModele2);
-    legendeChampAffiche2.addMouseListener(new MouseAdapter() {
-      @Override
-      public void mousePressed(MouseEvent e) {//on gère les évènements de la souris
-        check(e);
-      }
-      @Override
-      public void mouseReleased(MouseEvent e) {
-        check(e);
-      }
-      public void check(MouseEvent e) {
-        if (e.isPopupTrigger()) {//if the event shows the menu
-          popupChampInit(legendeChampAffiche2.rowAtPoint(e.getPoint()),2);
-          popupChamp2.show(legendeChampAffiche2, e.getX(), e.getY());
-        }
-      }
-    });
-    commandes.add(legendeChampAffiche2);
-    
-        
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Champ à afficher : "));
-    commandes.add(saisieChampAffiche3);
-    commandes.add(Box.createVerticalGlue());
-    
-    legendeChampAfficheModele3 = new LegendeModeleTableTexte();
-    legendeChampAffiche3 = new JTable(legendeChampAfficheModele3);
-    legendeChampAffiche3.addMouseListener(new MouseAdapter() {
-      @Override
-      public void mousePressed(MouseEvent e) {//on gère les évènements de la souris
-        check(e);
-      }
-      @Override
-      public void mouseReleased(MouseEvent e) {
-        check(e);
-      }
-      public void check(MouseEvent e) {
-        if (e.isPopupTrigger()) {//if the event shows the menu
-          popupChampInit(legendeChampAffiche3.rowAtPoint(e.getPoint()),3);
-          popupChamp3.show(legendeChampAffiche3, e.getX(), e.getY());
-        }
-      }
-    });
-    commandes.add(legendeChampAffiche3);
-    
-        commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Champ à afficher : "));
-    commandes.add(saisieChampAffiche4);
-    commandes.add(Box.createVerticalGlue());
-    
-    legendeChampAfficheModele4 = new LegendeModeleTableTexte();
-    legendeChampAffiche4 = new JTable(legendeChampAfficheModele4);
-    legendeChampAffiche4.addMouseListener(new MouseAdapter() {
-      @Override
-      public void mousePressed(MouseEvent e) {//on gère les évènements de la souris
-        check(e);
-      }
-      @Override
-      public void mouseReleased(MouseEvent e) {
-        check(e);
-      }
-      public void check(MouseEvent e) {
-        if (e.isPopupTrigger()) {//if the event shows the menu
-          popupChampInit(legendeChampAffiche4.rowAtPoint(e.getPoint()),4);
-          popupChamp4.show(legendeChampAffiche4, e.getX(), e.getY());
-        }
-      }
-    });
-    commandes.add(legendeChampAffiche4);
-    JScrollPane scrollLegende = new JScrollPane(commandes);
-
-    panneauGraphique = new GChaines(this);
-    panneauGraphique.autoriserSousTexte(true);
-    
-    donneesChaines = new ModeleChaines(vue, panneauGraphique);
-    JScrollPane scrollGraphique = new JScrollPane(panneauGraphique);
-    histochaine = Histogramme.histogrammeFactory();
-    this.ngrammes=new NgrammesPanel(vue);
-    JScrollPane scrollstatresultat = new JScrollPane(this.ngrammes);
-    JScrollPane scrollHistogramme = new JScrollPane(histochaine);
-    split2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollHistogramme, scrollstatresultat);
-    JSplitPane split3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollGraphique, split2);
-    pGraphique.add(split3, BorderLayout.CENTER);  
-    saisieTypeChaines.setAlignmentX(0);
-    saisieTypeUnites.setAlignmentX(0);
-    saisieTailleLigne.setAlignmentX(0);
-    saisieChampAffiche.setAlignmentX(0);
-    saisieChampAffiche1.setAlignmentX(0);
-    saisieChampAffiche2.setAlignmentX(0);
-    saisieChampAffiche3.setAlignmentX(0);
-    saisieChampAffiche4.setAlignmentX(0);
-    legendeChampAffiche.setAlignmentX(0);
-    legendeChampAffiche1.setAlignmentX(0);
-    legendeChampAffiche2.setAlignmentX(0);
-    legendeChampAffiche3.setAlignmentX(0);
-    legendeChampAffiche4.setAlignmentX(0);
-    
-    
-
-    JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,  scrollLegende,pGraphique);
-    getContentPane().add(split);
-    setVisible(true);
-    split.setDividerLocation(1./3);
-    split2.setDividerLocation(1./2);
-    split3.setDividerLocation(1./3);
-    setJMenuBar(menuBar);
-    JMenu corpusMenu = new JMenu("Paramètres d'affichage");
-    menuBar.add(corpusMenu);
-    corpusMenu.add(new GAction("Reprendre un affichage") {
-      @Override
-      public void executer() {
-         importerAffichage();
-      }
-    });
-    corpusMenu.add(new GAction("Sauver les paramètres d'affichage") {
-      @Override
-      public void executer() {
-         exporterAffichage();
-      }
-    });   
-    JMenu csvMenu = new JMenu("Exporter les données");
-    menuBar.add(csvMenu);
-    final VisuChaines visu = this;
-    final Vue vues = this.vue;
-    final PanneauEditeur pEditeurs = pEditeur;
-    csvMenu.add(new GAction("Exporter les données de filtrage") {
-      @Override
-      public void executer() {
-          new ExportCSV(getContentPane(),vues,pEditeurs,visu);
-      }
-    });
-    csvMenu.add(new GAction("Exporter le tableau statistique") {
-      @Override
-      public void executer() {
-             ExportCSV.exporterCSV(ngrammes.donneesCSV());
-      }
-    });
-    csvMenu.add(new GAction("Exporter les fréquences pour le champ1") {
-      public void executer() {
-          Object[][] donneesCSV = new Object[legendeChampAffiche.getRowCount()+1][2];
-         for(int i = 0 ; i < legendeChampAffiche.getRowCount();i++){
-                donneesCSV[i+1][0]=legendeChampAffiche.getValueAt(i, 1);
-                donneesCSV[i+1][1]=legendeChampAffiche.getValueAt(i, 2)==null ? "0" 
-                        : legendeChampAffiche.getValueAt(i, 2);
-         }
-                donneesCSV[0][1]="frequence";
-                donneesCSV[0][0]=saisieChampAffiche.pasdeSelection() ? "Nombre de Chainons"
-                        : saisieChampAffiche.getSelection();
-             ExportCSV.exporterCSV(donneesCSV);
-      }
-    });
-    csvMenu.add(new GAction("Exporter les fréquences pour le champ2") {
-      @Override
-      public void executer() {
-          Object[][] donneesCSV = new Object[legendeChampAffiche1.getRowCount()+1][2];
-         for(int i = 0 ; i < legendeChampAffiche1.getRowCount();i++){
-                donneesCSV[i+1][0]=legendeChampAffiche1.getValueAt(i, 1);
-                donneesCSV[i+1][1]=legendeChampAffiche1.getValueAt(i, 2)==null ? "0" 
-                        : legendeChampAffiche1.getValueAt(i, 2);
-         }
-                donneesCSV[0][1]="frequence";
-                donneesCSV[0][0]=saisieChampAffiche1.pasdeSelection() ? "Nombre de Chainons"
-                        : saisieChampAffiche1.getSelection();
-             ExportCSV.exporterCSV(donneesCSV);
-      }
-    });
-    csvMenu.add(new GAction("Exporter les fréquences pour le champ3") {
-      @Override
-      public void executer() {
-          Object[][] donneesCSV = new Object[legendeChampAffiche2.getRowCount()+1][2];
-         for(int i = 0 ; i < legendeChampAffiche2.getRowCount();i++){
-                donneesCSV[i+1][0]=legendeChampAffiche2.getValueAt(i, 1);
-                donneesCSV[i+1][1]=legendeChampAffiche2.getValueAt(i, 2)==null ? "0" 
-                        : legendeChampAffiche2.getValueAt(i, 2);
-         }
-                donneesCSV[0][1]="frequence";
-                donneesCSV[0][0]=saisieChampAffiche2.pasdeSelection() ? "Nombre de Chainons"
-                        : saisieChampAffiche2.getSelection();
-             ExportCSV.exporterCSV(donneesCSV);
-      }
-    }); 
-    csvMenu.add(new GAction("Exporter les fréquences pour le champ4") {
-      @Override
-      public void executer() {
-          Object[][] donneesCSV = new Object[legendeChampAffiche3.getRowCount()+1][2];
-         for(int i = 0 ; i < legendeChampAffiche3.getRowCount();i++){
-                donneesCSV[i+1][0]=legendeChampAffiche3.getValueAt(i, 1);
-                donneesCSV[i+1][1]=legendeChampAffiche3.getValueAt(i, 2)==null ? "0" 
-                        : legendeChampAffiche3.getValueAt(i, 2);
-         }
-                donneesCSV[0][1]="frequence";
-                donneesCSV[0][0]=saisieChampAffiche3.pasdeSelection() ? "Nombre de Chainons"
-                        : saisieChampAffiche3.getSelection();
-             ExportCSV.exporterCSV(donneesCSV);
-      }
-    }); 
-    csvMenu.add(new GAction("Exporter les fréquences pour le champ5") {
-      @Override
-      public void executer() {
-          Object[][] donneesCSV = new Object[legendeChampAffiche4.getRowCount()+1][2];
-         for(int i = 0 ; i < legendeChampAffiche4.getRowCount();i++){
-                donneesCSV[i+1][0]=legendeChampAffiche4.getValueAt(i, 1);
-                donneesCSV[i+1][1]=legendeChampAffiche4.getValueAt(i, 2)==null ? "0" 
-                        : legendeChampAffiche4.getValueAt(i, 2);
-         }
-                donneesCSV[0][1]="frequence";
-                donneesCSV[0][0]=saisieChampAffiche4.pasdeSelection() ? "Nombre de Chainons"
-                        : saisieChampAffiche4.getSelection();
-             ExportCSV.exporterCSV(donneesCSV);
-      }
-    });        
-    
-    // Fermeture de la fenêtre
-    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
-    addWindowListener(new WindowAdapter() {
-      @Override
-      public void windowClosing(WindowEvent evt) {
-        fermerFenetre();
-      }
-    });
-    // Initialisation
-    saisieTailleLigne.removeActionListener(this);
-    saisieTailleLigne.setSelectedIndex(0);
-    saisieTailleLigne.addActionListener(this);
-    saisieTailleLigne.setMaximumSize(getPreferredSize());
-    if (saisieTypeChaines.nbItems()==1) {
-      saisieTypeChaines.setSelection(0);
-      if (saisieTypeUnites.nbItems()==1) saisieTypeUnites.setSelection(0);
-      else saisieTypeUnites.effSelection();
-    } else {
-      saisieTypeChaines.effSelection();
-      saisieTypeUnites.effSelection();
-    }
-  }
-
-  private void fermerFenetre() {
-    vue.removeEventListener(this);
-    dispose();
-  }
-  @Override
-  public void traiterEvent(Message evt) { // très grossier : à améliorer
-    switch (evt.getType()) {
-      case CLEAR_CORPUS:
-        fermerFenetre();
-        return;
-      case NEW_CORPUS:  // impossible en principe : CLEAR_CORPUS a détruit la fenêtre
-        throw new UnsupportedOperationException("Fenêtre chaines présente lors d'un message NEW_CORPUS ???");
-      case MODIF_TEXTE:
-        fermerFenetre();
-        return;
-      case MODIF_VUE:
-        fermerFenetre();
-        return;
-      case MODIF_STRUCTURE:
-        fermerFenetre();
-        return;
-      case MODIF_ELEMENT:
-//        ElementEvent evtE = (ElementEvent) evt;
-//        if (evtE.getModif() != TypeModifElement.BORNES_UNITE) fermerFenetre();
-        fermerFenetre();
-        return;
-      case CORPUS_SAVED:
-          fermerFenetre();
-          return;
-      default:
-        throw new UnsupportedOperationException("Cas "+evt.getType()+" oublié dans un switch");
-    }
-  }
-
-  @Override
-  public void actionPerformed(ActionEvent evt) {
-    try {
-        panneauGraphique.setcouperparagraphe(activeCouperParagraphe.isSelected());
-      if (evt.getSource().equals(saisieTypeChaines)
-              ||evt.getSource().equals(saisieTypeUnites)) {
-        if (saisieTypeChaines.pasdeSelection()||saisieTypeUnites.pasdeSelection()) {
-          initVide();
-          return;
-        }
-        try {
-          init();
-        } catch (UnsupportedOperationException ex) {
-          GMessages.impossibiliteAction("Erreur de type : "+ex.getMessage());
-          initVide();
-          return;
-        }
-        return;
-      }
-      if (evt.getSource().equals(saisieChampAffiche)) {
-        if(!saisieTypeChaines.pasdeSelection()&&!saisieTypeUnites.pasdeSelection()){
-            if (saisieChampAffiche.pasdeSelection()) initCouleursNbElts();
-            else initCouleursChamp(saisieChampAffiche.getSelection());
-        }
-        return;
-      }
-    if (evt.getSource().equals(saisieChampAffiche1)) {
-        if(!saisieTypeChaines.pasdeSelection()&&!saisieTypeUnites.pasdeSelection()){
-            if (saisieChampAffiche1.pasdeSelection()) initFormesNbElts();
-            else initFormesChamp(saisieChampAffiche1.getSelection());
-        }
-        return;
-      }
-      if (evt.getSource().equals(saisieChampAffiche2)) {
-        if(!saisieTypeChaines.pasdeSelection()&&!saisieTypeUnites.pasdeSelection()){
-            if (saisieChampAffiche2.pasdeSelection()) initTaillesNbElts();
-            else initTaillesChamp(saisieChampAffiche2.getSelection());
-          }
-        return;
-      }
-      if (evt.getSource().equals(saisieChampAffiche3)) {
-        if(!saisieTypeChaines.pasdeSelection()&&!saisieTypeUnites.pasdeSelection()){
-            if (saisieChampAffiche3.pasdeSelection()) initSurTexteNbElts();
-            else initSurTexteChamp(saisieChampAffiche3.getSelection());
-          }
-        return;
-      }
-      if (evt.getSource().equals(saisieChampAffiche4)) {
-        if(!saisieTypeChaines.pasdeSelection()&&!saisieTypeUnites.pasdeSelection()){
-            if (saisieChampAffiche4.pasdeSelection()) initSousTexteNbElts();
-            else initSousTexteChamp(saisieChampAffiche4.getSelection());
-        }
-        return;
-      }
-      throw new UnsupportedOperationException("Evénement non prévu : "+evt.paramString());
-    } catch (Throwable ex) {
-      GMessages.erreurFatale(ex);
-    }
-  }
-  private void initVide() {
-    typeChaines = null;
-    typeUnites = null;
-    donneesChaines.initVide();
-    saisieChampAffiche.setModeleVide();
-    saisieChampAffiche1.setModeleVide();
-    saisieChampAffiche2.setModeleVide();
-    saisieChampAffiche3.setModeleVide();
-    saisieChampAffiche4.setModeleVide();
-    this.ngrammes.init();
-    legendeChampAfficheModele = new LegendeModeleTable(new String[]{"icone","nom du champ","frequence"},new LegendeLabel[0],new HashMap());
-    legendeChampAffiche.setModel(legendeChampAfficheModele);
-    legendeChampAfficheModele1 = new LegendeModeleTable(new String[]{"icone","nom du champ","frequence"},new LegendeLabel[0],new HashMap());
-    legendeChampAffiche1.setModel(legendeChampAfficheModele1);
-    legendeChampAfficheModele2 = new LegendeModeleTable(new String[]{"icone","nom du champ","frequence"},new LegendeLabel[0],new HashMap());
-    legendeChampAffiche2.setModel(legendeChampAfficheModele2);
-    legendeChampAfficheModele3 = new LegendeModeleTableTexte(new String[]{"Symbole","nom du champ","frequence"},new LegendeLabel[0],new HashMap());
-    legendeChampAffiche3.setModel(legendeChampAfficheModele3);
-    legendeChampAfficheModele4 = new LegendeModeleTableTexte(new String[]{"Symbole","nom du champ","frequence"},new LegendeLabel[0],new HashMap());
-    legendeChampAffiche4.setModel(legendeChampAfficheModele4);
-  }
-  private void init() throws UnsupportedOperationException {
-    typeChaines = saisieTypeChaines.getTypeSelection();
-    typeUnites = saisieTypeUnites.getTypeSelection();
-    donneesChaines.init(typeChaines, typeUnites, seuilsValsNbElts);
-    initCouleursNbElts();
-    initTaillesNbElts();
-    initFormesNbElts();
-    initSurTexteNbElts();
-    initSousTexteNbElts();
-    saisieChampAffiche.removeActionListener(this);
-    saisieChampAffiche.setModele(vue.getNomsChamps(Unite.class, typeUnites));
-    saisieChampAffiche.addActionListener(this);
-    saisieChampAffiche1.removeActionListener(this);
-    saisieChampAffiche1.setModele(vue.getNomsChamps(Unite.class, typeUnites));
-    saisieChampAffiche1.addActionListener(this);
-    saisieChampAffiche2.removeActionListener(this);
-    saisieChampAffiche2.setModele(vue.getNomsChamps(Unite.class, typeUnites));
-    saisieChampAffiche2.addActionListener(this);
-    saisieChampAffiche3.removeActionListener(this);
-    saisieChampAffiche3.setModele(vue.getNomsChamps(Unite.class, typeUnites));
-    saisieChampAffiche3.addActionListener(this);
-    saisieChampAffiche4.removeActionListener(this);
-    saisieChampAffiche4.setModele(vue.getNomsChamps(Unite.class, typeUnites));
-    saisieChampAffiche4.addActionListener(this);
-    Histogramme.updatePanel(histochaine,"Titre",donneesChaines,10,Color.BLUE,200,
-            "position de l'unité","Fréquence d'unités",vue);
-    this.ngrammes.setDonneesChaines(donneesChaines);
-    this.ngrammes.setTypeChaines(typeChaines);
-    this.ngrammes.setTypeUnites(typeUnites);
-    this.ngrammes.update();
-    
-    
-
-  }
-  private void initCouleursNbElts() {
-    HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt
-        (donneesChaines.getUnites(),typeUnites, labelsNbElements); 
-    donneesChaines.setChampAfficheNbElts(couleursNbElts);
-    legendeChampAfficheModele = new LegendeModeleTable(new String[]{"icone","nom du champ","frequence"},creerLegendesNbElements(),freq);
-    legendeChampAffiche.setModel(legendeChampAfficheModele);
-    legendeChampAffiche.getColumnModel().getColumn(0).setMaxWidth(colwidth);    
-    legendeChampAffiche.getColumnModel().getColumn(2).setMaxWidth(colwidth);
-    legendeChampAffiche.setRowHeight(colheight);
-  }
-
-  private void initTaillesNbElts() {
-    HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt
-        (donneesChaines.getUnites(),typeUnites, labelsNbElements);       
-    donneesChaines.setChampAfficheTailleNbElts(TaillesNbElts);
-    legendeChampAfficheModele2 = new LegendeModeleTable(new String[]{"icone","nom du champ","frequence"},creerLegendesTailleNbElements(),freq);
-    Histogramme.updatePanel(histochaine,"Titre",donneesChaines,10,Color.BLUE,200,
-            "position de l'unité","Fréquence d'unités",vue);
-    legendeChampAffiche2.setModel(legendeChampAfficheModele2);
-    legendeChampAffiche2.getColumnModel().getColumn(0).setMaxWidth(colwidth);    
-    legendeChampAffiche2.getColumnModel().getColumn(2).setMaxWidth(colwidth);
-    legendeChampAffiche2.setRowHeight(colheight);
-  }
-  private void initFormesNbElts() {
-    HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt
-        (donneesChaines.getUnites(),typeUnites, labelsNbElements);       
-    donneesChaines.setChampAfficheFormeNbElts(FormesNbElts);
-    legendeChampAfficheModele1 = new LegendeModeleTable(new String[]{"icone","nom du champ","frequence"},creerLegendesFormeNbElements(),freq);
-    legendeChampAffiche1.setModel(legendeChampAfficheModele1);
-    legendeChampAffiche1.getColumnModel().getColumn(0).setMaxWidth(colwidth);    
-    legendeChampAffiche1.getColumnModel().getColumn(2).setMaxWidth(colwidth);
-    legendeChampAffiche1.setRowHeight(colheight);
-  }
-  private void initSurTexteNbElts() {
-    HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt
-        (donneesChaines.getUnites(),typeUnites, labelsNbElements);       
-    donneesChaines.setChampAfficheSurTexteNbElts(TexteNbElts);
-    legendeChampAfficheModele3 = new LegendeModeleTableTexte(new String[]{"symbole","nom du champ","frequence"},creerLegendesSurTexteNbElements(),freq);
-    legendeChampAffiche3.setModel(legendeChampAfficheModele3);
-    legendeChampAffiche3.getColumnModel().getColumn(0).setMaxWidth(colwidth);    
-    legendeChampAffiche3.getColumnModel().getColumn(2).setMaxWidth(colwidth);
-  }
-    private void initSousTexteNbElts() {
-    HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt
-        (donneesChaines.getUnites(),typeUnites, labelsNbElements);       
-    donneesChaines.setChampAfficheSousTexteNbElts(TexteNbElts);
-    legendeChampAfficheModele4 = new LegendeModeleTableTexte(new String[]{"symbole","nom du champ","frequence"},creerLegendesSousTexteNbElements(),freq);
-    legendeChampAffiche4.setModel(legendeChampAfficheModele4);
-    legendeChampAffiche4.getColumnModel().getColumn(0).setMaxWidth(colwidth);    
-    legendeChampAffiche4.getColumnModel().getColumn(2).setMaxWidth(colwidth);
-  }
-  
-  private LegendeLabel[] creerLegendesNbElements() {
-    LegendeLabel[] legendes = new LegendeLabel[couleursNbElts.length];
-    for (int i = 0; i<legendes.length; i++)
-      legendes[i] = new LegendeLabel(labelsNbElements[i],
-              donneesChaines.isMasqueeValNbElements(i) ? null : couleursNbElts[i]);
-    return legendes;
-  }
-  private LegendeLabel[] creerLegendesFormeNbElements() {
-    LegendeLabel[] legendes = new LegendeLabel[FormesNbElts.length];
-    for (int i = 0; i<legendes.length; i++)
-      legendes[i] = new LegendeLabel(labelsNbElements[i]
-              ,Color.WHITE,1,(donneesChaines.isMasqueeValNbElements(i) ? -1 : FormesNbElts[i]),12,2);
-    return legendes;
-  }
-  private LegendeLabel[] creerLegendesTailleNbElements() {
-    LegendeLabel[] legendes = new LegendeLabel[TaillesNbElts.length];
-    for (int i = 0; i<legendes.length; i++)
-      legendes[i] = new LegendeLabel(labelsNbElements[i]
-              ,Color.WHITE,donneesChaines.isMasqueeValNbElements(i) ? -1 : TaillesNbElts[i],0,12,2);
-    return legendes;
-  }
-
-  private LegendeLabel[] creerLegendesSurTexteNbElements() {
-    LegendeLabel[] legendes = new LegendeLabel[TexteNbElts.length];
-    for (int i = 0; i<legendes.length; i++)
-      legendes[i] = new LegendeLabel(labelsNbElements[i]
-              ,donneesChaines.isMasqueeValNbElements(i) ? null : TexteNbElts[i]);
-    return legendes;
-  }
-    
-  private LegendeLabel[] creerLegendesSousTexteNbElements() {
-    LegendeLabel[] legendes = new LegendeLabel[TexteNbElts.length];
-    for (int i = 0; i<legendes.length; i++)
-      legendes[i] = new LegendeLabel(labelsNbElements[i]
-              ,donneesChaines.isMasqueeValNbElements(i) ? null : TexteNbElts[i]);
-    return legendes;
-  }
-  
-  
-  private void initCouleursChamp(String champ) {
-    valsAffichees = vue.getValeursChamp(Unite.class, typeUnites, champ);
-    HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp
-        (donneesChaines.getUnites(),typeUnites, champ,vue);
-    ChaineUtil.triFusionMap(valsAffichees,freq);
-    HashMap<String, Color> couleursValeursChamp = new HashMap<String, Color>();
-    for (int i = 0, nocolor = 0; i<valsAffichees.length; i++)
-      if (!donneesChaines.isMasqueeValChamp(champ, valsAffichees[i]))
-        couleursValeursChamp.put(valsAffichees[i], GVisu.getCouleur(nocolor++));
-    if (!donneesChaines.isMasqueeValNulleChamp(champ))
-      couleursValeursChamp.put("", GVisu.getCouleurSansValeur());
-    donneesChaines.setChampAffiche(champ, couleursValeursChamp);
-    legendeChampAfficheModele = new LegendeModeleTable(new String[]{"icone","nom du champ","frequence"},creerLegendesChamp(valsAffichees,
-            couleursValeursChamp),freq);
-    legendeChampAffiche.setModel(legendeChampAfficheModele);
-    legendeChampAffiche.getColumnModel().getColumn(0).setMaxWidth(colwidth);    
-    legendeChampAffiche.getColumnModel().getColumn(2).setMaxWidth(colwidth);
-    legendeChampAffiche.setRowHeight(colheight);
-  }
-  
-   private void initTaillesChamp(String champ) {
-    valsAffichees2 = vue.getValeursChamp(Unite.class, typeUnites, champ);
-    HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp
-        (donneesChaines.getUnites(),typeUnites, champ,vue);
-    ChaineUtil.triFusionMap(valsAffichees2,freq);
-    HashMap<String, Integer> TaillesValeursChamp = new HashMap<String, Integer>();
-    for (int i = 0, nocolor = 0; i<valsAffichees2.length; i++)
-      if (!donneesChaines.isMasqueeValChamp(champ, valsAffichees2[i]))
-        TaillesValeursChamp.put(valsAffichees2[i], GVisu.getTaille(nocolor++));
-    if (!donneesChaines.isMasqueeValNulleChamp(champ))
-      TaillesValeursChamp.put("", GVisu.getTailleSansValeur());
-    donneesChaines.setChampAfficheTaille(champ, TaillesValeursChamp);
-    legendeChampAfficheModele2 = new LegendeModeleTable(new String[]{"icone","nom du champ","frequence"},creerLegendesChampTaille(valsAffichees2,
-            TaillesValeursChamp),freq);    
-    Histogramme.updatePanel(histochaine,"Titre",donneesChaines,10,Color.BLUE,200,
-            "position de l'unité","Fréquence d'unités",vue);
-    legendeChampAffiche2.setModel(legendeChampAfficheModele2);
-    legendeChampAffiche2.getColumnModel().getColumn(0).setMaxWidth(colwidth);    
-    legendeChampAffiche2.getColumnModel().getColumn(2).setMaxWidth(colwidth);
-    legendeChampAffiche2.setRowHeight(colheight);
-  }
-   
-   private void initFormesChamp(String champ) {
-    valsAffichees1 = vue.getValeursChamp(Unite.class, typeUnites, champ);
-    HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp
-        (donneesChaines.getUnites(),typeUnites, champ,vue);
-    ChaineUtil.triFusionMap(valsAffichees1,freq);
-    HashMap<String, Integer> FormesValeursChamp = new HashMap<String, Integer>();
-    for (int i = 0, nocolor = 0; i<valsAffichees1.length; i++)
-      if (!donneesChaines.isMasqueeValChamp(champ, valsAffichees1[i]))
-        FormesValeursChamp.put(valsAffichees1[i], GVisu.getForme(nocolor++));
-    if (!donneesChaines.isMasqueeValNulleChamp(champ))
-      FormesValeursChamp.put("", GVisu.getFormeSansValeur());
-    donneesChaines.setChampAfficheForme(champ, FormesValeursChamp);
-       legendeChampAfficheModele1 = new LegendeModeleTable(new String[]{"icone","nom du champ","frequence"},creerLegendesChampForme(valsAffichees1,
-            FormesValeursChamp),freq);
-       legendeChampAffiche1.setModel(legendeChampAfficheModele1);
-    legendeChampAffiche1.getColumnModel().getColumn(0).setMaxWidth(colwidth);    
-    legendeChampAffiche1.getColumnModel().getColumn(2).setMaxWidth(colwidth);
-    legendeChampAffiche1.setRowHeight(colheight);
-  }
-   
-  private void initSurTexteChamp(String champ) {
-    valsAffichees3 = vue.getValeursChamp(Unite.class, typeUnites, champ);
-    HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp
-        (donneesChaines.getUnites(),typeUnites, champ,vue);
-    ChaineUtil.triFusionMap(valsAffichees3,freq);
-    HashMap<String, String> SurTexteValeursChamp = new HashMap<String, String>();
-    for (int i = 0, nocolor = 0; i<valsAffichees3.length; i++)
-      if (!donneesChaines.isMasqueeValChamp(champ, valsAffichees3[i]))
-        SurTexteValeursChamp.put(valsAffichees3[i],codeLegende.containsKey(champ) && 
-                codeLegende.get(champ).containsKey(valsAffichees3[i]) ? codeLegende.get(champ).get(valsAffichees3[i])
-                : GVisu.getTexte(nocolor++));
-    if (!donneesChaines.isMasqueeValNulleChamp(champ))
-      SurTexteValeursChamp.put("",codeLegende.containsKey(champ) && 
-                codeLegende.get(champ).containsKey("") ? codeLegende.get(champ).get("")
-                : GVisu.getTexteSansValeur());
-    donneesChaines.setChampAfficheSurTexte(champ, SurTexteValeursChamp);
-       legendeChampAfficheModele3 = new LegendeModeleTableTexte(new String[]{"symbole","nom du champ","frequence"},creerLegendesChampSurTexte(valsAffichees3,
-            SurTexteValeursChamp),freq);
-       legendeChampAffiche3.setModel(legendeChampAfficheModele3);
-    legendeChampAffiche3.getColumnModel().getColumn(0).setMaxWidth(colwidth);    
-    legendeChampAffiche3.getColumnModel().getColumn(2).setMaxWidth(colwidth);
-  }
-   
-  private void initSousTexteChamp(String champ) {
-    valsAffichees4 = vue.getValeursChamp(Unite.class, typeUnites, champ);
-    HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp
-        (donneesChaines.getUnites(),typeUnites, champ,vue);
-    ChaineUtil.triFusionMap(valsAffichees4,freq);
-    HashMap<String, String> SousTexteValeursChamp = new HashMap<String, String>();
-    for (int i = 0, nocolor = 0; i<valsAffichees4.length; i++)
-      if (!donneesChaines.isMasqueeValChamp(champ, valsAffichees4[i]))
-        SousTexteValeursChamp.put(valsAffichees4[i], codeLegende.containsKey(champ) && 
-                codeLegende.get(champ).containsKey(valsAffichees4[i]) ? codeLegende.get(champ).get(valsAffichees4[i])
-                : GVisu.getTexte(nocolor++));
-    if (!donneesChaines.isMasqueeValNulleChamp(champ))
-      SousTexteValeursChamp.put("", codeLegende.containsKey(champ) && 
-                codeLegende.get(champ).containsKey("") ? codeLegende.get(champ).get("")
-                : GVisu.getTexteSansValeur());
-    donneesChaines.setChampAfficheSousTexte(champ, SousTexteValeursChamp);
-       legendeChampAfficheModele4 = new LegendeModeleTableTexte(new String[]{"symbole","nom du champ","frequence"},creerLegendesChampSousTexte(valsAffichees4,
-            SousTexteValeursChamp),freq);
-       legendeChampAffiche4.setModel(legendeChampAfficheModele4);
-    legendeChampAffiche4.getColumnModel().getColumn(0).setMaxWidth(colwidth);    
-    legendeChampAffiche4.getColumnModel().getColumn(2).setMaxWidth(colwidth);
-  }
-  
-  
-  private LegendeLabel[] creerLegendesChamp(String[] valsAffichees,
-          HashMap<String, Color> couleursValeursChamp) {
-    LegendeLabel[] legendes = new LegendeLabel[valsAffichees.length+1];
-    for (int i = 0; i<valsAffichees.length; i++)
-      legendes[i] = new LegendeLabel(valsAffichees[i],
-              couleursValeursChamp.get(valsAffichees[i]));
-    legendes[valsAffichees.length] = new LegendeLabel("<aucune valeur>",
-            couleursValeursChamp.get(""));
-    return legendes;
-  }
-  
-  private LegendeLabel[] creerLegendesChampTaille(String[] valsAffichees,
-          HashMap<String, Integer> TaillesValeursChamp) {
-    LegendeLabel[] legendes = new LegendeLabel[valsAffichees.length+1];
-    for (int i = 0; i<valsAffichees.length; i++)
-      legendes[i] = new LegendeLabel(valsAffichees[i],Color.WHITE,
-              donneesChaines.isMasqueeValChamp(saisieChampAffiche2.getSelection(),
-                      valsAffichees[i]) ? -1 : (TaillesValeursChamp.get(valsAffichees[i])),0,12,2);
-    legendes[valsAffichees.length] = new LegendeLabel("<aucune valeur>",Color.WHITE,
-            donneesChaines.isMasqueeValNulleChamp(saisieChampAffiche2.getSelection()) ? -1 
-                    : (TaillesValeursChamp.get("")),0,6,2);
-    return legendes;
-  }
-  
-  private LegendeLabel[] creerLegendesChampForme(String[] valsAffichees,
-          HashMap<String, Integer> FormesValeursChamp) {
-    LegendeLabel[] legendes = new LegendeLabel[valsAffichees.length+1];
-    for (int i = 0; i<valsAffichees.length; i++)
-      legendes[i] = new LegendeLabel(valsAffichees[i],Color.WHITE,1,
-              donneesChaines.isMasqueeValChamp(saisieChampAffiche1.getSelection(),
-                      valsAffichees[i]) ? -1 : (FormesValeursChamp.get(valsAffichees[i])),12,2);
-    legendes[valsAffichees.length] = new LegendeLabel("<aucune valeur>",Color.WHITE,1,
-            donneesChaines.isMasqueeValNulleChamp(saisieChampAffiche1.getSelection()) ? -1 
-                    : (FormesValeursChamp.get("")),12,2);
-    return legendes;
-  }  
-  
-  private LegendeLabel[] creerLegendesChampSurTexte(String[] valsAffichees,
-          HashMap<String, String> SurTexteValeursChamp) {
-    LegendeLabel[] legendes = new LegendeLabel[valsAffichees.length+1];
-    for (int i = 0; i<valsAffichees.length; i++)
-      legendes[i] = new LegendeLabel(valsAffichees[i],
-              donneesChaines.isMasqueeValChamp(saisieChampAffiche3.getSelection(),
-                      valsAffichees[i]) ? "" : (SurTexteValeursChamp.get(valsAffichees[i])));
-    legendes[valsAffichees.length] = new LegendeLabel("<aucune valeur>",
-            donneesChaines.isMasqueeValNulleChamp(saisieChampAffiche3.getSelection()) ? "" 
-                    : (SurTexteValeursChamp.get("")));
-    return legendes;
-  }  
-  private LegendeLabel[] creerLegendesChampSousTexte(String[] valsAffichees,
-          HashMap<String, String> SousTexteValeursChamp) {
-    LegendeLabel[] legendes = new LegendeLabel[valsAffichees.length+1];
-    for (int i = 0; i<valsAffichees.length; i++)
-      legendes[i] = new LegendeLabel(valsAffichees[i],
-              donneesChaines.isMasqueeValChamp(saisieChampAffiche4.getSelection(),
-                      valsAffichees[i]) ? "" : (SousTexteValeursChamp.get(valsAffichees[i])));
-    legendes[valsAffichees.length] = new LegendeLabel("<aucune valeur>",
-            donneesChaines.isMasqueeValNulleChamp(saisieChampAffiche4.getSelection()) ? "" 
-                    : (SousTexteValeursChamp.get("")));
-    return legendes;
-  }  
- 
-  private void popupChampInit(final int index, final int champ) {  
-    final boolean masquee;
-    String[] vals;
-    Val0ComboBox zonedesaisie;
-    JPopupMenu popup;
-    switch(champ){
-        case 0 :
-            vals = valsAffichees;
-            zonedesaisie = saisieChampAffiche;
-            popup = popupChamp;
-            break;
-        case 1 :
-            vals = valsAffichees1;
-            zonedesaisie = saisieChampAffiche1;
-            popup = popupChamp1;            
-            break;
-        case 2 :
-            vals = valsAffichees2;
-            zonedesaisie = saisieChampAffiche2;
-            popup = popupChamp2;            
-            break;
-        case 3 :
-            vals = valsAffichees3;
-            zonedesaisie = saisieChampAffiche3;
-            popup = popupChamp3;            
-            break;
-        case 4 :
-            vals = valsAffichees4;
-            zonedesaisie = saisieChampAffiche4;
-            popup = popupChamp4;            
-            break;
-        default:
-            vals = new String[0];
-            zonedesaisie = new Val0ComboBox("Nombre de chaînons");
-            popup = new JPopupMenu();                 
-            break;
-    }
-    popup.removeAll();
-    if (zonedesaisie.pasdeSelection()) {
-      masquee = donneesChaines.isMasqueeValNbElements(index);
-      popup.add(new GAction(masquee ? "Montrer cette valeur" : 
-              "Masquer cette valeur") {
-        @Override
-        public void executer() {
-          modifierStatutValNbElements(masquee, index, false,champ);
-        }
-      });
-      popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : 
-              "Ne montrer que cette valeur") {
-        @Override
-        public void executer() {
-          modifierStatutValNbElements(masquee, index, true,champ);
-        }
-      });
-    } else if (index==vals.length) {
-      masquee = donneesChaines.isMasqueeValNulleChamp(zonedesaisie.getSelection());
-      popup.add(new GAction(masquee ? "Montrer cette valeur" : 
-              "Masquer cette valeur") {
-        @Override
-        public void executer() {
-          modifierStatutValNulleChamp(masquee, false,champ);
-        }
-      });
-     popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : 
-              "Ne montrer que cette valeur") {
-        @Override
-        public void executer() {
-          modifierStatutValNulleChamp(masquee, true,champ);
-        }
-      });
-     if(champ == 3 || champ == 4){
-        popup.add(new GAction("Changer le code de la légende") {
-           @Override
-           public void executer() {
-             changerCodeTexte(index,champ);
-           }
-         });         
-     }
-    } else {
-      masquee = donneesChaines.isMasqueeValChamp(zonedesaisie.getSelection(),
-              vals[index]);
-      popup.add(new GAction(masquee ? "Montrer cette valeur" : 
-              "Masquer cette valeur") {
-        @Override
-        public void executer() {
-          modifierStatutValChamp(masquee, index, false,champ);
-        }
-      });
-      popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : 
-              "Ne montrer que cette valeur") {
-        @Override
-        public void executer() {
-          modifierStatutValChamp(masquee, index, true,champ);
-        }
-      });
-     if(champ == 3 || champ == 4){
-        popup.add(new GAction("Changer le code de la légende") {
-           @Override
-           public void executer() {
-             changerCodeTexte(index,champ);
-           }
-         });         
-     }
-    }
-    
-  }
-  //il doit y avoir une saisie pour saisieChampAffiche3 ou pour saisieChampAffiche4
-  private void changerCodeTexte(int index, int noLegende){
-    JOptionPane saisieCode = new JOptionPane();
-    String ValAffichees;
-    Val0ComboBox saisiechampaffiche;
-    switch(noLegende){
-        case 3 :
-            saisiechampaffiche = saisieChampAffiche3;
-            ValAffichees = this.valsAffichees3[index];
-            break;
-        default :
-            saisiechampaffiche = saisieChampAffiche4;
-            ValAffichees = this.valsAffichees4[index];
-            break;
-    }
-    String code = saisieCode.showInputDialog(null, "Veuillez saisir un code légende d'au plus trois caractères", 
-            "Changer le code", JOptionPane.QUESTION_MESSAGE);
-    if(code!=null){
-        code = code.length() > 3 ? code.substring(0, 2) : code;
-        if(!codeLegende.containsKey(saisiechampaffiche.getSelection())){
-            codeLegende.put(saisiechampaffiche.getSelection(),new HashMap());
-        }
-        codeLegende.get(saisiechampaffiche.getSelection()).put(ValAffichees,code);
-        initSurTexteChamp(saisieChampAffiche3.getSelection());
-        initSousTexteChamp(saisieChampAffiche4.getSelection());
-    }
-  }
-  private void modifierStatutValChamp(boolean masquee, int index, boolean tous, int source) {
-      String[] vals;
-      Val0ComboBox zonedesaisie;
-      switch(source){
-          case 0:
-              vals = valsAffichees;
-              zonedesaisie = saisieChampAffiche;
-              break;
-          case 1:
-              vals = valsAffichees1;
-              zonedesaisie = saisieChampAffiche1;              
-              break;
-          case 2:
-              vals = valsAffichees2;
-              zonedesaisie = saisieChampAffiche2;                 
-              break;
-          case 3 :
-            vals = valsAffichees3;
-            zonedesaisie = saisieChampAffiche3;  
-            break;
-          case 4 :
-            vals = valsAffichees4;
-            zonedesaisie = saisieChampAffiche4;      
-            break;
-          default :
-              vals = new String[0];
-              zonedesaisie = new Val0ComboBox("Nombre de chaînons");                 
-              break;
-      }
-    if(!tous) donneesChaines.masquerValChamp(!masquee, 
-            zonedesaisie.getSelection(), vals[index]);
-    else if(masquee) donneesChaines.demasquerToutesValsChamp( 
-            zonedesaisie.getSelection());
-    else donneesChaines.masquerAutresValsChamp(typeUnites, 
-            zonedesaisie.getSelection(), vals[index]);
-    donneesChaines.modifMasqueVals(typeChaines, typeUnites);
-    if(saisieChampAffiche.pasdeSelection()){
-        initCouleursNbElts();
-    }
-    else{
-        initCouleursChamp(saisieChampAffiche.getSelection());
-    }
-    if(saisieChampAffiche1.pasdeSelection()){
-        initFormesNbElts();
-    }
-    else{
-        initFormesChamp(saisieChampAffiche1.getSelection());
-    }
-    if(saisieChampAffiche2.pasdeSelection()){
-        initTaillesNbElts();
-    }
-    else{
-        initTaillesChamp(saisieChampAffiche2.getSelection());
-    }
-    if(saisieChampAffiche3.pasdeSelection()){
-        initSurTexteNbElts();
-    }
-    else{
-        initSurTexteChamp(saisieChampAffiche3.getSelection());
-    }    
-    if(saisieChampAffiche4.pasdeSelection()){
-        initSousTexteNbElts();
-    }
-    else{
-        initSousTexteChamp(saisieChampAffiche4.getSelection());
-    }
-    
-    this.ngrammes.setDonneesChaines(donneesChaines);
-    this.ngrammes.setTypeChaines(typeChaines);
-    this.ngrammes.setTypeUnites(typeUnites);
-    this.ngrammes.update();
-  }
-  private void modifierStatutValNulleChamp(boolean masquee, boolean tous,int source) {
-      Val0ComboBox zonedesaisie;
-      switch(source){
-          case 0:
-              zonedesaisie = saisieChampAffiche;
-              break;
-          case 1:
-              zonedesaisie = saisieChampAffiche1;              
-              break;
-          case 2:
-              zonedesaisie = saisieChampAffiche2;                 
-              break;
-          case 3 :
-            zonedesaisie = saisieChampAffiche3;  
-            break;
-          case 4 :
-            zonedesaisie = saisieChampAffiche4;      
-            break;
-          default :
-              zonedesaisie = new Val0ComboBox("Nombre de chaînons");                 
-              break;
-      }      
-    if(!tous) donneesChaines.masquerValNulleChamp(!masquee, zonedesaisie.getSelection());
-   else if(masquee) donneesChaines.demasquerToutesValsChamp( 
-            zonedesaisie.getSelection());
-    else donneesChaines.masquerValsNonNullesChamp(typeUnites, 
-            zonedesaisie.getSelection());
-    donneesChaines.modifMasqueVals(typeChaines, typeUnites);
-    if(saisieChampAffiche.pasdeSelection()){
-        initCouleursNbElts();
-    }
-    else{
-        initCouleursChamp(saisieChampAffiche.getSelection());
-    }
-    if(saisieChampAffiche1.pasdeSelection()){
-        initFormesNbElts();
-    }
-    else{
-        initFormesChamp(saisieChampAffiche1.getSelection());
-    }
-    if(saisieChampAffiche2.pasdeSelection()){
-        initTaillesNbElts();
-    }
-    else{
-        initTaillesChamp(saisieChampAffiche2.getSelection());
-    }
-    if(saisieChampAffiche3.pasdeSelection()){
-        initSurTexteNbElts();
-    }
-    else{
-        initSurTexteChamp(saisieChampAffiche3.getSelection());
-    }    
-    if(saisieChampAffiche4.pasdeSelection()){
-        initSousTexteNbElts();
-    }
-    else{
-        initSousTexteChamp(saisieChampAffiche4.getSelection());
-    }
-//    initstat();
-    
-    this.ngrammes.setDonneesChaines(donneesChaines);
-    this.ngrammes.setTypeChaines(typeChaines);
-    this.ngrammes.setTypeUnites(typeUnites);
-    this.ngrammes.update();
-  }
-  private void modifierStatutValNbElements(boolean masquee, int index, boolean tous,int source) {
-      Val0ComboBox zonedesaisie;
-      switch(source){
-          case 0:
-              zonedesaisie = saisieChampAffiche;
-              break;
-          case 1:
-              zonedesaisie = saisieChampAffiche1;              
-              break;
-          case 2:
-              zonedesaisie = saisieChampAffiche2;                 
-              break;
-          case 3 :
-            zonedesaisie = saisieChampAffiche3;  
-            break;
-          case 4 :
-            zonedesaisie = saisieChampAffiche4;      
-            break;
-          default :
-              zonedesaisie = new Val0ComboBox("Nombre de chaînons");                 
-              break;
-      }            
-    if(!tous) donneesChaines.masquerValNbElements(!masquee, index);
-   else if(masquee) donneesChaines.demasquerToutesValsNbElts( 
-            zonedesaisie.getSelection());
-    else donneesChaines.masquerAutresValsNbElts( 
-            zonedesaisie.getSelection(), index);
-    donneesChaines.modifMasqueVals(typeChaines, typeUnites);
-    if(saisieChampAffiche.pasdeSelection()){
-        initCouleursNbElts();
-    }
-    else{
-        initCouleursChamp(saisieChampAffiche.getSelection());
-    }
-    if(saisieChampAffiche1.pasdeSelection()){
-        initFormesNbElts();
-    }
-    else{
-        initFormesChamp(saisieChampAffiche1.getSelection());
-    }
-    if(saisieChampAffiche2.pasdeSelection()){
-        initTaillesNbElts();
-    }
-    else{
-        initTaillesChamp(saisieChampAffiche2.getSelection());
-    }
-    if(saisieChampAffiche3.pasdeSelection()){
-        initSurTexteNbElts();
-    }
-    else{
-        initSurTexteChamp(saisieChampAffiche3.getSelection());
-    }    
-    if(saisieChampAffiche4.pasdeSelection()){
-        initSousTexteNbElts();
-    }
-    else{
-        initSousTexteChamp(saisieChampAffiche4.getSelection());
-    }
-//    initstat();
-    
-    this.ngrammes.setDonneesChaines(donneesChaines);
-    this.ngrammes.setTypeChaines(typeChaines);
-    this.ngrammes.setTypeUnites(typeUnites);
-    this.ngrammes.update();
-  }
-
-  
-  public JTable getLegende(int index){
-      JTable retour;
-      switch(index){
-          case 0 :
-              retour = this.legendeChampAffiche;
-              break;
-          case 1 :
-              retour = this.legendeChampAffiche1;
-              break;
-          case 2 :
-              retour = this.legendeChampAffiche2;
-              break;
-          case 3 : 
-              retour = this.legendeChampAffiche3;
-              break;
-          case 4 :
-              retour = this.legendeChampAffiche4;
-              break;
-          default :
-              retour = new JTable();
-              break;
-      }
-      return retour;
-  }
-  //retourne en format SVG la sélection
-  public String getSelection(int taillepolice, int x , int y, String police){
-      String retour = "";
-      if(saisieTypeChaines.pasdeSelection()){
-          retour = retour + "<text x=\""+x+"\" y=\""+(y) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Type de Schéma : aucun" + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      else{
-          retour = retour + "<text x=\""+x+"\" y=\""+(y) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Type de Schéma : " + saisieTypeChaines.getSelection() + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-                  
-      }
-      if(saisieTypeUnites.pasdeSelection()){
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 2 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Type d'Unités : aucun" + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      else{
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 2 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Type d'Unités : " + saisieTypeUnites.getSelection() + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      if(saisieChampAffiche.pasdeSelection()){
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 4 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Champ 1 : nombre de Chainons" + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      else{
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 4 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Champ 1 : " + saisieChampAffiche.getSelection() + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      if(saisieChampAffiche1.pasdeSelection()){
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 6 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Champ 2 : nombre de Chainons" + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      else{
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 6 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Champ 2 : " + saisieChampAffiche1.getSelection() + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      if(saisieChampAffiche2.pasdeSelection()){
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 8 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Champ 3 : nombre de Chainons" + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      else{
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 8 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Champ 3 : " + saisieChampAffiche2.getSelection() + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      if(saisieChampAffiche3.pasdeSelection()){
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 10 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Champ 4 : nombre de Chainons" + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      else{
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 10 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Champ 4 : " + saisieChampAffiche3.getSelection() + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      if(saisieChampAffiche4.pasdeSelection()){
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 12 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Champ 5 : nombre de Chainons" + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      else{
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 12 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Champ 5 : " + saisieChampAffiche4.getSelection() + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      return retour;
-  }
-  public void exporterAffichage(){
-      HashMap<String,Object> Choix = new HashMap();
-      HashMap<String,String> choixCommande = new HashMap();
-      
-      choixCommande.put("saisieTypeChaines",saisieTypeChaines.pasdeSelection() ? null : saisieTypeChaines.getSelection());
-      choixCommande.put("saisieTypeUnites",saisieTypeUnites.pasdeSelection() ? null : saisieTypeUnites.getSelection());
-      choixCommande.put("saisieTailleLigne",saisieTailleLigne.getSelectedItem().toString());
-      choixCommande.put("activeCouperParagraphe",activeCouperParagraphe.isSelected() ? "vrai" : "faux");
-      choixCommande.put("saisieChampAffiche",saisieChampAffiche.pasdeSelection() ? null : saisieChampAffiche.getSelection());
-      choixCommande.put("saisieChampAffiche1",saisieChampAffiche1.pasdeSelection() ? null : saisieChampAffiche1.getSelection());
-      choixCommande.put("saisieChampAffiche2",saisieChampAffiche2.pasdeSelection() ? null : saisieChampAffiche2.getSelection());
-      choixCommande.put("saisieChampAffiche3",saisieChampAffiche3.pasdeSelection() ? null : saisieChampAffiche3.getSelection());
-      choixCommande.put("saisieChampAffiche4",saisieChampAffiche4.pasdeSelection() ? null : saisieChampAffiche4.getSelection());
-
-      Choix.put("valmasquees",donneesChaines.getValsMasqueesChamp());
-      Choix.put("valNbmasquees",donneesChaines.getValsNbMasqueesChamp());
-      Choix.put("valNullemasquees",donneesChaines.getValsNulleMasqueesChamp());
-      Choix.put("codeLegende",this.codeLegende);
-      Choix.put("choixCommande1",choixCommande);
-      Choix.put("ngrammes",this.ngrammes.exporterAffichage());
-      Choix.put("nomFichier",Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC));
-      FichiersJava.enregistrerChaineSous(Choix);
-  }
-  public void importerAffichage(){
-      HashMap<String,Object> choix = FichiersJava.ouvrirChaineVue();
-      if(choix!=null && choix.containsKey("choixCommande1") &&
-              Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC).equals(choix.get("nomFichier"))){
-        HashMap<String,String> choixCommande = (HashMap<String,String>) choix.get("choixCommande1");
-        saisieTypeChaines.removeActionListener(this);
-        saisieTypeUnites.removeActionListener(this);
-        saisieTypeChaines.setSelectedItem(choixCommande.get("saisieTypeChaines"));
-        saisieTypeUnites.setSelectedItem(choixCommande.get("saisieTypeUnites"));
-        saisieTypeChaines.addActionListener(this);
-        saisieTypeUnites.addActionListener(this);
-        init();
-        //si on ne les paramètres d'affichage ont été enregistrés pour le même corpus
-        this.codeLegende = (HashMap<String,HashMap<String,String>>) choix.get("codeLegende");
-        donneesChaines.setValsMasqueesChamp((HashMap<String,HashSet<String>>) choix.get("valmasquees"));
-        donneesChaines.setValsNbMasqueesChamp((boolean[]) choix.get("valNbmasquees"));
-        donneesChaines.setValsNulleMasqueesChamp((HashSet<String>) choix.get("valNullemasquees"));
-        saisieTailleLigne.removeActionListener(this);
-        saisieChampAffiche.removeActionListener(this);
-        saisieChampAffiche1.removeActionListener(this);
-        saisieChampAffiche2.removeActionListener(this);
-        saisieChampAffiche3.removeActionListener(this);
-        saisieChampAffiche4.removeActionListener(this);
-        activeCouperParagraphe.setSelected(choixCommande.get("activeCouperParagraphe").equals("vrai"));
-        panneauGraphique.setcouperparagraphe(activeCouperParagraphe.isSelected());
-        saisieTailleLigne.setSelectedItem(choixCommande.get("saisieTailleLigne"));
-        int taille = saisieTailleLigne.getSelectedIndex()==0 ? Integer.MAX_VALUE :
-        Integer.parseInt((String)saisieTailleLigne.getSelectedItem());
-        panneauGraphique.setNbChainonsParLigne(taille);
-        if(choixCommande.get("saisieChampAffiche")!=null){
-          saisieChampAffiche.setSelectedItem(choixCommande.get("saisieChampAffiche"));
-        }
-        else{
-          saisieChampAffiche.effSelection();
-        }
-        if(choixCommande.get("saisieChampAffiche1")!=null){
-          saisieChampAffiche1.setSelectedItem(choixCommande.get("saisieChampAffiche1"));
-        }
-        else{
-          saisieChampAffiche1.effSelection();
-        }
-        if(choixCommande.get("saisieChampAffiche2")!=null){
-          saisieChampAffiche2.setSelectedItem(choixCommande.get("saisieChampAffiche2"));
-        }
-        else{
-          saisieChampAffiche2.effSelection();
-        }
-        if(choixCommande.get("saisieChampAffiche3")!=null){
-          saisieChampAffiche3.setSelectedItem(choixCommande.get("saisieChampAffiche3"));
-        }
-        else{
-          saisieChampAffiche3.effSelection();
-        }
-        if(choixCommande.get("saisieChampAffiche4")!=null){
-          saisieChampAffiche4.setSelectedItem(choixCommande.get("saisieChampAffiche4"));
-        }
-        else{
-          saisieChampAffiche4.effSelection();
-        }
-        saisieTailleLigne.addActionListener(this);
-        saisieChampAffiche.addActionListener(this);
-        saisieChampAffiche1.addActionListener(this);
-        saisieChampAffiche2.addActionListener(this);
-        saisieChampAffiche3.addActionListener(this);
-        saisieChampAffiche4.addActionListener(this);
-        donneesChaines.modifMasqueVals(typeChaines, typeUnites);
-
-          if(saisieChampAffiche.pasdeSelection()){
-              initCouleursNbElts();
-          }
-          else{
-              initCouleursChamp(saisieChampAffiche.getSelection());
-          }
-          if(saisieChampAffiche1.pasdeSelection()){
-              initFormesNbElts();
-          }
-          else{
-              initFormesChamp(saisieChampAffiche1.getSelection());
-          }
-          if(saisieChampAffiche2.pasdeSelection()){
-              initTaillesNbElts();
-          }
-          else{
-              initTaillesChamp(saisieChampAffiche2.getSelection());
-          }
-          if(saisieChampAffiche3.pasdeSelection()){
-              initSurTexteNbElts();
-          }
-          else{
-              initSurTexteChamp(saisieChampAffiche3.getSelection());
-          }    
-          if(saisieChampAffiche4.pasdeSelection()){
-              initSousTexteNbElts();
-          }
-          else{
-              initSousTexteChamp(saisieChampAffiche4.getSelection());
-          }
-        this.ngrammes.setDonneesChaines(donneesChaines);
-        this.ngrammes.setTypeChaines(typeChaines);
-        this.ngrammes.setTypeUnites(typeUnites);
-        this.ngrammes.importerAffichage((HashMap) choix.get("ngrammes"));
-          this.ngrammes.update();
-      }
-      else{
-          JOptionPane.showMessageDialog(null, "le fichier des paramètres d'affichage n'est pas destiné à cette fenêtre"
-                 + System.getProperty("line.separator") +
-                  "ou à ce corpus", "Erreur de lecture de fichier", JOptionPane.ERROR_MESSAGE);
-      }
-      
-      
-  }
-  
-  public ModeleChaines getDonneesChaines(){
-      return this.donneesChaines;
-  }
-  
-    public Object[][] donneesCSV(boolean[] champ){
-      ArrayList<Object[]> donnees = new ArrayList();
-      int nbchamp=0;
-      for(boolean tmp : champ){
-          if(tmp){
-              nbchamp = nbchamp + 1;
-          }
-      }
-      if(champ.length==5){
-              GChaines chaine = this.panneauGraphique;
-              Object[] titre = new Object[nbchamp+1];
-                  titre[0] = "unité";
-                  int compteurTitre=1;
-                  for(int  i = 0 ; i < champ.length ; i++){
-                      if(champ[i]){
-                          switch(i){
-                              case 0 :
-                                  titre[compteurTitre] = this.saisieChampAffiche.pasdeSelection() ? 
-                                          "Nombre de Chainons"
-                                          : this.saisieChampAffiche.getSelection();
-                                  break;
-                              case 1 :
-                                  titre[compteurTitre] = this.saisieChampAffiche1.pasdeSelection() ? 
-                                          "Nombre de Chainons"
-                                          : this.saisieChampAffiche1.getSelection();
-                                  break;
-                              case 2 :
-                                  titre[compteurTitre] = this.saisieChampAffiche2.pasdeSelection() ? 
-                                          "Nombre de Chainons"
-                                          : this.saisieChampAffiche2.getSelection();
-                                  break;
-                              case 3 :
-                                  titre[compteurTitre] = this.saisieChampAffiche3.pasdeSelection() ? 
-                                          "Nombre de Chainons"
-                                          : this.saisieChampAffiche3.getSelection();
-                                  break;
-                              case 4 :
-                                  titre[compteurTitre] = this.saisieChampAffiche4.pasdeSelection() ? 
-                                          "Nombre de Chainons"
-                                          : this.saisieChampAffiche4.getSelection();
-                                  break;
-                          }
-                          compteurTitre = compteurTitre + 1;
-                      }
-                  }
-                  donnees.add(titre);
-              for(int  j = 0 ; j < chaine.chainons.length ; j++){
-                  ModeleChaines.Chainon unit = chaine.chainons[j];
-                  Object[] row = new Object[nbchamp+1];
-                  row[0] = unit.texte;
-                  int compteur=1;
-                  for(int  i = 0 ; i < champ.length ; i++){
-                      if(champ[i]){
-                          switch(i){
-                              case 0 :
-                                  row[compteur] = this.saisieChampAffiche.pasdeSelection() ? 
-                                          labelsNbElements[donneesChaines.calculerValNbElements(unit.nbEltsChaine)]
-                                          : vue.getValeurChamp(unit.unite, this.saisieChampAffiche.getSelection());
-                                  break;
-                              case 1 :
-                                  row[compteur] = this.saisieChampAffiche1.pasdeSelection() ? 
-                                          labelsNbElements[donneesChaines.calculerValNbElements(unit.nbEltsChaine)]
-                                          : vue.getValeurChamp(unit.unite, this.saisieChampAffiche1.getSelection());
-                                  break;
-                              case 2 :
-                                  row[compteur] = this.saisieChampAffiche2.pasdeSelection() ? 
-                                          labelsNbElements[donneesChaines.calculerValNbElements(unit.nbEltsChaine)]
-                                          : vue.getValeurChamp(unit.unite, this.saisieChampAffiche2.getSelection());
-                                  break;
-                              case 3 :
-                                  row[compteur] = this.saisieChampAffiche3.pasdeSelection() ? 
-                                          labelsNbElements[donneesChaines.calculerValNbElements(unit.nbEltsChaine)]
-                                          : vue.getValeurChamp(unit.unite, this.saisieChampAffiche3.getSelection());
-                                  break;
-                              case 4 :
-                                  row[compteur] = this.saisieChampAffiche4.pasdeSelection() ? 
-                                          labelsNbElements[donneesChaines.calculerValNbElements(unit.nbEltsChaine)]
-                                          : vue.getValeurChamp(unit.unite, this.saisieChampAffiche4.getSelection());
-                                  break;
-                          }
-                          compteur = compteur + 1;
-                      }
-                  }
-                  donnees.add(row);
-              }
-       }
-      return donnees.toArray(new Object[donnees.size()][nbchamp]);
-  }
+	
+	private static final int[] seuilsValsNbElts = { 3, 10 };
+	
+	private static final Color[] couleursNbElts = { Color.WHITE, GVisu.getCouleurSansValeur(),
+			GVisu.getCouleur(0), GVisu.getCouleur(3), GVisu.getCouleur(1) };
+	
+	private static final int[] TaillesNbElts = { 1, 2, 3, 4, 4 };
+	
+	private static final int[] FormesNbElts = { 0, 1, 2, 3, 4 };
+	
+	private static final String[] TexteNbElts = { "00", "01", "02", "03", "04" };
+	
+	private final int colwidth = 50;
+	
+	private final int colheight = 30;
+	
+	private static final String[] labelsNbElements = {
+			"pas de chaîne associée",
+			"chaîne d'un seul chaînon",
+			"chaîne de 2-" + Integer.toString(seuilsValsNbElts[0]) + " chaînons",
+			"chaîne de " + Integer.toString(seuilsValsNbElts[0] + 1) + "-"
+					+ Integer.toString(seuilsValsNbElts[1]) + "  chaînons",
+			"chaîne de plus de " + Integer.toString(seuilsValsNbElts[1]) + " chaînons"
+	};
+	
+	private final Vue vue;
+	
+	private final ModeleChaines donneesChaines;
+	
+	private String typeChaines;
+	
+	private String typeUnites;
+	
+	private String[] valsAffichees;
+	
+	private String[] valsAffichees1;
+	
+	private String[] valsAffichees2;
+	
+	private String[] valsAffichees3;
+	
+	private String[] valsAffichees4;
+	
+	private HashMap<String, HashMap<String, String>> codeLegende = new HashMap();
+	
+	private final TypeComboBox saisieTypeChaines;
+	
+	private final TypeComboBox saisieTypeUnites;
+	
+	private Val0ComboBox saisieChampAffiche;
+	
+	private Val0ComboBox saisieChampAffiche1;
+	
+	private Val0ComboBox saisieChampAffiche2;
+	
+	private Val0ComboBox saisieChampAffiche3;
+	
+	private Val0ComboBox saisieChampAffiche4;
+	
+	private final JComboBox saisieTailleLigne;
+	
+	private ChartPanel histochaine;
+	
+	/* private JComboBox saisieTailleLigne; */
+	private JTable legendeChampAffiche;
+	
+	private LegendeModeleTable legendeChampAfficheModele;
+	
+	private JTable legendeChampAffiche1;
+	
+	private LegendeModeleTable legendeChampAfficheModele1;
+	
+	private JTable legendeChampAffiche2;
+	
+	private LegendeModeleTable legendeChampAfficheModele2;
+	
+	private JTable legendeChampAffiche3;
+	
+	private LegendeModeleTableTexte legendeChampAfficheModele3;
+	
+	private JTable legendeChampAffiche4;
+	
+	private LegendeModeleTableTexte legendeChampAfficheModele4;
+	
+	private JPopupMenu popupChamp = new JPopupMenu();
+	
+	private JPopupMenu popupChamp1 = new JPopupMenu();
+	
+	private JPopupMenu popupChamp2 = new JPopupMenu();
+	
+	private JPopupMenu popupChamp3 = new JPopupMenu();
+	
+	private JPopupMenu popupChamp4 = new JPopupMenu();
+	
+	private final GChaines panneauGraphique;// affichage graphique des chaines
+	
+	private final PanneauEditeur panneauEditeur;
+	
+	private final JCheckBox activeCouperParagraphe;
+	
+	private NgrammesPanel ngrammes;
+	
+	private final JSplitPane split2;
+	
+	private final JMenuBar menuBar = new JMenuBar();
+	
+	public VisuChaines(Container fenetre, Vue vue, PanneauEditeur pEditeur) {
+		super("Analyse des suites d'occurences");
+		Point pos = new Point(fenetre.getX() + 20, fenetre.getY() + 20);
+		Dimension dim = new Dimension(fenetre.getWidth(), fenetre.getHeight());
+		setLocation(pos);
+		setSize(dim);
+		this.vue = vue;
+		vue.addEventListener(this);
+		this.panneauEditeur = pEditeur;
+		saisieTypeChaines = new TypeComboBox(Schema.class);
+		saisieTypeChaines.setModele(vue.getTypesSchemasAVoir());
+		saisieTypeChaines.addActionListener(this);
+		saisieTypeUnites = new TypeComboBox(Unite.class);
+		saisieTypeUnites.setModele(vue.getTypesUnitesAVoir());
+		saisieTypeUnites.addActionListener(this);
+		saisieTailleLigne = new JComboBox(
+				new String[] { "<tous>", "10", "20", "30", "40", "50" });
+		saisieTailleLigne.setEditable(true);
+		saisieTailleLigne.setMaximumSize(getPreferredSize());
+		saisieTailleLigne.addActionListener(this);
+		saisieChampAffiche = new Val0ComboBox("Nombre de chaînons");
+		saisieChampAffiche.addActionListener(this);
+		saisieChampAffiche1 = new Val0ComboBox("Nombre de chaînons");
+		saisieChampAffiche1.addActionListener(this);
+		saisieChampAffiche2 = new Val0ComboBox("Nombre de chaînons");
+		saisieChampAffiche2.addActionListener(this);
+		saisieChampAffiche3 = new Val0ComboBox("Nombre de chaînons");
+		saisieChampAffiche3.addActionListener(this);
+		saisieChampAffiche4 = new Val0ComboBox("Nombre de chaînons");
+		saisieChampAffiche4.addActionListener(this);
+		// Panneau de présentation du graphique
+		JPanel pGraphique = new JPanel(new BorderLayout());
+		Box commandes = Box.createVerticalBox();
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Chaînes : "));
+		commandes.add(saisieTypeChaines);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Unites : "));
+		commandes.add(saisieTypeUnites);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Nb de chainons par ligne : "));
+		commandes.add(saisieTailleLigne);
+		commandes.add(Box.createVerticalGlue());
+		activeCouperParagraphe = new JCheckBox("Ne pas couper ls paragraphes");
+		commandes.add(activeCouperParagraphe);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Champ à afficher : "));
+		commandes.add(saisieChampAffiche);
+		commandes.add(Box.createVerticalGlue());
+		
+		
+		legendeChampAfficheModele = new LegendeModeleTable();
+		legendeChampAffiche = new JTable(new Object[0][0], new String[] { "Icone", "Valeur de champ", "Fréquence" });
+		legendeChampAffiche.addMouseListener(new MouseAdapter() {
+			
+			@Override
+			public void mousePressed(MouseEvent e) {// on gère les évènements de la souris
+				check(e);
+			}
+			
+			@Override
+			public void mouseReleased(MouseEvent e) {
+				check(e);
+			}
+			
+			public void check(MouseEvent e) {
+				if (e.isPopupTrigger()) {// if the event shows the menu
+					popupChampInit(legendeChampAffiche.rowAtPoint(e.getPoint()), 0);
+					popupChamp.show(legendeChampAffiche, e.getX(), e.getY());
+				}
+			}
+		});
+		
+		commandes.add(legendeChampAffiche);
+		
+		
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Champ à afficher : "));
+		commandes.add(saisieChampAffiche1);
+		commandes.add(Box.createVerticalGlue());
+		
+		legendeChampAfficheModele1 = new LegendeModeleTable();
+		legendeChampAffiche1 = new JTable(legendeChampAfficheModele1);
+		legendeChampAffiche1.addMouseListener(new MouseAdapter() {
+			
+			@Override
+			public void mousePressed(MouseEvent e) {// on gère les évènements de la souris
+				check(e);
+			}
+			
+			@Override
+			public void mouseReleased(MouseEvent e) {
+				check(e);
+			}
+			
+			public void check(MouseEvent e) {
+				if (e.isPopupTrigger()) {// if the event shows the menu
+					popupChampInit(legendeChampAffiche1.rowAtPoint(e.getPoint()), 1);
+					popupChamp1.show(legendeChampAffiche1, e.getX(), e.getY());
+				}
+			}
+		});
+		
+		commandes.add(legendeChampAffiche1);
+		
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Champ à afficher : "));
+		commandes.add(saisieChampAffiche2);
+		commandes.add(Box.createVerticalGlue());
+		
+		legendeChampAfficheModele2 = new LegendeModeleTable();
+		legendeChampAffiche2 = new JTable(legendeChampAfficheModele2);
+		legendeChampAffiche2.addMouseListener(new MouseAdapter() {
+			
+			@Override
+			public void mousePressed(MouseEvent e) {// on gère les évènements de la souris
+				check(e);
+			}
+			
+			@Override
+			public void mouseReleased(MouseEvent e) {
+				check(e);
+			}
+			
+			public void check(MouseEvent e) {
+				if (e.isPopupTrigger()) {// if the event shows the menu
+					popupChampInit(legendeChampAffiche2.rowAtPoint(e.getPoint()), 2);
+					popupChamp2.show(legendeChampAffiche2, e.getX(), e.getY());
+				}
+			}
+		});
+		commandes.add(legendeChampAffiche2);
+		
+		
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Champ à afficher : "));
+		commandes.add(saisieChampAffiche3);
+		commandes.add(Box.createVerticalGlue());
+		
+		legendeChampAfficheModele3 = new LegendeModeleTableTexte();
+		legendeChampAffiche3 = new JTable(legendeChampAfficheModele3);
+		legendeChampAffiche3.addMouseListener(new MouseAdapter() {
+			
+			@Override
+			public void mousePressed(MouseEvent e) {// on gère les évènements de la souris
+				check(e);
+			}
+			
+			@Override
+			public void mouseReleased(MouseEvent e) {
+				check(e);
+			}
+			
+			public void check(MouseEvent e) {
+				if (e.isPopupTrigger()) {// if the event shows the menu
+					popupChampInit(legendeChampAffiche3.rowAtPoint(e.getPoint()), 3);
+					popupChamp3.show(legendeChampAffiche3, e.getX(), e.getY());
+				}
+			}
+		});
+		commandes.add(legendeChampAffiche3);
+		
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Champ à afficher : "));
+		commandes.add(saisieChampAffiche4);
+		commandes.add(Box.createVerticalGlue());
+		
+		legendeChampAfficheModele4 = new LegendeModeleTableTexte();
+		legendeChampAffiche4 = new JTable(legendeChampAfficheModele4);
+		legendeChampAffiche4.addMouseListener(new MouseAdapter() {
+			
+			@Override
+			public void mousePressed(MouseEvent e) {// on gère les évènements de la souris
+				check(e);
+			}
+			
+			@Override
+			public void mouseReleased(MouseEvent e) {
+				check(e);
+			}
+			
+			public void check(MouseEvent e) {
+				if (e.isPopupTrigger()) {// if the event shows the menu
+					popupChampInit(legendeChampAffiche4.rowAtPoint(e.getPoint()), 4);
+					popupChamp4.show(legendeChampAffiche4, e.getX(), e.getY());
+				}
+			}
+		});
+		commandes.add(legendeChampAffiche4);
+		JScrollPane scrollLegende = new JScrollPane(commandes);
+		
+		panneauGraphique = new GChaines(this);
+		panneauGraphique.autoriserSousTexte(true);
+		
+		donneesChaines = new ModeleChaines(vue, panneauGraphique);
+		JScrollPane scrollGraphique = new JScrollPane(panneauGraphique);
+		histochaine = Histogramme.histogrammeFactory();
+		this.ngrammes = new NgrammesPanel(vue);
+		JScrollPane scrollstatresultat = new JScrollPane(this.ngrammes);
+		JScrollPane scrollHistogramme = new JScrollPane(histochaine);
+		split2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollHistogramme, scrollstatresultat);
+		JSplitPane split3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollGraphique, split2);
+		pGraphique.add(split3, BorderLayout.CENTER);
+		saisieTypeChaines.setAlignmentX(0);
+		saisieTypeUnites.setAlignmentX(0);
+		saisieTailleLigne.setAlignmentX(0);
+		saisieChampAffiche.setAlignmentX(0);
+		saisieChampAffiche1.setAlignmentX(0);
+		saisieChampAffiche2.setAlignmentX(0);
+		saisieChampAffiche3.setAlignmentX(0);
+		saisieChampAffiche4.setAlignmentX(0);
+		legendeChampAffiche.setAlignmentX(0);
+		legendeChampAffiche1.setAlignmentX(0);
+		legendeChampAffiche2.setAlignmentX(0);
+		legendeChampAffiche3.setAlignmentX(0);
+		legendeChampAffiche4.setAlignmentX(0);
+		
+		
+		
+		JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scrollLegende, pGraphique);
+		getContentPane().add(split);
+		setVisible(true);
+		split.setDividerLocation(1. / 3);
+		split2.setDividerLocation(1. / 2);
+		split3.setDividerLocation(1. / 3);
+		setJMenuBar(menuBar);
+		JMenu corpusMenu = new JMenu("Paramètres d'affichage");
+		menuBar.add(corpusMenu);
+		corpusMenu.add(new GAction("Reprendre un affichage") {
+			
+			@Override
+			public void executer() {
+				importerAffichage();
+			}
+		});
+		corpusMenu.add(new GAction("Sauver les paramètres d'affichage") {
+			
+			@Override
+			public void executer() {
+				exporterAffichage();
+			}
+		});
+		JMenu csvMenu = new JMenu("Exporter les données");
+		menuBar.add(csvMenu);
+		final VisuChaines visu = this;
+		final Vue vues = this.vue;
+		final PanneauEditeur pEditeurs = pEditeur;
+		csvMenu.add(new GAction("Exporter les données de filtrage") {
+			
+			@Override
+			public void executer() {
+				new ExportCSV(getContentPane(), vues, pEditeurs, visu);
+			}
+		});
+		csvMenu.add(new GAction("Exporter le tableau statistique") {
+			
+			@Override
+			public void executer() {
+				ExportCSV.exporterCSV(ngrammes.donneesCSV());
+			}
+		});
+		csvMenu.add(new GAction("Exporter les fréquences pour le champ1") {
+			
+			@Override
+			public void executer() {
+				Object[][] donneesCSV = new Object[legendeChampAffiche.getRowCount() + 1][2];
+				for (int i = 0; i < legendeChampAffiche.getRowCount(); i++) {
+					donneesCSV[i + 1][0] = legendeChampAffiche.getValueAt(i, 1);
+					donneesCSV[i + 1][1] = legendeChampAffiche.getValueAt(i, 2) == null ? "0"
+							: legendeChampAffiche.getValueAt(i, 2);
+				}
+				donneesCSV[0][1] = "frequence";
+				donneesCSV[0][0] = saisieChampAffiche.pasdeSelection() ? "Nombre de Chainons"
+						: saisieChampAffiche.getSelection();
+				ExportCSV.exporterCSV(donneesCSV);
+			}
+		});
+		csvMenu.add(new GAction("Exporter les fréquences pour le champ2") {
+			
+			@Override
+			public void executer() {
+				Object[][] donneesCSV = new Object[legendeChampAffiche1.getRowCount() + 1][2];
+				for (int i = 0; i < legendeChampAffiche1.getRowCount(); i++) {
+					donneesCSV[i + 1][0] = legendeChampAffiche1.getValueAt(i, 1);
+					donneesCSV[i + 1][1] = legendeChampAffiche1.getValueAt(i, 2) == null ? "0"
+							: legendeChampAffiche1.getValueAt(i, 2);
+				}
+				donneesCSV[0][1] = "frequence";
+				donneesCSV[0][0] = saisieChampAffiche1.pasdeSelection() ? "Nombre de Chainons"
+						: saisieChampAffiche1.getSelection();
+				ExportCSV.exporterCSV(donneesCSV);
+			}
+		});
+		csvMenu.add(new GAction("Exporter les fréquences pour le champ3") {
+			
+			@Override
+			public void executer() {
+				Object[][] donneesCSV = new Object[legendeChampAffiche2.getRowCount() + 1][2];
+				for (int i = 0; i < legendeChampAffiche2.getRowCount(); i++) {
+					donneesCSV[i + 1][0] = legendeChampAffiche2.getValueAt(i, 1);
+					donneesCSV[i + 1][1] = legendeChampAffiche2.getValueAt(i, 2) == null ? "0"
+							: legendeChampAffiche2.getValueAt(i, 2);
+				}
+				donneesCSV[0][1] = "frequence";
+				donneesCSV[0][0] = saisieChampAffiche2.pasdeSelection() ? "Nombre de Chainons"
+						: saisieChampAffiche2.getSelection();
+				ExportCSV.exporterCSV(donneesCSV);
+			}
+		});
+		csvMenu.add(new GAction("Exporter les fréquences pour le champ4") {
+			
+			@Override
+			public void executer() {
+				Object[][] donneesCSV = new Object[legendeChampAffiche3.getRowCount() + 1][2];
+				for (int i = 0; i < legendeChampAffiche3.getRowCount(); i++) {
+					donneesCSV[i + 1][0] = legendeChampAffiche3.getValueAt(i, 1);
+					donneesCSV[i + 1][1] = legendeChampAffiche3.getValueAt(i, 2) == null ? "0"
+							: legendeChampAffiche3.getValueAt(i, 2);
+				}
+				donneesCSV[0][1] = "frequence";
+				donneesCSV[0][0] = saisieChampAffiche3.pasdeSelection() ? "Nombre de Chainons"
+						: saisieChampAffiche3.getSelection();
+				ExportCSV.exporterCSV(donneesCSV);
+			}
+		});
+		csvMenu.add(new GAction("Exporter les fréquences pour le champ5") {
+			
+			@Override
+			public void executer() {
+				Object[][] donneesCSV = new Object[legendeChampAffiche4.getRowCount() + 1][2];
+				for (int i = 0; i < legendeChampAffiche4.getRowCount(); i++) {
+					donneesCSV[i + 1][0] = legendeChampAffiche4.getValueAt(i, 1);
+					donneesCSV[i + 1][1] = legendeChampAffiche4.getValueAt(i, 2) == null ? "0"
+							: legendeChampAffiche4.getValueAt(i, 2);
+				}
+				donneesCSV[0][1] = "frequence";
+				donneesCSV[0][0] = saisieChampAffiche4.pasdeSelection() ? "Nombre de Chainons"
+						: saisieChampAffiche4.getSelection();
+				ExportCSV.exporterCSV(donneesCSV);
+			}
+		});
+		
+		// Fermeture de la fenêtre
+		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+		addWindowListener(new WindowAdapter() {
+			
+			@Override
+			public void windowClosing(WindowEvent evt) {
+				fermerFenetre();
+			}
+		});
+		// Initialisation
+		saisieTailleLigne.removeActionListener(this);
+		saisieTailleLigne.setSelectedIndex(0);
+		saisieTailleLigne.addActionListener(this);
+		saisieTailleLigne.setMaximumSize(getPreferredSize());
+		if (saisieTypeChaines.nbItems() == 1) {
+			saisieTypeChaines.setSelection(0);
+			if (saisieTypeUnites.nbItems() == 1) saisieTypeUnites.setSelection(0);
+			else saisieTypeUnites.effSelection();
+		}
+		else {
+			saisieTypeChaines.effSelection();
+			saisieTypeUnites.effSelection();
+		}
+	}
+	
+	private void fermerFenetre() {
+		vue.removeEventListener(this);
+		dispose();
+	}
+	
+	@Override
+	public void traiterEvent(Message evt) { // très grossier : à améliorer
+		switch (evt.getType()) {
+			case CLEAR_CORPUS:
+				fermerFenetre();
+				return;
+			case NEW_CORPUS:  // impossible en principe : CLEAR_CORPUS a détruit la fenêtre
+				throw new UnsupportedOperationException("Fenêtre chaines présente lors d'un message NEW_CORPUS ???");
+			case MODIF_TEXTE:
+				fermerFenetre();
+				return;
+			case MODIF_VUE:
+				fermerFenetre();
+				return;
+			case MODIF_STRUCTURE:
+				fermerFenetre();
+				return;
+			case MODIF_ELEMENT:
+				// ElementEvent evtE = (ElementEvent) evt;
+				// if (evtE.getModif() != TypeModifElement.BORNES_UNITE) fermerFenetre();
+				fermerFenetre();
+				return;
+			case CORPUS_SAVED:
+				fermerFenetre();
+				return;
+			default:
+				throw new UnsupportedOperationException("Cas " + evt.getType() + " oublié dans un switch");
+		}
+	}
+	
+	@Override
+	public void actionPerformed(ActionEvent evt) {
+		try {
+			panneauGraphique.setcouperparagraphe(activeCouperParagraphe.isSelected());
+			if (evt.getSource().equals(saisieTypeChaines)
+					|| evt.getSource().equals(saisieTypeUnites)) {
+				if (saisieTypeChaines.pasdeSelection() || saisieTypeUnites.pasdeSelection()) {
+					initVide();
+					return;
+				}
+				try {
+					init();
+				}
+				catch (UnsupportedOperationException ex) {
+					GMessages.impossibiliteAction("Erreur de type : " + ex.getMessage());
+					initVide();
+					return;
+				}
+				return;
+			}
+			if (evt.getSource().equals(saisieChampAffiche)) {
+				if (!saisieTypeChaines.pasdeSelection() && !saisieTypeUnites.pasdeSelection()) {
+					if (saisieChampAffiche.pasdeSelection()) initCouleursNbElts();
+					else initCouleursChamp(saisieChampAffiche.getSelection());
+				}
+				return;
+			}
+			if (evt.getSource().equals(saisieChampAffiche1)) {
+				if (!saisieTypeChaines.pasdeSelection() && !saisieTypeUnites.pasdeSelection()) {
+					if (saisieChampAffiche1.pasdeSelection()) initFormesNbElts();
+					else initFormesChamp(saisieChampAffiche1.getSelection());
+				}
+				return;
+			}
+			if (evt.getSource().equals(saisieChampAffiche2)) {
+				if (!saisieTypeChaines.pasdeSelection() && !saisieTypeUnites.pasdeSelection()) {
+					if (saisieChampAffiche2.pasdeSelection()) initTaillesNbElts();
+					else initTaillesChamp(saisieChampAffiche2.getSelection());
+				}
+				return;
+			}
+			if (evt.getSource().equals(saisieChampAffiche3)) {
+				if (!saisieTypeChaines.pasdeSelection() && !saisieTypeUnites.pasdeSelection()) {
+					if (saisieChampAffiche3.pasdeSelection()) initSurTexteNbElts();
+					else initSurTexteChamp(saisieChampAffiche3.getSelection());
+				}
+				return;
+			}
+			if (evt.getSource().equals(saisieChampAffiche4)) {
+				if (!saisieTypeChaines.pasdeSelection() && !saisieTypeUnites.pasdeSelection()) {
+					if (saisieChampAffiche4.pasdeSelection()) initSousTexteNbElts();
+					else initSousTexteChamp(saisieChampAffiche4.getSelection());
+				}
+				return;
+			}
+			throw new UnsupportedOperationException("Evénement non prévu : " + evt.paramString());
+		}
+		catch (Throwable ex) {
+			GMessages.erreurFatale(ex);
+		}
+	}
+	
+	private void initVide() {
+		typeChaines = null;
+		typeUnites = null;
+		donneesChaines.initVide();
+		saisieChampAffiche.setModeleVide();
+		saisieChampAffiche1.setModeleVide();
+		saisieChampAffiche2.setModeleVide();
+		saisieChampAffiche3.setModeleVide();
+		saisieChampAffiche4.setModeleVide();
+		this.ngrammes.init();
+		legendeChampAfficheModele = new LegendeModeleTable(new String[] { "icone", "nom du champ", "frequence" }, new LegendeLabel[0], new HashMap());
+		legendeChampAffiche.setModel(legendeChampAfficheModele);
+		legendeChampAfficheModele1 = new LegendeModeleTable(new String[] { "icone", "nom du champ", "frequence" }, new LegendeLabel[0], new HashMap());
+		legendeChampAffiche1.setModel(legendeChampAfficheModele1);
+		legendeChampAfficheModele2 = new LegendeModeleTable(new String[] { "icone", "nom du champ", "frequence" }, new LegendeLabel[0], new HashMap());
+		legendeChampAffiche2.setModel(legendeChampAfficheModele2);
+		legendeChampAfficheModele3 = new LegendeModeleTableTexte(new String[] { "Symbole", "nom du champ", "frequence" }, new LegendeLabel[0], new HashMap());
+		legendeChampAffiche3.setModel(legendeChampAfficheModele3);
+		legendeChampAfficheModele4 = new LegendeModeleTableTexte(new String[] { "Symbole", "nom du champ", "frequence" }, new LegendeLabel[0], new HashMap());
+		legendeChampAffiche4.setModel(legendeChampAfficheModele4);
+	}
+	
+	private void init() throws UnsupportedOperationException {
+		typeChaines = saisieTypeChaines.getTypeSelection();
+		typeUnites = saisieTypeUnites.getTypeSelection();
+		donneesChaines.init(typeChaines, typeUnites, seuilsValsNbElts);
+		initCouleursNbElts();
+		initTaillesNbElts();
+		initFormesNbElts();
+		initSurTexteNbElts();
+		initSousTexteNbElts();
+		saisieChampAffiche.removeActionListener(this);
+		saisieChampAffiche.setModele(vue.getNomsChamps(Unite.class, typeUnites));
+		saisieChampAffiche.addActionListener(this);
+		saisieChampAffiche1.removeActionListener(this);
+		saisieChampAffiche1.setModele(vue.getNomsChamps(Unite.class, typeUnites));
+		saisieChampAffiche1.addActionListener(this);
+		saisieChampAffiche2.removeActionListener(this);
+		saisieChampAffiche2.setModele(vue.getNomsChamps(Unite.class, typeUnites));
+		saisieChampAffiche2.addActionListener(this);
+		saisieChampAffiche3.removeActionListener(this);
+		saisieChampAffiche3.setModele(vue.getNomsChamps(Unite.class, typeUnites));
+		saisieChampAffiche3.addActionListener(this);
+		saisieChampAffiche4.removeActionListener(this);
+		saisieChampAffiche4.setModele(vue.getNomsChamps(Unite.class, typeUnites));
+		saisieChampAffiche4.addActionListener(this);
+		Histogramme.updatePanel(histochaine, "Titre", donneesChaines, 10, Color.BLUE, 200,
+				"position de l'unité", "Fréquence d'unités", vue);
+		this.ngrammes.setDonneesChaines(donneesChaines);
+		this.ngrammes.setTypeChaines(typeChaines);
+		this.ngrammes.setTypeUnites(typeUnites);
+		this.ngrammes.update();
+		
+		
+		
+	}
+	
+	private void initCouleursNbElts() {
+		HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt(donneesChaines.getUnites(), typeUnites, labelsNbElements);
+		donneesChaines.setChampAfficheNbElts(couleursNbElts);
+		legendeChampAfficheModele = new LegendeModeleTable(new String[] { "icone", "nom du champ", "frequence" }, creerLegendesNbElements(), freq);
+		legendeChampAffiche.setModel(legendeChampAfficheModele);
+		legendeChampAffiche.getColumnModel().getColumn(0).setMaxWidth(colwidth);
+		legendeChampAffiche.getColumnModel().getColumn(2).setMaxWidth(colwidth);
+		legendeChampAffiche.setRowHeight(colheight);
+	}
+	
+	private void initTaillesNbElts() {
+		HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt(donneesChaines.getUnites(), typeUnites, labelsNbElements);
+		donneesChaines.setChampAfficheTailleNbElts(TaillesNbElts);
+		legendeChampAfficheModele2 = new LegendeModeleTable(new String[] { "icone", "nom du champ", "frequence" }, creerLegendesTailleNbElements(), freq);
+		Histogramme.updatePanel(histochaine, "Titre", donneesChaines, 10, Color.BLUE, 200,
+				"position de l'unité", "Fréquence d'unités", vue);
+		legendeChampAffiche2.setModel(legendeChampAfficheModele2);
+		legendeChampAffiche2.getColumnModel().getColumn(0).setMaxWidth(colwidth);
+		legendeChampAffiche2.getColumnModel().getColumn(2).setMaxWidth(colwidth);
+		legendeChampAffiche2.setRowHeight(colheight);
+	}
+	
+	private void initFormesNbElts() {
+		HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt(donneesChaines.getUnites(), typeUnites, labelsNbElements);
+		donneesChaines.setChampAfficheFormeNbElts(FormesNbElts);
+		legendeChampAfficheModele1 = new LegendeModeleTable(new String[] { "icone", "nom du champ", "frequence" }, creerLegendesFormeNbElements(), freq);
+		legendeChampAffiche1.setModel(legendeChampAfficheModele1);
+		legendeChampAffiche1.getColumnModel().getColumn(0).setMaxWidth(colwidth);
+		legendeChampAffiche1.getColumnModel().getColumn(2).setMaxWidth(colwidth);
+		legendeChampAffiche1.setRowHeight(colheight);
+	}
+	
+	private void initSurTexteNbElts() {
+		HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt(donneesChaines.getUnites(), typeUnites, labelsNbElements);
+		donneesChaines.setChampAfficheSurTexteNbElts(TexteNbElts);
+		legendeChampAfficheModele3 = new LegendeModeleTableTexte(new String[] { "symbole", "nom du champ", "frequence" }, creerLegendesSurTexteNbElements(), freq);
+		legendeChampAffiche3.setModel(legendeChampAfficheModele3);
+		legendeChampAffiche3.getColumnModel().getColumn(0).setMaxWidth(colwidth);
+		legendeChampAffiche3.getColumnModel().getColumn(2).setMaxWidth(colwidth);
+	}
+	
+	private void initSousTexteNbElts() {
+		HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt(donneesChaines.getUnites(), typeUnites, labelsNbElements);
+		donneesChaines.setChampAfficheSousTexteNbElts(TexteNbElts);
+		legendeChampAfficheModele4 = new LegendeModeleTableTexte(new String[] { "symbole", "nom du champ", "frequence" }, creerLegendesSousTexteNbElements(), freq);
+		legendeChampAffiche4.setModel(legendeChampAfficheModele4);
+		legendeChampAffiche4.getColumnModel().getColumn(0).setMaxWidth(colwidth);
+		legendeChampAffiche4.getColumnModel().getColumn(2).setMaxWidth(colwidth);
+	}
+	
+	private LegendeLabel[] creerLegendesNbElements() {
+		LegendeLabel[] legendes = new LegendeLabel[couleursNbElts.length];
+		for (int i = 0; i < legendes.length; i++)
+			legendes[i] = new LegendeLabel(labelsNbElements[i],
+					donneesChaines.isMasqueeValNbElements(i) ? null : couleursNbElts[i]);
+		return legendes;
+	}
+	
+	private LegendeLabel[] creerLegendesFormeNbElements() {
+		LegendeLabel[] legendes = new LegendeLabel[FormesNbElts.length];
+		for (int i = 0; i < legendes.length; i++)
+			legendes[i] = new LegendeLabel(labelsNbElements[i], Color.WHITE, 1, (donneesChaines.isMasqueeValNbElements(i) ? -1 : FormesNbElts[i]), 12, 2);
+		return legendes;
+	}
+	
+	private LegendeLabel[] creerLegendesTailleNbElements() {
+		LegendeLabel[] legendes = new LegendeLabel[TaillesNbElts.length];
+		for (int i = 0; i < legendes.length; i++)
+			legendes[i] = new LegendeLabel(labelsNbElements[i], Color.WHITE, donneesChaines.isMasqueeValNbElements(i) ? -1 : TaillesNbElts[i], 0, 12, 2);
+		return legendes;
+	}
+	
+	private LegendeLabel[] creerLegendesSurTexteNbElements() {
+		LegendeLabel[] legendes = new LegendeLabel[TexteNbElts.length];
+		for (int i = 0; i < legendes.length; i++)
+			legendes[i] = new LegendeLabel(labelsNbElements[i], donneesChaines.isMasqueeValNbElements(i) ? null : TexteNbElts[i]);
+		return legendes;
+	}
+	
+	private LegendeLabel[] creerLegendesSousTexteNbElements() {
+		LegendeLabel[] legendes = new LegendeLabel[TexteNbElts.length];
+		for (int i = 0; i < legendes.length; i++)
+			legendes[i] = new LegendeLabel(labelsNbElements[i], donneesChaines.isMasqueeValNbElements(i) ? null : TexteNbElts[i]);
+		return legendes;
+	}
+	
+	
+	private void initCouleursChamp(String champ) {
+		valsAffichees = vue.getValeursChamp(Unite.class, typeUnites, champ);
+		HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp(donneesChaines.getUnites(), typeUnites, champ, vue);
+		ChaineUtil.triFusionMap(valsAffichees, freq);
+		HashMap<String, Color> couleursValeursChamp = new HashMap<>();
+		for (int i = 0, nocolor = 0; i < valsAffichees.length; i++)
+			if (!donneesChaines.isMasqueeValChamp(champ, valsAffichees[i]))
+				couleursValeursChamp.put(valsAffichees[i], GVisu.getCouleur(nocolor++));
+		if (!donneesChaines.isMasqueeValNulleChamp(champ))
+			couleursValeursChamp.put("", GVisu.getCouleurSansValeur());
+		donneesChaines.setChampAffiche(champ, couleursValeursChamp);
+		legendeChampAfficheModele = new LegendeModeleTable(new String[] { "icone", "nom du champ", "frequence" }, creerLegendesChamp(valsAffichees,
+				couleursValeursChamp), freq);
+		legendeChampAffiche.setModel(legendeChampAfficheModele);
+		legendeChampAffiche.getColumnModel().getColumn(0).setMaxWidth(colwidth);
+		legendeChampAffiche.getColumnModel().getColumn(2).setMaxWidth(colwidth);
+		legendeChampAffiche.setRowHeight(colheight);
+	}
+	
+	private void initTaillesChamp(String champ) {
+		valsAffichees2 = vue.getValeursChamp(Unite.class, typeUnites, champ);
+		HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp(donneesChaines.getUnites(), typeUnites, champ, vue);
+		ChaineUtil.triFusionMap(valsAffichees2, freq);
+		HashMap<String, Integer> TaillesValeursChamp = new HashMap<>();
+		for (int i = 0, nocolor = 0; i < valsAffichees2.length; i++)
+			if (!donneesChaines.isMasqueeValChamp(champ, valsAffichees2[i]))
+				TaillesValeursChamp.put(valsAffichees2[i], GVisu.getTaille(nocolor++));
+		if (!donneesChaines.isMasqueeValNulleChamp(champ))
+			TaillesValeursChamp.put("", GVisu.getTailleSansValeur());
+		donneesChaines.setChampAfficheTaille(champ, TaillesValeursChamp);
+		legendeChampAfficheModele2 = new LegendeModeleTable(new String[] { "icone", "nom du champ", "frequence" }, creerLegendesChampTaille(valsAffichees2,
+				TaillesValeursChamp), freq);
+		Histogramme.updatePanel(histochaine, "Titre", donneesChaines, 10, Color.BLUE, 200,
+				"position de l'unité", "Fréquence d'unités", vue);
+		legendeChampAffiche2.setModel(legendeChampAfficheModele2);
+		legendeChampAffiche2.getColumnModel().getColumn(0).setMaxWidth(colwidth);
+		legendeChampAffiche2.getColumnModel().getColumn(2).setMaxWidth(colwidth);
+		legendeChampAffiche2.setRowHeight(colheight);
+	}
+	
+	private void initFormesChamp(String champ) {
+		valsAffichees1 = vue.getValeursChamp(Unite.class, typeUnites, champ);
+		HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp(donneesChaines.getUnites(), typeUnites, champ, vue);
+		ChaineUtil.triFusionMap(valsAffichees1, freq);
+		HashMap<String, Integer> FormesValeursChamp = new HashMap<>();
+		for (int i = 0, nocolor = 0; i < valsAffichees1.length; i++)
+			if (!donneesChaines.isMasqueeValChamp(champ, valsAffichees1[i]))
+				FormesValeursChamp.put(valsAffichees1[i], GVisu.getForme(nocolor++));
+		if (!donneesChaines.isMasqueeValNulleChamp(champ))
+			FormesValeursChamp.put("", GVisu.getFormeSansValeur());
+		donneesChaines.setChampAfficheForme(champ, FormesValeursChamp);
+		legendeChampAfficheModele1 = new LegendeModeleTable(new String[] { "icone", "nom du champ", "frequence" }, creerLegendesChampForme(valsAffichees1,
+				FormesValeursChamp), freq);
+		legendeChampAffiche1.setModel(legendeChampAfficheModele1);
+		legendeChampAffiche1.getColumnModel().getColumn(0).setMaxWidth(colwidth);
+		legendeChampAffiche1.getColumnModel().getColumn(2).setMaxWidth(colwidth);
+		legendeChampAffiche1.setRowHeight(colheight);
+	}
+	
+	private void initSurTexteChamp(String champ) {
+		valsAffichees3 = vue.getValeursChamp(Unite.class, typeUnites, champ);
+		HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp(donneesChaines.getUnites(), typeUnites, champ, vue);
+		ChaineUtil.triFusionMap(valsAffichees3, freq);
+		HashMap<String, String> SurTexteValeursChamp = new HashMap<>();
+		for (int i = 0, nocolor = 0; i < valsAffichees3.length; i++)
+			if (!donneesChaines.isMasqueeValChamp(champ, valsAffichees3[i]))
+				SurTexteValeursChamp.put(valsAffichees3[i], codeLegende.containsKey(champ) &&
+						codeLegende.get(champ).containsKey(valsAffichees3[i]) ? codeLegende.get(champ).get(valsAffichees3[i])
+								: GVisu.getTexte(nocolor++));
+		if (!donneesChaines.isMasqueeValNulleChamp(champ))
+			SurTexteValeursChamp.put("", codeLegende.containsKey(champ) &&
+					codeLegende.get(champ).containsKey("") ? codeLegende.get(champ).get("")
+							: GVisu.getTexteSansValeur());
+		donneesChaines.setChampAfficheSurTexte(champ, SurTexteValeursChamp);
+		legendeChampAfficheModele3 = new LegendeModeleTableTexte(new String[] { "symbole", "nom du champ", "frequence" }, creerLegendesChampSurTexte(valsAffichees3,
+				SurTexteValeursChamp), freq);
+		legendeChampAffiche3.setModel(legendeChampAfficheModele3);
+		legendeChampAffiche3.getColumnModel().getColumn(0).setMaxWidth(colwidth);
+		legendeChampAffiche3.getColumnModel().getColumn(2).setMaxWidth(colwidth);
+	}
+	
+	private void initSousTexteChamp(String champ) {
+		valsAffichees4 = vue.getValeursChamp(Unite.class, typeUnites, champ);
+		HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp(donneesChaines.getUnites(), typeUnites, champ, vue);
+		ChaineUtil.triFusionMap(valsAffichees4, freq);
+		HashMap<String, String> SousTexteValeursChamp = new HashMap<>();
+		for (int i = 0, nocolor = 0; i < valsAffichees4.length; i++)
+			if (!donneesChaines.isMasqueeValChamp(champ, valsAffichees4[i]))
+				SousTexteValeursChamp.put(valsAffichees4[i], codeLegende.containsKey(champ) &&
+						codeLegende.get(champ).containsKey(valsAffichees4[i]) ? codeLegende.get(champ).get(valsAffichees4[i])
+								: GVisu.getTexte(nocolor++));
+		if (!donneesChaines.isMasqueeValNulleChamp(champ))
+			SousTexteValeursChamp.put("", codeLegende.containsKey(champ) &&
+					codeLegende.get(champ).containsKey("") ? codeLegende.get(champ).get("")
+							: GVisu.getTexteSansValeur());
+		donneesChaines.setChampAfficheSousTexte(champ, SousTexteValeursChamp);
+		legendeChampAfficheModele4 = new LegendeModeleTableTexte(new String[] { "symbole", "nom du champ", "frequence" }, creerLegendesChampSousTexte(valsAffichees4,
+				SousTexteValeursChamp), freq);
+		legendeChampAffiche4.setModel(legendeChampAfficheModele4);
+		legendeChampAffiche4.getColumnModel().getColumn(0).setMaxWidth(colwidth);
+		legendeChampAffiche4.getColumnModel().getColumn(2).setMaxWidth(colwidth);
+	}
+	
+	
+	private LegendeLabel[] creerLegendesChamp(String[] valsAffichees,
+			HashMap<String, Color> couleursValeursChamp) {
+		LegendeLabel[] legendes = new LegendeLabel[valsAffichees.length + 1];
+		for (int i = 0; i < valsAffichees.length; i++)
+			legendes[i] = new LegendeLabel(valsAffichees[i],
+					couleursValeursChamp.get(valsAffichees[i]));
+		legendes[valsAffichees.length] = new LegendeLabel("<aucune valeur>",
+				couleursValeursChamp.get(""));
+		return legendes;
+	}
+	
+	private LegendeLabel[] creerLegendesChampTaille(String[] valsAffichees,
+			HashMap<String, Integer> TaillesValeursChamp) {
+		LegendeLabel[] legendes = new LegendeLabel[valsAffichees.length + 1];
+		for (int i = 0; i < valsAffichees.length; i++)
+			legendes[i] = new LegendeLabel(valsAffichees[i], Color.WHITE,
+					donneesChaines.isMasqueeValChamp(saisieChampAffiche2.getSelection(),
+							valsAffichees[i]) ? -1 : (TaillesValeursChamp.get(valsAffichees[i])), 0, 12, 2);
+		legendes[valsAffichees.length] = new LegendeLabel("<aucune valeur>", Color.WHITE,
+				donneesChaines.isMasqueeValNulleChamp(saisieChampAffiche2.getSelection()) ? -1
+						: (TaillesValeursChamp.get("")), 0, 6, 2);
+		return legendes;
+	}
+	
+	private LegendeLabel[] creerLegendesChampForme(String[] valsAffichees,
+			HashMap<String, Integer> FormesValeursChamp) {
+		LegendeLabel[] legendes = new LegendeLabel[valsAffichees.length + 1];
+		for (int i = 0; i < valsAffichees.length; i++)
+			legendes[i] = new LegendeLabel(valsAffichees[i], Color.WHITE, 1,
+					donneesChaines.isMasqueeValChamp(saisieChampAffiche1.getSelection(),
+							valsAffichees[i]) ? -1 : (FormesValeursChamp.get(valsAffichees[i])), 12, 2);
+		legendes[valsAffichees.length] = new LegendeLabel("<aucune valeur>", Color.WHITE, 1,
+				donneesChaines.isMasqueeValNulleChamp(saisieChampAffiche1.getSelection()) ? -1
+						: (FormesValeursChamp.get("")), 12, 2);
+		return legendes;
+	}
+	
+	private LegendeLabel[] creerLegendesChampSurTexte(String[] valsAffichees,
+			HashMap<String, String> SurTexteValeursChamp) {
+		LegendeLabel[] legendes = new LegendeLabel[valsAffichees.length + 1];
+		for (int i = 0; i < valsAffichees.length; i++)
+			legendes[i] = new LegendeLabel(valsAffichees[i],
+					donneesChaines.isMasqueeValChamp(saisieChampAffiche3.getSelection(),
+							valsAffichees[i]) ? "" : (SurTexteValeursChamp.get(valsAffichees[i])));
+		legendes[valsAffichees.length] = new LegendeLabel("<aucune valeur>",
+				donneesChaines.isMasqueeValNulleChamp(saisieChampAffiche3.getSelection()) ? ""
+						: (SurTexteValeursChamp.get("")));
+		return legendes;
+	}
+	
+	private LegendeLabel[] creerLegendesChampSousTexte(String[] valsAffichees,
+			HashMap<String, String> SousTexteValeursChamp) {
+		LegendeLabel[] legendes = new LegendeLabel[valsAffichees.length + 1];
+		for (int i = 0; i < valsAffichees.length; i++)
+			legendes[i] = new LegendeLabel(valsAffichees[i],
+					donneesChaines.isMasqueeValChamp(saisieChampAffiche4.getSelection(),
+							valsAffichees[i]) ? "" : (SousTexteValeursChamp.get(valsAffichees[i])));
+		legendes[valsAffichees.length] = new LegendeLabel("<aucune valeur>",
+				donneesChaines.isMasqueeValNulleChamp(saisieChampAffiche4.getSelection()) ? ""
+						: (SousTexteValeursChamp.get("")));
+		return legendes;
+	}
+	
+	private void popupChampInit(final int index, final int champ) {
+		final boolean masquee;
+		String[] vals;
+		Val0ComboBox zonedesaisie;
+		JPopupMenu popup;
+		switch (champ) {
+			case 0:
+				vals = valsAffichees;
+				zonedesaisie = saisieChampAffiche;
+				popup = popupChamp;
+				break;
+			case 1:
+				vals = valsAffichees1;
+				zonedesaisie = saisieChampAffiche1;
+				popup = popupChamp1;
+				break;
+			case 2:
+				vals = valsAffichees2;
+				zonedesaisie = saisieChampAffiche2;
+				popup = popupChamp2;
+				break;
+			case 3:
+				vals = valsAffichees3;
+				zonedesaisie = saisieChampAffiche3;
+				popup = popupChamp3;
+				break;
+			case 4:
+				vals = valsAffichees4;
+				zonedesaisie = saisieChampAffiche4;
+				popup = popupChamp4;
+				break;
+			default:
+				vals = new String[0];
+				zonedesaisie = new Val0ComboBox("Nombre de chaînons");
+				popup = new JPopupMenu();
+				break;
+		}
+		popup.removeAll();
+		if (zonedesaisie.pasdeSelection()) {
+			masquee = donneesChaines.isMasqueeValNbElements(index);
+			popup.add(new GAction(masquee ? "Montrer cette valeur" : "Masquer cette valeur") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValNbElements(masquee, index, false, champ);
+				}
+			});
+			popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : "Ne montrer que cette valeur") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValNbElements(masquee, index, true, champ);
+				}
+			});
+		}
+		else if (index == vals.length) {
+			masquee = donneesChaines.isMasqueeValNulleChamp(zonedesaisie.getSelection());
+			popup.add(new GAction(masquee ? "Montrer cette valeur" : "Masquer cette valeur") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValNulleChamp(masquee, false, champ);
+				}
+			});
+			popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : "Ne montrer que cette valeur") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValNulleChamp(masquee, true, champ);
+				}
+			});
+			if (champ == 3 || champ == 4) {
+				popup.add(new GAction("Changer le code de la légende") {
+					
+					@Override
+					public void executer() {
+						changerCodeTexte(index, champ);
+					}
+				});
+			}
+		}
+		else {
+			masquee = donneesChaines.isMasqueeValChamp(zonedesaisie.getSelection(),
+					vals[index]);
+			popup.add(new GAction(masquee ? "Montrer cette valeur" : "Masquer cette valeur") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValChamp(masquee, index, false, champ);
+				}
+			});
+			popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : "Ne montrer que cette valeur") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValChamp(masquee, index, true, champ);
+				}
+			});
+			if (champ == 3 || champ == 4) {
+				popup.add(new GAction("Changer le code de la légende") {
+					
+					@Override
+					public void executer() {
+						changerCodeTexte(index, champ);
+					}
+				});
+			}
+		}
+		
+	}
+	
+	// il doit y avoir une saisie pour saisieChampAffiche3 ou pour saisieChampAffiche4
+	private void changerCodeTexte(int index, int noLegende) {
+		JOptionPane saisieCode = new JOptionPane();
+		String ValAffichees;
+		Val0ComboBox saisiechampaffiche;
+		switch (noLegende) {
+			case 3:
+				saisiechampaffiche = saisieChampAffiche3;
+				ValAffichees = this.valsAffichees3[index];
+				break;
+			default:
+				saisiechampaffiche = saisieChampAffiche4;
+				ValAffichees = this.valsAffichees4[index];
+				break;
+		}
+		String code = saisieCode.showInputDialog(null, "Veuillez saisir un code légende d'au plus trois caractères",
+				"Changer le code", JOptionPane.QUESTION_MESSAGE);
+		if (code != null) {
+			code = code.length() > 3 ? code.substring(0, 2) : code;
+			if (!codeLegende.containsKey(saisiechampaffiche.getSelection())) {
+				codeLegende.put(saisiechampaffiche.getSelection(), new HashMap());
+			}
+			codeLegende.get(saisiechampaffiche.getSelection()).put(ValAffichees, code);
+			initSurTexteChamp(saisieChampAffiche3.getSelection());
+			initSousTexteChamp(saisieChampAffiche4.getSelection());
+		}
+	}
+	
+	private void modifierStatutValChamp(boolean masquee, int index, boolean tous, int source) {
+		String[] vals;
+		Val0ComboBox zonedesaisie;
+		switch (source) {
+			case 0:
+				vals = valsAffichees;
+				zonedesaisie = saisieChampAffiche;
+				break;
+			case 1:
+				vals = valsAffichees1;
+				zonedesaisie = saisieChampAffiche1;
+				break;
+			case 2:
+				vals = valsAffichees2;
+				zonedesaisie = saisieChampAffiche2;
+				break;
+			case 3:
+				vals = valsAffichees3;
+				zonedesaisie = saisieChampAffiche3;
+				break;
+			case 4:
+				vals = valsAffichees4;
+				zonedesaisie = saisieChampAffiche4;
+				break;
+			default:
+				vals = new String[0];
+				zonedesaisie = new Val0ComboBox("Nombre de chaînons");
+				break;
+		}
+		if (!tous) donneesChaines.masquerValChamp(!masquee,
+				zonedesaisie.getSelection(), vals[index]);
+		else if (masquee) donneesChaines.demasquerToutesValsChamp(
+				zonedesaisie.getSelection());
+		else donneesChaines.masquerAutresValsChamp(typeUnites,
+				zonedesaisie.getSelection(), vals[index]);
+		donneesChaines.modifMasqueVals(typeChaines, typeUnites);
+		if (saisieChampAffiche.pasdeSelection()) {
+			initCouleursNbElts();
+		}
+		else {
+			initCouleursChamp(saisieChampAffiche.getSelection());
+		}
+		if (saisieChampAffiche1.pasdeSelection()) {
+			initFormesNbElts();
+		}
+		else {
+			initFormesChamp(saisieChampAffiche1.getSelection());
+		}
+		if (saisieChampAffiche2.pasdeSelection()) {
+			initTaillesNbElts();
+		}
+		else {
+			initTaillesChamp(saisieChampAffiche2.getSelection());
+		}
+		if (saisieChampAffiche3.pasdeSelection()) {
+			initSurTexteNbElts();
+		}
+		else {
+			initSurTexteChamp(saisieChampAffiche3.getSelection());
+		}
+		if (saisieChampAffiche4.pasdeSelection()) {
+			initSousTexteNbElts();
+		}
+		else {
+			initSousTexteChamp(saisieChampAffiche4.getSelection());
+		}
+		
+		this.ngrammes.setDonneesChaines(donneesChaines);
+		this.ngrammes.setTypeChaines(typeChaines);
+		this.ngrammes.setTypeUnites(typeUnites);
+		this.ngrammes.update();
+	}
+	
+	private void modifierStatutValNulleChamp(boolean masquee, boolean tous, int source) {
+		Val0ComboBox zonedesaisie;
+		switch (source) {
+			case 0:
+				zonedesaisie = saisieChampAffiche;
+				break;
+			case 1:
+				zonedesaisie = saisieChampAffiche1;
+				break;
+			case 2:
+				zonedesaisie = saisieChampAffiche2;
+				break;
+			case 3:
+				zonedesaisie = saisieChampAffiche3;
+				break;
+			case 4:
+				zonedesaisie = saisieChampAffiche4;
+				break;
+			default:
+				zonedesaisie = new Val0ComboBox("Nombre de chaînons");
+				break;
+		}
+		if (!tous) donneesChaines.masquerValNulleChamp(!masquee, zonedesaisie.getSelection());
+		else if (masquee) donneesChaines.demasquerToutesValsChamp(
+				zonedesaisie.getSelection());
+		else donneesChaines.masquerValsNonNullesChamp(typeUnites,
+				zonedesaisie.getSelection());
+		donneesChaines.modifMasqueVals(typeChaines, typeUnites);
+		if (saisieChampAffiche.pasdeSelection()) {
+			initCouleursNbElts();
+		}
+		else {
+			initCouleursChamp(saisieChampAffiche.getSelection());
+		}
+		if (saisieChampAffiche1.pasdeSelection()) {
+			initFormesNbElts();
+		}
+		else {
+			initFormesChamp(saisieChampAffiche1.getSelection());
+		}
+		if (saisieChampAffiche2.pasdeSelection()) {
+			initTaillesNbElts();
+		}
+		else {
+			initTaillesChamp(saisieChampAffiche2.getSelection());
+		}
+		if (saisieChampAffiche3.pasdeSelection()) {
+			initSurTexteNbElts();
+		}
+		else {
+			initSurTexteChamp(saisieChampAffiche3.getSelection());
+		}
+		if (saisieChampAffiche4.pasdeSelection()) {
+			initSousTexteNbElts();
+		}
+		else {
+			initSousTexteChamp(saisieChampAffiche4.getSelection());
+		}
+		// initstat();
+		
+		this.ngrammes.setDonneesChaines(donneesChaines);
+		this.ngrammes.setTypeChaines(typeChaines);
+		this.ngrammes.setTypeUnites(typeUnites);
+		this.ngrammes.update();
+	}
+	
+	private void modifierStatutValNbElements(boolean masquee, int index, boolean tous, int source) {
+		Val0ComboBox zonedesaisie;
+		switch (source) {
+			case 0:
+				zonedesaisie = saisieChampAffiche;
+				break;
+			case 1:
+				zonedesaisie = saisieChampAffiche1;
+				break;
+			case 2:
+				zonedesaisie = saisieChampAffiche2;
+				break;
+			case 3:
+				zonedesaisie = saisieChampAffiche3;
+				break;
+			case 4:
+				zonedesaisie = saisieChampAffiche4;
+				break;
+			default:
+				zonedesaisie = new Val0ComboBox("Nombre de chaînons");
+				break;
+		}
+		if (!tous) donneesChaines.masquerValNbElements(!masquee, index);
+		else if (masquee) donneesChaines.demasquerToutesValsNbElts(
+				zonedesaisie.getSelection());
+		else donneesChaines.masquerAutresValsNbElts(
+				zonedesaisie.getSelection(), index);
+		donneesChaines.modifMasqueVals(typeChaines, typeUnites);
+		if (saisieChampAffiche.pasdeSelection()) {
+			initCouleursNbElts();
+		}
+		else {
+			initCouleursChamp(saisieChampAffiche.getSelection());
+		}
+		if (saisieChampAffiche1.pasdeSelection()) {
+			initFormesNbElts();
+		}
+		else {
+			initFormesChamp(saisieChampAffiche1.getSelection());
+		}
+		if (saisieChampAffiche2.pasdeSelection()) {
+			initTaillesNbElts();
+		}
+		else {
+			initTaillesChamp(saisieChampAffiche2.getSelection());
+		}
+		if (saisieChampAffiche3.pasdeSelection()) {
+			initSurTexteNbElts();
+		}
+		else {
+			initSurTexteChamp(saisieChampAffiche3.getSelection());
+		}
+		if (saisieChampAffiche4.pasdeSelection()) {
+			initSousTexteNbElts();
+		}
+		else {
+			initSousTexteChamp(saisieChampAffiche4.getSelection());
+		}
+		// initstat();
+		
+		this.ngrammes.setDonneesChaines(donneesChaines);
+		this.ngrammes.setTypeChaines(typeChaines);
+		this.ngrammes.setTypeUnites(typeUnites);
+		this.ngrammes.update();
+	}
+	
+	
+	public JTable getLegende(int index) {
+		JTable retour;
+		switch (index) {
+			case 0:
+				retour = this.legendeChampAffiche;
+				break;
+			case 1:
+				retour = this.legendeChampAffiche1;
+				break;
+			case 2:
+				retour = this.legendeChampAffiche2;
+				break;
+			case 3:
+				retour = this.legendeChampAffiche3;
+				break;
+			case 4:
+				retour = this.legendeChampAffiche4;
+				break;
+			default:
+				retour = new JTable();
+				break;
+		}
+		return retour;
+	}
+	
+	// retourne en format SVG la sélection
+	public String getSelection(int taillepolice, int x, int y, String police) {
+		String retour = "";
+		if (saisieTypeChaines.pasdeSelection()) {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Type de Schéma : aucun" + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		else {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Type de Schéma : " + saisieTypeChaines.getSelection() + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+			
+		}
+		if (saisieTypeUnites.pasdeSelection()) {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 2 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Type d'Unités : aucun" + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		else {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 2 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Type d'Unités : " + saisieTypeUnites.getSelection() + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		if (saisieChampAffiche.pasdeSelection()) {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 4 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Champ 1 : nombre de Chainons" + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		else {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 4 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Champ 1 : " + saisieChampAffiche.getSelection() + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		if (saisieChampAffiche1.pasdeSelection()) {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 6 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Champ 2 : nombre de Chainons" + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		else {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 6 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Champ 2 : " + saisieChampAffiche1.getSelection() + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		if (saisieChampAffiche2.pasdeSelection()) {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 8 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Champ 3 : nombre de Chainons" + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		else {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 8 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Champ 3 : " + saisieChampAffiche2.getSelection() + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		if (saisieChampAffiche3.pasdeSelection()) {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 10 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Champ 4 : nombre de Chainons" + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		else {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 10 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Champ 4 : " + saisieChampAffiche3.getSelection() + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		if (saisieChampAffiche4.pasdeSelection()) {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 12 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Champ 5 : nombre de Chainons" + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		else {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 12 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Champ 5 : " + saisieChampAffiche4.getSelection() + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		return retour;
+	}
+	
+	public void exporterAffichage() {
+		HashMap<String, Object> Choix = new HashMap();
+		HashMap<String, String> choixCommande = new HashMap();
+		
+		choixCommande.put("saisieTypeChaines", saisieTypeChaines.pasdeSelection() ? null : saisieTypeChaines.getSelection());
+		choixCommande.put("saisieTypeUnites", saisieTypeUnites.pasdeSelection() ? null : saisieTypeUnites.getSelection());
+		choixCommande.put("saisieTailleLigne", saisieTailleLigne.getSelectedItem().toString());
+		choixCommande.put("activeCouperParagraphe", activeCouperParagraphe.isSelected() ? "vrai" : "faux");
+		choixCommande.put("saisieChampAffiche", saisieChampAffiche.pasdeSelection() ? null : saisieChampAffiche.getSelection());
+		choixCommande.put("saisieChampAffiche1", saisieChampAffiche1.pasdeSelection() ? null : saisieChampAffiche1.getSelection());
+		choixCommande.put("saisieChampAffiche2", saisieChampAffiche2.pasdeSelection() ? null : saisieChampAffiche2.getSelection());
+		choixCommande.put("saisieChampAffiche3", saisieChampAffiche3.pasdeSelection() ? null : saisieChampAffiche3.getSelection());
+		choixCommande.put("saisieChampAffiche4", saisieChampAffiche4.pasdeSelection() ? null : saisieChampAffiche4.getSelection());
+		
+		Choix.put("valmasquees", donneesChaines.getValsMasqueesChamp());
+		Choix.put("valNbmasquees", donneesChaines.getValsNbMasqueesChamp());
+		Choix.put("valNullemasquees", donneesChaines.getValsNulleMasqueesChamp());
+		Choix.put("codeLegende", this.codeLegende);
+		Choix.put("choixCommande1", choixCommande);
+		Choix.put("ngrammes", this.ngrammes.exporterAffichage());
+		Choix.put("nomFichier", Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC));
+		FichiersJava.enregistrerChaineSous(Choix);
+	}
+	
+	public void importerAffichage() {
+		HashMap<String, Object> choix = FichiersJava.ouvrirChaineVue();
+		if (choix != null && choix.containsKey("choixCommande1") &&
+				Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC).equals(choix.get("nomFichier"))) {
+			HashMap<String, String> choixCommande = (HashMap<String, String>) choix.get("choixCommande1");
+			saisieTypeChaines.removeActionListener(this);
+			saisieTypeUnites.removeActionListener(this);
+			saisieTypeChaines.setSelectedItem(choixCommande.get("saisieTypeChaines"));
+			saisieTypeUnites.setSelectedItem(choixCommande.get("saisieTypeUnites"));
+			saisieTypeChaines.addActionListener(this);
+			saisieTypeUnites.addActionListener(this);
+			init();
+			// si on ne les paramètres d'affichage ont été enregistrés pour le même corpus
+			this.codeLegende = (HashMap<String, HashMap<String, String>>) choix.get("codeLegende");
+			donneesChaines.setValsMasqueesChamp((HashMap<String, HashSet<String>>) choix.get("valmasquees"));
+			donneesChaines.setValsNbMasqueesChamp((boolean[]) choix.get("valNbmasquees"));
+			donneesChaines.setValsNulleMasqueesChamp((HashSet<String>) choix.get("valNullemasquees"));
+			saisieTailleLigne.removeActionListener(this);
+			saisieChampAffiche.removeActionListener(this);
+			saisieChampAffiche1.removeActionListener(this);
+			saisieChampAffiche2.removeActionListener(this);
+			saisieChampAffiche3.removeActionListener(this);
+			saisieChampAffiche4.removeActionListener(this);
+			activeCouperParagraphe.setSelected(choixCommande.get("activeCouperParagraphe").equals("vrai"));
+			panneauGraphique.setcouperparagraphe(activeCouperParagraphe.isSelected());
+			saisieTailleLigne.setSelectedItem(choixCommande.get("saisieTailleLigne"));
+			int taille = saisieTailleLigne.getSelectedIndex() == 0 ? Integer.MAX_VALUE : Integer.parseInt((String) saisieTailleLigne.getSelectedItem());
+			panneauGraphique.setNbChainonsParLigne(taille);
+			if (choixCommande.get("saisieChampAffiche") != null) {
+				saisieChampAffiche.setSelectedItem(choixCommande.get("saisieChampAffiche"));
+			}
+			else {
+				saisieChampAffiche.effSelection();
+			}
+			if (choixCommande.get("saisieChampAffiche1") != null) {
+				saisieChampAffiche1.setSelectedItem(choixCommande.get("saisieChampAffiche1"));
+			}
+			else {
+				saisieChampAffiche1.effSelection();
+			}
+			if (choixCommande.get("saisieChampAffiche2") != null) {
+				saisieChampAffiche2.setSelectedItem(choixCommande.get("saisieChampAffiche2"));
+			}
+			else {
+				saisieChampAffiche2.effSelection();
+			}
+			if (choixCommande.get("saisieChampAffiche3") != null) {
+				saisieChampAffiche3.setSelectedItem(choixCommande.get("saisieChampAffiche3"));
+			}
+			else {
+				saisieChampAffiche3.effSelection();
+			}
+			if (choixCommande.get("saisieChampAffiche4") != null) {
+				saisieChampAffiche4.setSelectedItem(choixCommande.get("saisieChampAffiche4"));
+			}
+			else {
+				saisieChampAffiche4.effSelection();
+			}
+			saisieTailleLigne.addActionListener(this);
+			saisieChampAffiche.addActionListener(this);
+			saisieChampAffiche1.addActionListener(this);
+			saisieChampAffiche2.addActionListener(this);
+			saisieChampAffiche3.addActionListener(this);
+			saisieChampAffiche4.addActionListener(this);
+			donneesChaines.modifMasqueVals(typeChaines, typeUnites);
+			
+			if (saisieChampAffiche.pasdeSelection()) {
+				initCouleursNbElts();
+			}
+			else {
+				initCouleursChamp(saisieChampAffiche.getSelection());
+			}
+			if (saisieChampAffiche1.pasdeSelection()) {
+				initFormesNbElts();
+			}
+			else {
+				initFormesChamp(saisieChampAffiche1.getSelection());
+			}
+			if (saisieChampAffiche2.pasdeSelection()) {
+				initTaillesNbElts();
+			}
+			else {
+				initTaillesChamp(saisieChampAffiche2.getSelection());
+			}
+			if (saisieChampAffiche3.pasdeSelection()) {
+				initSurTexteNbElts();
+			}
+			else {
+				initSurTexteChamp(saisieChampAffiche3.getSelection());
+			}
+			if (saisieChampAffiche4.pasdeSelection()) {
+				initSousTexteNbElts();
+			}
+			else {
+				initSousTexteChamp(saisieChampAffiche4.getSelection());
+			}
+			this.ngrammes.setDonneesChaines(donneesChaines);
+			this.ngrammes.setTypeChaines(typeChaines);
+			this.ngrammes.setTypeUnites(typeUnites);
+			this.ngrammes.importerAffichage((HashMap) choix.get("ngrammes"));
+			this.ngrammes.update();
+		}
+		else {
+			JOptionPane.showMessageDialog(null, "le fichier des paramètres d'affichage n'est pas destiné à cette fenêtre"
+					+ System.getProperty("line.separator") +
+					"ou à ce corpus", "Erreur de lecture de fichier", JOptionPane.ERROR_MESSAGE);
+		}
+		
+		
+	}
+	
+	public ModeleChaines getDonneesChaines() {
+		return this.donneesChaines;
+	}
+	
+	public Object[][] donneesCSV(boolean[] champ) {
+		ArrayList<Object[]> donnees = new ArrayList<>();
+		int nbchamp = 0;
+		for (boolean tmp : champ) {
+			if (tmp) {
+				nbchamp = nbchamp + 1;
+			}
+		}
+		if (champ.length == 5) {
+			GChaines chaine = this.panneauGraphique;
+			Object[] titre = new Object[nbchamp + 1];
+			titre[0] = "unité";
+			int compteurTitre = 1;
+			for (int i = 0; i < champ.length; i++) {
+				if (champ[i]) {
+					switch (i) {
+						case 0:
+							titre[compteurTitre] = this.saisieChampAffiche.pasdeSelection() ? "Nombre de Chainons"
+									: this.saisieChampAffiche.getSelection();
+							break;
+						case 1:
+							titre[compteurTitre] = this.saisieChampAffiche1.pasdeSelection() ? "Nombre de Chainons"
+									: this.saisieChampAffiche1.getSelection();
+							break;
+						case 2:
+							titre[compteurTitre] = this.saisieChampAffiche2.pasdeSelection() ? "Nombre de Chainons"
+									: this.saisieChampAffiche2.getSelection();
+							break;
+						case 3:
+							titre[compteurTitre] = this.saisieChampAffiche3.pasdeSelection() ? "Nombre de Chainons"
+									: this.saisieChampAffiche3.getSelection();
+							break;
+						case 4:
+							titre[compteurTitre] = this.saisieChampAffiche4.pasdeSelection() ? "Nombre de Chainons"
+									: this.saisieChampAffiche4.getSelection();
+							break;
+					}
+					compteurTitre = compteurTitre + 1;
+				}
+			}
+			donnees.add(titre);
+			for (int j = 0; j < chaine.chainons.length; j++) {
+				ModeleChaines.Chainon unit = chaine.chainons[j];
+				Object[] row = new Object[nbchamp + 1];
+				row[0] = unit.texte;
+				int compteur = 1;
+				for (int i = 0; i < champ.length; i++) {
+					if (champ[i]) {
+						switch (i) {
+							case 0:
+								row[compteur] = this.saisieChampAffiche.pasdeSelection() ? labelsNbElements[donneesChaines.calculerValNbElements(unit.nbEltsChaine)]
+										: vue.getValeurChamp(unit.unite, this.saisieChampAffiche.getSelection());
+								break;
+							case 1:
+								row[compteur] = this.saisieChampAffiche1.pasdeSelection() ? labelsNbElements[donneesChaines.calculerValNbElements(unit.nbEltsChaine)]
+										: vue.getValeurChamp(unit.unite, this.saisieChampAffiche1.getSelection());
+								break;
+							case 2:
+								row[compteur] = this.saisieChampAffiche2.pasdeSelection() ? labelsNbElements[donneesChaines.calculerValNbElements(unit.nbEltsChaine)]
+										: vue.getValeurChamp(unit.unite, this.saisieChampAffiche2.getSelection());
+								break;
+							case 3:
+								row[compteur] = this.saisieChampAffiche3.pasdeSelection() ? labelsNbElements[donneesChaines.calculerValNbElements(unit.nbEltsChaine)]
+										: vue.getValeurChamp(unit.unite, this.saisieChampAffiche3.getSelection());
+								break;
+							case 4:
+								row[compteur] = this.saisieChampAffiche4.pasdeSelection() ? labelsNbElements[donneesChaines.calculerValNbElements(unit.nbEltsChaine)]
+										: vue.getValeurChamp(unit.unite, this.saisieChampAffiche4.getSelection());
+								break;
+						}
+						compteur = compteur + 1;
+					}
+				}
+				donnees.add(row);
+			}
+		}
+		return donnees.toArray(new Object[donnees.size()][nbchamp]);
+	}
 }
Index: tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ChaineUtil.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ChaineUtil.java	(revision 3062)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ChaineUtil.java	(revision 3063)
@@ -5,935 +5,935 @@
  */
 
 package visuAnalec.chaines;
+
 import java.awt.*;
 import java.util.*;
 import java.util.ArrayList;
 import visuAnalec.elements.*;
 import visuAnalec.texte.*;
 import visuAnalec.vue.*;
+
 /**
  *
  * @author Marc
  */
 public abstract class ChaineUtil {
-    
-   //renvoie un HashMap qui à un nombre de chainons de la chaine associe le nombre de chaines 
-   //qui ont ce nombre de chainons 
-   public static HashMap<Integer,Integer> calculerdonneecourbechainons(String[] typesdispo,Vue vue){
-       String[] typesChaines = vue.getTypesSchemasAVoir();
-       HashMap<Integer,Integer> retour = new HashMap();
-       for(String typechaine : typesChaines){
-           Schema[] chaines = vue.getSchemas(typechaine);
-           for(Schema chaine : chaines){
-               HashSet<Element> contenu = chaine.getContenu();
-               int compte = 0;
-               for(Element elt : contenu){
-                   if(elt.getClass()==Unite.class && tableauRecherche(typesdispo,elt.getType())){
-                       compte = compte + 1;
-                   }
-               }
-               if(retour.containsKey(compte)){
-                    retour.put(compte,retour.get(compte) + 1);
-               }
-               else{
-                    retour.put(compte,1);    
-               }
-           }
-       }
-       return retour;
-   }
-    
-   
-   
-       
-    
-   //Calcule à partir de la position en caractères la position en mot dans une chaine de caractère
-   //@require : la position en caractère doit être inférieure à la longueur de la chaine
-   private static int calculerPositionMot(int poscaractere, String chaine,Vue vue){
-       int compteur = 1;
-       int i = 0;
-       while(i < poscaractere){
-           if(chaine.charAt(i)=='\n'  || chaine.charAt(i)==' ' || chaine.charAt(i)=='\r'){
-               while(i < poscaractere && (chaine.charAt(i)=='\n'  || chaine.charAt(i)==' '
-                       || chaine.charAt(i)=='\r')){
-                   i = i + 1;
-               }
-               compteur = compteur  + 1;
-           }
-           i = i + 1;
-       }
-       return compteur;
-   }
-   
-   //cherche la position en nombre d'un caractère mot dans le corpus
-   public static int calculerPositionMotCorpus(int poscaractere, Vue vue){
-       String corpus = vue.getCorpus().getTexte();
-       int resultat = 0;
-       Integer[] finparagraphe = vue.getCorpus().getFinParagraphes();
-       int finparagraphecourant = 0;
-       for(int i = 0 ; i < corpus.length();i++){
-           if(corpus.charAt(i)==' ' || i > finparagraphe[finparagraphecourant]){
-               resultat = resultat + 1;
-               if(i > finparagraphe[finparagraphecourant]){
-                  finparagraphecourant = finparagraphecourant + 1;  
-               }
-           }
-           if(i == poscaractere){
-               return resultat;
-           }
-       }
-       return resultat;
-   }
-   //donne le nombre de paragraphes du corpus
-   public static int nbParagraphe(Vue vue){
-       return vue.getCorpus().getFinParagraphes().length;
-   }
-   //donne le nombre de caractères du corpus
-   public static int nbCaractere(Vue vue){
-       return vue.getCorpus().getTexte().length();
-   }
-   //donne le nombre de mots du Corpus
-   public static int nbMot(Vue vue){
-       return calculerPositionMotCorpus(nbCaractere(vue)-1,vue);
-   }
-  //donne le nombre d'unité appartenant à une chaine
-   public static int nombreDeReference(String[] typesUnite,Vue vue){
-       String[] types = vue.getTypesSchemasAVoir();
-       int compte = 0;
-       for(String type : types){
-           Schema[] chaines = vue.getSchemas(type);
-           for(Schema chaine : chaines){
-               for(Element unit : chaine.getContenu()){
-                   if(unit.getClass()==Unite.class && tableauRecherche(typesUnite,unit.getType())){
-                       compte =  compte + 1;
-                   }
-               }
-           }
-       }
-       return compte;
-   }
-   //donne le nombre de chaines non vides
-   public static int nbChaines(Vue vue){
-       String[] types = vue.getTypesSchemasAVoir();
-       int compte = 0;
-       for(String type : types){
-           Schema[] chaines = vue.getSchemas(type);
-           for(Schema chaine : chaines){
-               if(chaine.getContenu().size()>0){
-                       compte =  compte + 1;
-               }
-           }
-       }
-       return compte;       
-   }
-   //calcule le nombre de références par unité de longueur "choix"
-   public static float densiteReferentielle(String choix,String[] types,Vue vue){
-       float compte = 0.0f;
-       compte = compte + nombreDeReference(types,vue);
-       switch(choix){
-           case "Caractère":
-               compte = Math.round(compte * 10000.0f / nbCaractere(vue)) / 10000.0f; 
-               break;
-           case "Mot":
-               compte = Math.round(compte * 10000.0f / nbMot(vue)) / 10000.0f; 
-               break;
-           case "Paragraphe":
-               compte = Math.round(compte * 10000.0f / nbParagraphe(vue)) / 10000.0f; 
-               break;
-           default:
-               break;
-               
-       }
-       return compte;
-   }
-   //attention les unités sont dans le désordre
-   public static ArrayList<Integer> positionUnite(String[] types,Vue vue){
-       ArrayList<Integer> retour  = new ArrayList();
-       for(String type : types){
-           Unite[] unites = vue.getUnites(type);
-           for(Unite unit : unites){
-               retour.add(unit.getDeb());
-           }
-       }
-       return retour;
-   }
-   //renvoie les unités dont le type est contenu dans le tableau "types" puis et triée par ordre d'apparition 
-   // dans le corpus
-   public static Unite[] getUniteesTrieesEtFiltrees(String[] types,Vue vue){
-       ArrayList<Unite> stockage = new ArrayList();
-       for(String type : types){
-           Unite[] tmp = vue.getUnites(type);
-           for(int i  = 0; i < tmp.length;i++){
-               stockage.add(tmp[i]);
-           }
-       }
-       Unite[] retour = stockage.toArray(new Unite[stockage.size()]);
-       triFusionUnite(retour);
-       return retour;
-   }
-   //calcule les position en nombre de mots au sein d'un corpus des unités dont le 
-   //type est contenu dans le tableau "types" puis et triée par ordre d'apparition 
-   public static ArrayList<Integer> positionUniteEnMot(String[] types,Vue vue){
-       Unite[] donnees = getUniteesTrieesEtFiltrees(types,vue);
-       int postexte = 0;
-       int comptemot = 0;
-       String texte = vue.getCorpus().getTexte();
-       ArrayList<Integer> retour = new ArrayList();
-       for(int i = 0 ; i < donnees.length ; i++){
-           while(postexte < donnees[i].getDeb()){
-               if(texte.charAt(postexte)==' ' || texte.charAt(postexte)=='\n'){
-                   comptemot = comptemot + 1;
-               }
-               postexte = postexte + 1;
-           }
-           retour.add(comptemot);
-       }
-       return retour;
-   }
-    //calcule les écarts en nombre de caractères au sein d'un corpus des unités dont le 
-   //type est contenu dans le tableau "types"
-   //les écarts sont la différence les positions de début de deux unités consécutives respectant toutes deux 
-   //un type d'unités contenu dans "types"
-   public static ArrayList<Integer> ecartUniteCaractere(String[] types,Vue vue){
-       ArrayList<Integer> retour  = new ArrayList();
-           Unite[] unites = getUniteesTrieesEtFiltrees(types,vue);
-           for(int i = 0;i < unites.length-1;i++){
-               retour.add(unites[i+1].getDeb() - unites[i].getDeb());
-           }
-       return retour;
-   }   
-    //calcule les écarts en nombre de mots au sein d'un corpus des unités dont le 
-   //type est contenu dans le tableau "types" 
-   //les écarts sont la différence les positions de début de deux unités consécutives respectant toutes deux 
-   //un type d'unités contenu dans "types"
-   public static ArrayList<Integer> ecartUniteMot(String[] types,Vue vue){
-       ArrayList<Integer> retour  = new ArrayList();
-           Unite[] unites = getUniteesTrieesEtFiltrees(types,vue);
-           for(int i = 0;i < unites.length-1;i++){
-               String texte = vue.getCorpus().getTexte().substring(unites[i].getDeb(), unites[i+1].getDeb());
-               int compte = 0;
-               for(int j = 0 ; j < texte.length();j++){
-                   if(texte.charAt(j)==' ' || texte.charAt(j)=='\n'){
-                       compte = compte + 1; 
-                   }
-               }
-               retour.add(compte);
-           }
-       return retour;
-   }
-   
-   //détermine les longueurs en mots des unités contenu dans un corpus et dont le 
-   //type est contenu dans le tableau "types" 
-   public static ArrayList<Integer> longueurUniteMot(String[] types,Vue vue){
-       ArrayList<Integer> retour  = new ArrayList();
-       for(String type : types){
-           Unite[] unites = vue.getUnites(type);
-           for(int i = 0;i < unites.length;i++){
-               String texte = vue.getCorpus().getTexte().substring(unites[i].getDeb(), unites[i].getFin());
-               int compte = 0;
-               for(int j = 0 ; j < texte.length();j++){
-                   if(texte.charAt(j)==' ' || texte.charAt(j)=='\n'){
-                       compte = compte + 1; 
-                   }
-               }
-               retour.add(compte);
-           }
-       }
-       return retour;
-   }
-   
-   //détermine les longueurs en nombre de caractères des unités contenu dans un corpus et dont le 
-   //type est contenu dans le tableau "types" 
-   public static ArrayList<Integer> longueurUniteCaractere(String[] types,Vue vue){
-       ArrayList<Integer> retour  = new ArrayList();
-       for(String type : types){
-           Unite[] unites = vue.getUnites(type);
-           for(int i = 0;i < unites.length;i++){
-               int compte = unites[i].getFin()-unites[i].getDeb();
-               retour.add(compte);
-           }
-       }
-       return retour;
-   }
-   
-   //pas optimisé comme un binary search car on a pas d'ordre défini sur les objets du tableau
-   //et donc le tableau n'est pas trié
-   public static boolean tableauRecherche(Object[] tab, Object elt){
-       for(Object unit : tab){
-           if(unit.equals(elt)){
-               return true;
-           }
-       }
-       return false;
-   }
-   
-   //détermine la longueur des chaines en caractères
-   public static ArrayList<Integer> longueurChaineCaractere(String[] types,Vue vue){
-       String[] typeschaine = vue.getTypesSchemasAVoir();
-       ArrayList<Integer> retour = new ArrayList();
-       for(String type : typeschaine){
-           Schema[] chaines = vue.getSchemas(type);
-           for(Schema chaine : chaines){
-               HashSet<Element> contenu = chaine.getContenu();
-               Integer compte = 0;
-               for(Element elt : contenu){
-                   if(elt.getClass()==Unite.class && tableauRecherche(types,elt.getType())){
-                       Unite tmp = (Unite) elt;
-                       compte = compte + tmp.getFin() - tmp.getDeb();
-                   }
-               }
-               retour.add(compte);
-           }
-       }
-       return retour;
-   }
-   
-   //détermine la longueur des chaines en mots en sommant la longueur des maillons dont le type est contenu
-   //dans "types"
-   public static ArrayList<Integer> longueurChaineMot(String[] types,Vue vue){
-       String[] typeschaine = vue.getTypesSchemasAVoir();
-       ArrayList<Integer> retour = new ArrayList();
-       for(String type : typeschaine){
-           Schema[] chaines = vue.getSchemas(type);
-           for(Schema chaine : chaines){
-               HashSet<Element> contenu = chaine.getContenu();
-               Integer compte = 0;
-               for(Element elt : contenu){
-                   if(elt.getClass()==Unite.class && tableauRecherche(types,elt.getType())){
-                       Unite tmp = (Unite) elt;
-                       String texte = vue.getCorpus().getTexte().substring(tmp.getDeb(), tmp.getFin());
-                       for(int i = 0 ; i < texte.length();i++){
-                            if(texte.charAt(i)==' ' || texte.charAt(i)=='\n'){
-                                compte = compte + 1;
-                            }
-                       }
-                   }
-               }
-               retour.add(compte);
-           }
-       }
-       return retour;
-   }
-   
-   
-   //calcule le nombre de chainons(unités) dont le type est contenu dans "types" de chaque chaine
-   public static ArrayList<Integer> nombreDeChainons(String[] types,Vue vue){
-       String[] typeschaines = vue.getTypesSchemasAVoir();
-       ArrayList retour = new ArrayList();
-       for(String type : typeschaines){
-           Schema[] chaines = vue.getSchemas(type);
-           for(Schema chaine : chaines){
-               HashSet<Element> contenu = chaine.getContenu();
-               Integer compte = 0;
-               for(Element elt : contenu){
-                   if(elt.getClass()==Unite.class && tableauRecherche(types,elt.getType())){
-                       compte = compte + 1;
-                   }
-               }
-               retour.add(compte);
-           }
-       }
-       return retour;
-   }
-   
-   
-   
-   //recherche le numero de paragraphe dans le corpus qui correspond à une position en caractère 
-   public static int conversionPositionCaracterEtNoParagraphe(int poscaractere, Vue vue){
-       Integer[] noparagraphe = vue.getCorpus().getFinParagraphes();
-       for(int  i = 0 ; i < noparagraphe.length;i++ ){
-           if(poscaractere > noparagraphe[i] || i ==noparagraphe.length-1){
-               return i;
-           }
-           
-       }
-       return -1 ;
-   }
-   
-   
-    //@ensures : retourne la longueur d'une unité en caractère
-   public static int longueurUnite(Unite donnee){
-       return (donnee.getFin() - donnee.getDeb());
-   }
-   
-   //@ensures : retourne la longueur d'une unite en mot
-   public static int nbMotUnite(Unite donnee,Vue vue){
-       String chaine = (vue.getCorpus()).getTexteUnite(donnee);
-       return calculerPositionMot(chaine.length(),chaine,vue);
-   }
-   //cherche le maximum d'un tableau pas forcément trié 
-   public static Integer maxiTab(Integer[] donnees){
-       Integer max = -1;
-       if(donnees.length > 0){
-        max = donnees[0];
-        for(Integer nbr : donnees){
-            if(nbr > max){
-                max = nbr;
-            }
-        }
-       }
-       return max;
-   } 
-   //cherche le minimum d'un tableau pas forcément trié 
-   public static Integer miniTab(Integer[] donnees){
-       Integer min = -1;
-       if(donnees.length > 0){
-        min = donnees[0];
-        for(Integer nbr : donnees){
-            if(nbr < min){
-                min = nbr;
-            }
-        }
-       }
-       return min;
-   } 
-   //retourne la somme des éléments d'un tableau
-   public static int somme(Integer[] donnees){
-       int total = 0;
-       for(Integer nbr : donnees){
-           total = total + nbr;
-       }
-       return total;
-   }
-   
-   
-   public static int nbMotsDansUneUnite(int deb,int fin,Vue vue){
-       String texteunite = vue.getCorpus().getTexte().substring(deb, fin);
-       int compte = (deb<fin ? 1 : 0);
-       for(int i=0;i< texteunite.length();i++){
-           if(texteunite.charAt(i)==' '){
-               compte = compte + 1;
-           }
-       }
-       return compte;
-   }   
- //permet de trier un tableau de valeurs suivant leur fréquence  
- public static void triFusionMap(String tableau[],HashMap<String, Float> freq)
-        {
-        int longueur=tableau.length;
-        if (longueur>0)
-            {
-            triFusionMap(tableau,0,longueur-1,freq);
-            }
-        }
-
-  private static void triFusionMap(String tableau[],int deb,int fin,HashMap<String, Float> freq)
-        {
-        if (deb!=fin)
-            {
-            int milieu=(fin+deb)/2;
-            triFusionMap(tableau,deb,milieu,freq);
-            triFusionMap(tableau,milieu+1,fin,freq);
-            fusionMap(tableau,deb,milieu,fin,freq);
-            }
-        }
-    
-   private static void fusionMap(String tableau[],int deb1,int fin1,int fin2,HashMap<String, Float> freq)
-        {
-        int deb2=fin1+1;
-
-        //on recopie les éléments du début du tableau
-        String table1[]=new String[fin1-deb1+1];
-        for(int i=deb1;i<=fin1;i++)
-            {
-            table1[i-deb1]=tableau[i];
-            }
-        
-        int compt1=deb1;
-        int compt2=deb2;
-        
-        for(int i=deb1;i<=fin2;i++)
-            {        
-            if (compt1==deb2) //c'est que tous les éléments du premier tableau ont été utilisés
-                {
-                break; //tous les éléments ont donc été classés
-                }
-            else if (compt2==(fin2+1)) //c'est que tous les éléments du second tableau ont été utilisés
-                {
-                tableau[i]=table1[compt1-deb1]; //on ajoute les éléments restants du premier tableau
-                compt1++;
-                }
-            else if (freq.get(table1[compt1-deb1])>freq.get(tableau[compt2]))
-                {
-                tableau[i]=table1[compt1-deb1]; //on ajoute un élément du premier tableau
-                compt1++;
-                }
-            else
-                {
-                tableau[i]=tableau[compt2]; //on ajoute un élément du second tableau
-                compt2++;
-                }
-            }
-        }
-   //on enlève les unités dont le numero de paragraphe appartient à Noparagraphe
-   public static Unite[] filtreparagraphe(Unite[] donnees, ArrayList<Integer> Noparagraphemasque,Vue vue){
-       HashMap<Unite,Integer> noparagraphe = unitenumeroparagraphe(donnees,vue);
-       ArrayList<Unite> unitefiltrees = new ArrayList(); 
-       for(Unite unit : donnees){
-           if(!(Noparagraphemasque.contains(noparagraphe.get(unit)))){
-               unitefiltrees.add(unit);
-           }
-       }
-       Unite[] resultat = unitefiltrees.toArray(new Unite[0]);
-       return resultat;
-   }   
-    //renvoie un tableau contenant les fréquences de chaque valeur d'un champ dans la liste d'unités
-   public static HashMap<String, Float> calculerfrequencechamp(Unite[] donnees,String typeUnites
-           ,String Champcible,Vue vue){
-       String[] valsdisponibles  = vue.getValeursChamp(Unite.class, typeUnites, Champcible);
-       HashMap<String, Float> tableaufrequence = new HashMap<String, Float>(valsdisponibles.length + 1); 
-       String valeurchamp;
-       //on initialise le tableau résultat
-       for(String valeur : valsdisponibles){
-           tableaufrequence.put(valeur, 0.0f);
-       }
-       tableaufrequence.put("", 0.0f);
-       //on compte le nombre d'occurences
-       for(Unite unit : donnees){
-           valeurchamp = vue.getValeurChamp(unit, Champcible);
-           tableaufrequence.put(valeurchamp,tableaufrequence.get(valeurchamp) + 1); 
-       }
-       //on calcule les pourcentages
-       for(String valeur : valsdisponibles){
-           tableaufrequence.put(valeur, tableaufrequence.get(valeur) * 10000.0f /
-                   donnees.length / 100.0f);
-       }       
-           tableaufrequence.put("", tableaufrequence.get("") * 10000.0f /
-                   donnees.length / 100.0f);       
-       
-       return tableaufrequence;
-   }
-   
-  //détermine la moyenne par rapport à la deuxième variable d'un HashMap
-  public static float Esperance(HashMap<Object,Integer> donnees){
-      float moyenne  = 0.0f;
-      for(Object i : donnees.keySet()){
-          moyenne = moyenne + donnees.get(i);
-      }
-      moyenne = moyenne / donnees.size();
-      return moyenne;
-  }
-    //détermine la moyenne des valeurs d'un tableau
-  public static float Esperance(Integer[] donnees){
-      float moyenne  = 0.0f;
-      for(Integer i : donnees){
-          moyenne = moyenne + i;
-      }
-      moyenne = moyenne / donnees.length;
-      return moyenne;
-  }  
-    //détermine la variance par rapport à la deuxième variable d'un HashMap
-  public static float Variance(HashMap<Object,Integer> donnees){
-      float moyenne  = Esperance(donnees);
-      float variance = 0.0f;
-      if(donnees.size() > 1){
-        for(Object i : donnees.keySet()){
-            variance = variance + (donnees.get(i) - moyenne) * (donnees.get(i) - moyenne);
-        }
-          variance  =  variance / (donnees.size() - 1);
-      }
-
-      return variance;
-  }
-  //détermine la variance des valeurs d'un tableau
-  public static float Variance(Integer[] donnees){
-      float moyenne  = Esperance(donnees);
-      float variance = 0.0f;
-      if(donnees.length > 1){
-        for(Integer i : donnees){
-            variance = variance + (i - moyenne) * (i - moyenne);
-        }
-          variance  =  variance / (donnees.length - 1);
-      }
-      return variance;
-  }  
-  //permet de trier les unités d'un tableau
-  //la relation d'ordre entre les unités est la comparaison des positions de débuts des unités au sein du texte
-  public static void triFusionUnite(Unite tableau[])
-        {
-        int longueur=tableau.length;
-        if (longueur>0)
-            {
-            triFusionUnite(tableau,0,longueur-1);
-            }
-        }
-
-  private static void triFusionUnite(Unite tableau[],int deb,int fin)
-        {
-        if (deb!=fin)
-            {
-            int milieu=(fin+deb)/2;
-            triFusionUnite(tableau,deb,milieu);
-            triFusionUnite(tableau,milieu+1,fin);
-            fusionUnite(tableau,deb,milieu,fin);
-            }
-        }
-    
-   private static void fusionUnite(Unite tableau[],int deb1,int fin1,int fin2)
-        {
-        int deb2=fin1+1;
-
-        //on recopie les éléments du début du tableau
-        Unite table1[]=new Unite[fin1-deb1+1];
-        for(int i=deb1;i<=fin1;i++)
-            {
-            table1[i-deb1]=tableau[i];
-            }
-        
-        int compt1=deb1;
-        int compt2=deb2;
-        
-        for(int i=deb1;i<=fin2;i++)
-            {        
-            if (compt1==deb2) //c'est que tous les éléments du premier tableau ont été utilisés
-                {
-                break; //tous les éléments ont donc été classés
-                }
-            else if (compt2==(fin2+1)) //c'est que tous les éléments du second tableau ont été utilisés
-                {
-                tableau[i]=table1[compt1-deb1]; //on ajoute les éléments restants du premier tableau
-                compt1++;
-                }
-            else if (table1[compt1-deb1].getDeb()<tableau[compt2].getDeb())
-                {
-                tableau[i]=table1[compt1-deb1]; //on ajoute un élément du premier tableau
-                compt1++;
-                }
-            else
-                {
-                tableau[i]=tableau[compt2]; //on ajoute un élément du second tableau
-                compt2++;
-                }
-            }
-        }
-   
-    //permet de trier les unités d'une arrayList
-  //la relation d'ordre entre les unités est la comparaison des positions de débuts des unités au sein du texte 
-  public static void triFusionUnite(ArrayList<Unite> tableau)
-        {
-        int longueur=tableau.size();
-        if (longueur>0)
-            {
-            triFusionUnite(tableau,0,longueur-1);
-            }
-        }
-
-  private static void triFusionUnite(ArrayList<Unite> tableau,int deb,int fin)
-        {
-        if (deb!=fin)
-            {
-            int milieu=(fin+deb)/2;
-            triFusionUnite(tableau,deb,milieu);
-            triFusionUnite(tableau,milieu+1,fin);
-            fusionUnite(tableau,deb,milieu,fin);
-            }
-        }
-    
-   private static void fusionUnite(ArrayList<Unite> tableau,int deb1,int fin1,int fin2)
-        {
-        int deb2=fin1+1;
-
-        //on recopie les éléments du début du tableau
-        Unite table1[]=new Unite[fin1-deb1+1];
-        for(int i=deb1;i<=fin1;i++)
-            {
-            table1[i-deb1]=tableau.get(i);
-            }
-        
-        int compt1=deb1;
-        int compt2=deb2;
-        
-        for(int i=deb1;i<=fin2;i++)
-            {        
-            if (compt1==deb2) //c'est que tous les éléments du premier tableau ont été utilisés
-                {
-                break; //tous les éléments ont donc été classés
-                }
-            else if (compt2==(fin2+1)) //c'est que tous les éléments du second tableau ont été utilisés
-                {
-                tableau.add(i, table1[compt1-deb1]); //on ajoute les éléments restants du premier tableau
-                tableau.remove(i+1);
-                compt1++;
-                }
-            else if (table1[compt1-deb1].getDeb()<tableau.get(compt2).getDeb())
-                {
-                tableau.add(i,table1[compt1-deb1]); //on ajoute un élément du premier tableau
-                tableau.remove(i+1);
-                compt1++;
-                }
-            else
-                {
-                tableau.add(i,tableau.get(compt2)); //on ajoute un élément du second tableau
-                tableau.remove(i+1);
-                compt2++;
-                }
-            }
-        }
-   
-  //permet de créer un ensemble de points à intervalle régulier entre deux bornes
-  public static int[] discretisation(int deb, int fin, int nbpoints){
-      int[] subdivision = new int[nbpoints];
-      try{
-        int pas  = (fin - deb)/(nbpoints - 1);
-        for(int i = 0; i < nbpoints;i++){
-            subdivision[i] = deb + i * pas; 
-         }
-      }
-      catch(ArithmeticException e){
-          subdivision[0] = (deb + fin) / 2;
-      }
-      return subdivision;
-  }
-  
-  //@require : les paragraphes et les unités sont triés dans l'ordre
-  //@ensures : retourne une table associant les unités à leur numero de
-  //paragraphe
-  public static HashMap<Unite,Integer> unitenumeroparagraphe(Unite[] unites,Vue vue){ 
-    HashMap<Unite,Integer> numeroparagraphe = new HashMap<Unite,Integer>(unites.length);
-    int[] noparagraphe = (vue.getCorpus()).calculerNoParagraphe(unites); 
-    for(int i = 0; i < unites.length;i++){//pour toutes les unites 
-        numeroparagraphe.put(unites[i],noparagraphe[i]);
-    }
-    return numeroparagraphe; 
-  }  
-  //le nouveau type s'appellera "tout"
-  //attention les relations ne sont pas copiées pour vérifier pour maintenir le lien entre les unités
-  public static void fusionTypeUnite(Vue vue){
-      //on initialise les propriétés du nouveau type
-      long deb = System.nanoTime();
-    HashSet<String> nomsChamps = new HashSet(); 
-    for(String champ : (vue.getTypesUnitesAVoir().length==0 ? new String[0] : 
-            vue.getNomsChamps(Unite.class, vue.getTypesUnitesAVoir()[0]))){
-          nomsChamps.add(champ);
-    }
-    //les propriétés du nouveau seront l'intersection des propriétés de tous les types
-    for(String type : vue.getTypesUnitesAVoir()){
-        HashSet<String> nomsChampNonFiltres = (HashSet<String>) nomsChamps.clone();
-        nomsChamps = new HashSet();
-        for(String champ : vue.getNomsChamps(Unite.class, type)){
-            //si le champ est partagé par tous les autres types d'unités déjà passé en revue
-            //alors on l'ajoute à l'intersection provisoire
-            if(nomsChampNonFiltres.contains(champ)){
-                nomsChamps.add(champ);
-            }
-        }
-    }
-    //on parcours toutes les unités
-    for(String type : vue.getTypesUnitesAVoir()){
-        for(Unite unit : vue.getUnites(type)){
-            Unite cloneUnite = new Unite("tout",unit.getDeb(),unit.getFin());
-            for(String champ : nomsChamps){
-                cloneUnite.putProp(champ, vue.getValeurChamp(unit, champ));
-            }
-            vue.getCorpus().addUniteConvertit(cloneUnite);
-            //on ajoute la nouvelle unité aux autre schemas
-            for(Schema schemasContenant : unit.getSchemas()){
-                vue.getCorpus().ajouterElementSchemaSaisi(cloneUnite, schemasContenant);
-            }
-        }
-    }
-    long fin = System.nanoTime();
-    System.out.println((fin-deb)/1000000);
-    }  
-    //crée un type de schéma et les schémas correspondant à partir des choix de l'utilisateur
-  /*Deux éléments d'une même relation appartiennent au même Schéma et on crée un shéma 
-     pour chaque valeur différente d'une propriété de la relation*/
-  public static Schema[] conversion(String source,String nomType,String typeSource,String primaryKey, String[] otherKey,
-          Vue vue){
-      ArrayList<Schema> retour = new ArrayList();
-      HashMap<String,Schema> triSchema = new HashMap(); 
-       long deb = System.nanoTime();
-      switch(source){
-          case "Relation" :
-              Relation[] donnees = vue.getRelations(typeSource);
-              //pour toutes les relations
-              for(Relation Rel : donnees){
-                  String valeur = vue.getValeurChamp(Rel, primaryKey);
-                  //si aucun schema n'a la même valeur que la relation pour la clé primaire
-                  if(!triSchema.containsKey(valeur)){
-                      triSchema.put(valeur, new Schema(nomType));
-                      HashMap<String,String> propSchema = triSchema.get(valeur).getProps();
-                      //le schema prend les mêmes propriétés que le schéma
-                      for(String champ : Rel.getProps().keySet()){
-                          propSchema.put(champ, Rel.getProp(champ));
-                      }
-                  }
-                  triSchema.get(valeur).ajouter(Rel.getElt1());
-                  triSchema.get(valeur).ajouter(Rel.getElt2());
-              }
-              break;
-          case "typeUnite" :
-              //pour tous les types d'unités on crée un schéma
-              String[] typesUnites = vue.getTypesUnitesAVoir();
-              for(String type : typesUnites){
-                  triSchema.put(type,new Schema(nomType));
-                  HashMap<String,String> propSchema = triSchema.get(type).getProps();
-                  propSchema.put("type",type);
-                  for(Unite unit : vue.getUnites(type)){
-                    triSchema.get(type).ajouter(unit);
-                  }
-              }
-              break;
-          case "attributUnite" :
-              Unite[] UnitesAVoir = vue.getUnites(typeSource);
-              //pour toutes les unités
-              for(Unite unit : UnitesAVoir){
-                  String valeur = vue.getValeurChamp(unit, primaryKey);
-                  //si aucun schéma n'a la même valeur que l'unité pour la clé primaire
-                  if(!triSchema.containsKey(valeur)){
-                      triSchema.put(valeur, new Schema(nomType));
-                      HashMap<String,String> propSchema = triSchema.get(valeur).getProps();
-                      //le nouveau schéma prend les mêmes propriétés que l'unité
-                      propSchema.put(primaryKey, unit.getProp(primaryKey));
-                      for(String champ : otherKey){
-                          propSchema.put(champ, unit.getProp(champ));
-                      }
-                  }
-                  triSchema.get(valeur).ajouter(unit);
-              }
-              break;
-          default :
-              break;
-              
-      }
-      for(String valeur : triSchema.keySet()){
-          vue.getCorpus().addSchemaConvertit(triSchema.get(valeur));
-      }
-    long fin = System.nanoTime();
-    System.out.println((fin-deb)/1000000);
-      
-      return retour.toArray(new Schema[0]);
-  }
-  
-   //calcule les donnees nécessaires pour l'affichage du graphique dont l'axe des abscisses est le numéro de 
-   //paragraphe
-   public static HashMap<Integer,HashMap<String,Integer>> calculedonneecourbe(String[] typesdispo,String unitecomptage, Vue vue){
-       HashMap<Integer,HashMap<String,Integer>> donnees = new HashMap(); 
-       String texte =  vue.getCorpus().getTexte();
-       Integer[] noparagraphes = vue.getCorpus().getFinParagraphes();
-       int unitecourante = 0;
-       int paragraphecourant = 0;
-       int comptemot = 0;
-       int sommeUniteComptage = 0;
-       HashMap<Unite,Schema> chainesUnitesNonFiltrees = calculerChainesUnitesNonFiltrees(typesdispo,vue);
-       HashSet<Schema> chaineparagraphe = new HashSet();
-       Unite[] unites = ChaineUtil.getUniteesTrieesEtFiltrees(typesdispo,vue);
-       //initialisation
-       for(int i = 0;i < noparagraphes.length;i++){
-           donnees.put(i,new HashMap());
-           donnees.get(i).put("Nombre de Chaines de coreference",0);
-           donnees.get(i).put("Nombre de chainons",0);
-           donnees.get(i).put("ratio nombre de chainons par nombre de " + unitecomptage,0);
-           donnees.get(i).put("Densité référentielle",0);
-       }
-       for(int i = 0; i < texte.length();i++){
-           if(i > noparagraphes[paragraphecourant] || i == texte.length() - 1){
-               donnees.get(paragraphecourant).put("Nombre de Chaines de coreference",chaineparagraphe.size());
-               donnees.get(paragraphecourant).put("ratio nombre de chainons par nombre de " + unitecomptage,
-                     Math.round(sommeUniteComptage * 100.0f / (unitecomptage.equals("Mots") ? comptemot : 
-                             (noparagraphes[paragraphecourant] - (paragraphecourant==0 ? 0 : 
-                                     noparagraphes[paragraphecourant - 1])))));
-               donnees.get(paragraphecourant).put("Densité référentielle",
-                       Math.round((100.0f * donnees.get(paragraphecourant).get("Nombre de chainons")) / 
-                               (unitecomptage=="Mots" ? comptemot : (noparagraphes[paragraphecourant] - 
-                                       (paragraphecourant==0 ? 0 :  noparagraphes[paragraphecourant - 1])))));
-               chaineparagraphe = new HashSet();
-               paragraphecourant = paragraphecourant + 1;
-               comptemot = 1;
-               sommeUniteComptage = 0;
-           }
-           //si on decouvre une unité
-           while(unitecourante < unites.length && unites[unitecourante].getDeb()==i){
-               if(chainesUnitesNonFiltrees.containsKey(unites[unitecourante])){
-               donnees.get(paragraphecourant).put("Nombre de chainons", 
-                       (int) donnees.get(paragraphecourant).get("Nombre de chainons") + 1);
-               chaineparagraphe.add(chainesUnitesNonFiltrees.get(unites[unitecourante]));
-               sommeUniteComptage = sommeUniteComptage + (unitecomptage=="Mots" ? 
-                       ChaineUtil.nbMotsDansUneUnite(unites[unitecourante].getDeb(),unites[unitecourante].getFin(),vue)
-                       : unites[unitecourante].getFin() - unites[unitecourante].getDeb());
-               }
-               unitecourante = unitecourante + 1;
-           }
-            //si on change de mot
-            if(unitecomptage.equals("Mots") && texte.charAt(i)==' '){
-                comptemot = comptemot + 1;
-            }
-       }
-       
-       return donnees;
-   }
-   
-
-  //struture qui n'est pas filtrées mais qui associe à une unité qui correspond au bon type d'unités
-  //contenu dans "typeUnités" la chaine qui la contient et qui est elle aussi du bon type de Schéma
-  private static HashMap<Unite,Schema> calculerChainesUnitesNonFiltrees(String[] typeUnites, Vue vue) throws UnsupportedOperationException {
-    HashMap<Unite,Schema> chainesUnitesNonFiltrees = new HashMap();
-    for(String typechaine : vue.getTypesSchemasAVoir()){
-        Schema[] chaines = vue.getSchemas(typechaine);
-        for (Schema chaine : chaines){
-            HashSet<Element> contenu = chaine.getContenu();
-          for (Element elt : contenu) {
-            if (elt.getClass()==Unite.class && ChaineUtil.tableauRecherche(typeUnites,elt.getType())) {
-              if (chainesUnitesNonFiltrees.containsKey(elt)) {
-                throw new UnsupportedOperationException("L'unité "+vue.getIdElement(elt)
-                        +" appartient à deux chaînes : "+vue.getIdElement(chaine)+" et "
-                        +vue.getIdElement(chainesUnitesNonFiltrees.get((Unite) elt)));
-              } else
-                chainesUnitesNonFiltrees.put((Unite) elt, chaine);
-            }
-          }
-        }
-    }
-    return chainesUnitesNonFiltrees;
-  }
-  
-  //renvoie la valeur en un point d'un polynome interpolé à partir de deux tableau représentant les coordonnées de points
-  public static Integer interpolationLagrangienne(Integer[] abscisse,Integer[] ordonnee,int value){
-      if(abscisse.length == ordonnee.length){
-          Double retour = 0.0d; 
-          for(int i = 0;i<abscisse.length;i++ ){
-              Double produit = 1.0d ;
-              for(int j = 0; j < abscisse.length;j++){
-                  if(i!=j){
-                      produit = produit * (value - abscisse[j]) / (abscisse[i] - abscisse[j]);
-                  }
-              }
-              retour = retour + produit * ordonnee[i];
-          }
-          return (Math.round(retour)<0 ? 0 : (int) Math.round(retour));
-          
-      }
-      return -1;
-  }
-  /*@require: abscisse and length have the same length*/
-  public static ArrayList<Float[]> coef_spline_quad(Integer[] abscisse,Integer[] ordonnee){
-      Float[] coef_abs =  new Float[abscisse.length];
-      Float[] coef_ord =  new Float[ordonnee.length];
-      ArrayList<Float[]> retour  = new ArrayList();
-      coef_abs[0] = 0.0f;
-      for(int i = 1 ; i < abscisse.length;i++){
-          coef_abs[i] = 1.0f*2*(ordonnee[i]-ordonnee[i-1])/(abscisse[i]-abscisse[i-1]);
-          coef_ord[i] = ordonnee[i-1] + coef_abs[i-1] * (abscisse[i]-abscisse[i-1]) / 2 ;
-          
-      }
-      retour.add(coef_abs);
-      retour.add(coef_ord);
-      return retour;
-      
-  }
-  /*@require: abscisse and length have the same length superior to 2*/
-  public static Integer interpolation_spline_quad(Integer[] abscisse,Integer[] ordonnee,int value){
-      float retour;
-      ArrayList<Float[]> coef = coef_spline_quad(abscisse,ordonnee);
-      retour = coef.get(1)[1];
-      for(int i = 1; i < abscisse.length;i++){
-          if(value > abscisse[i-1] && value < abscisse[i]){
-              retour = 0 - coef.get(0)[i-1] * (value - abscisse[i]) * (value - abscisse[i]) + coef.get(0)[i]
-                       * (value - abscisse[i-1]) * (value - abscisse[i-1])/2/(abscisse[i]-abscisse[i-1])
-                      + coef.get(1)[i];
-          }
-      }
-      return  Math.round(retour);
-  }
-      
+	
+	// renvoie un HashMap qui à un nombre de chainons de la chaine associe le nombre de chaines
+	// qui ont ce nombre de chainons
+	public static HashMap<Integer, Integer> calculerdonneecourbechainons(String[] typesdispo, Vue vue) {
+		String[] typesChaines = vue.getTypesSchemasAVoir();
+		HashMap<Integer, Integer> retour = new HashMap();
+		for (String typechaine : typesChaines) {
+			Schema[] chaines = vue.getSchemas(typechaine);
+			for (Schema chaine : chaines) {
+				HashSet<Element> contenu = chaine.getContenu();
+				int compte = 0;
+				for (Element elt : contenu) {
+					if (elt.getClass() == Unite.class && tableauRecherche(typesdispo, elt.getType())) {
+						compte = compte + 1;
+					}
+				}
+				if (retour.containsKey(compte)) {
+					retour.put(compte, retour.get(compte) + 1);
+				}
+				else {
+					retour.put(compte, 1);
+				}
+			}
+		}
+		return retour;
+	}
+	
+	
+	
+	
+	
+	// Calcule à partir de la position en caractères la position en mot dans une chaine de caractère
+	// @require : la position en caractère doit être inférieure à la longueur de la chaine
+	private static int calculerPositionMot(int poscaractere, String chaine, Vue vue) {
+		int compteur = 1;
+		int i = 0;
+		while (i < poscaractere) {
+			if (chaine.charAt(i) == '\n' || chaine.charAt(i) == ' ' || chaine.charAt(i) == '\r') {
+				while (i < poscaractere && (chaine.charAt(i) == '\n' || chaine.charAt(i) == ' '
+						|| chaine.charAt(i) == '\r')) {
+					i = i + 1;
+				}
+				compteur = compteur + 1;
+			}
+			i = i + 1;
+		}
+		return compteur;
+	}
+	
+	// cherche la position en nombre d'un caractère mot dans le corpus
+	public static int calculerPositionMotCorpus(int poscaractere, Vue vue) {
+		String corpus = vue.getCorpus().getTexte();
+		int resultat = 0;
+		Integer[] finparagraphe = vue.getCorpus().getFinParagraphes();
+		int finparagraphecourant = 0;
+		for (int i = 0; i < corpus.length(); i++) {
+			if (corpus.charAt(i) == ' ' || i > finparagraphe[finparagraphecourant]) {
+				resultat = resultat + 1;
+				if (i > finparagraphe[finparagraphecourant]) {
+					finparagraphecourant = finparagraphecourant + 1;
+				}
+			}
+			if (i == poscaractere) {
+				return resultat;
+			}
+		}
+		return resultat;
+	}
+	
+	// donne le nombre de paragraphes du corpus
+	public static int nbParagraphe(Vue vue) {
+		return vue.getCorpus().getFinParagraphes().length;
+	}
+	
+	// donne le nombre de caractères du corpus
+	public static int nbCaractere(Vue vue) {
+		return vue.getCorpus().getTexte().length();
+	}
+	
+	// donne le nombre de mots du Corpus
+	public static int nbMot(Vue vue) {
+		return calculerPositionMotCorpus(nbCaractere(vue) - 1, vue);
+	}
+	
+	// donne le nombre d'unité appartenant à une chaine
+	public static int nombreDeReference(String[] typesUnite, Vue vue) {
+		String[] types = vue.getTypesSchemasAVoir();
+		int compte = 0;
+		for (String type : types) {
+			Schema[] chaines = vue.getSchemas(type);
+			for (Schema chaine : chaines) {
+				for (Element unit : chaine.getContenu()) {
+					if (unit.getClass() == Unite.class && tableauRecherche(typesUnite, unit.getType())) {
+						compte = compte + 1;
+					}
+				}
+			}
+		}
+		return compte;
+	}
+	
+	// donne le nombre de chaines non vides
+	public static int nbChaines(Vue vue) {
+		String[] types = vue.getTypesSchemasAVoir();
+		int compte = 0;
+		for (String type : types) {
+			Schema[] chaines = vue.getSchemas(type);
+			for (Schema chaine : chaines) {
+				if (chaine.getContenu().size() > 0) {
+					compte = compte + 1;
+				}
+			}
+		}
+		return compte;
+	}
+	
+	// calcule le nombre de références par unité de longueur "choix"
+	public static float densiteReferentielle(String choix, String[] types, Vue vue) {
+		float compte = 0.0f;
+		compte = compte + nombreDeReference(types, vue);
+		switch (choix) {
+			case "Caractère":
+				compte = Math.round(compte * 10000.0f / nbCaractere(vue)) / 10000.0f;
+				break;
+			case "Mot":
+				compte = Math.round(compte * 10000.0f / nbMot(vue)) / 10000.0f;
+				break;
+			case "Paragraphe":
+				compte = Math.round(compte * 10000.0f / nbParagraphe(vue)) / 10000.0f;
+				break;
+			default:
+				break;
+			
+		}
+		return compte;
+	}
+	
+	// attention les unités sont dans le désordre
+	public static ArrayList<Integer> positionUnite(String[] types, Vue vue) {
+		ArrayList<Integer> retour = new ArrayList<>();
+		for (String type : types) {
+			Unite[] unites = vue.getUnites(type);
+			for (Unite unit : unites) {
+				retour.add(unit.getDeb());
+			}
+		}
+		return retour;
+	}
+	
+	// renvoie les unités dont le type est contenu dans le tableau "types" puis et triée par ordre d'apparition
+	// dans le corpus
+	public static Unite[] getUniteesTrieesEtFiltrees(String[] types, Vue vue) {
+		ArrayList<Unite> stockage = new ArrayList<>();
+		for (String type : types) {
+			Unite[] tmp = vue.getUnites(type);
+			for (int i = 0; i < tmp.length; i++) {
+				stockage.add(tmp[i]);
+			}
+		}
+		Unite[] retour = stockage.toArray(new Unite[stockage.size()]);
+		triFusionUnite(retour);
+		return retour;
+	}
+	
+	// calcule les position en nombre de mots au sein d'un corpus des unités dont le
+	// type est contenu dans le tableau "types" puis et triée par ordre d'apparition
+	public static ArrayList<Integer> positionUniteEnMot(String[] types, Vue vue) {
+		Unite[] donnees = getUniteesTrieesEtFiltrees(types, vue);
+		int postexte = 0;
+		int comptemot = 0;
+		String texte = vue.getCorpus().getTexte();
+		ArrayList<Integer> retour = new ArrayList<>();
+		for (int i = 0; i < donnees.length; i++) {
+			while (postexte < donnees[i].getDeb()) {
+				if (texte.charAt(postexte) == ' ' || texte.charAt(postexte) == '\n') {
+					comptemot = comptemot + 1;
+				}
+				postexte = postexte + 1;
+			}
+			retour.add(comptemot);
+		}
+		return retour;
+	}
+	
+	// calcule les écarts en nombre de caractères au sein d'un corpus des unités dont le
+	// type est contenu dans le tableau "types"
+	// les écarts sont la différence les positions de début de deux unités consécutives respectant toutes deux
+	// un type d'unités contenu dans "types"
+	public static ArrayList<Integer> ecartUniteCaractere(String[] types, Vue vue) {
+		ArrayList<Integer> retour = new ArrayList<>();
+		Unite[] unites = getUniteesTrieesEtFiltrees(types, vue);
+		for (int i = 0; i < unites.length - 1; i++) {
+			retour.add(unites[i + 1].getDeb() - unites[i].getDeb());
+		}
+		return retour;
+	}
+	
+	// calcule les écarts en nombre de mots au sein d'un corpus des unités dont le
+	// type est contenu dans le tableau "types"
+	// les écarts sont la différence les positions de début de deux unités consécutives respectant toutes deux
+	// un type d'unités contenu dans "types"
+	public static ArrayList<Integer> ecartUniteMot(String[] types, Vue vue) {
+		ArrayList<Integer> retour = new ArrayList<>();
+		Unite[] unites = getUniteesTrieesEtFiltrees(types, vue);
+		for (int i = 0; i < unites.length - 1; i++) {
+			String texte = vue.getCorpus().getTexte().substring(unites[i].getDeb(), unites[i + 1].getDeb());
+			int compte = 0;
+			for (int j = 0; j < texte.length(); j++) {
+				if (texte.charAt(j) == ' ' || texte.charAt(j) == '\n') {
+					compte = compte + 1;
+				}
+			}
+			retour.add(compte);
+		}
+		return retour;
+	}
+	
+	// détermine les longueurs en mots des unités contenu dans un corpus et dont le
+	// type est contenu dans le tableau "types"
+	public static ArrayList<Integer> longueurUniteMot(String[] types, Vue vue) {
+		ArrayList<Integer> retour = new ArrayList<>();
+		for (String type : types) {
+			Unite[] unites = vue.getUnites(type);
+			for (int i = 0; i < unites.length; i++) {
+				String texte = vue.getCorpus().getTexte().substring(unites[i].getDeb(), unites[i].getFin());
+				int compte = 0;
+				for (int j = 0; j < texte.length(); j++) {
+					if (texte.charAt(j) == ' ' || texte.charAt(j) == '\n') {
+						compte = compte + 1;
+					}
+				}
+				retour.add(compte);
+			}
+		}
+		return retour;
+	}
+	
+	// détermine les longueurs en nombre de caractères des unités contenu dans un corpus et dont le
+	// type est contenu dans le tableau "types"
+	public static ArrayList<Integer> longueurUniteCaractere(String[] types, Vue vue) {
+		ArrayList<Integer> retour = new ArrayList<>();
+		for (String type : types) {
+			Unite[] unites = vue.getUnites(type);
+			for (int i = 0; i < unites.length; i++) {
+				int compte = unites[i].getFin() - unites[i].getDeb();
+				retour.add(compte);
+			}
+		}
+		return retour;
+	}
+	
+	// pas optimisé comme un binary search car on a pas d'ordre défini sur les objets du tableau
+	// et donc le tableau n'est pas trié
+	public static boolean tableauRecherche(Object[] tab, Object elt) {
+		for (Object unit : tab) {
+			if (unit.equals(elt)) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	// détermine la longueur des chaines en caractères
+	public static ArrayList<Integer> longueurChaineCaractere(String[] types, Vue vue) {
+		String[] typeschaine = vue.getTypesSchemasAVoir();
+		ArrayList<Integer> retour = new ArrayList();
+		for (String type : typeschaine) {
+			Schema[] chaines = vue.getSchemas(type);
+			for (Schema chaine : chaines) {
+				HashSet<Element> contenu = chaine.getContenu();
+				Integer compte = 0;
+				for (Element elt : contenu) {
+					if (elt.getClass() == Unite.class && tableauRecherche(types, elt.getType())) {
+						Unite tmp = (Unite) elt;
+						compte = compte + tmp.getFin() - tmp.getDeb();
+					}
+				}
+				retour.add(compte);
+			}
+		}
+		return retour;
+	}
+	
+	// détermine la longueur des chaines en mots en sommant la longueur des maillons dont le type est contenu
+	// dans "types"
+	public static ArrayList<Integer> longueurChaineMot(String[] types, Vue vue) {
+		String[] typeschaine = vue.getTypesSchemasAVoir();
+		ArrayList<Integer> retour = new ArrayList();
+		for (String type : typeschaine) {
+			Schema[] chaines = vue.getSchemas(type);
+			for (Schema chaine : chaines) {
+				HashSet<Element> contenu = chaine.getContenu();
+				Integer compte = 0;
+				for (Element elt : contenu) {
+					if (elt.getClass() == Unite.class && tableauRecherche(types, elt.getType())) {
+						Unite tmp = (Unite) elt;
+						String texte = vue.getCorpus().getTexte().substring(tmp.getDeb(), tmp.getFin());
+						for (int i = 0; i < texte.length(); i++) {
+							if (texte.charAt(i) == ' ' || texte.charAt(i) == '\n') {
+								compte = compte + 1;
+							}
+						}
+					}
+				}
+				retour.add(compte);
+			}
+		}
+		return retour;
+	}
+	
+	
+	// calcule le nombre de chainons(unités) dont le type est contenu dans "types" de chaque chaine
+	public static ArrayList<Integer> nombreDeChainons(String[] types, Vue vue) {
+		String[] typeschaines = vue.getTypesSchemasAVoir();
+		ArrayList retour = new ArrayList();
+		for (String type : typeschaines) {
+			Schema[] chaines = vue.getSchemas(type);
+			for (Schema chaine : chaines) {
+				HashSet<Element> contenu = chaine.getContenu();
+				Integer compte = 0;
+				for (Element elt : contenu) {
+					if (elt.getClass() == Unite.class && tableauRecherche(types, elt.getType())) {
+						compte = compte + 1;
+					}
+				}
+				retour.add(compte);
+			}
+		}
+		return retour;
+	}
+	
+	
+	
+	// recherche le numero de paragraphe dans le corpus qui correspond à une position en caractère
+	public static int conversionPositionCaracterEtNoParagraphe(int poscaractere, Vue vue) {
+		Integer[] noparagraphe = vue.getCorpus().getFinParagraphes();
+		for (int i = 0; i < noparagraphe.length; i++) {
+			if (poscaractere > noparagraphe[i] || i == noparagraphe.length - 1) {
+				return i;
+			}
+			
+		}
+		return -1;
+	}
+	
+	
+	// @ensures : retourne la longueur d'une unité en caractère
+	public static int longueurUnite(Unite donnee) {
+		return (donnee.getFin() - donnee.getDeb());
+	}
+	
+	// @ensures : retourne la longueur d'une unite en mot
+	public static int nbMotUnite(Unite donnee, Vue vue) {
+		String chaine = (vue.getCorpus()).getTexteUnite(donnee);
+		return calculerPositionMot(chaine.length(), chaine, vue);
+	}
+	
+	// cherche le maximum d'un tableau pas forcément trié
+	public static Integer maxiTab(Integer[] donnees) {
+		Integer max = -1;
+		if (donnees.length > 0) {
+			max = donnees[0];
+			for (Integer nbr : donnees) {
+				if (nbr > max) {
+					max = nbr;
+				}
+			}
+		}
+		return max;
+	}
+	
+	// cherche le minimum d'un tableau pas forcément trié
+	public static Integer miniTab(Integer[] donnees) {
+		Integer min = -1;
+		if (donnees.length > 0) {
+			min = donnees[0];
+			for (Integer nbr : donnees) {
+				if (nbr < min) {
+					min = nbr;
+				}
+			}
+		}
+		return min;
+	}
+	
+	// retourne la somme des éléments d'un tableau
+	public static int somme(Integer[] donnees) {
+		int total = 0;
+		for (Integer nbr : donnees) {
+			total = total + nbr;
+		}
+		return total;
+	}
+	
+	
+	public static int nbMotsDansUneUnite(int deb, int fin, Vue vue) {
+		String texteunite = vue.getCorpus().getTexte().substring(deb, fin);
+		int compte = (deb < fin ? 1 : 0);
+		for (int i = 0; i < texteunite.length(); i++) {
+			if (texteunite.charAt(i) == ' ') {
+				compte = compte + 1;
+			}
+		}
+		return compte;
+	}
+	
+	// permet de trier un tableau de valeurs suivant leur fréquence
+	public static void triFusionMap(String tableau[], HashMap<String, Float> freq) {
+		int longueur = tableau.length;
+		if (longueur > 0) {
+			triFusionMap(tableau, 0, longueur - 1, freq);
+		}
+	}
+	
+	private static void triFusionMap(String tableau[], int deb, int fin, HashMap<String, Float> freq) {
+		if (deb != fin) {
+			int milieu = (fin + deb) / 2;
+			triFusionMap(tableau, deb, milieu, freq);
+			triFusionMap(tableau, milieu + 1, fin, freq);
+			fusionMap(tableau, deb, milieu, fin, freq);
+		}
+	}
+	
+	private static void fusionMap(String tableau[], int deb1, int fin1, int fin2, HashMap<String, Float> freq) {
+		int deb2 = fin1 + 1;
+		
+		// on recopie les éléments du début du tableau
+		String table1[] = new String[fin1 - deb1 + 1];
+		for (int i = deb1; i <= fin1; i++) {
+			table1[i - deb1] = tableau[i];
+		}
+		
+		int compt1 = deb1;
+		int compt2 = deb2;
+		
+		for (int i = deb1; i <= fin2; i++) {
+			if (compt1 == deb2) // c'est que tous les éléments du premier tableau ont été utilisés
+			{
+				break; // tous les éléments ont donc été classés
+			}
+			else if (compt2 == (fin2 + 1)) // c'est que tous les éléments du second tableau ont été utilisés
+			{
+				tableau[i] = table1[compt1 - deb1]; // on ajoute les éléments restants du premier tableau
+				compt1++;
+			}
+			else if (freq.get(table1[compt1 - deb1]) > freq.get(tableau[compt2])) {
+				tableau[i] = table1[compt1 - deb1]; // on ajoute un élément du premier tableau
+				compt1++;
+			}
+			else {
+				tableau[i] = tableau[compt2]; // on ajoute un élément du second tableau
+				compt2++;
+			}
+		}
+	}
+	
+	// on enlève les unités dont le numero de paragraphe appartient à Noparagraphe
+	public static Unite[] filtreparagraphe(Unite[] donnees, ArrayList<Integer> Noparagraphemasque, Vue vue) {
+		HashMap<Unite, Integer> noparagraphe = unitenumeroparagraphe(donnees, vue);
+		ArrayList<Unite> unitefiltrees = new ArrayList();
+		for (Unite unit : donnees) {
+			if (!(Noparagraphemasque.contains(noparagraphe.get(unit)))) {
+				unitefiltrees.add(unit);
+			}
+		}
+		Unite[] resultat = unitefiltrees.toArray(new Unite[0]);
+		return resultat;
+	}
+	
+	// renvoie un tableau contenant les fréquences de chaque valeur d'un champ dans la liste d'unités
+	public static HashMap<String, Float> calculerfrequencechamp(Unite[] donnees, String typeUnites, String Champcible, Vue vue) {
+		String[] valsdisponibles = vue.getValeursChamp(Unite.class, typeUnites, Champcible);
+		HashMap<String, Float> tableaufrequence = new HashMap<>(valsdisponibles.length + 1);
+		String valeurchamp;
+		// on initialise le tableau résultat
+		for (String valeur : valsdisponibles) {
+			tableaufrequence.put(valeur, 0.0f);
+		}
+		tableaufrequence.put("", 0.0f);
+		// on compte le nombre d'occurences
+		for (Unite unit : donnees) {
+			valeurchamp = vue.getValeurChamp(unit, Champcible);
+			tableaufrequence.put(valeurchamp, tableaufrequence.get(valeurchamp) + 1);
+		}
+		// on calcule les pourcentages
+		for (String valeur : valsdisponibles) {
+			tableaufrequence.put(valeur, tableaufrequence.get(valeur) * 10000.0f /
+					donnees.length / 100.0f);
+		}
+		tableaufrequence.put("", tableaufrequence.get("") * 10000.0f /
+				donnees.length / 100.0f);
+		
+		return tableaufrequence;
+	}
+	
+	// détermine la moyenne par rapport à la deuxième variable d'un HashMap
+	public static float Esperance(HashMap<Object, Integer> donnees) {
+		float moyenne = 0.0f;
+		for (Object i : donnees.keySet()) {
+			moyenne = moyenne + donnees.get(i);
+		}
+		moyenne = moyenne / donnees.size();
+		return moyenne;
+	}
+	
+	// détermine la moyenne des valeurs d'un tableau
+	public static float Esperance(Integer[] donnees) {
+		float moyenne = 0.0f;
+		for (Integer i : donnees) {
+			moyenne = moyenne + i;
+		}
+		moyenne = moyenne / donnees.length;
+		return moyenne;
+	}
+	
+	// détermine la variance par rapport à la deuxième variable d'un HashMap
+	public static float Variance(HashMap<Object, Integer> donnees) {
+		float moyenne = Esperance(donnees);
+		float variance = 0.0f;
+		if (donnees.size() > 1) {
+			for (Object i : donnees.keySet()) {
+				variance = variance + (donnees.get(i) - moyenne) * (donnees.get(i) - moyenne);
+			}
+			variance = variance / (donnees.size() - 1);
+		}
+		
+		return variance;
+	}
+	
+	// détermine la variance des valeurs d'un tableau
+	public static float Variance(Integer[] donnees) {
+		float moyenne = Esperance(donnees);
+		float variance = 0.0f;
+		if (donnees.length > 1) {
+			for (Integer i : donnees) {
+				variance = variance + (i - moyenne) * (i - moyenne);
+			}
+			variance = variance / (donnees.length - 1);
+		}
+		return variance;
+	}
+	
+	// permet de trier les unités d'un tableau
+	// la relation d'ordre entre les unités est la comparaison des positions de débuts des unités au sein du texte
+	public static void triFusionUnite(Unite tableau[]) {
+		int longueur = tableau.length;
+		if (longueur > 0) {
+			triFusionUnite(tableau, 0, longueur - 1);
+		}
+	}
+	
+	private static void triFusionUnite(Unite tableau[], int deb, int fin) {
+		if (deb != fin) {
+			int milieu = (fin + deb) / 2;
+			triFusionUnite(tableau, deb, milieu);
+			triFusionUnite(tableau, milieu + 1, fin);
+			fusionUnite(tableau, deb, milieu, fin);
+		}
+	}
+	
+	private static void fusionUnite(Unite tableau[], int deb1, int fin1, int fin2) {
+		int deb2 = fin1 + 1;
+		
+		// on recopie les éléments du début du tableau
+		Unite table1[] = new Unite[fin1 - deb1 + 1];
+		for (int i = deb1; i <= fin1; i++) {
+			table1[i - deb1] = tableau[i];
+		}
+		
+		int compt1 = deb1;
+		int compt2 = deb2;
+		
+		for (int i = deb1; i <= fin2; i++) {
+			if (compt1 == deb2) // c'est que tous les éléments du premier tableau ont été utilisés
+			{
+				break; // tous les éléments ont donc été classés
+			}
+			else if (compt2 == (fin2 + 1)) // c'est que tous les éléments du second tableau ont été utilisés
+			{
+				tableau[i] = table1[compt1 - deb1]; // on ajoute les éléments restants du premier tableau
+				compt1++;
+			}
+			else if (table1[compt1 - deb1].getDeb() < tableau[compt2].getDeb()) {
+				tableau[i] = table1[compt1 - deb1]; // on ajoute un élément du premier tableau
+				compt1++;
+			}
+			else {
+				tableau[i] = tableau[compt2]; // on ajoute un élément du second tableau
+				compt2++;
+			}
+		}
+	}
+	
+	// permet de trier les unités d'une arrayList
+	// la relation d'ordre entre les unités est la comparaison des positions de débuts des unités au sein du texte
+	public static void triFusionUnite(ArrayList<Unite> tableau) {
+		int longueur = tableau.size();
+		if (longueur > 0) {
+			triFusionUnite(tableau, 0, longueur - 1);
+		}
+	}
+	
+	private static void triFusionUnite(ArrayList<Unite> tableau, int deb, int fin) {
+		if (deb != fin) {
+			int milieu = (fin + deb) / 2;
+			triFusionUnite(tableau, deb, milieu);
+			triFusionUnite(tableau, milieu + 1, fin);
+			fusionUnite(tableau, deb, milieu, fin);
+		}
+	}
+	
+	private static void fusionUnite(ArrayList<Unite> tableau, int deb1, int fin1, int fin2) {
+		int deb2 = fin1 + 1;
+		
+		// on recopie les éléments du début du tableau
+		Unite table1[] = new Unite[fin1 - deb1 + 1];
+		for (int i = deb1; i <= fin1; i++) {
+			table1[i - deb1] = tableau.get(i);
+		}
+		
+		int compt1 = deb1;
+		int compt2 = deb2;
+		
+		for (int i = deb1; i <= fin2; i++) {
+			if (compt1 == deb2) // c'est que tous les éléments du premier tableau ont été utilisés
+			{
+				break; // tous les éléments ont donc été classés
+			}
+			else if (compt2 == (fin2 + 1)) // c'est que tous les éléments du second tableau ont été utilisés
+			{
+				tableau.add(i, table1[compt1 - deb1]); // on ajoute les éléments restants du premier tableau
+				tableau.remove(i + 1);
+				compt1++;
+			}
+			else if (table1[compt1 - deb1].getDeb() < tableau.get(compt2).getDeb()) {
+				tableau.add(i, table1[compt1 - deb1]); // on ajoute un élément du premier tableau
+				tableau.remove(i + 1);
+				compt1++;
+			}
+			else {
+				tableau.add(i, tableau.get(compt2)); // on ajoute un élément du second tableau
+				tableau.remove(i + 1);
+				compt2++;
+			}
+		}
+	}
+	
+	// permet de créer un ensemble de points à intervalle régulier entre deux bornes
+	public static int[] discretisation(int deb, int fin, int nbpoints) {
+		int[] subdivision = new int[nbpoints];
+		try {
+			int pas = (fin - deb) / (nbpoints - 1);
+			for (int i = 0; i < nbpoints; i++) {
+				subdivision[i] = deb + i * pas;
+			}
+		}
+		catch (ArithmeticException e) {
+			subdivision[0] = (deb + fin) / 2;
+		}
+		return subdivision;
+	}
+	
+	// @require : les paragraphes et les unités sont triés dans l'ordre
+	// @ensures : retourne une table associant les unités à leur numero de
+	// paragraphe
+	public static HashMap<Unite, Integer> unitenumeroparagraphe(Unite[] unites, Vue vue) {
+		HashMap<Unite, Integer> numeroparagraphe = new HashMap<>(unites.length);
+		int[] noparagraphe = (vue.getCorpus()).calculerNoParagraphe(unites);
+		for (int i = 0; i < unites.length; i++) {// pour toutes les unites
+			numeroparagraphe.put(unites[i], noparagraphe[i]);
+		}
+		return numeroparagraphe;
+	}
+	
+	// le nouveau type s'appellera "tout"
+	// attention les relations ne sont pas copiées pour vérifier pour maintenir le lien entre les unités
+	public static void fusionTypeUnite(Vue vue) {
+		// on initialise les propriétés du nouveau type
+		long deb = System.nanoTime();
+		HashSet<String> nomsChamps = new HashSet();
+		for (String champ : (vue.getTypesUnitesAVoir().length == 0 ? new String[0] : vue.getNomsChamps(Unite.class, vue.getTypesUnitesAVoir()[0]))) {
+			nomsChamps.add(champ);
+		}
+		// les propriétés du nouveau seront l'intersection des propriétés de tous les types
+		for (String type : vue.getTypesUnitesAVoir()) {
+			HashSet<String> nomsChampNonFiltres = (HashSet<String>) nomsChamps.clone();
+			nomsChamps = new HashSet();
+			for (String champ : vue.getNomsChamps(Unite.class, type)) {
+				// si le champ est partagé par tous les autres types d'unités déjà passé en revue
+				// alors on l'ajoute à l'intersection provisoire
+				if (nomsChampNonFiltres.contains(champ)) {
+					nomsChamps.add(champ);
+				}
+			}
+		}
+		// on parcours toutes les unités
+		for (String type : vue.getTypesUnitesAVoir()) {
+			for (Unite unit : vue.getUnites(type)) {
+				Unite cloneUnite = new Unite("tout", unit.getDeb(), unit.getFin());
+				for (String champ : nomsChamps) {
+					cloneUnite.putProp(champ, vue.getValeurChamp(unit, champ));
+				}
+				vue.getCorpus().addUniteConvertit(cloneUnite);
+				// on ajoute la nouvelle unité aux autre schemas
+				for (Schema schemasContenant : unit.getSchemas()) {
+					vue.getCorpus().ajouterElementSchemaSaisi(cloneUnite, schemasContenant);
+				}
+			}
+		}
+		long fin = System.nanoTime();
+		System.out.println((fin - deb) / 1000000);
+	}
+	
+	// crée un type de schéma et les schémas correspondant à partir des choix de l'utilisateur
+	/*
+	 * Deux éléments d'une même relation appartiennent au même Schéma et on crée un shéma
+	 * pour chaque valeur différente d'une propriété de la relation
+	 */
+	public static Schema[] conversion(String source, String nomType, String typeSource, String primaryKey, String[] otherKey,
+			Vue vue) {
+		ArrayList<Schema> retour = new ArrayList();
+		HashMap<String, Schema> triSchema = new HashMap();
+		long deb = System.nanoTime();
+		switch (source) {
+			case "Relation":
+				Relation[] donnees = vue.getRelations(typeSource);
+				// pour toutes les relations
+				for (Relation Rel : donnees) {
+					String valeur = vue.getValeurChamp(Rel, primaryKey);
+					// si aucun schema n'a la même valeur que la relation pour la clé primaire
+					if (!triSchema.containsKey(valeur)) {
+						triSchema.put(valeur, new Schema(nomType));
+						HashMap<String, String> propSchema = triSchema.get(valeur).getProps();
+						// le schema prend les mêmes propriétés que le schéma
+						for (String champ : Rel.getProps().keySet()) {
+							propSchema.put(champ, Rel.getProp(champ));
+						}
+					}
+					triSchema.get(valeur).ajouter(Rel.getElt1());
+					triSchema.get(valeur).ajouter(Rel.getElt2());
+				}
+				break;
+			case "typeUnite":
+				// pour tous les types d'unités on crée un schéma
+				String[] typesUnites = vue.getTypesUnitesAVoir();
+				for (String type : typesUnites) {
+					triSchema.put(type, new Schema(nomType));
+					HashMap<String, String> propSchema = triSchema.get(type).getProps();
+					propSchema.put("type", type);
+					for (Unite unit : vue.getUnites(type)) {
+						triSchema.get(type).ajouter(unit);
+					}
+				}
+				break;
+			case "attributUnite":
+				Unite[] UnitesAVoir = vue.getUnites(typeSource);
+				// pour toutes les unités
+				for (Unite unit : UnitesAVoir) {
+					String valeur = vue.getValeurChamp(unit, primaryKey);
+					// si aucun schéma n'a la même valeur que l'unité pour la clé primaire
+					if (!triSchema.containsKey(valeur)) {
+						triSchema.put(valeur, new Schema(nomType));
+						HashMap<String, String> propSchema = triSchema.get(valeur).getProps();
+						// le nouveau schéma prend les mêmes propriétés que l'unité
+						propSchema.put(primaryKey, unit.getProp(primaryKey));
+						for (String champ : otherKey) {
+							propSchema.put(champ, unit.getProp(champ));
+						}
+					}
+					triSchema.get(valeur).ajouter(unit);
+				}
+				break;
+			default:
+				break;
+			
+		}
+		for (String valeur : triSchema.keySet()) {
+			vue.getCorpus().addSchemaConvertit(triSchema.get(valeur));
+		}
+		long fin = System.nanoTime();
+		System.out.println((fin - deb) / 1000000);
+		
+		return retour.toArray(new Schema[0]);
+	}
+	
+	// calcule les donnees nécessaires pour l'affichage du graphique dont l'axe des abscisses est le numéro de
+	// paragraphe
+	public static HashMap<Integer, HashMap<String, Integer>> calculedonneecourbe(String[] typesdispo, String unitecomptage, Vue vue) {
+		HashMap<Integer, HashMap<String, Integer>> donnees = new HashMap();
+		String texte = vue.getCorpus().getTexte();
+		Integer[] noparagraphes = vue.getCorpus().getFinParagraphes();
+		int unitecourante = 0;
+		int paragraphecourant = 0;
+		int comptemot = 0;
+		int sommeUniteComptage = 0;
+		HashMap<Unite, Schema> chainesUnitesNonFiltrees = calculerChainesUnitesNonFiltrees(typesdispo, vue);
+		HashSet<Schema> chaineparagraphe = new HashSet();
+		Unite[] unites = ChaineUtil.getUniteesTrieesEtFiltrees(typesdispo, vue);
+		// initialisation
+		for (int i = 0; i < noparagraphes.length; i++) {
+			donnees.put(i, new HashMap());
+			donnees.get(i).put("Nombre de Chaines de coreference", 0);
+			donnees.get(i).put("Nombre de chainons", 0);
+			donnees.get(i).put("ratio nombre de chainons par nombre de " + unitecomptage, 0);
+			donnees.get(i).put("Densité référentielle", 0);
+		}
+		for (int i = 0; i < texte.length(); i++) {
+			if (i > noparagraphes[paragraphecourant] || i == texte.length() - 1) {
+				donnees.get(paragraphecourant).put("Nombre de Chaines de coreference", chaineparagraphe.size());
+				donnees.get(paragraphecourant).put("ratio nombre de chainons par nombre de " + unitecomptage,
+						Math.round(sommeUniteComptage * 100.0f / (unitecomptage.equals("Mots") ? comptemot
+								: (noparagraphes[paragraphecourant] - (paragraphecourant == 0 ? 0 : noparagraphes[paragraphecourant - 1])))));
+				donnees.get(paragraphecourant).put("Densité référentielle",
+						Math.round((100.0f * donnees.get(paragraphecourant).get("Nombre de chainons")) /
+								(unitecomptage == "Mots" ? comptemot
+										: (noparagraphes[paragraphecourant] -
+												(paragraphecourant == 0 ? 0 : noparagraphes[paragraphecourant - 1])))));
+				chaineparagraphe = new HashSet();
+				paragraphecourant = paragraphecourant + 1;
+				comptemot = 1;
+				sommeUniteComptage = 0;
+			}
+			// si on decouvre une unité
+			while (unitecourante < unites.length && unites[unitecourante].getDeb() == i) {
+				if (chainesUnitesNonFiltrees.containsKey(unites[unitecourante])) {
+					donnees.get(paragraphecourant).put("Nombre de chainons",
+							donnees.get(paragraphecourant).get("Nombre de chainons") + 1);
+					chaineparagraphe.add(chainesUnitesNonFiltrees.get(unites[unitecourante]));
+					sommeUniteComptage = sommeUniteComptage + (unitecomptage == "Mots" ? ChaineUtil.nbMotsDansUneUnite(unites[unitecourante].getDeb(), unites[unitecourante].getFin(), vue)
+							: unites[unitecourante].getFin() - unites[unitecourante].getDeb());
+				}
+				unitecourante = unitecourante + 1;
+			}
+			// si on change de mot
+			if (unitecomptage.equals("Mots") && texte.charAt(i) == ' ') {
+				comptemot = comptemot + 1;
+			}
+		}
+		
+		return donnees;
+	}
+	
+	
+	// struture qui n'est pas filtrées mais qui associe à une unité qui correspond au bon type d'unités
+	// contenu dans "typeUnités" la chaine qui la contient et qui est elle aussi du bon type de Schéma
+	private static HashMap<Unite, Schema> calculerChainesUnitesNonFiltrees(String[] typeUnites, Vue vue) throws UnsupportedOperationException {
+		HashMap<Unite, Schema> chainesUnitesNonFiltrees = new HashMap();
+		for (String typechaine : vue.getTypesSchemasAVoir()) {
+			Schema[] chaines = vue.getSchemas(typechaine);
+			for (Schema chaine : chaines) {
+				HashSet<Element> contenu = chaine.getContenu();
+				for (Element elt : contenu) {
+					if (elt.getClass() == Unite.class && ChaineUtil.tableauRecherche(typeUnites, elt.getType())) {
+						if (chainesUnitesNonFiltrees.containsKey(elt)) {
+							throw new UnsupportedOperationException("L'unité " + vue.getIdElement(elt)
+									+ " appartient à deux chaînes : " + vue.getIdElement(chaine) + " et "
+									+ vue.getIdElement(chainesUnitesNonFiltrees.get(elt)));
+						}
+						else
+							chainesUnitesNonFiltrees.put((Unite) elt, chaine);
+					}
+				}
+			}
+		}
+		return chainesUnitesNonFiltrees;
+	}
+	
+	// renvoie la valeur en un point d'un polynome interpolé à partir de deux tableau représentant les coordonnées de points
+	public static Integer interpolationLagrangienne(Integer[] abscisse, Integer[] ordonnee, int value) {
+		if (abscisse.length == ordonnee.length) {
+			Double retour = 0.0d;
+			for (int i = 0; i < abscisse.length; i++) {
+				Double produit = 1.0d;
+				for (int j = 0; j < abscisse.length; j++) {
+					if (i != j) {
+						produit = produit * (value - abscisse[j]) / (abscisse[i] - abscisse[j]);
+					}
+				}
+				retour = retour + produit * ordonnee[i];
+			}
+			return (Math.round(retour) < 0 ? 0 : (int) Math.round(retour));
+			
+		}
+		return -1;
+	}
+	
+	/* @require: abscisse and length have the same length */
+	public static ArrayList<Float[]> coef_spline_quad(Integer[] abscisse, Integer[] ordonnee) {
+		Float[] coef_abs = new Float[abscisse.length];
+		Float[] coef_ord = new Float[ordonnee.length];
+		ArrayList<Float[]> retour = new ArrayList();
+		coef_abs[0] = 0.0f;
+		for (int i = 1; i < abscisse.length; i++) {
+			coef_abs[i] = 1.0f * 2 * (ordonnee[i] - ordonnee[i - 1]) / (abscisse[i] - abscisse[i - 1]);
+			coef_ord[i] = ordonnee[i - 1] + coef_abs[i - 1] * (abscisse[i] - abscisse[i - 1]) / 2;
+			
+		}
+		retour.add(coef_abs);
+		retour.add(coef_ord);
+		return retour;
+		
+	}
+	
+	/* @require: abscisse and length have the same length superior to 2 */
+	public static Integer interpolation_spline_quad(Integer[] abscisse, Integer[] ordonnee, int value) {
+		float retour;
+		ArrayList<Float[]> coef = coef_spline_quad(abscisse, ordonnee);
+		retour = coef.get(1)[1];
+		for (int i = 1; i < abscisse.length; i++) {
+			if (value > abscisse[i - 1] && value < abscisse[i]) {
+				retour = 0 - coef.get(0)[i - 1] * (value - abscisse[i]) * (value - abscisse[i]) + coef.get(0)[i]
+						* (value - abscisse[i - 1]) * (value - abscisse[i - 1]) / 2 / (abscisse[i] - abscisse[i - 1])
+						+ coef.get(1)[i];
+			}
+		}
+		return Math.round(retour);
+	}
+	
 }
Index: tmp/org.txm.chartsengine.jfreechart.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.chartsengine.jfreechart.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.chartsengine.jfreechart.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -17,4 +17,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.chartsengine.jfreechart.core
 
Index: tmp/org.txm.libs.batik/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.batik/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.batik/META-INF/MANIFEST.MF	(revision 3063)
@@ -60,4 +60,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: https://xmlgraphics.apache.org/batik/
+Automatic-Module-Name: org.txm.libs.batik
 
Index: tmp/org.txm.cql2lsa.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.cql2lsa.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.cql2lsa.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -17,4 +17,5 @@
 Bundle-Activator: cql2lsarcp.Activator
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.cql2lsa.rcp
 
Index: tmp/org.txm.wordcloud.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.wordcloud.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.wordcloud.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.wordcloud.core
 
Index: tmp/org.txm.index.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.index.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.index.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -11,4 +11,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.index.rcp
 
Index: tmp/org.txm.searchengine.cqp.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.searchengine.cqp.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.searchengine.cqp.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -14,4 +14,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.searchengine.cqp.rcp
 
Index: tmp/org.txm.libs.cqp.macosx/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.cqp.macosx/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.cqp.macosx/META-INF/MANIFEST.MF	(revision 3063)
@@ -7,4 +7,5 @@
 Eclipse-PlatformFilter: (osgi.os=macosx)
 Bundle-Vendor: Textometrie.org
 Fragment-Host: org.txm.libs.cqp
+Automatic-Module-Name: org.txm.libs.cqp.macosx
 
Index: tmp/org.txm.statsengine.r.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.statsengine.r.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.statsengine.r.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.statsengine.r.rcp
 
Index: tmp/org.txm.groovy.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.groovy.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.groovy.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -11,4 +11,5 @@
 Bundle-Activator: org.txm.groovy.rcp.Activator
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometry.org
+Automatic-Module-Name: org.txm.groovy.rcp
 
Index: tmp/org.txm.annotation.kr.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.annotation.kr.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.annotation.kr.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -13,4 +13,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.annotation.kr.rcp
 
Index: tmp/org.txm.specificities.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.specificities.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.specificities.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -13,4 +13,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.specificities.core
 
Index: tmp/org.txm.statsengine.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.statsengine.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.statsengine.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -9,4 +9,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.statsengine.core
 
Index: tmp/org.txm.statsengine.r.core.win32/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.statsengine.r.core.win32/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.statsengine.r.core.win32/META-INF/MANIFEST.MF	(revision 3063)
@@ -7,3 +7,4 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Eclipse-PlatformFilter: (osgi.os=win32)
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.statsengine.r.core.win32
Index: tmp/org.txm.lexicaltable.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.lexicaltable.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.lexicaltable.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -11,4 +11,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.lexicaltable.rcp
 
Index: tmp/org.txm.chartsengine.graphstream.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.chartsengine.graphstream.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.chartsengine.graphstream.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.chartsengine.graphstream.core
 
Index: tmp/org.txm.lexicaltable.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.lexicaltable.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.lexicaltable.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.lexicaltable.core
 
Index: tmp/org.txm.svn.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.svn.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.svn.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -18,4 +18,5 @@
 Bundle-Activator: svnenvironement.Activator
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.svn.rcp
 
Index: tmp/org.txm.core.tests/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.core.tests/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.core.tests/META-INF/MANIFEST.MF	(revision 3063)
@@ -33,4 +33,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.tests.core
 
Index: tmp/org.txm.libs.colt/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.colt/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.colt/META-INF/MANIFEST.MF	(revision 3063)
@@ -13,4 +13,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: https://dst.lbl.gov/ACSSoftware/colt/
+Automatic-Module-Name: org.txm.libs.colt
 
Index: tmp/org.txm.chartsengine.svgbatik.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.chartsengine.svgbatik.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.chartsengine.svgbatik.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -9,4 +9,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.chartsengine.svgbatik.rcp
 
Index: tmp/org.txm.querycooccurrences.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.querycooccurrences.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.querycooccurrences.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -18,4 +18,5 @@
 Bundle-Activator: listcooccurrences.Activator
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.querycooccurrences.rcp
 
Index: tmp/org.txm.treetagger.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.treetagger.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.treetagger.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -11,4 +11,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.treetagger.rcp
 
Index: tmp/org.txm.treetagger.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.treetagger.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.treetagger.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -10,4 +10,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.treetagger.core
 
Index: tmp/org.txm.searchengine.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.searchengine.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.searchengine.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -10,4 +10,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.searchengine.core
 
Index: tmp/org.txm.tmp.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.tmp.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.tmp.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -6,4 +6,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.tmp.rcp
 
Index: tmp/org.txm.properties.core/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.properties.core/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.properties.core/META-INF/MANIFEST.MF	(revision 3063)
@@ -10,4 +10,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.properties.core
 
Index: tmp/org.txm.treetaggerinstaller.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.treetaggerinstaller.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.treetaggerinstaller.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -14,4 +14,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.treetaggerinstaller.rcp
 
Index: tmp/org.txm.practically.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.practically.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.practically.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -16,4 +16,5 @@
 Bundle-ManifestVersion: 2
 Bundle-Activator: practicallymacro.editormacros.Activator
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Automatic-Module-Name: org.txm.practically.rcp
 
Index: tmp/org.txm.chartsengine.r.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.chartsengine.r.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.chartsengine.r.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -9,4 +9,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.chartsengine.r.rcp
 
Index: tmp/org.txm.libs.rserve/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.rserve/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.rserve/META-INF/MANIFEST.MF	(revision 3063)
@@ -8,4 +8,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: https://rforge.net/Rserve/index.html
+Automatic-Module-Name: org.txm.libs.rserve
 
Index: tmp/org.txm.libs.jfreesvg/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.jfreesvg/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.jfreesvg/META-INF/MANIFEST.MF	(revision 3063)
@@ -8,4 +8,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: www.jfree.org
+Automatic-Module-Name: org.txm.libs.jfreesvg
 
Index: tmp/org.txm.libs.jfreechart/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.jfreechart/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.jfreechart/META-INF/MANIFEST.MF	(revision 3063)
@@ -47,3 +47,4 @@
 Bundle-Vendor: www.jfree.org
 Bundle-ClassPath: .,
  lib/jfreechart-1.5.0.jar
+Automatic-Module-Name: org.txm.libs.jfreechart
Index: tmp/org.txm.libs.graphstream/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.graphstream/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.graphstream/META-INF/MANIFEST.MF	(revision 3063)
@@ -52,4 +52,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: http://graphstream-project.org
+Automatic-Module-Name: org.txm.libs.graphstream
 
Index: tmp/org.txm.para.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.para.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.para.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -10,4 +10,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.para.rcp
 
Index: tmp/org.txm.imports.metopes/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.imports.metopes/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.imports.metopes/META-INF/MANIFEST.MF	(revision 3063)
@@ -15,3 +15,4 @@
  org.txm.imports.metopes,
  org.txm.macro.metopes
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.imports.metopes
Index: tmp/org.txm.chartsengine.jfreechart.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.chartsengine.jfreechart.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.chartsengine.jfreechart.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -17,4 +17,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.chartsengine.jfreechart.rcp
 
Index: tmp/org.txm.statsengine.r.core.linux/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.statsengine.r.core.linux/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.statsengine.r.core.linux/META-INF/MANIFEST.MF	(revision 3063)
@@ -7,3 +7,4 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Eclipse-PlatformFilter: (osgi.os=linux)
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.statsengine.r.core.linux
Index: tmp/org.txm.oriflamms.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.oriflamms.rcp/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.oriflamms.rcp/META-INF/MANIFEST.MF	(revision 3063)
@@ -12,4 +12,5 @@
 Bundle-Activator: oriflamms.Activator
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.oriflamms.rcp
 
Index: tmp/org.txm.rcp.feature/feature.xml
===================================================================
--- tmp/org.txm.rcp.feature/feature.xml	(revision 3062)
+++ tmp/org.txm.rcp.feature/feature.xml	(revision 3063)
@@ -254,6 +254,8 @@
       <import plugin="org.eclipse.e4.ui.workbench.renderers.swt"/>
       <import plugin="javax.annotation" version="1.2.0" match="greaterOrEqual"/>
       <import plugin="org.txm.rcp" version="0.8.0" match="greaterOrEqual"/>
+      <import plugin="org.txm.searchengine.core" version="1.0.0" match="greaterOrEqual"/>
+      <import plugin="org.txm.rcp" version="0.8.1" match="greaterOrEqual"/>
    </requires>
 
    <plugin
Index: tmp/org.txm.libs.saxon/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.saxon/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.libs.saxon/META-INF/MANIFEST.MF	(revision 3063)
@@ -18,4 +18,5 @@
 Bundle-ManifestVersion: 2
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: http://saxon.sourceforge.net/
+Automatic-Module-Name: org.txm.libs.saxon
 
Index: tmp/org.txm.rcp.p2.ui/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.rcp.p2.ui/META-INF/MANIFEST.MF	(revision 3062)
+++ tmp/org.txm.rcp.p2.ui/META-INF/MANIFEST.MF	(revision 3063)
@@ -11,3 +11,4 @@
 Export-Package: org.eclipse.equinox.internal.p2.ui,
  org.eclipse.equinox.internal.p2.ui.dialogs
 Bundle-Vendor: Textometrie.org
+Automatic-Module-Name: org.txm.rcp.p2.ui
