Index: tmp/org.txm.libs.batik/build.properties
===================================================================
--- tmp/org.txm.libs.batik/build.properties	(revision 3077)
+++ tmp/org.txm.libs.batik/build.properties	(revision 3078)
@@ -20,4 +20,5 @@
                js.jar,\
                xml-apis-ext.jar,\
                xml-apis.jar,\
-               .
+               .,\
+               OSGI-INF/
Index: tmp/org.eclipse.pde.hack/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.eclipse.pde.hack/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.eclipse.pde.hack/META-INF/MANIFEST.MF	(revision 3078)
@@ -5,5 +5,5 @@
 Bundle-Version: 1.0.0
 Fragment-Host: org.eclipse.pde.build;bundle-version="3.9.300"
 Automatic-Module-Name: org.eclipse.pde.hack
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
Index: tmp/org.txm.statsengine.r.core.macosx/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.statsengine.r.core.macosx/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.statsengine.r.core.macosx/META-INF/MANIFEST.MF	(revision 3078)
@@ -4,7 +4,7 @@
 Bundle-SymbolicName: org.txm.statsengine.r.core.macosx
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: org.txm.statsengine.r.core;bundle-version="1.0.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Eclipse-PlatformFilter: (osgi.os=macosx)
 Bundle-Vendor: Textometrie.org
 Automatic-Module-Name: org.txm.statsengine.r.core.macosx
Index: tmp/org.txm.statsengine.r.core.macosx/build.properties
===================================================================
--- tmp/org.txm.statsengine.r.core.macosx/build.properties	(revision 3077)
+++ tmp/org.txm.statsengine.r.core.macosx/build.properties	(revision 3078)
@@ -2,5 +2,6 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               res/
-#qualifier=svn
\ No newline at end of file
+               res/,\
+               OSGI-INF/
+#qualifier=svn
Index: tmp/org.txm.libs.graphstream/build.properties
===================================================================
--- tmp/org.txm.libs.graphstream/build.properties	(revision 3077)
+++ tmp/org.txm.libs.graphstream/build.properties	(revision 3078)
@@ -3,7 +3,6 @@
                lib/gs-algo-1.3/gs-algo-1.3.jar,\
                lib/gs-core-1.3/gs-core-1.3.jar,\
                lib/gs-ui-1.3/gs-ui-1.3.jar
-jars.compile.order = 
 source.. = src/
 bin.excludes = lib/gs-algo-1.3/,\
                lib/gs-core-1.3/,\
Index: tmp/org.txm.statsengine.r.core.linux/build.properties
===================================================================
--- tmp/org.txm.statsengine.r.core.linux/build.properties	(revision 3077)
+++ tmp/org.txm.statsengine.r.core.linux/build.properties	(revision 3078)
@@ -2,5 +2,6 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               res/
+               res/,\
+               OSGI-INF/
 #qualifier=svn
Index: tmp/org.txm.statsengine.r.core.linux/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.statsengine.r.core.linux/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.statsengine.r.core.linux/META-INF/MANIFEST.MF	(revision 3078)
@@ -4,7 +4,7 @@
 Bundle-SymbolicName: org.txm.statsengine.r.core.linux
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: org.txm.statsengine.r.core;bundle-version="1.0.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Eclipse-PlatformFilter: (osgi.os=linux)
 Bundle-Vendor: Textometrie.org
 Automatic-Module-Name: org.txm.statsengine.r.core.linux
Index: tmp/org.txm.libs.office/build.properties
===================================================================
--- tmp/org.txm.libs.office/build.properties	(revision 3077)
+++ tmp/org.txm.libs.office/build.properties	(revision 3078)
@@ -2,43 +2,11 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               lib/collection-0.7.jar,\
-               lib/commons-cli-1.4.jar,\
-               lib/commons-codec-1.11.jar,\
-               lib/commons-compress-1.17.jar,\
-               lib/commons-csv-1.5.jar,\
-               lib/commons-io-2.6.jar,\
-               lib/commons-lang3-3.4.jar,\
-               lib/httpclient-4.5.5.jar,\
-               lib/httpclient-cache-4.5.5.jar,\
-               lib/httpcore-4.4.9.jar,\
-               lib/jackson-annotations-2.9.0.jar,\
-               lib/jackson-core-2.9.5.jar,\
-               lib/jackson-databind-2.9.5.jar,\
                lib/java-rdfa-0.4.2.jar,\
-               lib/jcl-over-slf4j-1.7.25.jar,\
-               lib/jena-arq-3.8.0.jar,\
-               lib/jena-base-3.8.0.jar,\
-               lib/jena-cmds-3.8.0.jar,\
-               lib/jena-core-3.8.0.jar,\
-               lib/jena-dboe-base-3.8.0.jar,\
-               lib/jena-dboe-index-3.8.0.jar,\
-               lib/jena-dboe-trans-data-3.8.0.jar,\
-               lib/jena-dboe-transaction-3.8.0.jar,\
-               lib/jena-iri-3.8.0.jar,\
-               lib/jena-rdfconnection-3.8.0.jar,\
-               lib/jena-shaded-guava-3.8.0.jar,\
-               lib/jena-tdb-3.8.0.jar,\
-               lib/jena-tdb2-3.8.0.jar,\
-               lib/jsonld-java-0.12.0.jar,\
-               lib/libthrift-0.10.0.jar,\
                lib/log4j-1.2.17.jar,\
                lib/odfdom-java-0.8.11-incubating.jar,\
                lib/simple-odf-0.8.2-incubating.jar,\
                lib/slf4j-api-1.7.25.jar,\
-               lib/slf4j-log4j12-1.7.25.jar,\
-               lib/xslt-runner-1.2.4-incubating.jar,\
-               lib/xslt-runner-task-1.2.4-incubating.jar,\
                lib/commons-beanutils-1.9.2.jar,\
                lib/commons-collections-3.2.2.jar,\
                lib/commons-digester-1.8.1.jar,\
@@ -52,5 +20,6 @@
                lib/slf4j-log4j12-1.7.6.jar,\
                lib/taglets-0.8.11-incubating.jar,\
                lib/xercesImpl-2.9.1.jar,\
-               lib/xml-apis-1.3.04.jar
+               lib/xml-apis-1.3.04.jar,\
+               OSGI-INF/
 #qualifier=svn
Index: tmp/org.txm.core.tests/build.properties
===================================================================
--- tmp/org.txm.core.tests/build.properties	(revision 3077)
+++ tmp/org.txm.core.tests/build.properties	(revision 3078)
@@ -2,4 +2,5 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               plugin.xml
+               plugin.xml,\
+               OSGI-INF/
Index: tmp/org.txm.chartsengine.rcp/src/org/txm/chartsengine/rcp/swt/ChartEditorToolBar.java
===================================================================
--- tmp/org.txm.chartsengine.rcp/src/org/txm/chartsengine/rcp/swt/ChartEditorToolBar.java	(revision 3077)
+++ tmp/org.txm.chartsengine.rcp/src/org/txm/chartsengine/rcp/swt/ChartEditorToolBar.java	(revision 3078)
@@ -3,6 +3,7 @@
 import org.eclipse.swt.widgets.Composite;
 import org.txm.chartsengine.core.results.ChartResult;
 import org.txm.chartsengine.rcp.editors.ChartEditor;
+import org.txm.core.results.TXMResult;
 import org.txm.rcp.editors.TXMEditorToolBar;
 import org.txm.rcp.swt.GLComposite;
 
@@ -15,11 +16,11 @@
  */
 // FIXME: became useless? could now directly use TXMEditorToolBar
 public class ChartEditorToolBar extends TXMEditorToolBar {
-
-
-	public final static String ID = "ChartEditorToolBar" ;
 	
 	
+	public final static String ID = "ChartEditorToolBar";
+	
+	
 	/**
 	 * 
 	 * @param parent
@@ -31,7 +32,7 @@
 		this(chartEditor, parent, subWidgetsComposite, style, ChartEditorToolBar.ID);
 	}
 	
-
+	
 	/**
 	 * 
 	 * @param parent
@@ -40,175 +41,175 @@
 	 */
 	public ChartEditorToolBar(ChartEditor<? extends ChartResult> chartEditor, Composite parent, GLComposite subWidgetsComposite, int style, String toolbarId) {
 		super(chartEditor, parent, subWidgetsComposite, style, toolbarId);
-
 		
-		//FIXME: tests
-//		new ToolItem(this, SWT.SEPARATOR);
-//		
-//		final ToolItem showTitle = new ToolItem(this, SWT.CHECK);
-//		//showTitle.setText(SWTComponentsProviderMessages.showhideTitle);
-//		showTitle.setImage(IImageKeys.getImage(this, "icons/show_title.png"));
-//		showTitle.setDisabledImage(IImageKeys.getImage(this, "icons/show_title_disabled.png"));
-//		showTitle.setToolTipText(SWTComponentsProviderMessages.showhideTitle);
-//
-//		if(!TXMPreferences.isEmpty(chartEditorPart.getPreferencesNodeQualifier(), ChartsEnginePreferences.SHOW_TITLE))	{
-//			showTitle.setSelection(TXMPreferences.getBoolean(chartEditorPart.getPreferencesNodeQualifier(), chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_TITLE));
-//		}
-//		// disable if not managed
-//		else	{
-//			showTitle.setEnabled(false);
-//		}
-//		
-//
-//		final ToolItem showLegend = new ToolItem(this, SWT.CHECK);
-//		//showLegend.setText(SWTComponentsProviderMessages.showhideLegend);
-//		showLegend.setImage(IImageKeys.getImage(this, "icons/show_legend.png"));
-//		showLegend.setDisabledImage(IImageKeys.getImage(this, "icons/show_legend_disabled.png"));
-//		showLegend.setToolTipText(SWTComponentsProviderMessages.showhideLegend);
-//
-//		if(!TXMPreferences.isEmpty(chartEditorPart.getPreferencesNodeQualifier(), ChartsEnginePreferences.SHOW_LEGEND))	{
-//			showLegend.setSelection(TXMPreferences.getBoolean(chartEditorPart.getPreferencesNodeQualifier(), chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_LEGEND));
-//		}
-//		// disable if not managed
-//		else	{
-//			showLegend.setEnabled(false);
-//		}
-//
-//		
-//		final ToolItem showGrid = new ToolItem(this, SWT.CHECK);
-//		//showGrid.setText(SWTComponentsProviderMessages.showhideGrid);
-//		showGrid.setImage(IImageKeys.getImage(this, "icons/show_grid.png"));
-//		showGrid.setDisabledImage(IImageKeys.getImage(this, "icons/show_grid_disabled.png"));
-//		showGrid.setToolTipText(SWTComponentsProviderMessages.showhideGrid);
-//		
-//		if(!TXMPreferences.isEmpty(chartEditorPart.getPreferencesNodeQualifier(), ChartsEnginePreferences.SHOW_GRID))	{
-//			showGrid.setSelection(TXMPreferences.getBoolean(chartEditorPart.getPreferencesNodeQualifier(), chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_GRID));
-//		}
-//		// disable if not managed
-//		else	{
-//			showGrid.setEnabled(false);
-//		}
-//
-//		
-//		
-//		SelectionListener listener = new SelectionListener() {
-//			
-//			@Override
-//			public void widgetSelected(final SelectionEvent e) {
-//				
-//				// Accessing the source must be done outside the Job
-//				if(e.getSource() == showTitle)	{
-//					TXMPreferences.putLocalBoolean(chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_TITLE,showTitle.getSelection());
-//				}
-//				if(e.getSource() == showLegend)	{
-//					TXMPreferences.putLocalBoolean(chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_LEGEND, showLegend.getSelection());
-//				}
-//				if(e.getSource() == showGrid)	{
-//					TXMPreferences.putLocalBoolean(chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_GRID, showGrid.getSelection());
-//				}
-//				
-//				
-//				// updates existing chart 
-//				Job job = new Job("Update chart") {
-//
-//				    @Override
-//				    protected IStatus run(final IProgressMonitor monitor) {
-//
-//								
-//								
-//							  	// updating and reloading
-//								monitor.beginTask("Updating", IProgressMonitor.UNKNOWN);
-//								chartEditorPart.updateChart();
-//
-//								
-//								
-//								// cancel
-//								if(monitor.isCanceled())	{
-//									return Status.CANCEL_STATUS;
-//								}
-//								
-//								// refreshes
-//					    		chartEditorPart.getSite().getShell().getDisplay().asyncExec(new Runnable() {
-//									@Override
-//									public void run() {
-//										CorporaView.refresh();
-//									}
-//								});
-//								
-//								
-//								// loading
-//								monitor.setTaskName("Loading");
-//								chartEditorPart.loadChart();
-//								
-//								
-//								
-//								// FIXME: persistence test, saving local preferences/parameters to file
-//								//TXMPreferences.flush(chartEditorPart.getResultData());
-//								
-//								
-//								// done
-//								monitor.done(); 
-//
-//							
-////							}
-////						});
-//				  
-//			    		
-//				        return Status.OK_STATUS;
-//				    }
-//
-//				};
-//				//job.setUser(true); // show progress bar, without that the progress is located to bottom right
-//				job.schedule();
-//				
-//				
-//				
-//				
-//			}
-//			
-//			@Override
-//			public void widgetDefaultSelected(SelectionEvent e) {
-//				// TODO Auto-generated method stub
-//				
-//			}
-//		};
-//		showTitle.addSelectionListener(listener);
-//		showLegend.addSelectionListener(listener);
-//		showGrid.addSelectionListener(listener);
+		
+		// FIXME: tests
+		// new ToolItem(this, SWT.SEPARATOR);
+		//
+		// final ToolItem showTitle = new ToolItem(this, SWT.CHECK);
+		// //showTitle.setText(SWTComponentsProviderMessages.showhideTitle);
+		// showTitle.setImage(IImageKeys.getImage(this, "icons/show_title.png"));
+		// showTitle.setDisabledImage(IImageKeys.getImage(this, "icons/show_title_disabled.png"));
+		// showTitle.setToolTipText(SWTComponentsProviderMessages.showhideTitle);
+		//
+		// if(!TXMPreferences.isEmpty(chartEditorPart.getPreferencesNodeQualifier(), ChartsEnginePreferences.SHOW_TITLE)) {
+		// showTitle.setSelection(TXMPreferences.getBoolean(chartEditorPart.getPreferencesNodeQualifier(), chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_TITLE));
+		// }
+		// // disable if not managed
+		// else {
+		// showTitle.setEnabled(false);
+		// }
+		//
+		//
+		// final ToolItem showLegend = new ToolItem(this, SWT.CHECK);
+		// //showLegend.setText(SWTComponentsProviderMessages.showhideLegend);
+		// showLegend.setImage(IImageKeys.getImage(this, "icons/show_legend.png"));
+		// showLegend.setDisabledImage(IImageKeys.getImage(this, "icons/show_legend_disabled.png"));
+		// showLegend.setToolTipText(SWTComponentsProviderMessages.showhideLegend);
+		//
+		// if(!TXMPreferences.isEmpty(chartEditorPart.getPreferencesNodeQualifier(), ChartsEnginePreferences.SHOW_LEGEND)) {
+		// showLegend.setSelection(TXMPreferences.getBoolean(chartEditorPart.getPreferencesNodeQualifier(), chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_LEGEND));
+		// }
+		// // disable if not managed
+		// else {
+		// showLegend.setEnabled(false);
+		// }
+		//
+		//
+		// final ToolItem showGrid = new ToolItem(this, SWT.CHECK);
+		// //showGrid.setText(SWTComponentsProviderMessages.showhideGrid);
+		// showGrid.setImage(IImageKeys.getImage(this, "icons/show_grid.png"));
+		// showGrid.setDisabledImage(IImageKeys.getImage(this, "icons/show_grid_disabled.png"));
+		// showGrid.setToolTipText(SWTComponentsProviderMessages.showhideGrid);
+		//
+		// if(!TXMPreferences.isEmpty(chartEditorPart.getPreferencesNodeQualifier(), ChartsEnginePreferences.SHOW_GRID)) {
+		// showGrid.setSelection(TXMPreferences.getBoolean(chartEditorPart.getPreferencesNodeQualifier(), chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_GRID));
+		// }
+		// // disable if not managed
+		// else {
+		// showGrid.setEnabled(false);
+		// }
+		//
+		//
+		//
+		// SelectionListener listener = new SelectionListener() {
+		//
+		// @Override
+		// public void widgetSelected(final SelectionEvent e) {
+		//
+		// // Accessing the source must be done outside the Job
+		// if(e.getSource() == showTitle) {
+		// TXMPreferences.putLocalBoolean(chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_TITLE,showTitle.getSelection());
+		// }
+		// if(e.getSource() == showLegend) {
+		// TXMPreferences.putLocalBoolean(chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_LEGEND, showLegend.getSelection());
+		// }
+		// if(e.getSource() == showGrid) {
+		// TXMPreferences.putLocalBoolean(chartEditorPart.getResultData(), ChartsEnginePreferences.SHOW_GRID, showGrid.getSelection());
+		// }
+		//
+		//
+		// // updates existing chart
+		// Job job = new Job("Update chart") {
+		//
+		// @Override
+		// protected IStatus run(final IProgressMonitor monitor) {
+		//
+		//
+		//
+		// // updating and reloading
+		// monitor.beginTask("Updating", IProgressMonitor.UNKNOWN);
+		// chartEditorPart.updateChart();
+		//
+		//
+		//
+		// // cancel
+		// if(monitor.isCanceled()) {
+		// return Status.CANCEL_STATUS;
+		// }
+		//
+		// // refreshes
+		// chartEditorPart.getSite().getShell().getDisplay().asyncExec(new Runnable() {
+		// @Override
+		// public void run() {
+		// CorporaView.refresh();
+		// }
+		// });
+		//
+		//
+		// // loading
+		// monitor.setTaskName("Loading");
+		// chartEditorPart.loadChart();
+		//
+		//
+		//
+		// // FIXME: persistence test, saving local preferences/parameters to file
+		// //TXMPreferences.flush(chartEditorPart.getResultData());
+		//
+		//
+		// // done
+		// monitor.done();
+		//
+		//
+		//// }
+		//// });
+		//
+		//
+		// return Status.OK_STATUS;
+		// }
+		//
+		// };
+		// //job.setUser(true); // show progress bar, without that the progress is located to bottom right
+		// job.schedule();
+		//
+		//
+		//
+		//
+		// }
+		//
+		// @Override
+		// public void widgetDefaultSelected(SelectionEvent e) {
+		// // TODO Auto-generated method stub
+		//
+		// }
+		// };
+		// showTitle.addSelectionListener(listener);
+		// showLegend.addSelectionListener(listener);
+		// showGrid.addSelectionListener(listener);
 	}
-
 	
+	
 	/**
 	 * Synchronizes the tool bar with the chart result states.
 	 * Enables/disables button according to the chart result states.
 	 * 
 	 */
-	// FIXME: tests to disable command if the chart is null and reenable it when the chart is computed 
-//	public void synchronize()	{
-//		boolean enable = (this.getEditorPart().getResultData().getChart() != null);
-////		HandledContributionItem t = (HandledContributionItem) this.getItem(0).getData();
-//		System.out.println("ChartEditorToolBar.synchronize()");
-//		
-//		IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
-//        ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
-//        if (handlerService != null && commandService != null) {
-//                try {
-//                        Command command = commandService.getCommand(ExportChartEditorView.ID);
-//                        command.setEnabled(null);
-//                        //command.setEnabled(new Boolean(enable));
-//                } catch (Exception e) {
-//                	e.printStackTrace();
-//                }
-//        }
-//        else	{
-//        	System.err.println("ChartEditorToolBar.synchronize() can't get handler service");
-//        }
-//	}
-
-
+	// FIXME: tests to disable command if the chart is null and reenable it when the chart is computed
+	// public void synchronize() {
+	// boolean enable = (this.getEditorPart().getResultData().getChart() != null);
+	//// HandledContributionItem t = (HandledContributionItem) this.getItem(0).getData();
+	// System.out.println("ChartEditorToolBar.synchronize()");
+	//
+	// IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
+	// ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+	// if (handlerService != null && commandService != null) {
+	// try {
+	// Command command = commandService.getCommand(ExportChartEditorView.ID);
+	// command.setEnabled(null);
+	// //command.setEnabled(new Boolean(enable));
+	// } catch (Exception e) {
+	// e.printStackTrace();
+	// }
+	// }
+	// else {
+	// System.err.println("ChartEditorToolBar.synchronize() can't get handler service");
+	// }
+	// }
+	
+	
 	@Override
-	public ChartEditor getEditorPart() {
-		return (ChartEditor) editorPart;
+	public ChartEditor<? extends TXMResult> getEditorPart() {
+		return (ChartEditor<?>) editorPart;
 	}
-
-}
\ No newline at end of file
+	
+}
Index: tmp/org.txm.chartsengine.rcp/src/org/txm/chartsengine/rcp/events/EventCallBack.java
===================================================================
--- tmp/org.txm.chartsengine.rcp/src/org/txm/chartsengine/rcp/events/EventCallBack.java	(revision 3077)
+++ tmp/org.txm.chartsengine.rcp/src/org/txm/chartsengine/rcp/events/EventCallBack.java	(revision 3078)
@@ -7,12 +7,13 @@
 
 /**
  * Event call back to manage user entries events in the charts in all chart engine implementations.
+ * 
  * @author sjacquot
  *
  */
 public abstract class EventCallBack {
-
 	
+	
 	/**
 	 * Area of event constants.
 	 */
@@ -23,17 +24,17 @@
 	 * The linked Chart editor part.
 	 */
 	protected ChartEditor chartEditor;
-
+	
 	/**
 	 * 
 	 */
-	public EventCallBack() {
-	}
+	public EventCallBack() {}
 	
 	
-
+	
 	/**
 	 * Processes the call back.
+	 * 
 	 * @param event
 	 * @param eventArea
 	 * @param customData
@@ -46,9 +47,9 @@
 	public void setChartEditor(ChartEditor chartEditor) {
 		this.chartEditor = chartEditor;
 	}
-
-
-
+	
+	
+	
 	/**
 	 * @return the chartEditor
 	 */
Index: tmp/org.txm.libs.jfreesvg/build.properties
===================================================================
--- tmp/org.txm.libs.jfreesvg/build.properties	(revision 3077)
+++ tmp/org.txm.libs.jfreesvg/build.properties	(revision 3078)
@@ -1,4 +1,4 @@
 bin.includes = META-INF/,\
                lib/jfreesvg-1.7.jar,\
-               .
-jars.compile.order = 
+               .,\
+               OSGI-INF/
Index: tmp/org.txm.libs.cqp.macosx/build.properties
===================================================================
--- tmp/org.txm.libs.cqp.macosx/build.properties	(revision 3077)
+++ tmp/org.txm.libs.cqp.macosx/build.properties	(revision 3078)
@@ -2,5 +2,6 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               res/
-#qualifier=svn
\ No newline at end of file
+               res/,\
+               OSGI-INF/
+#qualifier=svn
Index: tmp/org.txm.libs.cqp.linux/build.properties
===================================================================
--- tmp/org.txm.libs.cqp.linux/build.properties	(revision 3077)
+++ tmp/org.txm.libs.cqp.linux/build.properties	(revision 3078)
@@ -2,5 +2,6 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               res/
+               res/,\
+               OSGI-INF/
 #qualifier=svn
Index: tmp/org.txm.oriflamms.rcp/src/org/txm/oriflamms/functions/CopyXMLFiles.java
===================================================================
--- tmp/org.txm.oriflamms.rcp/src/org/txm/oriflamms/functions/CopyXMLFiles.java	(revision 3077)
+++ tmp/org.txm.oriflamms.rcp/src/org/txm/oriflamms/functions/CopyXMLFiles.java	(revision 3078)
@@ -14,10 +14,13 @@
 import org.txm.utils.io.FileCopy;
 
 public class CopyXMLFiles {
+	
 	File xmlFile;
+	
 	File outDir;
-	ArrayList<File> dtdFiles = new ArrayList<File>();
 	
+	ArrayList<File> dtdFiles = new ArrayList<>();
+	
 	public CopyXMLFiles(File xmlFile) {
 		this.xmlFile = xmlFile;
 	}
@@ -28,6 +31,7 @@
 		InputStream inputData = xmlFile.toURI().toURL().openStream();
 		factory = XMLInputFactory.newInstance();
 		factory.setXMLResolver(new XMLResolver() {
+			
 			@Override
 			public Object resolveEntity(String publicID, String systemID,
 					String baseURI, String namespace) throws XMLStreamException {
@@ -35,14 +39,15 @@
 				dtdFiles.add(srcFile);
 				try {
 					return srcFile.toURI().toURL().openStream();
-				} catch (IOException e) {
+				}
+				catch (IOException e) {
 					// TODO Auto-generated catch block
 					e.printStackTrace();
-					return new ArrayList();
+					return new ArrayList<>();
 				}
 			}
 		});
-	
+		
 		parser = factory.createXMLStreamReader(inputData);
 		
 		for (int event = parser.next(); event != XMLStreamConstants.END_DOCUMENT; event = parser.next()) {
Index: tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/renderers/XYCardinalSplineRenderer.java
===================================================================
--- tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/renderers/XYCardinalSplineRenderer.java	(revision 3077)
+++ tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/renderers/XYCardinalSplineRenderer.java	(revision 3078)
@@ -37,7 +37,7 @@
 	/**
 	 * 
 	 */
-	protected List<Point2D> points = new ArrayList();
+	protected List<Point2D> points = new ArrayList<>();
 	
 	
 	
@@ -127,7 +127,7 @@
 		pts.add(0, (Point2D) pts.get(0).clone());
 		pts.add((Point2D) pts.get(pts.size() - 1).clone());
 		
-		List<Point2D> result = new ArrayList();
+		List<Point2D> result = new ArrayList<>();
 		
 		for (int i = 1; i < pts.size() - 2; i++) {
 			for (int t = 0; t <= this.precision; t++) {
Index: tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/themes/base/ExtendedNumberAxis.java
===================================================================
--- tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/themes/base/ExtendedNumberAxis.java	(revision 3077)
+++ tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/themes/base/ExtendedNumberAxis.java	(revision 3078)
@@ -8,6 +8,7 @@
 import org.jfree.chart.axis.AxisState;
 import org.jfree.chart.axis.NumberAxis;
 import org.jfree.chart.axis.NumberTick;
+import org.jfree.chart.axis.Tick;
 import org.jfree.chart.axis.TickType;
 import org.jfree.chart.ui.RectangleEdge;
 
@@ -74,8 +75,8 @@
 	@Override
 	public List refreshTicks(Graphics2D g2, AxisState state, Rectangle2D dataArea, RectangleEdge edge) {
 		
-		List allTicks = super.refreshTicks(g2, state, dataArea, edge);
-		List newTicks = new ArrayList();
+		List<Tick> allTicks = super.refreshTicks(g2, state, dataArea, edge);
+		List<Tick> newTicks = new ArrayList<>();
 		
 		for (Object tick : allTicks) {
 			NumberTick numberTick = (NumberTick) tick;
@@ -97,7 +98,7 @@
 				continue;
 			}
 			
-			newTicks.add(tick);
+			newTicks.add(numberTick);
 		}
 		return newTicks;
 	}
Index: tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/themes/base/SymbolAxisBetweenTicks.java
===================================================================
--- tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/themes/base/SymbolAxisBetweenTicks.java	(revision 3077)
+++ tmp/org.txm.chartsengine.jfreechart.core/src/org/txm/chartsengine/jfreechart/core/themes/base/SymbolAxisBetweenTicks.java	(revision 3078)
@@ -191,9 +191,9 @@
 	
 	
 	@Override
-	protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, RectangleEdge edge) {
+	protected List<Tick> refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, RectangleEdge edge) {
 		
-		List ticks = new java.util.ArrayList();
+		List<Tick> ticks = new java.util.ArrayList<>();
 		
 		Font tickLabelFont = getTickLabelFont();
 		g2.setFont(tickLabelFont);
Index: tmp/org.txm.libs.args4j/build.properties
===================================================================
--- tmp/org.txm.libs.args4j/build.properties	(revision 3077)
+++ tmp/org.txm.libs.args4j/build.properties	(revision 3078)
@@ -1,5 +1,6 @@
 source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
-               .
+               .,\
+               OSGI-INF/
 #qualifier=svn
Index: tmp/org.txm.cooccurrence.chartsengine/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.cooccurrence.chartsengine/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.cooccurrence.chartsengine/META-INF/MANIFEST.MF	(revision 3078)
@@ -4,7 +4,7 @@
 Bundle-SymbolicName: org.txm.cooccurrence.chartsengine;singleton:=true
 Bundle-Version: 1.0.0.qualifier
 Bundle-Vendor: Textometrie.org
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Require-Bundle: org.txm.chartsengine.graphstream.core;bundle-version="1.0.0";visibility:=reexport,
  org.txm.cooccurrence.core;bundle-version="1.0.0";visibility:=reexport,
  org.txm.cooccurrence.rcp;bundle-version="1.0.0";visibility:=reexport,
Index: tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/adapters/CorpusAdapterFactory.java
===================================================================
--- tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/adapters/CorpusAdapterFactory.java	(revision 3077)
+++ tmp/org.txm.searchengine.cqp.rcp/src/org/txm/searchengine/cqp/rcp/adapters/CorpusAdapterFactory.java	(revision 3078)
@@ -41,11 +41,11 @@
 					List<TXMResult> allChildren = ((TXMResult) corpus).getChildren(!TBXPreferences.getInstance().getBoolean(TBXPreferences.SHOW_ALL_RESULT_NODES));
 					
 					
-					ArrayList partitions = new ArrayList();
-					ArrayList subcorporas = new ArrayList();
-					ArrayList resultsChildren = new ArrayList();
-					ArrayList hiddentResultsChildren = new ArrayList();
-					ArrayList children = new ArrayList();
+					ArrayList<Partition> partitions = new ArrayList<>();
+					ArrayList<CQPCorpus> subcorporas = new ArrayList<>();
+					ArrayList<TXMResult> resultsChildren = new ArrayList<>();
+					ArrayList<Object> hiddentResultsChildren = new ArrayList<>();
+					ArrayList<Object> children = new ArrayList<>();
 					
 					// FIXME: remove Text and SavedQuery from the corpora view
 					// + sort and group the partitions and subcorpus
@@ -53,15 +53,15 @@
 						Object element = allChildren.get(i);
 						// partitions
 						if (element instanceof Partition) {
-							partitions.add(element);
+							partitions.add((Partition) element);
 						}
 						// corpus
 						else if (element instanceof CQPCorpus) {
-							subcorporas.add(element);
+							subcorporas.add((CQPCorpus) element);
 						}
 						// results
 						else if (((TXMResult) element).isVisible()) {
-							resultsChildren.add(element);
+							resultsChildren.add((TXMResult) element);
 						}
 						// hidden results
 						else if (TBXPreferences.getInstance().getBoolean(TBXPreferences.SHOW_ALL_RESULT_NODES)) {
Index: tmp/org.txm.utils/build.properties
===================================================================
--- tmp/org.txm.utils/build.properties	(revision 3077)
+++ tmp/org.txm.utils/build.properties	(revision 3078)
@@ -8,5 +8,6 @@
                commons-lang-2.4.jar,\
                juniversalchardet-1.0.3.jar,\
                ant-1.7.1.jar,\
-               textcat-1.0.1.jar
+               textcat-1.0.1.jar,\
+               OSGI-INF/
 #qualifier=svn
Index: tmp/org.txm.treetagger.core.models/build.properties
===================================================================
--- tmp/org.txm.treetagger.core.models/build.properties	(revision 3077)
+++ tmp/org.txm.treetagger.core.models/build.properties	(revision 3078)
@@ -2,5 +2,6 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               res/models/
-#qualifier=svn
\ No newline at end of file
+               res/models/,\
+               OSGI-INF/
+#qualifier=svn
Index: tmp/org.txm.treetagger.core.models/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.treetagger.core.models/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.treetagger.core.models/META-INF/MANIFEST.MF	(revision 3078)
@@ -4,6 +4,6 @@
 Bundle-SymbolicName: org.txm.treetagger.core.models
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: org.txm.treetagger.core
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
 Automatic-Module-Name: org.txm.treetagger.core.models
Index: tmp/org.txm.treetagger.core.macosx/build.properties
===================================================================
--- tmp/org.txm.treetagger.core.macosx/build.properties	(revision 3077)
+++ tmp/org.txm.treetagger.core.macosx/build.properties	(revision 3078)
@@ -2,6 +2,7 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               res/
+               res/,\
+               OSGI-INF/
 root.macosx.cocoa.x86_64.permissions.755=res/macosx/,res/macosx/bin,res/macosx/cmd
 #qualifier=svn
Index: tmp/org.txm.treetagger.core.macosx/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.treetagger.core.macosx/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.treetagger.core.macosx/META-INF/MANIFEST.MF	(revision 3078)
@@ -5,5 +5,5 @@
 Bundle-Vendor: Textometrie.org
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: org.txm.treetagger.core
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Automatic-Module-Name: org.txm.treetagger.core.macosx
Index: tmp/org.txm.libs.saxon/build.properties
===================================================================
--- tmp/org.txm.libs.saxon/build.properties	(revision 3077)
+++ tmp/org.txm.libs.saxon/build.properties	(revision 3078)
@@ -2,4 +2,5 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               saxon9he.jar
+               saxon9he.jar,\
+               OSGI-INF/
Index: tmp/org.txm.ocaml.core/build.properties
===================================================================
--- tmp/org.txm.ocaml.core/build.properties	(revision 3077)
+++ tmp/org.txm.ocaml.core/build.properties	(revision 3078)
@@ -4,5 +4,4 @@
                .,\
                lib/ocamlrun-scripting.jar,\
                lib/ocaml-lib-files.jar
-jars.compile.order = 
 source.. = src/
Index: tmp/org.txm.tmp.rcp/build.properties
===================================================================
--- tmp/org.txm.tmp.rcp/build.properties	(revision 3077)
+++ tmp/org.txm.tmp.rcp/build.properties	(revision 3078)
@@ -1,5 +1,10 @@
 #Fri Jul 06 10:25:19 CEST 2018
 output..=bin/
-bin.includes=plugin.xml,META-INF/,.,icons/,contexts.xml
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               icons/,\
+               contexts.xml,\
+               OSGI-INF/
 source..=src/
 #qualifier=svn
Index: tmp/org.txm.libs.gson/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.libs.gson/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.libs.gson/META-INF/MANIFEST.MF	(revision 3078)
@@ -4,7 +4,7 @@
 Bundle-SymbolicName: org.txm.libs.gson
 Bundle-Version: 2.8.6
 Automatic-Module-Name: org.txm.libs.gson
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ClassPath: gson-2.8.6.jar,
  .
 Export-Package: com.google.gson,
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 3077)
+++ tmp/org.txm.searchengine.cqp.core/src/org/txm/importer/cwb/ReadRegistryFile.java	(revision 3078)
@@ -40,7 +40,7 @@
 	 */
 	public void read() {
 		pAttributes = new ArrayList<>();
-		sAttributes = new ArrayList();
+		sAttributes = new ArrayList<>();
 		sattrs = new HashMap<>();
 		sattrsProfs = new HashMap<>();
 		
Index: tmp/org.txm.searchengine.cqp.core/build.properties
===================================================================
--- tmp/org.txm.searchengine.cqp.core/build.properties	(revision 3077)
+++ tmp/org.txm.searchengine.cqp.core/build.properties	(revision 3078)
@@ -3,8 +3,6 @@
 bin.includes = plugin.xml,\
                META-INF/,\
                .,\
-               icons/,\
-               res/,\
                OSGI-INF/
 source..=src/
 #qualifier=svn
Index: tmp/org.txm.libs.jfreechart/build.properties
===================================================================
--- tmp/org.txm.libs.jfreechart/build.properties	(revision 3077)
+++ tmp/org.txm.libs.jfreechart/build.properties	(revision 3078)
@@ -2,5 +2,5 @@
                about.html,\
                about_files/,\
                .,\
-               lib/jfreechart-1.5.0.jar
-jars.compile.order = 
+               lib/jfreechart-1.5.0.jar,\
+               OSGI-INF/
Index: tmp/org.txm.imports.metopes/.classpath
===================================================================
--- tmp/org.txm.imports.metopes/.classpath	(revision 3077)
+++ tmp/org.txm.imports.metopes/.classpath	(revision 3078)
@@ -1,16 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con"
-		path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" />
-	<classpathentry kind="con"
-		path="org.eclipse.pde.core.requiredPlugins">
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
 		<accessrules>
-			<accessrule kind="accessible" pattern="**" />
+			<accessrule kind="accessible" pattern="**"/>
 		</accessrules>
 	</classpathentry>
-	<classpathentry kind="src" path="src" />
-	<classpathentry kind="src" path="res" />
-	<classpathentry exported="true" kind="con"
-		path="GROOVY_DSL_SUPPORT" />
-	<classpathentry kind="output" path="bin" />
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="res"/>
+	<classpathentry kind="output" path="bin"/>
 </classpath>
Index: tmp/org.txm.imports.metopes/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.imports.metopes/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.imports.metopes/META-INF/MANIFEST.MF	(revision 3078)
@@ -8,7 +8,7 @@
  org.txm.rcp;bundle-version="0.8.0",
  org.eclipse.ui,
  org.eclipse.core.runtime
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Export-Package: org.txm.importer.metopes,
  org.txm.importer.metopes.preferences,
Index: tmp/org.txm.treetagger.core.win32/build.properties
===================================================================
--- tmp/org.txm.treetagger.core.win32/build.properties	(revision 3077)
+++ tmp/org.txm.treetagger.core.win32/build.properties	(revision 3078)
@@ -2,5 +2,6 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               res/
-#qualifier=svn
\ No newline at end of file
+               res/,\
+               OSGI-INF/
+#qualifier=svn
Index: tmp/org.txm.treetagger.core.win32/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.treetagger.core.win32/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.treetagger.core.win32/META-INF/MANIFEST.MF	(revision 3078)
@@ -4,6 +4,6 @@
 Bundle-SymbolicName: org.txm.treetagger.core.win32
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: org.txm.treetagger.core;bundle-version="1.0.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Textometrie.org
 Automatic-Module-Name: org.txm.treetagger.core.win32
Index: tmp/org.txm.rcp/src/main/java/org/txm/rcp/p2/plugins/TXMCatalogViewer.java
===================================================================
--- tmp/org.txm.rcp/src/main/java/org/txm/rcp/p2/plugins/TXMCatalogViewer.java	(revision 3077)
+++ tmp/org.txm.rcp/src/main/java/org/txm/rcp/p2/plugins/TXMCatalogViewer.java	(revision 3078)
@@ -14,29 +14,33 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 
-public class TXMCatalogViewer extends CatalogViewer{
-
+public class TXMCatalogViewer extends CatalogViewer {
+	
 	public TXMCatalogViewer(Catalog catalog, IShellProvider shellProvider,
 			IRunnableContext context, CatalogConfiguration configuration) {
 		super(catalog, shellProvider, context, configuration);
 		// TODO Auto-generated constructor stub
 	}
-
+	
+	@Override
 	protected ControlListItem<?> doCreateViewerItem(Composite parent, Object element) {
 		if (element instanceof CatalogItem) {
-			return new TXMDiscoveryItem(parent, SWT.BORDER, getResources(), shellProvider, (CatalogItem) element, this);
-		} else if (element instanceof CatalogCategory) {
-			return new CategoryItem(parent, SWT.NONE, getResources(), (CatalogCategory) element);
+			return new TXMDiscoveryItem<>(parent, SWT.BORDER, getResources(), shellProvider, (CatalogItem) element, this);
 		}
+		else if (element instanceof CatalogCategory) {
+			return new CategoryItem<>(parent, SWT.NONE, getResources(), (CatalogCategory) element);
+		}
 		return null;
 	}
-
+	
+	@Override
 	public void modifySelection(final CatalogItem connector, boolean selected) {
 		super.modifySelection(connector, selected);
 	}
-
+	
+	@Override
 	protected void doCheckCatalog() {
-		//System.out.println("DO CHECK CATALOG");
+		// System.out.println("DO CHECK CATALOG");
 		int categoryWithConnectorCount = 0;
 		int itemCount = getCatalog().getItems().size();
 		
@@ -49,4 +53,4 @@
 			MessageDialog.openWarning(shellProvider.getShell(), Messages.ConnectorDiscoveryWizardMainPage_noConnectorsFound, Messages.ConnectorDiscoveryWizardMainPage_noConnectorsFound_description);
 		}
 	}
-}
\ No newline at end of file
+}
Index: tmp/org.txm.rcp/src/main/java/org/txm/rcp/utils/SWTEditorsUtils.java
===================================================================
--- tmp/org.txm.rcp/src/main/java/org/txm/rcp/utils/SWTEditorsUtils.java	(revision 3077)
+++ tmp/org.txm.rcp/src/main/java/org/txm/rcp/utils/SWTEditorsUtils.java	(revision 3078)
@@ -80,12 +80,13 @@
 					}
 					else if (tmpEditor instanceof ITXMResultEditor) {
 						
-						ArrayList eds = tmpEditors.get(((ITXMResultEditor<TXMResult>) tmpEditor).getResult());
+						ITXMResultEditor<TXMResult> txmEditor = (ITXMResultEditor<TXMResult>) tmpEditor;
+						ArrayList<ITXMResultEditor<TXMResult>> eds = tmpEditors.get(txmEditor.getResult());
 						if (eds == null) {
 							eds = new ArrayList<>();
-							tmpEditors.put(((ITXMResultEditor<TXMResult>) tmpEditor).getResult(), eds);
+							tmpEditors.put(txmEditor.getResult(), eds);
 						}
-						eds.add(tmpEditor);
+						eds.add(txmEditor);
 					}
 				}
 			}
Index: tmp/org.txm.rcp/src/main/java/org/txm/rcp/editors/TableKeyListener.java
===================================================================
--- tmp/org.txm.rcp/src/main/java/org/txm/rcp/editors/TableKeyListener.java	(revision 3077)
+++ tmp/org.txm.rcp/src/main/java/org/txm/rcp/editors/TableKeyListener.java	(revision 3078)
@@ -17,31 +17,35 @@
 import org.txm.utils.logger.Log;
 
 public class TableKeyListener implements KeyListener {
+	
 	TableViewer[] viewers;
-
+	
 	public TableKeyListener(TableViewer... viewers) {
 		this.viewers = viewers;
 	}
-
+	
 	@Override
 	public void keyReleased(KeyEvent e) {
-
+		
 	}
-
+	
 	@Override
 	public void keyPressed(KeyEvent e) {
-		//System.out.println("key code: "+e.keyCode);
-		if ((e.stateMask & SWT.CTRL) != 0 && e.keyCode == 99 ) { // CTRL + C
+		// System.out.println("key code: "+e.keyCode);
+		if ((e.stateMask & SWT.CTRL) != 0 && e.keyCode == 99) { // CTRL + C
 			copyLinesToClipboard(e);
-		} else if ((e.stateMask & SWT.CTRL) != 0 && e.keyCode == 102 ) { // CTRL + F
+		}
+		else if ((e.stateMask & SWT.CTRL) != 0 && e.keyCode == 102) { // CTRL + F
 			searchInLines(e);
-		} else if ((e.stateMask & SWT.COMMAND) != 0 && e.keyCode == 99 ) { // CMD + C
+		}
+		else if ((e.stateMask & SWT.COMMAND) != 0 && e.keyCode == 99) { // CMD + C
 			copyLinesToClipboard(e);
-		} else if ((e.stateMask & SWT.COMMAND) != 0 && e.keyCode == 102 ) { // CMD + F
+		}
+		else if ((e.stateMask & SWT.COMMAND) != 0 && e.keyCode == 102) { // CMD + F
 			searchInLines(e);
 		}
 	}
-
+	
 	/**
 	 * Opens a dialog box to enter a REGEX that selects lines in the table.
 	 */
@@ -51,72 +55,72 @@
 		if (dialog.open() == Window.OK) {
 			for (TableViewer viewer : viewers) {
 				TableItem[] items = viewer.getTable().getItems();
-				//System.out.println("search in tablein items: "+Arrays.toString(items));
-
+				// System.out.println("search in tablein items: "+Arrays.toString(items));
+				
 				TableColumn[] cols = viewer.getTable().getColumns();
-					String reg = dialog.getValue();
-					Pattern p = Pattern.compile(reg);
-					// TODO: useless ?
-					//ArrayList<TableItem> matchingItem = new ArrayList<TableItem>();
-					ArrayList<Integer> matchingIndexes = new ArrayList<Integer>();
-					for (int l = 0 ; l < items.length ; l++) {
-						TableItem item = items[l];
-						for (int i = 0 ; i < cols.length ; i++) {
-							if (p.matcher(item.getText(i)).matches()) {
-								// TODO: useless
-								//matchingItem.add(item);
-								matchingIndexes.add(l);
-								break; // next line
-							}
+				String reg = dialog.getValue();
+				Pattern p = Pattern.compile(reg);
+				// TODO: useless ?
+				// ArrayList<TableItem> matchingItem = new ArrayList<TableItem>();
+				ArrayList<Integer> matchingIndexes = new ArrayList<>();
+				for (int l = 0; l < items.length; l++) {
+					TableItem item = items[l];
+					for (int i = 0; i < cols.length; i++) {
+						if (p.matcher(item.getText(i)).matches()) {
+							// TODO: useless
+							// matchingItem.add(item);
+							matchingIndexes.add(l);
+							break; // next line
 						}
 					}
-					Log.fine(TXMCoreMessages.bind(TXMUIMessages.foundLinesColon, matchingIndexes));
-
-					// TODO: useless ?
-//					int[] indexes = new int[matchingIndexes.size()];
-//					TableItem[] mitems = new TableItem[matchingItem.size()];
-//					int i = 0;
-//					for(int index : matchingIndexes) {
-//						indexes[i++] = index;
-//					}
-//					i = 0;
-//					for(TableItem item : matchingItem) {
-//						mitems[i++] = item;
-//					}
-
-					// TODO: old version which doesn't trigger selection event
-//					if (mitems.length > 0) {
-//						viewer.getTable().showItem(mitems[0]); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
-//						viewer.getTable().deselectAll(); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
-//						viewer.getTable().select(indexes); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
-					
-					// trigger selection event on viewer
-					if (matchingIndexes.size() > 0) {
-						ArrayList elements = new ArrayList(matchingIndexes.size());
-						for(int j = 0; j < matchingIndexes.size(); j++) {
-							elements.add(viewer.getElementAt(matchingIndexes.get(j)));
+				}
+				Log.fine(TXMCoreMessages.bind(TXMUIMessages.foundLinesColon, matchingIndexes));
+				
+				// TODO: useless ?
+				// int[] indexes = new int[matchingIndexes.size()];
+				// TableItem[] mitems = new TableItem[matchingItem.size()];
+				// int i = 0;
+				// for(int index : matchingIndexes) {
+				// indexes[i++] = index;
+				// }
+				// i = 0;
+				// for(TableItem item : matchingItem) {
+				// mitems[i++] = item;
+				// }
+				
+				// TODO: old version which doesn't trigger selection event
+				// if (mitems.length > 0) {
+				// viewer.getTable().showItem(mitems[0]); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
+				// viewer.getTable().deselectAll(); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
+				// viewer.getTable().select(indexes); // useless: viewer.getTable().setSelection(indexes) can replace these 3 lines of code
+				
+				// trigger selection event on viewer
+				if (matchingIndexes.size() > 0) {
+					ArrayList<Object> elements = new ArrayList<>(matchingIndexes.size());
+					for (int j = 0; j < matchingIndexes.size(); j++) {
+						elements.add(viewer.getElementAt(matchingIndexes.get(j)));
+					}
+					viewer.setSelection(new StructuredSelection(elements), true);
+					for (TableViewer oViewer : viewers) {
+						if (oViewer != viewer) {
+							oViewer.getTable().deselectAll();
+							oViewer.getTable().select(viewer.getTable().getSelectionIndices());
 						}
-						viewer.setSelection(new StructuredSelection(elements), true);
-						for (TableViewer oViewer : viewers) {
-							if (oViewer != viewer) {
-								oViewer.getTable().deselectAll();
-								oViewer.getTable().select(viewer.getTable().getSelectionIndices());
-							}
-						}
-						return;
 					}
+					return;
+				}
 			}
 		}
 	}
-
+	
 	/**
 	 * Copies the current lines selection to the clipboard.
 	 */
 	public void copyLinesToClipboard(KeyEvent e) {
 		
-		StringBuffer str = new StringBuffer(); //$NON-NLS-1$
-	
-		for (int l = 0 ; l < viewers[0].getTable().getSelection().length ; l++) {
+		StringBuffer str = new StringBuffer();
+		
+		for (int l = 0; l < viewers[0].getTable().getSelection().length; l++) {
 			
 			if (l > 0) str.append("\n"); //$NON-NLS-1$
 			
@@ -125,8 +129,8 @@
 				TableItem[] items = viewer.getTable().getSelection();
 				TableItem item = items[l];
 				
-				for (int i = 0 ; i < cols.length ; i++) {
-					if (cols[i].getText().trim().length() >0) {
+				for (int i = 0; i < cols.length; i++) {
+					if (cols[i].getText().trim().length() > 0) {
 						if (i > 0) str.append("\t"); //$NON-NLS-1$
 						str.append(item.getText(i));
 					}
@@ -138,4 +142,4 @@
 		org.txm.rcp.utils.IOClipboard.write(strr);
 		Log.info(TXMCoreMessages.bind(TXMUIMessages.copiedLinesColon, strr));
 	}
-}
\ No newline at end of file
+}
Index: tmp/org.txm.rcp/plugin.xml
===================================================================
--- tmp/org.txm.rcp/plugin.xml	(revision 3077)
+++ tmp/org.txm.rcp/plugin.xml	(revision 3078)
@@ -2928,20 +2928,8 @@
                   </iterate>
                </with>
             </definition>
+           
             <definition
-                  id="OneScriptSelected">
-               <with
-                     variable="selection">
-                  <iterate
-                        ifEmpty="false"
-                        operator="and">
-                     <instanceof
-                           value="org.txm.objects.Script">
-                     </instanceof>
-                  </iterate>
-               </with>
-            </definition>
-            <definition
                   id="OneResultSelected">
                <visibleWhen
                      checkEnabled="false">
@@ -2977,32 +2965,6 @@
                </with>
             </definition>
             <definition
-                  id="OneTxmObjectSelected">
-               <with
-                     variable="selection">
-                  <iterate
-                        ifEmpty="false"
-                        operator="and">
-                     <instanceof
-                           value="org.txm.objects.TxmObject">
-                     </instanceof>
-                  </iterate>
-               </with>
-            </definition>
-            <definition
-                  id="OneQueryLogSelected">
-               <with
-                     variable="selection">
-                  <iterate
-                        ifEmpty="false"
-                        operator="and">
-                     <instanceof
-                           value="org.txm.objects.QueryLog">
-                     </instanceof>
-                  </iterate>
-               </with>
-            </definition>
-            <definition
                   id="StatEngineReady">
                <test
                      forcePluginActivation="true"
Index: tmp/org.txm.backtomedia.rcp/build.properties
===================================================================
--- tmp/org.txm.backtomedia.rcp/build.properties	(revision 3077)
+++ tmp/org.txm.backtomedia.rcp/build.properties	(revision 3078)
@@ -4,7 +4,7 @@
                .,\
                icons/,\
                vlcj-4.1.0/jna-5.2.0.jar,\
-               vlcj-4.1.0/platform-5.2.0.jar,\
+               vlcj-4.1.0/jna-platform-5.2.0.jar,\
                vlcj-4.1.0/vlcj-4.1.0.jar,\
                opal-0.9.5.2.jar,\
                OSGI-INF/,\
Index: tmp/org.txm.wordcloud.core/build.properties
===================================================================
--- tmp/org.txm.wordcloud.core/build.properties	(revision 3077)
+++ tmp/org.txm.wordcloud.core/build.properties	(revision 3078)
@@ -1,5 +1,8 @@
 #Fri Jul 06 10:25:20 CEST 2018
 output..=bin/
-bin.includes=META-INF/,.,plugin.xml
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               OSGI-INF/
 source..=src/
 #qualifier=svn
Index: tmp/org.txm.libs.colt/build.properties
===================================================================
--- tmp/org.txm.libs.colt/build.properties	(revision 3077)
+++ tmp/org.txm.libs.colt/build.properties	(revision 3078)
@@ -1,4 +1,5 @@
 bin.includes = META-INF/,\
                about.html,\
                lib/colt-1.2.0.jar,\
-               .
+               .,\
+               OSGI-INF/
Index: tmp/org.txm.xmleditor.rcp/build.properties
===================================================================
--- tmp/org.txm.xmleditor.rcp/build.properties	(revision 3077)
+++ tmp/org.txm.xmleditor.rcp/build.properties	(revision 3078)
@@ -1,5 +1,8 @@
 #Fri Jul 06 10:25:20 CEST 2018
 output..=bin/
-bin.includes=plugin.xml,META-INF/,.,OSGI-INF/l10n/bundle.properties
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               OSGI-INF/
 source..=src/
 #qualifier=svn
Index: tmp/org.txm.libs.cqp/build.properties
===================================================================
--- tmp/org.txm.libs.cqp/build.properties	(revision 3077)
+++ tmp/org.txm.libs.cqp/build.properties	(revision 3078)
@@ -2,5 +2,6 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               plugin.xml
+               plugin.xml,\
+               OSGI-INF/
 #qualifier=svn
Index: tmp/org.txm.libs.msoffice/build.properties
===================================================================
--- tmp/org.txm.libs.msoffice/build.properties	(revision 3077)
+++ tmp/org.txm.libs.msoffice/build.properties	(revision 3078)
@@ -14,5 +14,6 @@
                lib/poi-scratchpad-5.0.0.jar,\
                lib/commons-compress-1.20.jar,\
                lib/curvesapi-1.06.jar,\
-               lib/xmlbeans-4.0.0.jar
+               lib/xmlbeans-4.0.0.jar,\
+               OSGI-INF/
 #qualifier=svn
Index: tmp/org.txm.libs.groovy-all/build.properties
===================================================================
--- tmp/org.txm.libs.groovy-all/build.properties	(revision 3077)
+++ tmp/org.txm.libs.groovy-all/build.properties	(revision 3078)
@@ -24,4 +24,5 @@
                lib/groovy-test-2.5.0-indy.jar,\
                lib/groovy-test-junit5-2.5.0-indy.jar,\
                lib/groovy-testng-2.5.0-indy.jar,\
-               lib/groovy-xml-2.5.0-indy.jar
+               lib/groovy-xml-2.5.0-indy.jar,\
+               OSGI-INF/
Index: tmp/org.txm.treetagger.core.linux/build.properties
===================================================================
--- tmp/org.txm.treetagger.core.linux/build.properties	(revision 3077)
+++ tmp/org.txm.treetagger.core.linux/build.properties	(revision 3078)
@@ -2,6 +2,7 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               res/
+               res/,\
+               OSGI-INF/
 root.linux.gtk.x86_64.permissions.755=res/linux/,res/linux/bin,res/linux/cmd
-#qualifier=svn
\ No newline at end of file
+#qualifier=svn
Index: tmp/org.txm.treetagger.core.linux/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.treetagger.core.linux/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.treetagger.core.linux/META-INF/MANIFEST.MF	(revision 3078)
@@ -4,5 +4,5 @@
 Bundle-SymbolicName: org.txm.treetagger.core.linux
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: org.txm.treetagger.core;bundle-version="1.0.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Automatic-Module-Name: org.txm.treetagger.core.linux
Index: tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/ExternalizationFilesUpdater.java
===================================================================
--- tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/ExternalizationFilesUpdater.java	(revision 3077)
+++ tmp/org.txm.translate.rcp/src/org/txm/rcp/translate/ExternalizationFilesUpdater.java	(revision 3078)
@@ -66,36 +66,35 @@
  * 
  */
 public class ExternalizationFilesUpdater {
-
+	
 	static boolean debug = false; // activate the properties files content display
 	
 	/** The dirfiles to process containing "(messages|bundle)(_$lang)?.properties" files */
-	LinkedList<File> dirfiles = new LinkedList<File>();
+	LinkedList<File> dirfiles = new LinkedList<>();
 	
 	/** The propertyfiles. */
-	HashMap<File, List<File>> propertyfiles = new HashMap<File, List<File>>();
+	HashMap<File, List<File>> propertyfiles = new HashMap<>();
 	
 	/** The fileentries: the messages keys */
-	HashMap<File, List<String>> fileentries = new HashMap<File, List<String>>();
+	HashMap<File, List<String>> fileentries = new HashMap<>();
 	
 	/** The fileentriesvalues: the messages key<->value s. */
-	HashMap<File, HashMap<String, String>> fileentriesvalues = new HashMap<File, HashMap<String, String>>();
-
+	HashMap<File, HashMap<String, String>> fileentriesvalues = new HashMap<>();
+	
 	/**
 	 * Gets the entries.
 	 *
 	 * @param file the file
 	 * @return the entries
-	 * @throws IOException 
+	 * @throws IOException
 	 */
-	public static List<String> getEntries(File file) throws IOException
-	{
-		List<String> entries = new ArrayList<String>();
+	public static List<String> getEntries(File file) throws IOException {
+		List<String> entries = new ArrayList<>();
 		String encoding = "iso-8859-1";
 		if (file.getName().startsWith("message")) { // TXM manages messages.properties encoded in UTF-8
 			encoding = "UTF-8";
 		}
-		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file) , encoding));
+		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), encoding));
 		String line = reader.readLine();
 		while (line != null) {
 			String[] split = line.split("=", 2);
@@ -105,25 +104,25 @@
 			line = reader.readLine();
 		}
 		reader.close();
-		if (debug) System.out.println(" ENTRIES "+file+" -> "+entries);
+		if (debug) System.out.println(" ENTRIES " + file + " -> " + entries);
 		return entries;
 	}
-
+	
 	/**
 	 * Gets the values.
 	 *
 	 * @param file the file
 	 * @return the values
-	 * @throws IOException 
+	 * @throws IOException
 	 */
 	public static HashMap<String, String> getValues(File file) throws IOException {
-		HashMap<String, String> values = new HashMap<String, String>();
+		HashMap<String, String> values = new HashMap<>();
 		
 		String encoding = "iso-8859-1";
 		if (file.getName().startsWith("message")) { // TXM manages messages.properties encoded in UTF-8
 			encoding = "UTF-8";
 		}
-		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file) , encoding));
+		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), encoding));
 		
 		String line = reader.readLine();
 		while (line != null) {
@@ -135,18 +134,18 @@
 		}
 		reader.close();
 		
-		if (debug) System.out.println(" VALUES "+file+" -> "+values);
+		if (debug) System.out.println(" VALUES " + file + " -> " + values);
 		return values;
 	}
-
+	
 	/**
 	 * Process found directories.
-	 * @throws IOException 
+	 * 
+	 * @throws IOException
 	 */
-	public void processFoundDirectories() throws IOException
-	{
+	public void processFoundDirectories() throws IOException {
 		for (File dirfile : dirfiles) {
-			System.out.println("DIRECTORY : "+dirfile);
+			System.out.println("DIRECTORY : " + dirfile);
 			List<File> files = propertyfiles.get(dirfile);
 			for (File f : files) {
 				this.fileentries.put(f, getEntries(f)); // ordered
@@ -154,82 +153,83 @@
 			}
 			File reference = null;
 			if (files.get(0).getName().startsWith("m")) {
-				reference = new File(dirfile,"messages.properties");
+				reference = new File(dirfile, "messages.properties");
 			}
 			else if (files.get(0).getName().startsWith("b")) {
-				reference = new File(dirfile,"bundle.properties");
+				reference = new File(dirfile, "bundle.properties");
 			}
 			if (reference != null && reference.exists()) {
 				for (File f : files) {
 					if (!f.getName().equals(reference.getName())) {
-						List<String> refentries = new ArrayList(this.fileentries.get(reference));
-						List<String> tmp1 = new ArrayList(this.fileentries.get(f));
+						List<String> refentries = new ArrayList<>(this.fileentries.get(reference));
+						List<String> tmp1 = new ArrayList<>(this.fileentries.get(f));
 						tmp1.removeAll(refentries);
 						
 						refentries = this.fileentries.get(reference);
 						List<String> tmp = this.fileentries.get(f);
 						refentries.removeAll(tmp);
 						for (String missing : refentries) {
-							this.fileentriesvalues.get(f).put(missing,"N/A_"+this.fileentriesvalues.get(reference).get(missing)); // put entry's value
+							this.fileentriesvalues.get(f).put(missing, "N/A_" + this.fileentriesvalues.get(reference).get(missing)); // put entry's value
 						}
 						
 						this.fileentries.put(f, this.fileentries.get(reference)); // update file entries
 						
 						if (tmp1.size() > 0 || refentries.size() > 0)
-							System.out.println(" "+f.getName());
+							System.out.println(" " + f.getName());
 						if (tmp1.size() > 0)
-							System.out.println( "  Removed keys : "+tmp1);
+							System.out.println("  Removed keys : " + tmp1);
 						if (refentries.size() > 0)
-							System.out.println( "  Added keys : "+refentries);
+							System.out.println("  Added keys : " + refentries);
 					}
 				}
 			}
 		}
 	}
-
+	
 	/**
 	 * Update files.
-	 * @throws IOException 
+	 * 
+	 * @throws IOException
 	 */
 	public void updateFiles() throws IOException {
 		for (File dirfile : dirfiles) {
 			List<File> files = propertyfiles.get(dirfile);
 			for (File f : files) {
 				
-				List<String> entries =  this.fileentries.get(f);
-				if (debug) System.out.println(" U "+f+" <- "+entries);
+				List<String> entries = this.fileentries.get(f);
+				if (debug) System.out.println(" U " + f + " <- " + entries);
 				HashMap<String, String> values = this.fileentriesvalues.get(f);
 				
-				OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(f) , "iso-8859-1");
+				OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(f), "iso-8859-1");
 				for (String entry : entries) {
-					writer.write(entry+"="+values.get(entry)+"\n");
+					writer.write(entry + "=" + values.get(entry) + "\n");
 				}
 				writer.close();
 			}
 		}
 	}
-
+	
 	/**
 	 * Creates the missing files.
 	 *
 	 * @param lang the suffix
-	 * @throws IOException 
+	 * @throws IOException
 	 */
-	public void createMissingFiles(String lang) throws IOException
-	{
-		System.out.println("Looking for missing messages files "+ lang);
+	public void createMissingFiles(String lang) throws IOException {
+		System.out.println("Looking for missing messages files " + lang);
 		for (File dirfile : dirfiles) {
-			//println "DIRECTORY : "+dirfile
+			// println "DIRECTORY : "+dirfile
 			File reference = null;
 			String lookingname = "";
 			List<File> files = propertyfiles.get(dirfile);
 			if (files.get(0).getName().startsWith("m")) {
-				reference = new File(dirfile,"messages.properties");
-				lookingname = "messages_"+lang+".properties";
-			} else if (files.get(0).getName().startsWith("b")) {
-				reference = new File(dirfile,"bundle.properties");
-				lookingname = "bundle_"+lang+".properties";
+				reference = new File(dirfile, "messages.properties");
+				lookingname = "messages_" + lang + ".properties";
 			}
+			else if (files.get(0).getName().startsWith("b")) {
+				reference = new File(dirfile, "bundle.properties");
+				lookingname = "bundle_" + lang + ".properties";
+			}
 			
 			boolean create = true;
 			if (reference != null && reference.exists()) {
@@ -240,50 +240,51 @@
 			}
 			
 			if (create) {
-				new File(dirfile,lookingname).createNewFile();
-				System.out.println("Create file " +new File(dirfile,lookingname));
+				new File(dirfile, lookingname).createNewFile();
+				System.out.println("Create file " + new File(dirfile, lookingname));
 			}
 		}
 	}
-
-	/* (non-Javadoc)
+	
+	/*
+	 * (non-Javadoc)
 	 * @see java.lang.Object#toString()
 	 */
+	@Override
 	public String toString() {
 		String rez = "";
 		for (File dirfile : dirfiles) {
-			rez += dirfile+"\n";
+			rez += dirfile + "\n";
 			for (File f : propertyfiles.get(dirfile)) {
-				rez += "  "+f.getName()+"\n";
+				rez += "  " + f.getName() + "\n";
 			}
 		}
 		return rez;
 	}
-
+	
 	/**
 	 * Scan directory.
 	 *
 	 * @param directory the directory
 	 */
-	public void scanDirectory(File directory)
-	{
+	public void scanDirectory(File directory) {
 		if (!directory.exists()) {
-			System.out.println("directory '"+directory+"' does not exists");
+			System.out.println("directory '" + directory + "' does not exists");
 			return;
 		}
 		
-		System.out.println("scan directory : "+directory.getAbsolutePath());
-		LinkedList<File> files = new LinkedList<File>();
+		System.out.println("scan directory : " + directory.getAbsolutePath());
+		LinkedList<File> files = new LinkedList<>();
 		files.add(directory);
 		
 		while (!files.isEmpty()) {
 			File current = files.removeFirst();
 			if (current.isDirectory() && !current.getName().equals("bin")) {
-				List<File> currentpfiles = new ArrayList<File>();
+				List<File> currentpfiles = new ArrayList<>();
 				for (File sfile : current.listFiles(IOUtils.HIDDENFILE_FILTER)) {
 					if (sfile.isDirectory())
 						files.add(sfile);
-					else if(sfile.getName().endsWith(".properties") && (sfile.getName().startsWith("messages") || sfile.getName().startsWith("bundle")) )
+					else if (sfile.getName().endsWith(".properties") && (sfile.getName().startsWith("messages") || sfile.getName().startsWith("bundle")))
 						currentpfiles.add(sfile);
 				}
 				if (currentpfiles.size() > 0) {
@@ -293,26 +294,25 @@
 			}
 		}
 	}
-
+	
 	/**
 	 * The main method.
 	 *
 	 * @param args the arguments
-	 * @throws IOException 
+	 * @throws IOException
 	 */
-	public static void main(String[] args) throws Exception
-	{
+	public static void main(String[] args) throws Exception {
 		String userdir = System.getProperty("user.home");
 		File workspaceDir = new File(userdir, "workspace047/org.txm.annotation.urs.rcp");
 		
 		for (File project : workspaceDir.listFiles(IOUtils.HIDDENFILE_FILTER)) {
 			if (!project.isDirectory()) continue;
 			if (project.isHidden()) continue;
-		//	if (!project.getName().endsWith(".rcp")) continue;
+			// if (!project.getName().endsWith(".rcp")) continue;
 			
-			System.out.println("*** "+project+" ***");
+			System.out.println("*** " + project + " ***");
 			
-			String[] langs = {"fr", "ru"};
+			String[] langs = { "fr", "ru" };
 			ExternalizationFilesUpdater scanner = new ExternalizationFilesUpdater();
 			scanner.scanDirectory(project);
 			for (String lang : langs) {
@@ -322,4 +322,4 @@
 			scanner.updateFiles();
 		}
 	}
-}
\ No newline at end of file
+}
Index: tmp/org.txm.translate.rcp/build.properties
===================================================================
--- tmp/org.txm.translate.rcp/build.properties	(revision 3077)
+++ tmp/org.txm.translate.rcp/build.properties	(revision 3078)
@@ -4,4 +4,4 @@
 bin.includes = META-INF/,\
                .,\
                plugin.xml,\
-               OSGI-INF/l10n/bundle.properties
+               OSGI-INF/
Index: tmp/org.txm.rcp.p2.ui/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.rcp.p2.ui/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.rcp.p2.ui/META-INF/MANIFEST.MF	(revision 3078)
@@ -4,7 +4,7 @@
 Bundle-SymbolicName: org.txm.rcp.p2.ui
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: org.eclipse.equinox.p2.ui;bundle-version="2.3.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Eclipse-PatchFragment: true
 Bundle-ClassPath: library.jar,
  .
Index: tmp/org.txm.rcp.p2.ui/build.properties
===================================================================
--- tmp/org.txm.rcp.p2.ui/build.properties	(revision 3077)
+++ tmp/org.txm.rcp.p2.ui/build.properties	(revision 3078)
@@ -1,4 +1,5 @@
 bin.includes = META-INF/,\
-               library.jar
+               library.jar,\
+               OSGI-INF/
 source.library.jar = src/
 jars.compile.order = library.jar
Index: tmp/org.txm.links.rcp/build.properties
===================================================================
--- tmp/org.txm.links.rcp/build.properties	(revision 3077)
+++ tmp/org.txm.links.rcp/build.properties	(revision 3078)
@@ -1,5 +1,8 @@
 #Fri Jul 06 10:25:12 CEST 2018
 output..=bin/
-bin.includes=META-INF/,.,plugin.xml,OSGI-INF/l10n/bundle.properties
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               OSGI-INF/
 source..=src/
 #qualifier=svn
Index: tmp/org.txm.statsengine.r.core.win32/build.properties
===================================================================
--- tmp/org.txm.statsengine.r.core.win32/build.properties	(revision 3077)
+++ tmp/org.txm.statsengine.r.core.win32/build.properties	(revision 3078)
@@ -2,7 +2,8 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               res/
+               res/,\
+               OSGI-INF/
 bin.excludes = res/win32/library/BH/,\
                res/win32/library/stringi/
-#qualifier=svn
\ No newline at end of file
+#qualifier=svn
Index: tmp/org.txm.statsengine.r.core.win32/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.statsengine.r.core.win32/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.statsengine.r.core.win32/META-INF/MANIFEST.MF	(revision 3078)
@@ -4,7 +4,7 @@
 Bundle-SymbolicName: org.txm.statsengine.r.core.win32
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: org.txm.statsengine.r.core;bundle-version="1.0.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Eclipse-PlatformFilter: (osgi.os=win32)
 Bundle-Vendor: Textometrie.org
 Automatic-Module-Name: org.txm.statsengine.r.core.win32
Index: tmp/org.txm.libs.itext/build.properties
===================================================================
--- tmp/org.txm.libs.itext/build.properties	(revision 3077)
+++ tmp/org.txm.libs.itext/build.properties	(revision 3078)
@@ -1,3 +1,4 @@
 bin.includes = META-INF/,\
                .,\
-               lib/iText-2.1.5.jar
+               lib/iText-2.1.5.jar,\
+               OSGI-INF/
Index: tmp/org.txm.libs.rserve/build.properties
===================================================================
--- tmp/org.txm.libs.rserve/build.properties	(revision 3077)
+++ tmp/org.txm.libs.rserve/build.properties	(revision 3078)
@@ -2,5 +2,5 @@
                lib/,\
                lib/REngine.jar,\
                lib/RserveEngine.jar,\
-               .
-jars.compile.order = 
+               .,\
+               OSGI-INF/
Index: tmp/org.txm.rcp.about.fragment/build.properties
===================================================================
--- tmp/org.txm.rcp.about.fragment/build.properties	(revision 3077)
+++ tmp/org.txm.rcp.about.fragment/build.properties	(revision 3078)
@@ -1,4 +1,5 @@
 bin.includes = META-INF/,\
-               library.jar
+               library.jar,\
+               OSGI-INF/
 source.library.jar = src/
 jars.compile.order = library.jar
Index: tmp/org.txm.rcp.about.fragment/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.rcp.about.fragment/META-INF/MANIFEST.MF	(revision 3077)
+++ tmp/org.txm.rcp.about.fragment/META-INF/MANIFEST.MF	(revision 3078)
@@ -5,7 +5,7 @@
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: org.eclipse.ui.workbench;bundle-version="3.110.1.v20170704-1208"
 Eclipse-PatchFragment: true
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ClassPath: library.jar,
  .
 Export-Package: org.eclipse.ui.internal.about
Index: tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ModeleChaines.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ModeleChaines.java	(revision 3077)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ModeleChaines.java	(revision 3078)
@@ -16,726 +16,792 @@
  * @author Bernard
  */
 public class ModeleChaines {
-  static class Chainon {
-    Unite unite;
-    String texte;
-    Schema chaine = null;
-    int nbEltsChaine = 0;
-    String idChaine = "";
-    int noChaine = 0;
-    Chainon(Unite unite, String texte) {
-      this.unite = unite;
-      this.texte = texte;
-    }
-  }
-  private Vue vue;
-  private GChaines panneauGraphique;
-  private Unite[] listeUnites;
-  private boolean peutafficher = true;
-  private HashMap<Unite, Schema> chainesUnitesNonFiltrees =
-          new HashMap<Unite, Schema>();
-  private int[] seuilsValsNbElements = new int[0];
-  private HashMap<Unite, Chainon> chainonsUnites = new HashMap<Unite, Chainon>();
-  private HashMap<Schema, ArrayList<Unite>> unitesChaines =
-          new HashMap<Schema, ArrayList<Unite>>();
-  private HashMap<String, HashSet<String>> valsMasqueesChamp =
-          new HashMap<String, HashSet<String>>();
-  private HashSet<String> valNulleMasqueeChamp = new HashSet<String>();
-  private boolean[] valsMasqueesNbElements = new boolean[0];
-  
-  public ModeleChaines(Vue vue, GChaines panneauGraphique) {
-    this.vue = vue;
-    this.panneauGraphique = panneauGraphique;
-  }
-  Schema getChaine(Unite unit) {
-    return chainonsUnites.get(unit).chaine;
-  }
-  public HashMap<Unite, Chainon> getChainonUnites(){
-      return chainonsUnites;
-  }
-  Unite[] getUnites() {
-    return listeUnites;
-  }
-  Unite[] getUnitesChaine(Schema chaine) {
-    ArrayList<Unite> units = unitesChaines.get(chaine);
-    return units.toArray(new Unite[0]);
-  }
-  boolean isMasqueeValChamp(String champ, String val) {
-    return valsMasqueesChamp.containsKey(champ)
-            &&valsMasqueesChamp.get(champ).contains(val);
-  }
-  boolean isMasqueeValNulleChamp(String champ) {
-    return valNulleMasqueeChamp.contains(champ);
-  }
-  boolean isMasqueeValNbElements(int i) {
-    return i >= valsMasqueesNbElements.length ? false : valsMasqueesNbElements[i];
-  }
-  public HashMap<String, HashSet<String>> getValsMasqueesChamp(){
-      return valsMasqueesChamp;
-  }
-  public HashSet<String> getValsNulleMasqueesChamp(){
-      return valNulleMasqueeChamp;
-  }  
-  public HashMap<Unite, Schema> getchainesUnitesNonFiltrees(){
-      return chainesUnitesNonFiltrees;
-  }
-  public boolean[] getValsNbMasqueesChamp(){
-      return valsMasqueesNbElements;
-  }    
-  public void setValsMasqueesChamp(HashMap<String, HashSet<String>> valsMasqueesChamp){
-      this.valsMasqueesChamp = valsMasqueesChamp;
-  }
-  public void setValsNulleMasqueesChamp(HashSet<String> valNulleMasqueeChamp){
-      this.valNulleMasqueeChamp = valNulleMasqueeChamp;
-  }  
-  public void setValsNbMasqueesChamp(boolean[] valsMasqueesNbElements){
-      this.valsMasqueesNbElements=valsMasqueesNbElements;
-  }      
-  //retourne le nombre de valeurs masquees pour le champ
-  public int nbvaleursmasquees(String champ){
-      int resultat=0;
-      if(champ==null){//si le champ affiché est le nombre de chainons
-          for(boolean val : valsMasqueesNbElements){
-              if(val){
-                  resultat = resultat + 1;
-              }
-          }
-      }
-      else{
-          resultat = valsMasqueesChamp.get(champ).size();
-      }
-      return resultat;
-  }
-  void demasquerToutesValsChamp(String champ) {
-    valsMasqueesChamp.get(champ).clear();
-    valNulleMasqueeChamp.remove(champ);
-  }
-  void demasquerToutesValsNbElts(String champ) {
-    for (int i = 0; i<valsMasqueesNbElements.length; i++) {
-      valsMasqueesNbElements[i] = false;  
-    }
-  }
-  void setGChaine(GChaines panneaugraphique){
-      this.panneauGraphique = panneaugraphique;
-  }
-  void setUnites(Unite[] donnees){
-      this.listeUnites = donnees;
-  }  
-  void permettreaffichage(boolean autorisation){
-      this.peutafficher = autorisation;
-  }
-  boolean peutetreafficher(){
-      return this.peutafficher;
-  }
- void masquerAutresValsChamp(String typeunite, String champ, String val) {
-    for(String v: vue.getValeursChamp(Unite.class, typeunite, champ)) 
-      valsMasqueesChamp.get(champ).add(v);
-     valsMasqueesChamp.get(champ).remove(val);
-     valNulleMasqueeChamp.add(champ);
-  }
- void masquerValChamp(boolean yes, String champ, String val) {
-    if (yes) valsMasqueesChamp.get(champ).add(val);
-    else valsMasqueesChamp.get(champ).remove(val);
-  }
- void masquerValsNonNullesChamp(String typeunite, String champ) {
-    for(String v: vue.getValeursChamp(Unite.class, typeunite, champ)) 
-      valsMasqueesChamp.get(champ).add(v);
-     valNulleMasqueeChamp.remove(champ);
-  }
-  void masquerValNulleChamp(boolean yes, String champ) {
-    if (yes) valNulleMasqueeChamp.add(champ);
-    else valNulleMasqueeChamp.remove(champ);
-  }
-  void masquerAutresValsNbElts(String champ, int i0) {
-    for (int i = 0; i<valsMasqueesNbElements.length; i++) {
-      valsMasqueesNbElements[i] = i!=i0;  
-    }
-  }
-  void masquerValNbElements(boolean yes, int i) {
-    valsMasqueesNbElements[i] = yes;
-  }
-  void init(String typeChaines, String typeUnites, int[] seuils)
-          throws UnsupportedOperationException {
-    seuilsValsNbElements = seuils;
-    String[] champs = vue.getNomsChamps(Unite.class, typeUnites);
-    valsMasqueesChamp.clear();
-    for (String champ : champs)
-      valsMasqueesChamp.put(champ, new HashSet<String>());
-    valNulleMasqueeChamp.clear();
-    valsMasqueesNbElements = new boolean[seuils.length+3];
-    calculerChainesUnitesNonFiltrees(typeChaines, typeUnites);
-    calculerDonnees(typeChaines, typeUnites);
-  }
-  //struture qui n'est pas filtrées mais qui associe à une unité qui correspond au bon type d'unités
-  //la chaine qui la contient et qui est elle aussi du bon type de Schéma
-  private void calculerChainesUnitesNonFiltrees(String typeChaines,
-          String typeUnites) throws UnsupportedOperationException {
-    chainesUnitesNonFiltrees.clear();
-    for (Schema chaine : vue.getSchemasAVoir(typeChaines))
-      for (Element elt : chaine.getContenu()) {
-        if (elt.getClass()==Unite.class&&elt.getType().equals(typeUnites)) {
-          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);
-        }
-      }
-  }
-  void modifMasqueVals(String typeChaines, String typeUnites) {
-    calculerDonnees(typeChaines, typeUnites);
-  }
-  void modifMasqueValsChampChaine(String typeChaines, String typeUnites,ArrayList noparagraphecachees,String champ
-  ,String Valeur) {
-    calculerDonnees(typeChaines, typeUnites, noparagraphecachees, champ
-  , Valeur);
-  }  
-  private void filtrerListeUnites(String typeUnites, String typeChaines) {
-    Unite[] unites = vue.getUnitesAVoir(typeUnites);
-    Schema[] chaines = vue.getSchemasAVoir(typeChaines);
-    unitesChaines.clear();
-    for (Schema chaine : chaines) unitesChaines.put(chaine, new ArrayList<Unite>());
-    ArrayList<Integer> indFiltrees = new ArrayList<Integer>();
-    String[] champs = vue.getNomsChamps(Unite.class, typeUnites);
-    boolean agarder;
-    for (int i = 0; i<unites.length; i++) {
-      agarder = true;
-      for (String champ : champs) {//pour tous les champs 
-        String val = vue.getValeurChamp(unites[i], champ);//je recupere la valeur du champ
-        if (val.isEmpty()) {
-          if (valNulleMasqueeChamp.contains(champ)) {
-            agarder = false;
-            break;
-          }
-        } else {
-          if (valsMasqueesChamp.get(champ).contains(val)) {
-            agarder = false;
-            break;
-          }
-        }
-      }
-      if (agarder) {
-        indFiltrees.add(i);
-        if (chainesUnitesNonFiltrees.containsKey(unites[i])) {
-          Schema chaine = chainesUnitesNonFiltrees.get(unites[i]);
-          unitesChaines.get(chaine).add(unites[i]);
-        }
-      }
-    }
-    ArrayList<Integer> indIndFiltrees = new ArrayList<Integer>();
-    for(int k=0; k<indFiltrees.size(); k++) {
-      Unite unit = unites[indFiltrees.get(k)];
-      if(chainesUnitesNonFiltrees.containsKey(unit)) {
-        if(!isMasqueeValNbElements(calculerValNbElements(
-                unitesChaines.get(chainesUnitesNonFiltrees.get(unit)).size())))
-          indIndFiltrees.add(k);
-      } else {
-        if(!isMasqueeValNbElements(0)) indIndFiltrees.add(k);
-      }      
-    }
-    listeUnites = new Unite[indIndFiltrees.size()];
-    for (int k = 0; k<listeUnites.length; k++) {
-      listeUnites[k] = unites[indFiltrees.get(indIndFiltrees.get(k))];
-    }
-        for (Schema chaine : chaines) {
-          int nb = unitesChaines.get(chaine).size();
-          if(nb==0||isMasqueeValNbElements(calculerValNbElements(nb)))
-            unitesChaines.remove(chaine);
-        }
-  }
-  private void calculerDonnees(String typeChaines, String typeUnites) {
-     filtrerListeUnites(typeUnites, typeChaines);
-    Chainon[] chainons = new Chainon[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Unite unit = listeUnites[i];
-      chainons[i] = new Chainon(unit, vue.getTexteUnite(unit));
-      if(chainesUnitesNonFiltrees.containsKey(unit)) {
-        Schema chaine = chainesUnitesNonFiltrees.get(unit);
-        chainons[i].chaine = chaine;
-        chainons[i].nbEltsChaine = unitesChaines.get(chaine).size();
-        chainons[i].idChaine = vue.getIdElement(chaine);
-      } 
-      chainonsUnites.put(listeUnites[i], chainons[i]);
-    }
-    HashMap<Schema, Integer> noChaine = new HashMap<Schema, Integer>();
-    int no = 0;
-    for (Schema chaine : vue.getSchemasAVoir(typeChaines)) {
-      if(unitesChaines.containsKey(chaine)) {
-        int nbElts = unitesChaines.get(chaine).size(); 
-       noChaine.put(chaine, nbElts>1 ? ++no : 0);
-    }
-    }
-    for (Unite unit : listeUnites) {
-      Chainon chainon = chainonsUnites.get(unit);
-      if (chainon.chaine!=null) chainon.noChaine = noChaine.get(chainon.chaine);
-    }
-    int[] noPar = vue.getCorpus().calculerNoParagraphe(listeUnites);
-    if(peutafficher){
-        panneauGraphique.setDonnees(chainons, noPar);
-    }
-  }
-  void initVide() {
-    listeUnites = new Unite[0];
-    chainesUnitesNonFiltrees.clear();
-    seuilsValsNbElements = new int[0];
-    chainonsUnites.clear();
-    unitesChaines.clear();
-    if(peutafficher){
-        panneauGraphique.setDonnees(new Chainon[0], new int[0]);
-        panneauGraphique.setCouleurs(new Color[0]);
-        panneauGraphique.setTaille(new int[0]);
-        panneauGraphique.setForme(new int[0]);
-        panneauGraphique.setSurTexte(new String[0]);
-        panneauGraphique.setSousTexte(new String[0]);
-    }
-    valNulleMasqueeChamp.clear();
-    valsMasqueesChamp.clear();
-    valsMasqueesNbElements = new boolean[0];
-  }
-  void setChampAffiche(String champ, HashMap<String, Color> couleursValeursChamp) {
-    if(peutafficher){  
-        panneauGraphique.setCouleurs(colorerChamp(champ, couleursValeursChamp));
-    }
-  }
-  void setChampAfficheTaille(String champ, HashMap<String, Integer> TaillesValeursChamp) {
-    if(peutafficher){  
-        panneauGraphique.setTaille(ReduireChamp(champ, TaillesValeursChamp));
-    }
-  }  
-  void setChampAfficheForme(String champ, HashMap<String, Integer> FormesValeursChamp) {
-    if(peutafficher){  
-        panneauGraphique.setForme(FormerChamp(champ, FormesValeursChamp));
-    }
-  }  
-  
-  void setChampAfficheSurTexte(String champ, HashMap<String, String> SurTexteValeursChamp) {
-    if(peutafficher){  
-        panneauGraphique.setSurTexte(SurTexteChamp(champ, SurTexteValeursChamp));
-    }
-  }  
-  void setChampAfficheSousTexte(String champ, HashMap<String, String> SousTexteValeursChamp) {
-    if(peutafficher){  
-        panneauGraphique.setSousTexte(SousTexteChamp(champ, SousTexteValeursChamp));
-    }
-  }  
-  
-  void setChampAfficheNbElts(Color[] couleurs) {
-    if(peutafficher){
-        panneauGraphique.setCouleurs(colorerNbElts(couleurs));
-    }
-  }
-  
-
-    
-  void setChampAfficheTailleNbElts(int[] taille) {
-    if(peutafficher){
-        panneauGraphique.setTaille(ReduireNbElts(taille));
-    }
-  }
-  
-  void setChampAfficheFormeNbElts(int[] forme) {
-    if(peutafficher){
-        panneauGraphique.setForme(FormeNbElts(forme));
-    }
-  }  
-  
-  void setChampAfficheSurTexteNbElts(String[] SurTexte) {
-    if(peutafficher){
-        panneauGraphique.setSurTexte(SurTexteNbElts(SurTexte));
-    }
-  }  
-  
-  void setChampAfficheSousTexteNbElts(String[] SousTexte) {
-    if(peutafficher){
-        panneauGraphique.setSousTexte(SousTexteNbElts(SousTexte));
-    }
-  }  
-  
-  private Color[] colorerNbElts(Color[] couleurs) {
-    Color[] couls = new Color[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Chainon ch = chainonsUnites.get(listeUnites[i]);
-      if (ch.chaine==null) couls[i] = couleurs[0];
-      else {
-        int nbElts = ch.nbEltsChaine;
-        couls[i] = couleurs[calculerValNbElements(nbElts)];
-      }
-    }
-    return couls;
-  }
-   private int[] FormeNbElts(int[] formes) {
-    int[] forme = new int[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Chainon ch = chainonsUnites.get(listeUnites[i]);
-      if (ch.chaine==null) forme[i] = formes[0];
-      else {
-        int nbElts = ch.nbEltsChaine;
-        forme[i] = formes[calculerValNbElements(nbElts)];
-      }
-    }
-    return forme;
-  }
-
-   private int[] ReduireNbElts(int[] tailles) {
-    int[] taille = new int[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Chainon ch = chainonsUnites.get(listeUnites[i]);
-      if (ch.chaine==null) taille[i] = tailles[0];
-      else {
-        int nbElts = ch.nbEltsChaine;
-        taille[i] = tailles[calculerValNbElements(nbElts)];
-      }
-    }
-    return taille;
-  }
-  private String[] SurTexteNbElts(String[] SurTextes) {
-    String[] SurTexte = new String[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Chainon ch = chainonsUnites.get(listeUnites[i]);
-      if (ch.chaine==null) SurTexte[i] = SurTextes[0];
-      else {
-        int nbElts = ch.nbEltsChaine;
-        SurTexte[i] = SurTextes[calculerValNbElements(nbElts)];
-      }
-    }
-    return SurTexte;
-  }
-    private String[] SousTexteNbElts(String[] SousTextes) {
-    String[] SousTexte = new String[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Chainon ch = chainonsUnites.get(listeUnites[i]);
-      if (ch.chaine==null) SousTexte[i] = SousTextes[0];
-      else {
-        int nbElts = ch.nbEltsChaine;
-        SousTexte[i] = SousTextes[calculerValNbElements(nbElts)];
-      }
-    }
-    return SousTexte;
-  }
-  
-   
-  private Color[] colorerChamp(String champ, HashMap<String, Color> couleursValeursChamp) {
-    Color[] couls = new Color[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Chainon ch = chainonsUnites.get(listeUnites[i]);
-      couls[i] = couleursValeursChamp.get(vue.getValeurChamp(ch.unite, champ));
-    }
-    return couls;
-  }
-  //même chose que colorer champ mais en influant la taille des chainons
-  private int[] ReduireChamp(String champ, HashMap<String, Integer> TaillesValeursChamp) {
-    int[] taille = new int[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Chainon ch = chainonsUnites.get(listeUnites[i]);
-      taille[i] = TaillesValeursChamp.get(vue.getValeurChamp(ch.unite, champ));
-    }
-    return taille;
-  }
-  //même chose que colorer champ mais en influant la forme des chainons
-  private int[] FormerChamp(String champ, HashMap<String, Integer> FormesValeursChamp) {
-    int[] forme = new int[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Chainon ch = chainonsUnites.get(listeUnites[i]);
-      forme[i] = FormesValeursChamp.get(vue.getValeurChamp(ch.unite, champ));
-    }
-    return forme;
-  }
-  //même chose que colorer champ mais en influant le texte au dessus des chainons
-  private String[] SurTexteChamp(String champ, HashMap<String, String> SurTexteValeursChamp) {
-    String[] SurTexte = new String[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Chainon ch = chainonsUnites.get(listeUnites[i]);
-      SurTexte[i] = SurTexteValeursChamp.get(vue.getValeurChamp(ch.unite, champ));
-    }
-    return SurTexte;
-  }
-  //même chose que colorer champ mais en influant le texte au dessous des chainons
-  private String[] SousTexteChamp(String champ, HashMap<String, String> SousTexteValeursChamp) {
-    String[] SousTexte = new String[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Chainon ch = chainonsUnites.get(listeUnites[i]);
-      SousTexte[i] = SousTexteValeursChamp.get(vue.getValeurChamp(ch.unite, champ));
-    }
-    return SousTexte;
-  }
-  
-  
-  public int calculerValNbElements(int nbElts) {
-    return nbElts==1 ? 1 : nbElts<=seuilsValsNbElements[0] ? 2 : 
-            nbElts<=seuilsValsNbElements[1] ? 3 : 4;
-  }
-  
-
-  
-  //retourne un tableau contenant les numéros de paragraphe qui contiennent des unités du modele
-  public Integer[] listenumeroparagraphe(){
-      int[] noparagraphe = (vue.getCorpus()).calculerNoParagraphe(listeUnites);
-      ArrayList<Integer> resultat = new ArrayList();
-      int former = -1;
-      for(int i = 0 ; i < noparagraphe.length;i++){
-          if(former!=noparagraphe[i]){
-              resultat.add(noparagraphe[i]);
-              former = noparagraphe[i];
-          }          
-      }
-      Integer[] resultatconversion = new Integer[resultat.size()];
-      return ( resultat.toArray(resultatconversion));
-  }
-
-  
-  //renvoie un Hashmap quidécrit la répartition des unités en position 
-  //au sein du texte
-  //@require : listesUnites est trié selon la position de debut de ses éléments
-  public ArrayList<int[]> dispositionunites(int nbclasses){
-    Unite[] unites = listeUnites; 
-    ArrayList<int[]> locationunites = new ArrayList<int[]>(nbclasses);
-    int longueurtexte = vue.getCorpus().getTexte().length();
-    int[] listeposition = ChaineUtil.discretisation(0,longueurtexte,nbclasses + 1);
-    int posprev = 0;
-    if(nbclasses > 0){
-        int posactuel = 1;
-        int compte = 0;
-        int k = 0;
-        while(k < unites.length || posactuel < nbclasses + 1){
-            if(k < unites.length  && unites[k].getDeb() < listeposition[posactuel] 
-                    && unites[k].getDeb() >= listeposition[posprev]){
-            //si l'unite est dans cette partie du texte alors on incrémente le compteur
-                compte = compte + 1;
-                k = k + 1;
-            }
-            else{
-                posprev = posactuel;//on actualise la position precedente
-                locationunites.add(new int[]{listeposition[posprev],compte});
-                compte = 0;
-                posactuel = posactuel + 1;
-            }
-        }
-    }    
-    return locationunites;
-  }
-
-   
-   
-
-   //renvoie un tableau contenant les fréquences de chaque valeur d'un champ de la chaine dans la liste d'unités
-   public HashMap<String, Float> calculerfrequencechaine(Unite[] donnees,String typeChaines
-           ,String Champcible,HashSet<String> valeurinterdite){
-       String[] valsdisponibles  = vue.getValeursChamp(Schema.class, typeChaines, 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);
-       int compteur  = 0;
-       //on compte le nombre d'occurences
-       for(Unite unit : donnees){
-           valeurchamp = chainesUnitesNonFiltrees.containsKey(unit) ? vue.getValeurChamp(chainesUnitesNonFiltrees.get(unit)
-                   , Champcible) : null;
-           if(valeurchamp!=null && !valeurinterdite.contains(valeurchamp)){
-                compteur = compteur + 1;
-                tableaufrequence.put(valeurchamp,tableaufrequence.get(valeurchamp) + 1); 
-           }
-       }
-       //on calcule les pourcentages
-       for(String valeur : valsdisponibles){
-           tableaufrequence.put(valeur,compteur==0 ? 0.0f : tableaufrequence.get(valeur) * 10000.0f /
-                   compteur / 100.0f);
-       }       
-           tableaufrequence.put("",compteur==0 ? 0.0f :  tableaufrequence.get("") * 10000.0f /
-                   compteur / 100.0f);       
-       
-       return tableaufrequence;
-   }
-   //renvoie un tableau contenant les fréquences de chaque longueur des chaines de la liste d'unités
-   public HashMap<String, Float> calculerfrequencenbelt(Unite[] donnees,String typeUnites
-           ,String[] valsdisponibles){
-       HashMap<String, Float> tableaufrequence = new HashMap<String, Float>(valsdisponibles.length); 
-       String valeurchamp;
-       //on initialise le tableau résultat
-       for(String valeur : valsdisponibles){
-           tableaufrequence.put(valeur, 0.0f);
-       }
-       int compte = 0;
-        //on compte le nombre d'occurences
-       for(Unite unit : donnees){
-           Schema chaine = chainesUnitesNonFiltrees.containsKey(unit) ? chainesUnitesNonFiltrees.get(unit)
-                    : null;
-                int nb = chaine==null ? 0 : unitesChaines.get(chaine).size() ;
-                if(isMasqueeValNbElements(calculerValNbElements(nb))){
-                    
-                }
-                else if(nb==0){
-                    valeurchamp = valsdisponibles[0];
-                    tableaufrequence.put(valeurchamp,tableaufrequence.get(valeurchamp) + 1); 
-                    compte = compte + 1;
-                }
-                else{
-                    valeurchamp = valsdisponibles[calculerValNbElements(nb)];
-                    tableaufrequence.put(valeurchamp,tableaufrequence.get(valeurchamp) + 1); 
-                    compte = compte + 1;
-                }           
-       }
-
-
-       //on calcule les pourcentages
-       for(String valeur : valsdisponibles){
-           tableaufrequence.put(valeur, tableaufrequence.get(valeur) * 10000.0f /
-                   compte / 100.0f);
-       }       
-       
-       
-       return tableaufrequence;
-   }   
-   
-
-   
-
-   //on enlève les unités dont les valeurs des chaines les contenant sont masquees
-   public Unite[] filtrechaine(Unite[] donnees, String Champ, HashSet<String> Valeurcachees){
-       ArrayList<Unite> unitefiltrees = new ArrayList<Unite>(); 
-       for(Unite unit : donnees){
-           if(chainesUnitesNonFiltrees.containsKey(unit) && !(Valeurcachees.contains(vue.getValeurChamp(chainesUnitesNonFiltrees.get(unit),Champ)))){
-               unitefiltrees.add(unit);
-           }
-       }
-       Unite[] resultat = unitefiltrees.toArray(new Unite[0]);
-       return resultat;
-   }   
-   //on ne garde que les unités dont les chaines les contenant possèdent la valeur "valeur" pour le champ 
-    //"Champ" 
-   public Unite[] filtrevaleurchaine(Unite[] donnees,String Champ,String valeur){
-       ArrayList<Unite> uniteduchamp = new ArrayList();
-       ArrayList<Unite> unitefiltrees = new ArrayList();
-       for(Schema chaine : unitesChaines.keySet()){
-           //on trie les unités dont les chaines contenant ont la bonne valeur pour le champ
-           if((vue.getValeurChamp(chaine, Champ)).equals(valeur)){
-               uniteduchamp.addAll(unitesChaines.get(chaine));
-           }
-       }
-       //on ne garde que les unités passée en paramètre
-       for(int i = 0; i < donnees.length;i++){
-           if(uniteduchamp.contains(donnees[i])){
-               unitefiltrees.add(donnees[i]);
-           }
-       }
-       //on met le résultat sous forme de tableau
-       Unite[] resultat =(Unite[]) unitefiltrees.toArray();
-       return resultat;
-   }
-   
-  
-   //renvoioe la chaine qui contient l'unité dans ModeleChaine
-   public Schema getSchemacontenantunite(Unite unit){
-        return chainesUnitesNonFiltrees.get(unit);
-   }
-
-   //filtre qui remplit les mêmes fonctions que le précédent mais également qui filtre suivant une liste de 
-   //paragraphes interdits et ne garde que les unités appartenant aux chaines ayant pour le champ Champ la valeur
-   //Valeur
-    private void filtrerListeUnites(String typeUnites, String typeChaines,ArrayList noparagraphecachees,
-            String Champ,String Valeur){
-    Unite[] unites = vue.getUnitesAVoir(typeUnites);
-    Schema[] chaines = vue.getSchemasAVoir(typeChaines);
-    unitesChaines.clear();
-    int[] noparagraphe = (vue.getCorpus()).calculerNoParagraphe(unites);
-    for (Schema chaine : chaines) unitesChaines.put(chaine, new ArrayList<Unite>());
-    ArrayList<Integer> indFiltrees = new ArrayList<Integer>();
-    String[] champs = vue.getNomsChamps(Unite.class, typeUnites);
-    boolean agarder;
-    for (int i = 0; i<unites.length; i++) {
-      agarder = true;
-      for (String champ : champs) {//pour tous les champs 
-        String val = vue.getValeurChamp(unites[i], champ);//je recupere la valeur du champ
-        if (val.isEmpty()) {
-          if (valNulleMasqueeChamp.contains(champ)) {
-            agarder = false;
-            break;
-          }
-        } else {
-          if (valsMasqueesChamp.get(champ).contains(val)) {
-            agarder = false;
-            break;
-          }
-        }
-      }
-      //si l'unité appartient à un paragraphe interdit
-      if(noparagraphecachees.contains(noparagraphe[i])){
-          agarder = false;
-      }
-      //si la chaine contenant l'unité a une mauvaise valeur pour le champ ou si l'unité est sans chaine
-      if(!chainesUnitesNonFiltrees.containsKey(unites[i]) || 
-              !vue.getValeurChamp(chainesUnitesNonFiltrees.get(unites[i]),Champ).equals(Valeur)){
-          agarder = false;
-      }
-      if (agarder) {
-        indFiltrees.add(i);
-        if (chainesUnitesNonFiltrees.containsKey(unites[i])) {
-          Schema chaine = chainesUnitesNonFiltrees.get(unites[i]);
-          unitesChaines.get(chaine).add(unites[i]);
-        }
-      }
-    }
-    ArrayList<Integer> indIndFiltrees = new ArrayList<Integer>();
-    for(int k=0; k<indFiltrees.size(); k++) {
-      Unite unit = unites[indFiltrees.get(k)];
-      if(chainesUnitesNonFiltrees.containsKey(unit)) {
-        if(!isMasqueeValNbElements(calculerValNbElements(
-                unitesChaines.get(chainesUnitesNonFiltrees.get(unit)).size())))
-          indIndFiltrees.add(k);
-      } else {
-        if(!isMasqueeValNbElements(0)) indIndFiltrees.add(k);
-      }      
-    }
-    listeUnites = new Unite[indIndFiltrees.size()];
-    for (int k = 0; k<listeUnites.length; k++) {
-      listeUnites[k] = unites[indFiltrees.get(indIndFiltrees.get(k))];
-    }
-        for (Schema chaine : chaines) {
-          int nb = unitesChaines.get(chaine).size();
-          if(nb==0||isMasqueeValNbElements(calculerValNbElements(nb)))
-            unitesChaines.remove(chaine);
-        }
-  }
-    //permet de calculer les données pour une valeur de champ de la chaine
-  private void calculerDonnees(String typeChaines, String typeUnites,ArrayList noparagraphecachees,String champ
-  ,String Valeur) {
-     filtrerListeUnites(typeUnites, typeChaines,noparagraphecachees, champ, Valeur);
-    Chainon[] chainons = new Chainon[listeUnites.length];
-    for (int i = 0; i<listeUnites.length; i++) {
-      Unite unit = listeUnites[i];
-      chainons[i] = new Chainon(unit, vue.getTexteUnite(unit));
-      if(chainesUnitesNonFiltrees.containsKey(unit)) {
-        Schema chaine = chainesUnitesNonFiltrees.get(unit);
-        chainons[i].chaine = chaine;
-        chainons[i].nbEltsChaine = unitesChaines.get(chaine).size();
-        chainons[i].idChaine = vue.getIdElement(chaine);
-      } 
-      chainonsUnites.put(listeUnites[i], chainons[i]);
-    }
-    HashMap<Schema, Integer> noChaine = new HashMap<Schema, Integer>();
-    int no = 0;
-    for (Schema chaine : vue.getSchemasAVoir(typeChaines)) {
-      if(unitesChaines.containsKey(chaine)) {
-        int nbElts = unitesChaines.get(chaine).size(); 
-       noChaine.put(chaine, nbElts>1 ? ++no : 0);
-    }
-    }
-    for (Unite unit : listeUnites) {
-      Chainon chainon = chainonsUnites.get(unit);
-      if (chainon.chaine!=null) chainon.noChaine = noChaine.get(chainon.chaine);
-    }
-    int[] noPar = vue.getCorpus().calculerNoParagraphe(listeUnites);
-    if(peutafficher){
-        panneauGraphique.setDonnees(chainons, noPar);
-    }
-  }
-
-
-  
-
-    
- 
+	
+	static class Chainon {
+		
+		Unite unite;
+		
+		String texte;
+		
+		Schema chaine = null;
+		
+		int nbEltsChaine = 0;
+		
+		String idChaine = "";
+		
+		int noChaine = 0;
+		
+		Chainon(Unite unite, String texte) {
+			this.unite = unite;
+			this.texte = texte;
+		}
+	}
+	
+	private Vue vue;
+	
+	private GChaines panneauGraphique;
+	
+	private Unite[] listeUnites;
+	
+	private boolean peutafficher = true;
+	
+	private HashMap<Unite, Schema> chainesUnitesNonFiltrees = new HashMap<>();
+	
+	private int[] seuilsValsNbElements = new int[0];
+	
+	private HashMap<Unite, Chainon> chainonsUnites = new HashMap<>();
+	
+	private HashMap<Schema, ArrayList<Unite>> unitesChaines = new HashMap<>();
+	
+	private HashMap<String, HashSet<String>> valsMasqueesChamp = new HashMap<>();
+	
+	private HashSet<String> valNulleMasqueeChamp = new HashSet<>();
+	
+	private boolean[] valsMasqueesNbElements = new boolean[0];
+	
+	public ModeleChaines(Vue vue, GChaines panneauGraphique) {
+		this.vue = vue;
+		this.panneauGraphique = panneauGraphique;
+	}
+	
+	Schema getChaine(Unite unit) {
+		return chainonsUnites.get(unit).chaine;
+	}
+	
+	public HashMap<Unite, Chainon> getChainonUnites() {
+		return chainonsUnites;
+	}
+	
+	Unite[] getUnites() {
+		return listeUnites;
+	}
+	
+	Unite[] getUnitesChaine(Schema chaine) {
+		ArrayList<Unite> units = unitesChaines.get(chaine);
+		return units.toArray(new Unite[0]);
+	}
+	
+	boolean isMasqueeValChamp(String champ, String val) {
+		return valsMasqueesChamp.containsKey(champ)
+				&& valsMasqueesChamp.get(champ).contains(val);
+	}
+	
+	boolean isMasqueeValNulleChamp(String champ) {
+		return valNulleMasqueeChamp.contains(champ);
+	}
+	
+	boolean isMasqueeValNbElements(int i) {
+		return i >= valsMasqueesNbElements.length ? false : valsMasqueesNbElements[i];
+	}
+	
+	public HashMap<String, HashSet<String>> getValsMasqueesChamp() {
+		return valsMasqueesChamp;
+	}
+	
+	public HashSet<String> getValsNulleMasqueesChamp() {
+		return valNulleMasqueeChamp;
+	}
+	
+	public HashMap<Unite, Schema> getchainesUnitesNonFiltrees() {
+		return chainesUnitesNonFiltrees;
+	}
+	
+	public boolean[] getValsNbMasqueesChamp() {
+		return valsMasqueesNbElements;
+	}
+	
+	public void setValsMasqueesChamp(HashMap<String, HashSet<String>> valsMasqueesChamp) {
+		this.valsMasqueesChamp = valsMasqueesChamp;
+	}
+	
+	public void setValsNulleMasqueesChamp(HashSet<String> valNulleMasqueeChamp) {
+		this.valNulleMasqueeChamp = valNulleMasqueeChamp;
+	}
+	
+	public void setValsNbMasqueesChamp(boolean[] valsMasqueesNbElements) {
+		this.valsMasqueesNbElements = valsMasqueesNbElements;
+	}
+	
+	// retourne le nombre de valeurs masquees pour le champ
+	public int nbvaleursmasquees(String champ) {
+		int resultat = 0;
+		if (champ == null) {// si le champ affiché est le nombre de chainons
+			for (boolean val : valsMasqueesNbElements) {
+				if (val) {
+					resultat = resultat + 1;
+				}
+			}
+		}
+		else {
+			resultat = valsMasqueesChamp.get(champ).size();
+		}
+		return resultat;
+	}
+	
+	void demasquerToutesValsChamp(String champ) {
+		valsMasqueesChamp.get(champ).clear();
+		valNulleMasqueeChamp.remove(champ);
+	}
+	
+	void demasquerToutesValsNbElts(String champ) {
+		for (int i = 0; i < valsMasqueesNbElements.length; i++) {
+			valsMasqueesNbElements[i] = false;
+		}
+	}
+	
+	void setGChaine(GChaines panneaugraphique) {
+		this.panneauGraphique = panneaugraphique;
+	}
+	
+	void setUnites(Unite[] donnees) {
+		this.listeUnites = donnees;
+	}
+	
+	void permettreaffichage(boolean autorisation) {
+		this.peutafficher = autorisation;
+	}
+	
+	boolean peutetreafficher() {
+		return this.peutafficher;
+	}
+	
+	void masquerAutresValsChamp(String typeunite, String champ, String val) {
+		for (String v : vue.getValeursChamp(Unite.class, typeunite, champ))
+			valsMasqueesChamp.get(champ).add(v);
+		valsMasqueesChamp.get(champ).remove(val);
+		valNulleMasqueeChamp.add(champ);
+	}
+	
+	void masquerValChamp(boolean yes, String champ, String val) {
+		if (yes) valsMasqueesChamp.get(champ).add(val);
+		else valsMasqueesChamp.get(champ).remove(val);
+	}
+	
+	void masquerValsNonNullesChamp(String typeunite, String champ) {
+		for (String v : vue.getValeursChamp(Unite.class, typeunite, champ))
+			valsMasqueesChamp.get(champ).add(v);
+		valNulleMasqueeChamp.remove(champ);
+	}
+	
+	void masquerValNulleChamp(boolean yes, String champ) {
+		if (yes) valNulleMasqueeChamp.add(champ);
+		else valNulleMasqueeChamp.remove(champ);
+	}
+	
+	void masquerAutresValsNbElts(String champ, int i0) {
+		for (int i = 0; i < valsMasqueesNbElements.length; i++) {
+			valsMasqueesNbElements[i] = i != i0;
+		}
+	}
+	
+	void masquerValNbElements(boolean yes, int i) {
+		valsMasqueesNbElements[i] = yes;
+	}
+	
+	void init(String typeChaines, String typeUnites, int[] seuils)
+			throws UnsupportedOperationException {
+		seuilsValsNbElements = seuils;
+		String[] champs = vue.getNomsChamps(Unite.class, typeUnites);
+		valsMasqueesChamp.clear();
+		for (String champ : champs)
+			valsMasqueesChamp.put(champ, new HashSet<String>());
+		valNulleMasqueeChamp.clear();
+		valsMasqueesNbElements = new boolean[seuils.length + 3];
+		calculerChainesUnitesNonFiltrees(typeChaines, typeUnites);
+		calculerDonnees(typeChaines, typeUnites);
+	}
+	
+	// struture qui n'est pas filtrées mais qui associe à une unité qui correspond au bon type d'unités
+	// la chaine qui la contient et qui est elle aussi du bon type de Schéma
+	private void calculerChainesUnitesNonFiltrees(String typeChaines,
+			String typeUnites) throws UnsupportedOperationException {
+		chainesUnitesNonFiltrees.clear();
+		for (Schema chaine : vue.getSchemasAVoir(typeChaines))
+			for (Element elt : chaine.getContenu()) {
+				if (elt.getClass() == Unite.class && elt.getType().equals(typeUnites)) {
+					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);
+				}
+			}
+	}
+	
+	void modifMasqueVals(String typeChaines, String typeUnites) {
+		calculerDonnees(typeChaines, typeUnites);
+	}
+	
+	void modifMasqueValsChampChaine(String typeChaines, String typeUnites, ArrayList noparagraphecachees, String champ, String Valeur) {
+		calculerDonnees(typeChaines, typeUnites, noparagraphecachees, champ, Valeur);
+	}
+	
+	private void filtrerListeUnites(String typeUnites, String typeChaines) {
+		Unite[] unites = vue.getUnitesAVoir(typeUnites);
+		Schema[] chaines = vue.getSchemasAVoir(typeChaines);
+		unitesChaines.clear();
+		for (Schema chaine : chaines)
+			unitesChaines.put(chaine, new ArrayList<Unite>());
+		ArrayList<Integer> indFiltrees = new ArrayList<>();
+		String[] champs = vue.getNomsChamps(Unite.class, typeUnites);
+		boolean agarder;
+		for (int i = 0; i < unites.length; i++) {
+			agarder = true;
+			for (String champ : champs) {// pour tous les champs
+				String val = vue.getValeurChamp(unites[i], champ);// je recupere la valeur du champ
+				if (val.isEmpty()) {
+					if (valNulleMasqueeChamp.contains(champ)) {
+						agarder = false;
+						break;
+					}
+				}
+				else {
+					if (valsMasqueesChamp.get(champ).contains(val)) {
+						agarder = false;
+						break;
+					}
+				}
+			}
+			if (agarder) {
+				indFiltrees.add(i);
+				if (chainesUnitesNonFiltrees.containsKey(unites[i])) {
+					Schema chaine = chainesUnitesNonFiltrees.get(unites[i]);
+					unitesChaines.get(chaine).add(unites[i]);
+				}
+			}
+		}
+		ArrayList<Integer> indIndFiltrees = new ArrayList<>();
+		for (int k = 0; k < indFiltrees.size(); k++) {
+			Unite unit = unites[indFiltrees.get(k)];
+			if (chainesUnitesNonFiltrees.containsKey(unit)) {
+				if (!isMasqueeValNbElements(calculerValNbElements(
+						unitesChaines.get(chainesUnitesNonFiltrees.get(unit)).size())))
+					indIndFiltrees.add(k);
+			}
+			else {
+				if (!isMasqueeValNbElements(0)) indIndFiltrees.add(k);
+			}
+		}
+		listeUnites = new Unite[indIndFiltrees.size()];
+		for (int k = 0; k < listeUnites.length; k++) {
+			listeUnites[k] = unites[indFiltrees.get(indIndFiltrees.get(k))];
+		}
+		for (Schema chaine : chaines) {
+			int nb = unitesChaines.get(chaine).size();
+			if (nb == 0 || isMasqueeValNbElements(calculerValNbElements(nb)))
+				unitesChaines.remove(chaine);
+		}
+	}
+	
+	private void calculerDonnees(String typeChaines, String typeUnites) {
+		filtrerListeUnites(typeUnites, typeChaines);
+		Chainon[] chainons = new Chainon[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Unite unit = listeUnites[i];
+			chainons[i] = new Chainon(unit, vue.getTexteUnite(unit));
+			if (chainesUnitesNonFiltrees.containsKey(unit)) {
+				Schema chaine = chainesUnitesNonFiltrees.get(unit);
+				chainons[i].chaine = chaine;
+				chainons[i].nbEltsChaine = unitesChaines.get(chaine).size();
+				chainons[i].idChaine = vue.getIdElement(chaine);
+			}
+			chainonsUnites.put(listeUnites[i], chainons[i]);
+		}
+		HashMap<Schema, Integer> noChaine = new HashMap<>();
+		int no = 0;
+		for (Schema chaine : vue.getSchemasAVoir(typeChaines)) {
+			if (unitesChaines.containsKey(chaine)) {
+				int nbElts = unitesChaines.get(chaine).size();
+				noChaine.put(chaine, nbElts > 1 ? ++no : 0);
+			}
+		}
+		for (Unite unit : listeUnites) {
+			Chainon chainon = chainonsUnites.get(unit);
+			if (chainon.chaine != null) chainon.noChaine = noChaine.get(chainon.chaine);
+		}
+		int[] noPar = vue.getCorpus().calculerNoParagraphe(listeUnites);
+		if (peutafficher) {
+			panneauGraphique.setDonnees(chainons, noPar);
+		}
+	}
+	
+	void initVide() {
+		listeUnites = new Unite[0];
+		chainesUnitesNonFiltrees.clear();
+		seuilsValsNbElements = new int[0];
+		chainonsUnites.clear();
+		unitesChaines.clear();
+		if (peutafficher) {
+			panneauGraphique.setDonnees(new Chainon[0], new int[0]);
+			panneauGraphique.setCouleurs(new Color[0]);
+			panneauGraphique.setTaille(new int[0]);
+			panneauGraphique.setForme(new int[0]);
+			panneauGraphique.setSurTexte(new String[0]);
+			panneauGraphique.setSousTexte(new String[0]);
+		}
+		valNulleMasqueeChamp.clear();
+		valsMasqueesChamp.clear();
+		valsMasqueesNbElements = new boolean[0];
+	}
+	
+	void setChampAffiche(String champ, HashMap<String, Color> couleursValeursChamp) {
+		if (peutafficher) {
+			panneauGraphique.setCouleurs(colorerChamp(champ, couleursValeursChamp));
+		}
+	}
+	
+	void setChampAfficheTaille(String champ, HashMap<String, Integer> TaillesValeursChamp) {
+		if (peutafficher) {
+			panneauGraphique.setTaille(ReduireChamp(champ, TaillesValeursChamp));
+		}
+	}
+	
+	void setChampAfficheForme(String champ, HashMap<String, Integer> FormesValeursChamp) {
+		if (peutafficher) {
+			panneauGraphique.setForme(FormerChamp(champ, FormesValeursChamp));
+		}
+	}
+	
+	void setChampAfficheSurTexte(String champ, HashMap<String, String> SurTexteValeursChamp) {
+		if (peutafficher) {
+			panneauGraphique.setSurTexte(SurTexteChamp(champ, SurTexteValeursChamp));
+		}
+	}
+	
+	void setChampAfficheSousTexte(String champ, HashMap<String, String> SousTexteValeursChamp) {
+		if (peutafficher) {
+			panneauGraphique.setSousTexte(SousTexteChamp(champ, SousTexteValeursChamp));
+		}
+	}
+	
+	void setChampAfficheNbElts(Color[] couleurs) {
+		if (peutafficher) {
+			panneauGraphique.setCouleurs(colorerNbElts(couleurs));
+		}
+	}
+	
+	
+	
+	void setChampAfficheTailleNbElts(int[] taille) {
+		if (peutafficher) {
+			panneauGraphique.setTaille(ReduireNbElts(taille));
+		}
+	}
+	
+	void setChampAfficheFormeNbElts(int[] forme) {
+		if (peutafficher) {
+			panneauGraphique.setForme(FormeNbElts(forme));
+		}
+	}
+	
+	void setChampAfficheSurTexteNbElts(String[] SurTexte) {
+		if (peutafficher) {
+			panneauGraphique.setSurTexte(SurTexteNbElts(SurTexte));
+		}
+	}
+	
+	void setChampAfficheSousTexteNbElts(String[] SousTexte) {
+		if (peutafficher) {
+			panneauGraphique.setSousTexte(SousTexteNbElts(SousTexte));
+		}
+	}
+	
+	private Color[] colorerNbElts(Color[] couleurs) {
+		Color[] couls = new Color[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Chainon ch = chainonsUnites.get(listeUnites[i]);
+			if (ch.chaine == null) couls[i] = couleurs[0];
+			else {
+				int nbElts = ch.nbEltsChaine;
+				couls[i] = couleurs[calculerValNbElements(nbElts)];
+			}
+		}
+		return couls;
+	}
+	
+	private int[] FormeNbElts(int[] formes) {
+		int[] forme = new int[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Chainon ch = chainonsUnites.get(listeUnites[i]);
+			if (ch.chaine == null) forme[i] = formes[0];
+			else {
+				int nbElts = ch.nbEltsChaine;
+				forme[i] = formes[calculerValNbElements(nbElts)];
+			}
+		}
+		return forme;
+	}
+	
+	private int[] ReduireNbElts(int[] tailles) {
+		int[] taille = new int[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Chainon ch = chainonsUnites.get(listeUnites[i]);
+			if (ch.chaine == null) taille[i] = tailles[0];
+			else {
+				int nbElts = ch.nbEltsChaine;
+				taille[i] = tailles[calculerValNbElements(nbElts)];
+			}
+		}
+		return taille;
+	}
+	
+	private String[] SurTexteNbElts(String[] SurTextes) {
+		String[] SurTexte = new String[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Chainon ch = chainonsUnites.get(listeUnites[i]);
+			if (ch.chaine == null) SurTexte[i] = SurTextes[0];
+			else {
+				int nbElts = ch.nbEltsChaine;
+				SurTexte[i] = SurTextes[calculerValNbElements(nbElts)];
+			}
+		}
+		return SurTexte;
+	}
+	
+	private String[] SousTexteNbElts(String[] SousTextes) {
+		String[] SousTexte = new String[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Chainon ch = chainonsUnites.get(listeUnites[i]);
+			if (ch.chaine == null) SousTexte[i] = SousTextes[0];
+			else {
+				int nbElts = ch.nbEltsChaine;
+				SousTexte[i] = SousTextes[calculerValNbElements(nbElts)];
+			}
+		}
+		return SousTexte;
+	}
+	
+	
+	private Color[] colorerChamp(String champ, HashMap<String, Color> couleursValeursChamp) {
+		Color[] couls = new Color[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Chainon ch = chainonsUnites.get(listeUnites[i]);
+			couls[i] = couleursValeursChamp.get(vue.getValeurChamp(ch.unite, champ));
+		}
+		return couls;
+	}
+	
+	// même chose que colorer champ mais en influant la taille des chainons
+	private int[] ReduireChamp(String champ, HashMap<String, Integer> TaillesValeursChamp) {
+		int[] taille = new int[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Chainon ch = chainonsUnites.get(listeUnites[i]);
+			taille[i] = TaillesValeursChamp.get(vue.getValeurChamp(ch.unite, champ));
+		}
+		return taille;
+	}
+	
+	// même chose que colorer champ mais en influant la forme des chainons
+	private int[] FormerChamp(String champ, HashMap<String, Integer> FormesValeursChamp) {
+		int[] forme = new int[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Chainon ch = chainonsUnites.get(listeUnites[i]);
+			forme[i] = FormesValeursChamp.get(vue.getValeurChamp(ch.unite, champ));
+		}
+		return forme;
+	}
+	
+	// même chose que colorer champ mais en influant le texte au dessus des chainons
+	private String[] SurTexteChamp(String champ, HashMap<String, String> SurTexteValeursChamp) {
+		String[] SurTexte = new String[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Chainon ch = chainonsUnites.get(listeUnites[i]);
+			SurTexte[i] = SurTexteValeursChamp.get(vue.getValeurChamp(ch.unite, champ));
+		}
+		return SurTexte;
+	}
+	
+	// même chose que colorer champ mais en influant le texte au dessous des chainons
+	private String[] SousTexteChamp(String champ, HashMap<String, String> SousTexteValeursChamp) {
+		String[] SousTexte = new String[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Chainon ch = chainonsUnites.get(listeUnites[i]);
+			SousTexte[i] = SousTexteValeursChamp.get(vue.getValeurChamp(ch.unite, champ));
+		}
+		return SousTexte;
+	}
+	
+	
+	public int calculerValNbElements(int nbElts) {
+		return nbElts == 1 ? 1 : nbElts <= seuilsValsNbElements[0] ? 2 : nbElts <= seuilsValsNbElements[1] ? 3 : 4;
+	}
+	
+	
+	
+	// retourne un tableau contenant les numéros de paragraphe qui contiennent des unités du modele
+	public Integer[] listenumeroparagraphe() {
+		int[] noparagraphe = (vue.getCorpus()).calculerNoParagraphe(listeUnites);
+		ArrayList<Integer> resultat = new ArrayList<>();
+		int former = -1;
+		for (int i = 0; i < noparagraphe.length; i++) {
+			if (former != noparagraphe[i]) {
+				resultat.add(noparagraphe[i]);
+				former = noparagraphe[i];
+			}
+		}
+		Integer[] resultatconversion = new Integer[resultat.size()];
+		return (resultat.toArray(resultatconversion));
+	}
+	
+	
+	// renvoie un Hashmap quidécrit la répartition des unités en position
+	// au sein du texte
+	// @require : listesUnites est trié selon la position de debut de ses éléments
+	public ArrayList<int[]> dispositionunites(int nbclasses) {
+		Unite[] unites = listeUnites;
+		ArrayList<int[]> locationunites = new ArrayList<>(nbclasses);
+		int longueurtexte = vue.getCorpus().getTexte().length();
+		int[] listeposition = ChaineUtil.discretisation(0, longueurtexte, nbclasses + 1);
+		int posprev = 0;
+		if (nbclasses > 0) {
+			int posactuel = 1;
+			int compte = 0;
+			int k = 0;
+			while (k < unites.length || posactuel < nbclasses + 1) {
+				if (k < unites.length && unites[k].getDeb() < listeposition[posactuel]
+						&& unites[k].getDeb() >= listeposition[posprev]) {
+					// si l'unite est dans cette partie du texte alors on incrémente le compteur
+					compte = compte + 1;
+					k = k + 1;
+				}
+				else {
+					posprev = posactuel;// on actualise la position precedente
+					locationunites.add(new int[] { listeposition[posprev], compte });
+					compte = 0;
+					posactuel = posactuel + 1;
+				}
+			}
+		}
+		return locationunites;
+	}
+	
+	
+	
+	
+	// renvoie un tableau contenant les fréquences de chaque valeur d'un champ de la chaine dans la liste d'unités
+	public HashMap<String, Float> calculerfrequencechaine(Unite[] donnees, String typeChaines, String Champcible, HashSet<String> valeurinterdite) {
+		String[] valsdisponibles = vue.getValeursChamp(Schema.class, typeChaines, 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);
+		int compteur = 0;
+		// on compte le nombre d'occurences
+		for (Unite unit : donnees) {
+			valeurchamp = chainesUnitesNonFiltrees.containsKey(unit) ? vue.getValeurChamp(chainesUnitesNonFiltrees.get(unit), Champcible) : null;
+			if (valeurchamp != null && !valeurinterdite.contains(valeurchamp)) {
+				compteur = compteur + 1;
+				tableaufrequence.put(valeurchamp, tableaufrequence.get(valeurchamp) + 1);
+			}
+		}
+		// on calcule les pourcentages
+		for (String valeur : valsdisponibles) {
+			tableaufrequence.put(valeur, compteur == 0 ? 0.0f
+					: tableaufrequence.get(valeur) * 10000.0f /
+							compteur / 100.0f);
+		}
+		tableaufrequence.put("", compteur == 0 ? 0.0f
+				: tableaufrequence.get("") * 10000.0f /
+						compteur / 100.0f);
+		
+		return tableaufrequence;
+	}
+	
+	// renvoie un tableau contenant les fréquences de chaque longueur des chaines de la liste d'unités
+	public HashMap<String, Float> calculerfrequencenbelt(Unite[] donnees, String typeUnites, String[] valsdisponibles) {
+		HashMap<String, Float> tableaufrequence = new HashMap<>(valsdisponibles.length);
+		String valeurchamp;
+		// on initialise le tableau résultat
+		for (String valeur : valsdisponibles) {
+			tableaufrequence.put(valeur, 0.0f);
+		}
+		int compte = 0;
+		// on compte le nombre d'occurences
+		for (Unite unit : donnees) {
+			Schema chaine = chainesUnitesNonFiltrees.containsKey(unit) ? chainesUnitesNonFiltrees.get(unit)
+					: null;
+			int nb = chaine == null ? 0 : unitesChaines.get(chaine).size();
+			if (isMasqueeValNbElements(calculerValNbElements(nb))) {
+				
+			}
+			else if (nb == 0) {
+				valeurchamp = valsdisponibles[0];
+				tableaufrequence.put(valeurchamp, tableaufrequence.get(valeurchamp) + 1);
+				compte = compte + 1;
+			}
+			else {
+				valeurchamp = valsdisponibles[calculerValNbElements(nb)];
+				tableaufrequence.put(valeurchamp, tableaufrequence.get(valeurchamp) + 1);
+				compte = compte + 1;
+			}
+		}
+		
+		
+		// on calcule les pourcentages
+		for (String valeur : valsdisponibles) {
+			tableaufrequence.put(valeur, tableaufrequence.get(valeur) * 10000.0f /
+					compte / 100.0f);
+		}
+		
+		
+		return tableaufrequence;
+	}
+	
+	
+	
+	
+	// on enlève les unités dont les valeurs des chaines les contenant sont masquees
+	public Unite[] filtrechaine(Unite[] donnees, String Champ, HashSet<String> Valeurcachees) {
+		ArrayList<Unite> unitefiltrees = new ArrayList<>();
+		for (Unite unit : donnees) {
+			if (chainesUnitesNonFiltrees.containsKey(unit) && !(Valeurcachees.contains(vue.getValeurChamp(chainesUnitesNonFiltrees.get(unit), Champ)))) {
+				unitefiltrees.add(unit);
+			}
+		}
+		Unite[] resultat = unitefiltrees.toArray(new Unite[0]);
+		return resultat;
+	}
+	
+	// on ne garde que les unités dont les chaines les contenant possèdent la valeur "valeur" pour le champ
+	// "Champ"
+	public Unite[] filtrevaleurchaine(Unite[] donnees, String Champ, String valeur) {
+		ArrayList<Unite> uniteduchamp = new ArrayList<>();
+		ArrayList<Unite> unitefiltrees = new ArrayList<>();
+		for (Schema chaine : unitesChaines.keySet()) {
+			// on trie les unités dont les chaines contenant ont la bonne valeur pour le champ
+			if ((vue.getValeurChamp(chaine, Champ)).equals(valeur)) {
+				uniteduchamp.addAll(unitesChaines.get(chaine));
+			}
+		}
+		// on ne garde que les unités passée en paramètre
+		for (int i = 0; i < donnees.length; i++) {
+			if (uniteduchamp.contains(donnees[i])) {
+				unitefiltrees.add(donnees[i]);
+			}
+		}
+		// on met le résultat sous forme de tableau
+		Unite[] resultat = (Unite[]) unitefiltrees.toArray();
+		return resultat;
+	}
+	
+	
+	// renvoioe la chaine qui contient l'unité dans ModeleChaine
+	public Schema getSchemacontenantunite(Unite unit) {
+		return chainesUnitesNonFiltrees.get(unit);
+	}
+	
+	// filtre qui remplit les mêmes fonctions que le précédent mais également qui filtre suivant une liste de
+	// paragraphes interdits et ne garde que les unités appartenant aux chaines ayant pour le champ Champ la valeur
+	// Valeur
+	private void filtrerListeUnites(String typeUnites, String typeChaines, ArrayList<Integer> noparagraphecachees,
+			String Champ, String Valeur) {
+		Unite[] unites = vue.getUnitesAVoir(typeUnites);
+		Schema[] chaines = vue.getSchemasAVoir(typeChaines);
+		unitesChaines.clear();
+		int[] noparagraphe = (vue.getCorpus()).calculerNoParagraphe(unites);
+		for (Schema chaine : chaines)
+			unitesChaines.put(chaine, new ArrayList<Unite>());
+		ArrayList<Integer> indFiltrees = new ArrayList<>();
+		String[] champs = vue.getNomsChamps(Unite.class, typeUnites);
+		boolean agarder;
+		for (int i = 0; i < unites.length; i++) {
+			agarder = true;
+			for (String champ : champs) {// pour tous les champs
+				String val = vue.getValeurChamp(unites[i], champ);// je recupere la valeur du champ
+				if (val.isEmpty()) {
+					if (valNulleMasqueeChamp.contains(champ)) {
+						agarder = false;
+						break;
+					}
+				}
+				else {
+					if (valsMasqueesChamp.get(champ).contains(val)) {
+						agarder = false;
+						break;
+					}
+				}
+			}
+			// si l'unité appartient à un paragraphe interdit
+			if (noparagraphecachees.contains(noparagraphe[i])) {
+				agarder = false;
+			}
+			// si la chaine contenant l'unité a une mauvaise valeur pour le champ ou si l'unité est sans chaine
+			if (!chainesUnitesNonFiltrees.containsKey(unites[i]) ||
+					!vue.getValeurChamp(chainesUnitesNonFiltrees.get(unites[i]), Champ).equals(Valeur)) {
+				agarder = false;
+			}
+			if (agarder) {
+				indFiltrees.add(i);
+				if (chainesUnitesNonFiltrees.containsKey(unites[i])) {
+					Schema chaine = chainesUnitesNonFiltrees.get(unites[i]);
+					unitesChaines.get(chaine).add(unites[i]);
+				}
+			}
+		}
+		ArrayList<Integer> indIndFiltrees = new ArrayList<>();
+		for (int k = 0; k < indFiltrees.size(); k++) {
+			Unite unit = unites[indFiltrees.get(k)];
+			if (chainesUnitesNonFiltrees.containsKey(unit)) {
+				if (!isMasqueeValNbElements(calculerValNbElements(
+						unitesChaines.get(chainesUnitesNonFiltrees.get(unit)).size())))
+					indIndFiltrees.add(k);
+			}
+			else {
+				if (!isMasqueeValNbElements(0)) indIndFiltrees.add(k);
+			}
+		}
+		listeUnites = new Unite[indIndFiltrees.size()];
+		for (int k = 0; k < listeUnites.length; k++) {
+			listeUnites[k] = unites[indFiltrees.get(indIndFiltrees.get(k))];
+		}
+		for (Schema chaine : chaines) {
+			int nb = unitesChaines.get(chaine).size();
+			if (nb == 0 || isMasqueeValNbElements(calculerValNbElements(nb)))
+				unitesChaines.remove(chaine);
+		}
+	}
+	
+	// permet de calculer les données pour une valeur de champ de la chaine
+	private void calculerDonnees(String typeChaines, String typeUnites, ArrayList<Integer> noparagraphecachees, String champ, String Valeur) {
+		filtrerListeUnites(typeUnites, typeChaines, noparagraphecachees, champ, Valeur);
+		Chainon[] chainons = new Chainon[listeUnites.length];
+		for (int i = 0; i < listeUnites.length; i++) {
+			Unite unit = listeUnites[i];
+			chainons[i] = new Chainon(unit, vue.getTexteUnite(unit));
+			if (chainesUnitesNonFiltrees.containsKey(unit)) {
+				Schema chaine = chainesUnitesNonFiltrees.get(unit);
+				chainons[i].chaine = chaine;
+				chainons[i].nbEltsChaine = unitesChaines.get(chaine).size();
+				chainons[i].idChaine = vue.getIdElement(chaine);
+			}
+			chainonsUnites.put(listeUnites[i], chainons[i]);
+		}
+		HashMap<Schema, Integer> noChaine = new HashMap<>();
+		int no = 0;
+		for (Schema chaine : vue.getSchemasAVoir(typeChaines)) {
+			if (unitesChaines.containsKey(chaine)) {
+				int nbElts = unitesChaines.get(chaine).size();
+				noChaine.put(chaine, nbElts > 1 ? ++no : 0);
+			}
+		}
+		for (Unite unit : listeUnites) {
+			Chainon chainon = chainonsUnites.get(unit);
+			if (chainon.chaine != null) chainon.noChaine = noChaine.get(chainon.chaine);
+		}
+		int[] noPar = vue.getCorpus().calculerNoParagraphe(listeUnites);
+		if (peutafficher) {
+			panneauGraphique.setDonnees(chainons, noPar);
+		}
+	}
+	
+	
+	
+	
+	
+	
 }
Index: tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ChaineUtil.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ChaineUtil.java	(revision 3077)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ChaineUtil.java	(revision 3078)
@@ -283,7 +283,7 @@
 	// 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();
+		ArrayList<Integer> retour = new ArrayList<>();
 		for (String type : typeschaine) {
 			Schema[] chaines = vue.getSchemas(type);
 			for (Schema chaine : chaines) {
@@ -305,7 +305,7 @@
 	// dans "types"
 	public static ArrayList<Integer> longueurChaineMot(String[] types, Vue vue) {
 		String[] typeschaine = vue.getTypesSchemasAVoir();
-		ArrayList<Integer> retour = new ArrayList();
+		ArrayList<Integer> retour = new ArrayList<>();
 		for (String type : typeschaine) {
 			Schema[] chaines = vue.getSchemas(type);
 			for (Schema chaine : chaines) {
@@ -332,7 +332,7 @@
 	// 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();
+		ArrayList<Integer> retour = new ArrayList<>();
 		for (String type : typeschaines) {
 			Schema[] chaines = vue.getSchemas(type);
 			for (Schema chaine : chaines) {
@@ -477,7 +477,7 @@
 	// 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();
+		ArrayList<Unite> unitefiltrees = new ArrayList<>();
 		for (Unite unit : donnees) {
 			if (!(Noparagraphemasque.contains(noparagraphe.get(unit)))) {
 				unitefiltrees.add(unit);
@@ -697,14 +697,14 @@
 	public static void fusionTypeUnite(Vue vue) {
 		// on initialise les propriétés du nouveau type
 		long deb = System.nanoTime();
-		HashSet<String> nomsChamps = new HashSet();
+		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();
+			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
@@ -738,8 +738,8 @@
 	 */
 	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();
+		ArrayList<Schema> retour = new ArrayList<>();
+		HashMap<String, Schema> triSchema = new HashMap<>();
 		long deb = System.nanoTime();
 		switch (source) {
 			case "Relation":
@@ -908,7 +908,7 @@
 	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();
+		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]);
Index: tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuCoref.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuCoref.java	(revision 3077)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuCoref.java	(revision 3078)
@@ -22,1113 +22,1172 @@
 import visuAnalec.util.GVisu.TypeComboBox;
 import visuAnalec.util.GVisu.Val0ComboBox;
 import visuAnalec.vue.*;
+
 /**
  *
  * @author Marc
  */
-public class VisuCoref extends JFrame implements Vue.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 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 JMenuBar menuBar = new JMenuBar();
-  private final ModeleChaines donneesChaines;
-  private String typeChaines;
-  private String typeUnites;
-  private String[] valsAffichees;
-  private HashSet<String> valsAffichees1cachees = new HashSet();
-  private ArrayList<Integer> noparagraphecachees = new ArrayList();
-  private String[] valsAffichees1;
-  private Integer[] valsAffichees2;
-  private final TypeComboBox saisieTypeChaines;
-  private final TypeComboBox saisieTypeUnites;
-  private Val0ComboBox saisieChampAffiche;
-  private Val0ComboBox saisieChampChaine;  
-  private final Val0ComboBox saisieChampStatistique;  
-  private JTable legendeChampAffiche;
-  private JTable legendeChampAfficheChaine;
-  private JTable legendeChampAfficheParagraphe;
-  private LegendeModeleTable legendeChampAfficheModele;
-  private LegendeModeleTableTexte legendeChampAfficheChaineModele;
-  private LegendeModeleTableTexte legendeChampAfficheParagrapheModele;  
-  private JPopupMenu popupChamp = new JPopupMenu();
-  private JPopupMenu popupChampChaine = new JPopupMenu();
-  private JPopupMenu popupChampParagraphe = new JPopupMenu();
-  private final JCheckBox activehistogramme;
-  private final Box listeGChaines;
-  private JTable ResultatStat;
-  private final HashSet<GChaines> suiteGChaines = new HashSet();
-  private final String[] statpossibles = new String[]{"Répartition des références par paragraphe",
-      "Répartition des paragraphes par référence","Répartition des paragraphe par valeur du champ",
-      "Répartition des valeurs du champ par paragraphe","Répartition des valeurs de champ par référence",
-      "Répartition des références par valeur de champ","Répartition par paragraphe et par réfences "
-          + "des valeurs du champ","Répartition par paragraphe et par valeur du champ des références",
-       "Répartition par référence et par valeur de champ des paragraphes"};
-  
-  
-  public VisuCoref(Container fenetre, Vue vue, PanneauEditeur pEditeur) {
-    super("Analyse d'une chaine de coréférence");
-    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);
-    saisieTypeChaines = new TypeComboBox(Schema.class);
-    saisieTypeChaines.setModele(vue.getTypesSchemasAVoir());
-    saisieTypeChaines.addActionListener(this);
-    saisieTypeUnites = new TypeComboBox(Unite.class);
-    saisieTypeUnites.setModele(vue.getTypesUnitesAVoir());
-    saisieTypeUnites.addActionListener(this);
-    saisieChampAffiche = new Val0ComboBox("Nombre de chaînons");
-    saisieChampAffiche.addActionListener(this);
-    saisieChampChaine = new Val0ComboBox("Rien");
-    saisieChampChaine.addActionListener(this); 
-    saisieChampStatistique = new Val0ComboBox("Rien");
-    saisieChampStatistique.addActionListener(this);
-    Box commandes = Box.createVerticalBox();
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Chaînes : "));
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(saisieTypeChaines);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Unites : "));
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(saisieTypeUnites);
-    commandes.add(Box.createVerticalGlue());    
-    activehistogramme = new JCheckBox("Afficher les histogrammes de répartition");
-    commandes.add(activehistogramme);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Champ à filtrer : "));
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(saisieChampAffiche);
-    commandes.add(Box.createVerticalGlue());
-    
-    legendeChampAffiche = new JTable();
-    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()));
-          popupChamp.show(legendeChampAffiche, e.getX(), e.getY());
-        }
-      }
-    });
-    
-    commandes.add(legendeChampAffiche);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Champ de la chaine à analyser : "));
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(saisieChampChaine);
-    commandes.add(Box.createVerticalGlue());
-    
-    legendeChampAfficheParagraphe = new JTable();
-    //legendeChampAfficheParagraphe.setCellRenderer(new LegendeCellRenderer());
-    legendeChampAfficheParagraphe.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
-          popupChampInitParagraphe(legendeChampAfficheParagraphe.rowAtPoint(e.getPoint()));
-          popupChampParagraphe.show(legendeChampAfficheParagraphe, e.getX(), e.getY());
-        }
-      }
-    });
-    
-    
-
-    legendeChampAfficheChaine = new JTable();
-    //legendeChampAfficheChaine.setCellRenderer(new LegendeCellRenderer());
-    legendeChampAfficheChaine.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
-          popupChampInitChaine(legendeChampAfficheChaine.rowAtPoint(e.getPoint()));
-          popupChampChaine.show(legendeChampAfficheChaine, e.getX(), e.getY());
-        }
-      }
-    });
-    commandes.add(legendeChampAfficheChaine); 
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Paragraphe à filtrer : "));
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(legendeChampAfficheParagraphe);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Sélectionner une statistique : "));
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(saisieChampStatistique);
-    JScrollPane scrollLegende = new JScrollPane(commandes);
-    listeGChaines = Box.createVerticalBox();
-    JScrollPane scrollList = new JScrollPane(listeGChaines);
-    Box resultatstat = Box.createVerticalBox();
-    resultatstat.add(Box.createVerticalGlue());
-    resultatstat.add(new JLabel("Statistique : "));
-    resultatstat.add(Box.createVerticalGlue());
-    ResultatStat = new JTable(new ModeleStatChaine());
-    JScrollPane jsp =new JScrollPane(ResultatStat);
-    resultatstat.add(ResultatStat.getTableHeader());
-    resultatstat.add(jsp);
-    JScrollPane scrollstatresultat = new JScrollPane(resultatstat);
-    JSplitPane split1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT,scrollList,scrollstatresultat);
-    JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,scrollLegende,split1);    
-    getContentPane().add(split);
-    setVisible(true);    
-    split.setDividerLocation(1./3);
-    split1.setDividerLocation(1./2);
-    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");
-    final VisuCoref visu = this;
-    final Vue vues = this.vue;
-    final PanneauEditeur pEditeurs = pEditeur;
-    menuBar.add(csvMenu);
-    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() {
-          Object[][] donneesCSV = new Object[ResultatStat.getRowCount()+1][ResultatStat.getColumnCount()];
-         for(int i = 0 ; i < ResultatStat.getRowCount();i++){
-             for(int j = 0 ; j < ResultatStat.getColumnCount();j++){
-                donneesCSV[i+1][j]=ResultatStat.getValueAt(i, j);
-             }
-         }
-             for(int j = 0 ; j < ResultatStat.getColumnCount();j++){
-                donneesCSV[0][j]=ResultatStat.getColumnName(j);
-             }
-             
-             ExportCSV.exporterCSV(donneesCSV);
-      }
-    }); 
-    csvMenu.add(new GAction("Exporter les fréquences pour le champ des unités") {
-      @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 champ des chaines") {
-      @Override
-      public void executer() {
-          if(!saisieChampChaine.pasdeSelection()){
-            Object[][] donneesCSV = new Object[legendeChampAfficheChaine.getRowCount()+1][2];
-           for(int i = 0 ; i < legendeChampAfficheChaine.getRowCount();i++){
-                  donneesCSV[i+1][0]=legendeChampAfficheChaine.getValueAt(i, 1);
-                donneesCSV[i+1][1]=legendeChampAfficheChaine.getValueAt(i, 2)==null ? "0" 
-                        : legendeChampAfficheChaine.getValueAt(i, 2);
-           }
-                  donneesCSV[0][1]="frequence";
-                  donneesCSV[0][0]=saisieChampChaine.getSelection();
-                  ExportCSV.exporterCSV(donneesCSV);
-          }
-      }
-    });
-    JMenu typeMenu = new JMenu("Fusionner des types d'unités");
-    menuBar.add(typeMenu);
-    final Vue vueconv = vue;
-    typeMenu.add(new GAction("Fusionner tous les types") {
-      @Override
-      public void executer() {
-          JOptionPane jop = new JOptionPane();			
-          int option = jop.showConfirmDialog(null, "Voulez-créer un nouveau type rassemblant tous les autres ?"
-                  +System.getProperty("line.separator")+"Si oui, la fenêtre de visualisation des chaines se fermera pour mettre à jour les annotations."
-                  , "Création d'un type d'unités", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
+public class VisuCoref extends JFrame implements Vue.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 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 JMenuBar menuBar = new JMenuBar();
+	
+	private final ModeleChaines donneesChaines;
+	
+	private String typeChaines;
+	
+	private String typeUnites;
+	
+	private String[] valsAffichees;
+	
+	private HashSet<String> valsAffichees1cachees = new HashSet<>();
+	
+	private ArrayList<Integer> noparagraphecachees = new ArrayList<>();
+	
+	private String[] valsAffichees1;
+	
+	private Integer[] valsAffichees2;
+	
+	private final TypeComboBox saisieTypeChaines;
+	
+	private final TypeComboBox saisieTypeUnites;
+	
+	private Val0ComboBox saisieChampAffiche;
+	
+	private Val0ComboBox saisieChampChaine;
+	
+	private final Val0ComboBox saisieChampStatistique;
+	
+	private JTable legendeChampAffiche;
+	
+	private JTable legendeChampAfficheChaine;
+	
+	private JTable legendeChampAfficheParagraphe;
+	
+	private LegendeModeleTable legendeChampAfficheModele;
+	
+	private LegendeModeleTableTexte legendeChampAfficheChaineModele;
+	
+	private LegendeModeleTableTexte legendeChampAfficheParagrapheModele;
+	
+	private JPopupMenu popupChamp = new JPopupMenu();
+	
+	private JPopupMenu popupChampChaine = new JPopupMenu();
+	
+	private JPopupMenu popupChampParagraphe = new JPopupMenu();
+	
+	private final JCheckBox activehistogramme;
+	
+	private final Box listeGChaines;
+	
+	private JTable ResultatStat;
+	
+	private final HashSet<GChaines> suiteGChaines = new HashSet<>();
+	
+	private final String[] statpossibles = new String[] { "Répartition des références par paragraphe",
+			"Répartition des paragraphes par référence", "Répartition des paragraphe par valeur du champ",
+			"Répartition des valeurs du champ par paragraphe", "Répartition des valeurs de champ par référence",
+			"Répartition des références par valeur de champ", "Répartition par paragraphe et par réfences "
+					+ "des valeurs du champ", "Répartition par paragraphe et par valeur du champ des références",
+			"Répartition par référence et par valeur de champ des paragraphes" };
+	
+	
+	public VisuCoref(Container fenetre, Vue vue, PanneauEditeur pEditeur) {
+		super("Analyse d'une chaine de coréférence");
+		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);
+		saisieTypeChaines = new TypeComboBox(Schema.class);
+		saisieTypeChaines.setModele(vue.getTypesSchemasAVoir());
+		saisieTypeChaines.addActionListener(this);
+		saisieTypeUnites = new TypeComboBox(Unite.class);
+		saisieTypeUnites.setModele(vue.getTypesUnitesAVoir());
+		saisieTypeUnites.addActionListener(this);
+		saisieChampAffiche = new Val0ComboBox("Nombre de chaînons");
+		saisieChampAffiche.addActionListener(this);
+		saisieChampChaine = new Val0ComboBox("Rien");
+		saisieChampChaine.addActionListener(this);
+		saisieChampStatistique = new Val0ComboBox("Rien");
+		saisieChampStatistique.addActionListener(this);
+		Box commandes = Box.createVerticalBox();
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Chaînes : "));
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(saisieTypeChaines);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Unites : "));
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(saisieTypeUnites);
+		commandes.add(Box.createVerticalGlue());
+		activehistogramme = new JCheckBox("Afficher les histogrammes de répartition");
+		commandes.add(activehistogramme);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Champ à filtrer : "));
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(saisieChampAffiche);
+		commandes.add(Box.createVerticalGlue());
+		
+		legendeChampAffiche = new JTable();
+		legendeChampAffiche.addMouseListener(new MouseAdapter() {
 			
-          if(option == JOptionPane.OK_OPTION){
-                ChaineUtil.fusionTypeUnite(vueconv);
-                fermerFenetre();
-          }
-      }
-    });   
-    saisieTypeChaines.setAlignmentX(0);
-    saisieTypeUnites.setAlignmentX(0);
-    saisieChampAffiche.setAlignmentX(0);
-    saisieChampChaine.setAlignmentX(0);
-    saisieChampStatistique.setAlignmentX(0);
-    legendeChampAffiche.setAlignmentX(0);
-    legendeChampAfficheChaine.setAlignmentX(0);
-    legendeChampAfficheParagraphe.setAlignmentX(0);
-    
-        // Fermeture de la fenêtre
-    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
-    addWindowListener(new WindowAdapter() {
-      @Override
-      public void windowClosing(WindowEvent evt) {
-        fermerFenetre();
-      }
-    });
-    donneesChaines = new ModeleChaines(vue, new GChaines(this));
-    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 {
-      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());
-           afficherchaines();
-          }
-        return;
-      }
-    if (evt.getSource().equals(saisieChampChaine)) {
-        initChaineChamp();
-        afficherchaines();
-        return;
-      }
-      if (evt.getSource().equals(saisieChampStatistique)) {
-        afficherstat();
-        return;
-      }  
-      throw new UnsupportedOperationException("Evénement non prévu : "+evt.paramString());
-    } catch (Throwable ex) {
-      GMessages.erreurFatale(ex);
-    }
-  }
-  
-    private void initVide() {
-    donneesChaines.permettreaffichage(false);
-    typeChaines = null;
-    typeUnites = null;
-    donneesChaines.initVide();
-    saisieChampAffiche.setModeleVide();
-    saisieChampChaine.setModeleVide();
-    saisieChampStatistique.setModeleVide();
-    legendeChampAfficheModele = new LegendeModeleTable(new String[]{"icone","nom du champ"},new LegendeLabel[0],new HashMap());
-    legendeChampAffiche.setModel(legendeChampAfficheModele);
-    legendeChampAfficheChaineModele = new LegendeModeleTableTexte(new String[]{"Affiché","nom du champ","frequence"},new LegendeLabel[0],new HashMap());
-    legendeChampAfficheChaine.setModel(legendeChampAfficheChaineModele);
-    legendeChampAfficheParagrapheModele = new LegendeModeleTableTexte(new String[]{"Affiché","nom du champ","frequence"},new LegendeLabel[0],new HashMap());
-    legendeChampAfficheParagraphe.setModel(legendeChampAfficheParagrapheModele);
-  }
-    private void init() throws UnsupportedOperationException {
-    donneesChaines.permettreaffichage(false);
-    typeChaines = saisieTypeChaines.getTypeSelection();
-    typeUnites = saisieTypeUnites.getTypeSelection();
-    donneesChaines.init(typeChaines, typeUnites, seuilsValsNbElts);
-    initParagraphechamp();
-    initCouleursNbElts();
-    afficherchaines();
-    saisieChampAffiche.removeActionListener(this);
-    saisieChampAffiche.setModele(vue.getNomsChamps(Unite.class, typeUnites));
-    saisieChampAffiche.addActionListener(this);
-    saisieChampChaine.removeActionListener(this);
-    saisieChampChaine.setModele(vue.getNomsChamps(Schema.class, typeChaines));
-    saisieChampChaine.addActionListener(this);
-    saisieChampStatistique.removeActionListener(this);
-    saisieChampStatistique.setModele(statpossibles);
-    saisieChampStatistique.addActionListener(this);    
-    //histochaine.changeHistogramme(donneesChaines.dispositionunites(10),Color.BLUE,this,200);
-    //initstat();
-
-  }
- 
-    private void initCouleursNbElts() {
-    if(!saisieChampChaine.pasdeSelection()){
-    donneesChaines.setChampAfficheNbElts(couleursNbElts);
-    }
-    if(!donneesChaines.peutetreafficher()){
-        HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt
-        (ChaineUtil.filtreparagraphe(saisieChampChaine.pasdeSelection() ? donneesChaines.getUnites() : 
-                donneesChaines.filtrechaine( donneesChaines.getUnites(), saisieChampChaine.getSelection(),
-                        valsAffichees1cachees),noparagraphecachees,vue),typeUnites,labelsNbElements); 
-        legendeChampAfficheModele = new LegendeModeleTable(new String[]{"icone","nom du champ","frequence"},
-                creerLegendesNbElements(),freq);
-        legendeChampAffiche.setModel(legendeChampAfficheModele);
-        legendeChampAffiche.getColumnModel().getColumn(0).setMaxWidth(50);    
-        legendeChampAffiche.getColumnModel().getColumn(2).setMaxWidth(50);
-        legendeChampAffiche.setRowHeight(30);
-    }
-  }
-    
-  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 void initCouleursChamp(String champ) {
-    valsAffichees = vue.getValeursChamp(Unite.class, typeUnites, champ);
-    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);
-    if(!donneesChaines.peutetreafficher()){
-        HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp
-    (ChaineUtil.filtreparagraphe(saisieChampChaine.pasdeSelection() ? donneesChaines.getUnites() : 
-            donneesChaines.filtrechaine(donneesChaines.getUnites(), saisieChampChaine.getSelection(),
-                    valsAffichees1cachees),noparagraphecachees,vue),typeUnites, champ,vue);
-        ChaineUtil.triFusionMap(valsAffichees,freq);
-        legendeChampAfficheModele = new LegendeModeleTable(new String[]{"icone","nom du champ","frequence"},
-                creerLegendesChamp(valsAffichees,couleursValeursChamp),freq);
-        legendeChampAffiche.setModel(legendeChampAfficheModele);
-        legendeChampAffiche.getColumnModel().getColumn(0).setMaxWidth(50);    
-        legendeChampAffiche.getColumnModel().getColumn(2).setMaxWidth(50);
-        legendeChampAffiche.setRowHeight(30);
-    }
-  }
-    
-  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;
-  }
-    
-    //initialise la Jlist des paragraphes
-    private void initParagraphechamp(){
-    valsAffichees2 = donneesChaines.listenumeroparagraphe();
-    LegendeLabel[] legende = new LegendeLabel[valsAffichees2.length];
-    for(int i = 0; i < valsAffichees2.length; i++){
-        int debutParagraphe = valsAffichees2[i] - 2 < 0 ? 0 : vue.getCorpus().getFinParagraphes()[valsAffichees2[i] - 2];
-        //on enlève 2 au paragraphe car quand on cherche le début d'un paragraphe on cherche la fin du précédent
-        //et de plus les paragraphes commencent à 1 quand les index de tableau commencent à 1
-        int longueur = debutParagraphe < vue.getCorpus().getTexte().length() - 20 ? 20 : 
-                vue.getCorpus().getTexte().length() - debutParagraphe;
-        if(noparagraphecachees.contains(valsAffichees2[i])){
-            legende[i] = new LegendeLabel("Paragraphe" + valsAffichees2[i].toString() + "  \"" +
-                    vue.getCorpus().getTexte().substring(debutParagraphe, debutParagraphe + longueur) + "\"","Non");
-        }
-        else{
-            legende[i] = new LegendeLabel("Paragraphe" + valsAffichees2[i].toString() + "  \"" +
-                    vue.getCorpus().getTexte().substring(debutParagraphe, debutParagraphe + longueur) + "\"","Oui");
-        }
-    }
-    if(!donneesChaines.peutetreafficher()){
-        legendeChampAfficheParagrapheModele = new LegendeModeleTableTexte(new String[]{"Affiché","Paragraphe"},legende,null);
-        legendeChampAfficheParagraphe.setModel(legendeChampAfficheParagrapheModele);
-        legendeChampAfficheParagraphe.getColumnModel().getColumn(0).setMaxWidth(50);
-    }
-    }
-    
-    //initialise la legende des valeurs de la Chaine
-    private void initChaineChamp(){
-    if(!donneesChaines.peutetreafficher()){
-        valsAffichees1 = vue.getValeursChamp(Schema.class, typeChaines, saisieChampChaine.getSelection());
-        LegendeLabel[] legende = new LegendeLabel[valsAffichees1.length];
-        HashMap<String, Float> freq; 
-        freq = donneesChaines.calculerfrequencechaine
-        (ChaineUtil.filtreparagraphe(donneesChaines.getUnites(),noparagraphecachees,vue),typeChaines, saisieChampChaine.getSelection(),valsAffichees1cachees);
-        ChaineUtil.triFusionMap(valsAffichees1,freq);
-        for(int i = 0; i < valsAffichees1.length; i++){
-            if(valsAffichees1cachees.contains(valsAffichees1[i])){
-                legende[i] = new LegendeLabel(valsAffichees1[i].toString(),"Non");
-            }
-            else{
-                legende[i] = new LegendeLabel(valsAffichees1[i].toString(),"Oui");
-            }
-        }
-        legendeChampAfficheChaineModele = new LegendeModeleTableTexte(new String[]{"Affiché","Paragraphe","frequence"},legende,freq);
-        legendeChampAfficheChaine.setModel(legendeChampAfficheChaineModele);
-        legendeChampAfficheChaine.getColumnModel().getColumn(0).setMaxWidth(50);  
-        legendeChampAfficheChaine.getColumnModel().getColumn(2).setMaxWidth(50); 
-    }
-    }
-    
-    
-  private void popupChampInit(final int index) {
-    final boolean masquee;
-    String[] vals= valsAffichees;
-    Val0ComboBox zonedesaisie=saisieChampAffiche;
-    JPopupMenu popup=popupChamp;
-    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);
-        }
-      });
-      popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : 
-              "Ne montrer que cette valeur") {
-        @Override
-        public void executer() {
-          modifierStatutValNbElements(masquee, index, true);
-        }
-      });
-    } 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);
-        }
-      });
-     popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : 
-              "Ne montrer que cette valeur") {
-        @Override
-        public void executer() {
-          modifierStatutValNulleChamp(masquee, true);
-        }
-      });
-    } 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);
-        }
-      });
-      popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : 
-              "Ne montrer que cette valeur") {
-        @Override
-        public void executer() {
-          modifierStatutValChamp(masquee, index, true);
-        }
-      });
-    }
-    
-  }
-  private void modifierStatutValChamp(boolean masquee, int index, boolean tous) {
-      String[] vals;
-      Val0ComboBox zonedesaisie;
-      vals = valsAffichees;
-      zonedesaisie = saisieChampAffiche;
-    if(!tous) donneesChaines.masquerValChamp(!masquee, 
-            zonedesaisie.getSelection(), vals[index]);
-    else if(masquee) donneesChaines.demasquerToutesValsChamp( 
-            zonedesaisie.getSelection());
-    else donneesChaines.masquerAutresValsChamp(typeUnites, 
-            zonedesaisie.getSelection(), vals[index]);
-    if(!saisieChampChaine.pasdeSelection()){
-        if(saisieChampAffiche.pasdeSelection()){
-            initCouleursNbElts();
-        }
-        else{
-            initCouleursChamp(saisieChampAffiche.getSelection());
-        }
-    }
-    afficherchaines();
-  }
-  private void modifierStatutValNulleChamp(boolean masquee, boolean tous) {
-      Val0ComboBox zonedesaisie;
-      zonedesaisie = saisieChampAffiche;
-    if(!tous) donneesChaines.masquerValNulleChamp(!masquee, zonedesaisie.getSelection());
-   else if(masquee) donneesChaines.demasquerToutesValsChamp( 
-            zonedesaisie.getSelection());
-    else donneesChaines.masquerValsNonNullesChamp(typeUnites, 
-            zonedesaisie.getSelection());
-    if(!saisieChampChaine.pasdeSelection()){
-        if(saisieChampAffiche.pasdeSelection()){
-            initCouleursNbElts();
-        }
-        else{
-            initCouleursChamp(saisieChampAffiche.getSelection());
-        }
-    }
-    afficherchaines();
-  }
-  private void modifierStatutValNbElements(boolean masquee, int index, boolean tous) {
-      Val0ComboBox zonedesaisie;
-      zonedesaisie = saisieChampAffiche;
-    if(!tous) donneesChaines.masquerValNbElements(!masquee, index);
-   else if(masquee) donneesChaines.demasquerToutesValsNbElts( 
-            zonedesaisie.getSelection());
-    else donneesChaines.masquerAutresValsNbElts( 
-            zonedesaisie.getSelection(), index);
-    if(!saisieChampChaine.pasdeSelection()){    
-        if(saisieChampAffiche.pasdeSelection()){
-            initCouleursNbElts();
-        }
-        else{
-            initCouleursChamp(saisieChampAffiche.getSelection());
-        }
-    }
-    afficherchaines();
-  }
-  
-    public void afficherchaines(){
-        donneesChaines.permettreaffichage(true);
-        this.suiteGChaines.clear();
-        listeGChaines.removeAll();
-        if(!saisieChampChaine.pasdeSelection() && !saisieTypeChaines.pasdeSelection() 
-                && !saisieTypeUnites.pasdeSelection()){
-           for(String val : valsAffichees1){ //pour toutes les valeurs de la propriété de la chaine
-               if(!valsAffichees1cachees.contains(val)){
-                   listeGChaines.add(Box.createVerticalGlue());
-                   GChaines graphique =  new GChaines(this);
-                   donneesChaines.setGChaine(graphique);
-                   donneesChaines.modifMasqueValsChampChaine(saisieTypeChaines.getSelection()
-                           ,saisieTypeUnites.getSelection(),noparagraphecachees,saisieChampChaine.getSelection(),
-                           val);
-                   if(!saisieChampAffiche.pasdeSelection()){
-                        initCouleursChamp(saisieChampAffiche.getSelection());
-                   }
-                   else{
-                        initCouleursNbElts();    
-                   }
-                   listeGChaines.add(new JLabel(val+" :"));
-                   listeGChaines.add(graphique);
-                   suiteGChaines.add(graphique);
-                   if(activehistogramme.isSelected()){
-                        ChartPanel histochaine = Histogramme.histogrammeFactory();
-                        Histogramme.updatePanel(histochaine,"Répartion des unités",donneesChaines,10, Color.blue, 200,
-                                "position de l'unité","Fréquence d'unités",vue);
-                        histochaine.setMaximumSize(new Dimension(550,300));
-                        listeGChaines.add(histochaine);
-                   }
-               }
-           }
-        }
-        donneesChaines.permettreaffichage(false);
-        GChaines graphique =  new GChaines(this);
-        donneesChaines.setGChaine(graphique);
-        donneesChaines.modifMasqueVals(saisieTypeChaines.getSelection()
-            ,saisieTypeUnites.getSelection());
-        if(!saisieChampChaine.pasdeSelection()){
-            if(saisieChampAffiche.pasdeSelection()){
-                initCouleursNbElts();
-            }
-            else{
-                initCouleursChamp(saisieChampAffiche.getSelection());
-            }
-            initChaineChamp();
-            initParagraphechamp();        
-         }
-        afficherstat();
-        listeGChaines.revalidate();
-        listeGChaines.repaint();
-    }
-    private void popupChampInitChaine(final int index) {
-    final boolean masquee;
-    Val0ComboBox zonedesaisie=saisieChampChaine;
-    JPopupMenu popup=popupChampChaine;
-    popup.removeAll();
-    if (zonedesaisie.pasdeSelection()) {
-    }
-    else {
-      masquee = valsAffichees1cachees.contains(valsAffichees1[index]);
-      popup.add(new GAction(masquee ? "Montrer cette valeur de la chaine" : 
-              "Masquer cette valeur de la chaine") {
-        @Override
-        public void executer() {
-          modifierStatutValChampChaine(masquee, index, false);
-        }
-      });
-      popup.add(new GAction(masquee ? "Montrer toutes les valeurs de la chaine" : 
-              "Ne montrer que cette valeur de la chaine") {
-        @Override
-        public void executer() {
-          modifierStatutValChampChaine(masquee, index, true);
-        }
-      });
-    }
-    
-  }
-  private void modifierStatutValChampChaine(boolean masquee, int index, boolean tous) {
-    if(!tous){ 
-        if(masquee){
-            valsAffichees1cachees.remove(valsAffichees1[index]);
-        }
-        else{
-            valsAffichees1cachees.add(valsAffichees1[index]);    
-        }
-    }
-    else if(masquee){ 
-        valsAffichees1cachees.clear();
-    }
-    else{ 
-        valsAffichees1cachees.clear();
-        for(String valeur : valsAffichees1){
-            if(!valeur.equals(valsAffichees1[index])){
-                valsAffichees1cachees.add(valeur);
-            }
-        }
-    
-    }
-    initChaineChamp();
-    if(!saisieChampChaine.pasdeSelection()){
-        afficherchaines();
-    }
-  }
-  
-  private void popupChampInitParagraphe(final int index) {
-    final boolean masquee;
-    Val0ComboBox zonedesaisie=saisieChampChaine;
-    JPopupMenu popup=popupChampParagraphe;
-    popup.removeAll();
-    if (zonedesaisie.pasdeSelection()) {
-    }
-    else {
-      masquee = noparagraphecachees.contains(valsAffichees2[index]);
-      popup.add(new GAction(masquee ? "Montrer ce paragraphe" : 
-              "Masquer ce paragraphe") {
-        @Override
-        public void executer() {
-          modifierStatutValChampParagraphe(masquee, index, false);
-        }
-      });
-      popup.add(new GAction(masquee ? "Montrer tous les paragraphes" : 
-              "Ne montrer que ce paragraphe") {
-        @Override
-        public void executer() {
-          modifierStatutValChampParagraphe(masquee, index, true);
-        }
-      });
-    }
-    
-  }
-  private void modifierStatutValChampParagraphe(boolean masquee, int index, boolean tous) {
-    if(!tous){ //on masque ou demasque un paragraphe
-        if(masquee){
-            noparagraphecachees.remove(valsAffichees2[index]);
-        }
-        else{
-            noparagraphecachees.add(valsAffichees2[index]);    
-        }
-    }
-    else if(masquee){ //on demasque tous les paragraphes
-        noparagraphecachees.clear();
-    }
-    else{ //on masque tous les autres paragraphes
-        noparagraphecachees.clear();
-        for(Integer numero : valsAffichees2){
-            if(numero.intValue()!=valsAffichees2[index]){
-                noparagraphecachees.add(numero);
-            }
-        }
-    }
-    initParagraphechamp();
-    if(!saisieChampChaine.pasdeSelection()){
-        afficherchaines();
-    }
-  }
-  public void afficherstat(){
-    if(!saisieChampStatistique.pasdeSelection() && !saisieChampChaine.pasdeSelection() 
-            && !saisieTypeChaines.pasdeSelection() && !saisieTypeUnites.pasdeSelection()){
-        ModeleStatChaine Modelestat = (ModeleStatChaine) ResultatStat.getModel();
-        String typeChampColonne;
-        String[] typeChampLigne;
-        switch(saisieChampStatistique.getSelection()){  
-            case "Répartition des références par paragraphe" :
-
-                typeChampColonne = "Chaine";
-                typeChampLigne = new String[1];
-                typeChampLigne[0] = "Paragraphe";
-                Modelestat=ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(), 
-                        valsAffichees1cachees, typeChampColonne, typeChampLigne, vue, 
-                        donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
-                break;
-            case "Répartition des paragraphes par référence" :
-
-                typeChampColonne = "Paragraphe";
-                typeChampLigne = new String[1];
-                typeChampLigne[0] = "Chaine";
-                Modelestat=ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(), 
-                        valsAffichees1cachees, typeChampColonne, typeChampLigne, vue, 
-                        donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
-                break;    
-            case "Répartition des paragraphe par valeur du champ" :
-                
-                typeChampColonne = "Paragraphe";
-                typeChampLigne = new String[1];
-                typeChampLigne[0] = "Unite";
-                Modelestat=ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(), 
-                        valsAffichees1cachees, typeChampColonne, typeChampLigne, vue, 
-                        donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
-                break; 
-            case "Répartition des valeurs du champ par paragraphe" :
-
-                typeChampColonne = "Unite";
-                typeChampLigne = new String[1];
-                typeChampLigne[0] = "Paragraphe";
-                Modelestat=ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(), 
-                        valsAffichees1cachees, typeChampColonne, typeChampLigne, vue, 
-                        donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
-                break; 
-            case "Répartition des valeurs de champ par référence" :
-
-                typeChampColonne = "Unite";
-                typeChampLigne = new String[1];
-                typeChampLigne[0] = "Chaine";
-                Modelestat=ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(), 
-                        valsAffichees1cachees, typeChampColonne, typeChampLigne, vue, 
-                        donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
-                break; 
-            case "Répartition des références par valeur de champ" :
-
-                typeChampColonne = "Chaine";
-                typeChampLigne = new String[1];
-                typeChampLigne[0] = "Unite";
-                Modelestat=ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(), 
-                        valsAffichees1cachees, typeChampColonne, typeChampLigne, vue, 
-                        donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
-                break; 
-            case "Répartition par paragraphe et par réfences des valeurs du champ" :
-
-                typeChampColonne = "Unite";
-                typeChampLigne = new String[2];
-                typeChampLigne[0] = "Chaine";
-                typeChampLigne[1] = "Paragraphe";
-                Modelestat=ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(), 
-                        valsAffichees1cachees, typeChampColonne, typeChampLigne, vue, 
-                        donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
-                break; 
-            case "Répartition par paragraphe et par valeur du champ des références" :
-
-                typeChampColonne = "Chaine";
-                typeChampLigne = new String[2];
-                typeChampLigne[0] = "Unite";
-                typeChampLigne[1] = "Paragraphe";
-                Modelestat=ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(), 
-                        valsAffichees1cachees, typeChampColonne, typeChampLigne, vue, 
-                        donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
-                break; 
-            case "Répartition par référence et par valeur de champ des paragraphes" :
-
-                typeChampColonne = "Paragraphe";
-                typeChampLigne = new String[2];
-                typeChampLigne[0] = "Chaine";
-                typeChampLigne[1] = "Unite";
-                Modelestat=ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(), 
-                        valsAffichees1cachees, typeChampColonne, typeChampLigne, vue, 
-                        donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
-                break; 
-            default :
-                break;
-            
-        }
-        
-        ResultatStat.setModel(Modelestat);
-        ResultatStat.setAutoCreateRowSorter(true); 
-        
-        for(int i = 0; i < ResultatStat.getColumnCount();i++){//on ajuste les tailles des cases du tableau
-            ResultatStat.getColumnModel().getColumn(i).setMinWidth(50);
-        }
-        ResultatStat.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-    
-    }
-  }
-  public JTable getLegende(){
-      return this.legendeChampAffiche;
-  }
-    
-  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(saisieChampChaine.pasdeSelection()){
-          retour = retour + "<text x=\""+x+"\" y=\""+(y + 6 * taillepolice) +"\""
-              + " style=\" fill:black; stroke:black ;font-size:"+taillepolice+"px "+police+"\">"+"Champ de la Chaine : aucun" + ";"+
-              "</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 de la Chaine : " + saisieChampChaine.getSelection() + ";"+
-              "</text>"+System.getProperty("line.separator") + System.getProperty("line.separator");
-      }
-      return retour;
-  }
-  public void importerAffichage(){
-      HashMap<String,Object> Choix = FichiersJava.ouvrirChaineVue();
-      if(Choix!=null && Choix.containsKey("choixCommande2") &&
-              Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC).equals(Choix.get("nomFichier"))){
-        HashMap<String,String> choixCommande = (HashMap<String,String>) Choix.get("choixCommande2");
-
-        saisieTypeChaines.removeActionListener(this);
-        saisieTypeUnites.removeActionListener(this);
-        saisieTypeChaines.setSelectedItem(choixCommande.get("saisieTypeChaines"));
-        saisieTypeUnites.setSelectedItem(choixCommande.get("saisieTypeUnites"));
-        saisieTypeChaines.addActionListener(this);
-        saisieTypeUnites.addActionListener(this);
-        init();
-
-        saisieChampChaine.removeActionListener(this);
-        saisieChampAffiche.removeActionListener(this);
-        saisieChampStatistique.removeActionListener(this);
-        donneesChaines.setValsMasqueesChamp((HashMap<String,HashSet<String>>) Choix.get("valmasquees"));
-        donneesChaines.setValsNbMasqueesChamp((boolean[]) Choix.get("valNbmasquees"));
-        donneesChaines.setValsNulleMasqueesChamp((HashSet<String>) Choix.get("valNullemasquees"));
-        this.valsAffichees1cachees=(HashSet<String>) Choix.get("valsAffichees1cachees");
-        this.noparagraphecachees=(ArrayList<Integer>) Choix.get("noparagraphecachees");
-        activehistogramme.setSelected(choixCommande.get("activehistogramme").equals("vrai"));
-        if(choixCommande.get("saisieChampAffiche")!=null){
-          saisieChampAffiche.setSelectedItem(choixCommande.get("saisieChampAffiche"));
-        }
-        else{
-          saisieChampAffiche.effSelection();
-        }
-        if(choixCommande.get("saisieChampChaine")!=null){
-          saisieChampChaine.setSelectedItem(choixCommande.get("saisieChampChaine"));
-        }
-        else{
-          saisieChampChaine.effSelection();
-        }
-        if(choixCommande.get("saisieChampStatistique")!=null){
-          saisieChampStatistique.setSelectedItem(choixCommande.get("saisieChampStatistique"));
-        }
-        else{
-          saisieChampStatistique.effSelection();
-        }
-
-        saisieChampChaine.addActionListener(this);
-        saisieChampAffiche.addActionListener(this);
-        saisieChampStatistique.addActionListener(this); 
-
-
-        if(saisieChampAffiche.pasdeSelection()){
-              initCouleursNbElts();
-        }
-        else{
-              initCouleursChamp(saisieChampAffiche.getSelection());
-        }
-      initChaineChamp();
-      initParagraphechamp(); 
-      afficherchaines();
-      afficherstat();
-    }
-    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 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("saisieChampAffiche",saisieChampAffiche.pasdeSelection() ? null : saisieChampAffiche.getSelection());
-      choixCommande.put("saisieChampChaine",saisieChampChaine.pasdeSelection() ? null : saisieChampChaine.getSelection());
-      choixCommande.put("saisieChampStatistique",saisieChampStatistique.pasdeSelection() ? null : saisieChampStatistique.getSelection());
-      choixCommande.put("activehistogramme",activehistogramme.isSelected() ? "vrai" : "faux");
-      Choix.put("valmasquees",donneesChaines.getValsMasqueesChamp());
-      Choix.put("valNbmasquees",donneesChaines.getValsNbMasqueesChamp());
-      Choix.put("valNullemasquees",donneesChaines.getValsNulleMasqueesChamp());
-      Choix.put("valsAffichees1cachees",valsAffichees1cachees);
-      Choix.put("noparagraphecachees",noparagraphecachees);
-      Choix.put("choixCommande2",choixCommande);
-      Choix.put("nomFichier",Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC));
-      FichiersJava.enregistrerChaineSous(Choix);
-  }
-  
-  public HashSet<GChaines> getSuiteGChaines(){
-      return this.suiteGChaines;
-  }
-  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;
-          }
-      }
-      //on crée les colonnes
-      if(champ.length==3){
-          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.saisieChampChaine.pasdeSelection() ? 
-                                ""
-                                : this.saisieChampChaine.getSelection();
-                             break;
-                    case 2 :
-                        titre[compteurTitre] = "Numéro de paragraphe";
-                             break;
-                     }
-                     compteurTitre = compteurTitre + 1;
-              }
-           }
-          donnees.add(titre);
-          for(GChaines chaine : this.suiteGChaines){
-              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.saisieChampChaine.pasdeSelection() ? 
-                                          ""
-                                          : vue.getValeurChamp(unit.chaine, this.saisieChampChaine.getSelection());
-                                  break;
-                              case 2 :
-                                  row[compteur] = chaine.noSegments[j];
-                                  break;
-                          }
-                          compteur = compteur + 1;
-                      }
-                  }
-                  donnees.add(row);
-              }
-          }
-      }
-      return donnees.toArray(new Object[donnees.size()][nbchamp+1]);
-  }
-
+			@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()));
+					popupChamp.show(legendeChampAffiche, e.getX(), e.getY());
+				}
+			}
+		});
+		
+		commandes.add(legendeChampAffiche);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Champ de la chaine à analyser : "));
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(saisieChampChaine);
+		commandes.add(Box.createVerticalGlue());
+		
+		legendeChampAfficheParagraphe = new JTable();
+		// legendeChampAfficheParagraphe.setCellRenderer(new LegendeCellRenderer());
+		legendeChampAfficheParagraphe.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
+					popupChampInitParagraphe(legendeChampAfficheParagraphe.rowAtPoint(e.getPoint()));
+					popupChampParagraphe.show(legendeChampAfficheParagraphe, e.getX(), e.getY());
+				}
+			}
+		});
+		
+		
+		
+		legendeChampAfficheChaine = new JTable();
+		// legendeChampAfficheChaine.setCellRenderer(new LegendeCellRenderer());
+		legendeChampAfficheChaine.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
+					popupChampInitChaine(legendeChampAfficheChaine.rowAtPoint(e.getPoint()));
+					popupChampChaine.show(legendeChampAfficheChaine, e.getX(), e.getY());
+				}
+			}
+		});
+		commandes.add(legendeChampAfficheChaine);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Paragraphe à filtrer : "));
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(legendeChampAfficheParagraphe);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Sélectionner une statistique : "));
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(saisieChampStatistique);
+		JScrollPane scrollLegende = new JScrollPane(commandes);
+		listeGChaines = Box.createVerticalBox();
+		JScrollPane scrollList = new JScrollPane(listeGChaines);
+		Box resultatstat = Box.createVerticalBox();
+		resultatstat.add(Box.createVerticalGlue());
+		resultatstat.add(new JLabel("Statistique : "));
+		resultatstat.add(Box.createVerticalGlue());
+		ResultatStat = new JTable(new ModeleStatChaine());
+		JScrollPane jsp = new JScrollPane(ResultatStat);
+		resultatstat.add(ResultatStat.getTableHeader());
+		resultatstat.add(jsp);
+		JScrollPane scrollstatresultat = new JScrollPane(resultatstat);
+		JSplitPane split1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollList, scrollstatresultat);
+		JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scrollLegende, split1);
+		getContentPane().add(split);
+		setVisible(true);
+		split.setDividerLocation(1. / 3);
+		split1.setDividerLocation(1. / 2);
+		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");
+		final VisuCoref visu = this;
+		final Vue vues = this.vue;
+		final PanneauEditeur pEditeurs = pEditeur;
+		menuBar.add(csvMenu);
+		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() {
+				Object[][] donneesCSV = new Object[ResultatStat.getRowCount() + 1][ResultatStat.getColumnCount()];
+				for (int i = 0; i < ResultatStat.getRowCount(); i++) {
+					for (int j = 0; j < ResultatStat.getColumnCount(); j++) {
+						donneesCSV[i + 1][j] = ResultatStat.getValueAt(i, j);
+					}
+				}
+				for (int j = 0; j < ResultatStat.getColumnCount(); j++) {
+					donneesCSV[0][j] = ResultatStat.getColumnName(j);
+				}
+				
+				ExportCSV.exporterCSV(donneesCSV);
+			}
+		});
+		csvMenu.add(new GAction("Exporter les fréquences pour le champ des unités") {
+			
+			@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 champ des chaines") {
+			
+			@Override
+			public void executer() {
+				if (!saisieChampChaine.pasdeSelection()) {
+					Object[][] donneesCSV = new Object[legendeChampAfficheChaine.getRowCount() + 1][2];
+					for (int i = 0; i < legendeChampAfficheChaine.getRowCount(); i++) {
+						donneesCSV[i + 1][0] = legendeChampAfficheChaine.getValueAt(i, 1);
+						donneesCSV[i + 1][1] = legendeChampAfficheChaine.getValueAt(i, 2) == null ? "0"
+								: legendeChampAfficheChaine.getValueAt(i, 2);
+					}
+					donneesCSV[0][1] = "frequence";
+					donneesCSV[0][0] = saisieChampChaine.getSelection();
+					ExportCSV.exporterCSV(donneesCSV);
+				}
+			}
+		});
+		JMenu typeMenu = new JMenu("Fusionner des types d'unités");
+		menuBar.add(typeMenu);
+		final Vue vueconv = vue;
+		typeMenu.add(new GAction("Fusionner tous les types") {
+			
+			@Override
+			public void executer() {
+				JOptionPane jop = new JOptionPane();
+				int option = jop.showConfirmDialog(null, "Voulez-créer un nouveau type rassemblant tous les autres ?"
+						+ System.getProperty("line.separator") + "Si oui, la fenêtre de visualisation des chaines se fermera pour mettre à jour les annotations.", "Création d'un type d'unités",
+						JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
+				
+				if (option == JOptionPane.OK_OPTION) {
+					ChaineUtil.fusionTypeUnite(vueconv);
+					fermerFenetre();
+				}
+			}
+		});
+		saisieTypeChaines.setAlignmentX(0);
+		saisieTypeUnites.setAlignmentX(0);
+		saisieChampAffiche.setAlignmentX(0);
+		saisieChampChaine.setAlignmentX(0);
+		saisieChampStatistique.setAlignmentX(0);
+		legendeChampAffiche.setAlignmentX(0);
+		legendeChampAfficheChaine.setAlignmentX(0);
+		legendeChampAfficheParagraphe.setAlignmentX(0);
+		
+		// Fermeture de la fenêtre
+		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+		addWindowListener(new WindowAdapter() {
+			
+			@Override
+			public void windowClosing(WindowEvent evt) {
+				fermerFenetre();
+			}
+		});
+		donneesChaines = new ModeleChaines(vue, new GChaines(this));
+		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 {
+			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());
+					afficherchaines();
+				}
+				return;
+			}
+			if (evt.getSource().equals(saisieChampChaine)) {
+				initChaineChamp();
+				afficherchaines();
+				return;
+			}
+			if (evt.getSource().equals(saisieChampStatistique)) {
+				afficherstat();
+				return;
+			}
+			throw new UnsupportedOperationException("Evénement non prévu : " + evt.paramString());
+		}
+		catch (Throwable ex) {
+			GMessages.erreurFatale(ex);
+		}
+	}
+	
+	private void initVide() {
+		donneesChaines.permettreaffichage(false);
+		typeChaines = null;
+		typeUnites = null;
+		donneesChaines.initVide();
+		saisieChampAffiche.setModeleVide();
+		saisieChampChaine.setModeleVide();
+		saisieChampStatistique.setModeleVide();
+		legendeChampAfficheModele = new LegendeModeleTable(new String[] { "icone", "nom du champ" }, new LegendeLabel[0], new HashMap());
+		legendeChampAffiche.setModel(legendeChampAfficheModele);
+		legendeChampAfficheChaineModele = new LegendeModeleTableTexte(new String[] { "Affiché", "nom du champ", "frequence" }, new LegendeLabel[0], new HashMap());
+		legendeChampAfficheChaine.setModel(legendeChampAfficheChaineModele);
+		legendeChampAfficheParagrapheModele = new LegendeModeleTableTexte(new String[] { "Affiché", "nom du champ", "frequence" }, new LegendeLabel[0], new HashMap());
+		legendeChampAfficheParagraphe.setModel(legendeChampAfficheParagrapheModele);
+	}
+	
+	private void init() throws UnsupportedOperationException {
+		donneesChaines.permettreaffichage(false);
+		typeChaines = saisieTypeChaines.getTypeSelection();
+		typeUnites = saisieTypeUnites.getTypeSelection();
+		donneesChaines.init(typeChaines, typeUnites, seuilsValsNbElts);
+		initParagraphechamp();
+		initCouleursNbElts();
+		afficherchaines();
+		saisieChampAffiche.removeActionListener(this);
+		saisieChampAffiche.setModele(vue.getNomsChamps(Unite.class, typeUnites));
+		saisieChampAffiche.addActionListener(this);
+		saisieChampChaine.removeActionListener(this);
+		saisieChampChaine.setModele(vue.getNomsChamps(Schema.class, typeChaines));
+		saisieChampChaine.addActionListener(this);
+		saisieChampStatistique.removeActionListener(this);
+		saisieChampStatistique.setModele(statpossibles);
+		saisieChampStatistique.addActionListener(this);
+		// histochaine.changeHistogramme(donneesChaines.dispositionunites(10),Color.BLUE,this,200);
+		// initstat();
+		
+	}
+	
+	private void initCouleursNbElts() {
+		if (!saisieChampChaine.pasdeSelection()) {
+			donneesChaines.setChampAfficheNbElts(couleursNbElts);
+		}
+		if (!donneesChaines.peutetreafficher()) {
+			HashMap<String, Float> freq = donneesChaines.calculerfrequencenbelt(ChaineUtil.filtreparagraphe(saisieChampChaine.pasdeSelection() ? donneesChaines.getUnites()
+					: donneesChaines.filtrechaine(donneesChaines.getUnites(), saisieChampChaine.getSelection(),
+							valsAffichees1cachees), noparagraphecachees, vue), typeUnites, labelsNbElements);
+			legendeChampAfficheModele = new LegendeModeleTable(new String[] { "icone", "nom du champ", "frequence" },
+					creerLegendesNbElements(), freq);
+			legendeChampAffiche.setModel(legendeChampAfficheModele);
+			legendeChampAffiche.getColumnModel().getColumn(0).setMaxWidth(50);
+			legendeChampAffiche.getColumnModel().getColumn(2).setMaxWidth(50);
+			legendeChampAffiche.setRowHeight(30);
+		}
+	}
+	
+	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 void initCouleursChamp(String champ) {
+		valsAffichees = vue.getValeursChamp(Unite.class, typeUnites, champ);
+		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);
+		if (!donneesChaines.peutetreafficher()) {
+			HashMap<String, Float> freq = ChaineUtil.calculerfrequencechamp(ChaineUtil.filtreparagraphe(saisieChampChaine.pasdeSelection() ? donneesChaines.getUnites()
+					: donneesChaines.filtrechaine(donneesChaines.getUnites(), saisieChampChaine.getSelection(),
+							valsAffichees1cachees), noparagraphecachees, vue), typeUnites, champ, vue);
+			ChaineUtil.triFusionMap(valsAffichees, freq);
+			legendeChampAfficheModele = new LegendeModeleTable(new String[] { "icone", "nom du champ", "frequence" },
+					creerLegendesChamp(valsAffichees, couleursValeursChamp), freq);
+			legendeChampAffiche.setModel(legendeChampAfficheModele);
+			legendeChampAffiche.getColumnModel().getColumn(0).setMaxWidth(50);
+			legendeChampAffiche.getColumnModel().getColumn(2).setMaxWidth(50);
+			legendeChampAffiche.setRowHeight(30);
+		}
+	}
+	
+	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;
+	}
+	
+	// initialise la Jlist des paragraphes
+	private void initParagraphechamp() {
+		valsAffichees2 = donneesChaines.listenumeroparagraphe();
+		LegendeLabel[] legende = new LegendeLabel[valsAffichees2.length];
+		for (int i = 0; i < valsAffichees2.length; i++) {
+			int debutParagraphe = valsAffichees2[i] - 2 < 0 ? 0 : vue.getCorpus().getFinParagraphes()[valsAffichees2[i] - 2];
+			// on enlève 2 au paragraphe car quand on cherche le début d'un paragraphe on cherche la fin du précédent
+			// et de plus les paragraphes commencent à 1 quand les index de tableau commencent à 1
+			int longueur = debutParagraphe < vue.getCorpus().getTexte().length() - 20 ? 20 : vue.getCorpus().getTexte().length() - debutParagraphe;
+			if (noparagraphecachees.contains(valsAffichees2[i])) {
+				legende[i] = new LegendeLabel("Paragraphe" + valsAffichees2[i].toString() + "  \"" +
+						vue.getCorpus().getTexte().substring(debutParagraphe, debutParagraphe + longueur) + "\"", "Non");
+			}
+			else {
+				legende[i] = new LegendeLabel("Paragraphe" + valsAffichees2[i].toString() + "  \"" +
+						vue.getCorpus().getTexte().substring(debutParagraphe, debutParagraphe + longueur) + "\"", "Oui");
+			}
+		}
+		if (!donneesChaines.peutetreafficher()) {
+			legendeChampAfficheParagrapheModele = new LegendeModeleTableTexte(new String[] { "Affiché", "Paragraphe" }, legende, null);
+			legendeChampAfficheParagraphe.setModel(legendeChampAfficheParagrapheModele);
+			legendeChampAfficheParagraphe.getColumnModel().getColumn(0).setMaxWidth(50);
+		}
+	}
+	
+	// initialise la legende des valeurs de la Chaine
+	private void initChaineChamp() {
+		if (!donneesChaines.peutetreafficher()) {
+			valsAffichees1 = vue.getValeursChamp(Schema.class, typeChaines, saisieChampChaine.getSelection());
+			LegendeLabel[] legende = new LegendeLabel[valsAffichees1.length];
+			HashMap<String, Float> freq;
+			freq = donneesChaines.calculerfrequencechaine(ChaineUtil.filtreparagraphe(donneesChaines.getUnites(), noparagraphecachees, vue), typeChaines, saisieChampChaine.getSelection(),
+					valsAffichees1cachees);
+			ChaineUtil.triFusionMap(valsAffichees1, freq);
+			for (int i = 0; i < valsAffichees1.length; i++) {
+				if (valsAffichees1cachees.contains(valsAffichees1[i])) {
+					legende[i] = new LegendeLabel(valsAffichees1[i].toString(), "Non");
+				}
+				else {
+					legende[i] = new LegendeLabel(valsAffichees1[i].toString(), "Oui");
+				}
+			}
+			legendeChampAfficheChaineModele = new LegendeModeleTableTexte(new String[] { "Affiché", "Paragraphe", "frequence" }, legende, freq);
+			legendeChampAfficheChaine.setModel(legendeChampAfficheChaineModele);
+			legendeChampAfficheChaine.getColumnModel().getColumn(0).setMaxWidth(50);
+			legendeChampAfficheChaine.getColumnModel().getColumn(2).setMaxWidth(50);
+		}
+	}
+	
+	
+	private void popupChampInit(final int index) {
+		final boolean masquee;
+		String[] vals = valsAffichees;
+		Val0ComboBox zonedesaisie = saisieChampAffiche;
+		JPopupMenu popup = popupChamp;
+		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);
+				}
+			});
+			popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : "Ne montrer que cette valeur") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValNbElements(masquee, index, true);
+				}
+			});
+		}
+		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);
+				}
+			});
+			popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : "Ne montrer que cette valeur") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValNulleChamp(masquee, true);
+				}
+			});
+		}
+		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);
+				}
+			});
+			popup.add(new GAction(masquee ? "Montrer toutes les valeurs" : "Ne montrer que cette valeur") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValChamp(masquee, index, true);
+				}
+			});
+		}
+		
+	}
+	
+	private void modifierStatutValChamp(boolean masquee, int index, boolean tous) {
+		String[] vals;
+		Val0ComboBox zonedesaisie;
+		vals = valsAffichees;
+		zonedesaisie = saisieChampAffiche;
+		if (!tous) donneesChaines.masquerValChamp(!masquee,
+				zonedesaisie.getSelection(), vals[index]);
+		else if (masquee) donneesChaines.demasquerToutesValsChamp(
+				zonedesaisie.getSelection());
+		else donneesChaines.masquerAutresValsChamp(typeUnites,
+				zonedesaisie.getSelection(), vals[index]);
+		if (!saisieChampChaine.pasdeSelection()) {
+			if (saisieChampAffiche.pasdeSelection()) {
+				initCouleursNbElts();
+			}
+			else {
+				initCouleursChamp(saisieChampAffiche.getSelection());
+			}
+		}
+		afficherchaines();
+	}
+	
+	private void modifierStatutValNulleChamp(boolean masquee, boolean tous) {
+		Val0ComboBox zonedesaisie;
+		zonedesaisie = saisieChampAffiche;
+		if (!tous) donneesChaines.masquerValNulleChamp(!masquee, zonedesaisie.getSelection());
+		else if (masquee) donneesChaines.demasquerToutesValsChamp(
+				zonedesaisie.getSelection());
+		else donneesChaines.masquerValsNonNullesChamp(typeUnites,
+				zonedesaisie.getSelection());
+		if (!saisieChampChaine.pasdeSelection()) {
+			if (saisieChampAffiche.pasdeSelection()) {
+				initCouleursNbElts();
+			}
+			else {
+				initCouleursChamp(saisieChampAffiche.getSelection());
+			}
+		}
+		afficherchaines();
+	}
+	
+	private void modifierStatutValNbElements(boolean masquee, int index, boolean tous) {
+		Val0ComboBox zonedesaisie;
+		zonedesaisie = saisieChampAffiche;
+		if (!tous) donneesChaines.masquerValNbElements(!masquee, index);
+		else if (masquee) donneesChaines.demasquerToutesValsNbElts(
+				zonedesaisie.getSelection());
+		else donneesChaines.masquerAutresValsNbElts(
+				zonedesaisie.getSelection(), index);
+		if (!saisieChampChaine.pasdeSelection()) {
+			if (saisieChampAffiche.pasdeSelection()) {
+				initCouleursNbElts();
+			}
+			else {
+				initCouleursChamp(saisieChampAffiche.getSelection());
+			}
+		}
+		afficherchaines();
+	}
+	
+	public void afficherchaines() {
+		donneesChaines.permettreaffichage(true);
+		this.suiteGChaines.clear();
+		listeGChaines.removeAll();
+		if (!saisieChampChaine.pasdeSelection() && !saisieTypeChaines.pasdeSelection()
+				&& !saisieTypeUnites.pasdeSelection()) {
+			for (String val : valsAffichees1) { // pour toutes les valeurs de la propriété de la chaine
+				if (!valsAffichees1cachees.contains(val)) {
+					listeGChaines.add(Box.createVerticalGlue());
+					GChaines graphique = new GChaines(this);
+					donneesChaines.setGChaine(graphique);
+					donneesChaines.modifMasqueValsChampChaine(saisieTypeChaines.getSelection(), saisieTypeUnites.getSelection(), noparagraphecachees, saisieChampChaine.getSelection(),
+							val);
+					if (!saisieChampAffiche.pasdeSelection()) {
+						initCouleursChamp(saisieChampAffiche.getSelection());
+					}
+					else {
+						initCouleursNbElts();
+					}
+					listeGChaines.add(new JLabel(val + " :"));
+					listeGChaines.add(graphique);
+					suiteGChaines.add(graphique);
+					if (activehistogramme.isSelected()) {
+						ChartPanel histochaine = Histogramme.histogrammeFactory();
+						Histogramme.updatePanel(histochaine, "Répartion des unités", donneesChaines, 10, Color.blue, 200,
+								"position de l'unité", "Fréquence d'unités", vue);
+						histochaine.setMaximumSize(new Dimension(550, 300));
+						listeGChaines.add(histochaine);
+					}
+				}
+			}
+		}
+		donneesChaines.permettreaffichage(false);
+		GChaines graphique = new GChaines(this);
+		donneesChaines.setGChaine(graphique);
+		donneesChaines.modifMasqueVals(saisieTypeChaines.getSelection(), saisieTypeUnites.getSelection());
+		if (!saisieChampChaine.pasdeSelection()) {
+			if (saisieChampAffiche.pasdeSelection()) {
+				initCouleursNbElts();
+			}
+			else {
+				initCouleursChamp(saisieChampAffiche.getSelection());
+			}
+			initChaineChamp();
+			initParagraphechamp();
+		}
+		afficherstat();
+		listeGChaines.revalidate();
+		listeGChaines.repaint();
+	}
+	
+	private void popupChampInitChaine(final int index) {
+		final boolean masquee;
+		Val0ComboBox zonedesaisie = saisieChampChaine;
+		JPopupMenu popup = popupChampChaine;
+		popup.removeAll();
+		if (zonedesaisie.pasdeSelection()) {
+		}
+		else {
+			masquee = valsAffichees1cachees.contains(valsAffichees1[index]);
+			popup.add(new GAction(masquee ? "Montrer cette valeur de la chaine" : "Masquer cette valeur de la chaine") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValChampChaine(masquee, index, false);
+				}
+			});
+			popup.add(new GAction(masquee ? "Montrer toutes les valeurs de la chaine" : "Ne montrer que cette valeur de la chaine") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValChampChaine(masquee, index, true);
+				}
+			});
+		}
+		
+	}
+	
+	private void modifierStatutValChampChaine(boolean masquee, int index, boolean tous) {
+		if (!tous) {
+			if (masquee) {
+				valsAffichees1cachees.remove(valsAffichees1[index]);
+			}
+			else {
+				valsAffichees1cachees.add(valsAffichees1[index]);
+			}
+		}
+		else if (masquee) {
+			valsAffichees1cachees.clear();
+		}
+		else {
+			valsAffichees1cachees.clear();
+			for (String valeur : valsAffichees1) {
+				if (!valeur.equals(valsAffichees1[index])) {
+					valsAffichees1cachees.add(valeur);
+				}
+			}
+			
+		}
+		initChaineChamp();
+		if (!saisieChampChaine.pasdeSelection()) {
+			afficherchaines();
+		}
+	}
+	
+	private void popupChampInitParagraphe(final int index) {
+		final boolean masquee;
+		Val0ComboBox zonedesaisie = saisieChampChaine;
+		JPopupMenu popup = popupChampParagraphe;
+		popup.removeAll();
+		if (zonedesaisie.pasdeSelection()) {
+		}
+		else {
+			masquee = noparagraphecachees.contains(valsAffichees2[index]);
+			popup.add(new GAction(masquee ? "Montrer ce paragraphe" : "Masquer ce paragraphe") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValChampParagraphe(masquee, index, false);
+				}
+			});
+			popup.add(new GAction(masquee ? "Montrer tous les paragraphes" : "Ne montrer que ce paragraphe") {
+				
+				@Override
+				public void executer() {
+					modifierStatutValChampParagraphe(masquee, index, true);
+				}
+			});
+		}
+		
+	}
+	
+	private void modifierStatutValChampParagraphe(boolean masquee, int index, boolean tous) {
+		if (!tous) { // on masque ou demasque un paragraphe
+			if (masquee) {
+				noparagraphecachees.remove(valsAffichees2[index]);
+			}
+			else {
+				noparagraphecachees.add(valsAffichees2[index]);
+			}
+		}
+		else if (masquee) { // on demasque tous les paragraphes
+			noparagraphecachees.clear();
+		}
+		else { // on masque tous les autres paragraphes
+			noparagraphecachees.clear();
+			for (Integer numero : valsAffichees2) {
+				if (numero.intValue() != valsAffichees2[index]) {
+					noparagraphecachees.add(numero);
+				}
+			}
+		}
+		initParagraphechamp();
+		if (!saisieChampChaine.pasdeSelection()) {
+			afficherchaines();
+		}
+	}
+	
+	public void afficherstat() {
+		if (!saisieChampStatistique.pasdeSelection() && !saisieChampChaine.pasdeSelection()
+				&& !saisieTypeChaines.pasdeSelection() && !saisieTypeUnites.pasdeSelection()) {
+			ModeleStatChaine Modelestat = (ModeleStatChaine) ResultatStat.getModel();
+			String typeChampColonne;
+			String[] typeChampLigne;
+			switch (saisieChampStatistique.getSelection()) {
+				case "Répartition des références par paragraphe":
+					
+					typeChampColonne = "Chaine";
+					typeChampLigne = new String[1];
+					typeChampLigne[0] = "Paragraphe";
+					Modelestat = ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(),
+							valsAffichees1cachees, typeChampColonne, typeChampLigne, vue,
+							donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
+					break;
+				case "Répartition des paragraphes par référence":
+					
+					typeChampColonne = "Paragraphe";
+					typeChampLigne = new String[1];
+					typeChampLigne[0] = "Chaine";
+					Modelestat = ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(),
+							valsAffichees1cachees, typeChampColonne, typeChampLigne, vue,
+							donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
+					break;
+				case "Répartition des paragraphe par valeur du champ":
+					
+					typeChampColonne = "Paragraphe";
+					typeChampLigne = new String[1];
+					typeChampLigne[0] = "Unite";
+					Modelestat = ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(),
+							valsAffichees1cachees, typeChampColonne, typeChampLigne, vue,
+							donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
+					break;
+				case "Répartition des valeurs du champ par paragraphe":
+					
+					typeChampColonne = "Unite";
+					typeChampLigne = new String[1];
+					typeChampLigne[0] = "Paragraphe";
+					Modelestat = ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(),
+							valsAffichees1cachees, typeChampColonne, typeChampLigne, vue,
+							donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
+					break;
+				case "Répartition des valeurs de champ par référence":
+					
+					typeChampColonne = "Unite";
+					typeChampLigne = new String[1];
+					typeChampLigne[0] = "Chaine";
+					Modelestat = ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(),
+							valsAffichees1cachees, typeChampColonne, typeChampLigne, vue,
+							donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
+					break;
+				case "Répartition des références par valeur de champ":
+					
+					typeChampColonne = "Chaine";
+					typeChampLigne = new String[1];
+					typeChampLigne[0] = "Unite";
+					Modelestat = ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(),
+							valsAffichees1cachees, typeChampColonne, typeChampLigne, vue,
+							donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
+					break;
+				case "Répartition par paragraphe et par réfences des valeurs du champ":
+					
+					typeChampColonne = "Unite";
+					typeChampLigne = new String[2];
+					typeChampLigne[0] = "Chaine";
+					typeChampLigne[1] = "Paragraphe";
+					Modelestat = ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(),
+							valsAffichees1cachees, typeChampColonne, typeChampLigne, vue,
+							donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
+					break;
+				case "Répartition par paragraphe et par valeur du champ des références":
+					
+					typeChampColonne = "Chaine";
+					typeChampLigne = new String[2];
+					typeChampLigne[0] = "Unite";
+					typeChampLigne[1] = "Paragraphe";
+					Modelestat = ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(),
+							valsAffichees1cachees, typeChampColonne, typeChampLigne, vue,
+							donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
+					break;
+				case "Répartition par référence et par valeur de champ des paragraphes":
+					
+					typeChampColonne = "Paragraphe";
+					typeChampLigne = new String[2];
+					typeChampLigne[0] = "Chaine";
+					typeChampLigne[1] = "Unite";
+					Modelestat = ModeleStatChaine.calculateStatCoref(saisieChampChaine.getSelection(), saisieChampAffiche.getSelection(),
+							valsAffichees1cachees, typeChampColonne, typeChampLigne, vue,
+							donneesChaines, noparagraphecachees, typeChaines, typeUnites, labelsNbElements);
+					break;
+				default:
+					break;
+				
+			}
+			
+			ResultatStat.setModel(Modelestat);
+			ResultatStat.setAutoCreateRowSorter(true);
+			
+			for (int i = 0; i < ResultatStat.getColumnCount(); i++) {// on ajuste les tailles des cases du tableau
+				ResultatStat.getColumnModel().getColumn(i).setMinWidth(50);
+			}
+			ResultatStat.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+			
+		}
+	}
+	
+	public JTable getLegende() {
+		return this.legendeChampAffiche;
+	}
+	
+	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 (saisieChampChaine.pasdeSelection()) {
+			retour = retour + "<text x=\"" + x + "\" y=\"" + (y + 6 * taillepolice) + "\""
+					+ " style=\" fill:black; stroke:black ;font-size:" + taillepolice + "px " + police + "\">" + "Champ de la Chaine : aucun" + ";" +
+					"</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 de la Chaine : " + saisieChampChaine.getSelection() + ";" +
+					"</text>" + System.getProperty("line.separator") + System.getProperty("line.separator");
+		}
+		return retour;
+	}
+	
+	public void importerAffichage() {
+		HashMap<String, Object> Choix = FichiersJava.ouvrirChaineVue();
+		if (Choix != null && Choix.containsKey("choixCommande2") &&
+				Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC).equals(Choix.get("nomFichier"))) {
+			HashMap<String, String> choixCommande = (HashMap<String, String>) Choix.get("choixCommande2");
+			
+			saisieTypeChaines.removeActionListener(this);
+			saisieTypeUnites.removeActionListener(this);
+			saisieTypeChaines.setSelectedItem(choixCommande.get("saisieTypeChaines"));
+			saisieTypeUnites.setSelectedItem(choixCommande.get("saisieTypeUnites"));
+			saisieTypeChaines.addActionListener(this);
+			saisieTypeUnites.addActionListener(this);
+			init();
+			
+			saisieChampChaine.removeActionListener(this);
+			saisieChampAffiche.removeActionListener(this);
+			saisieChampStatistique.removeActionListener(this);
+			donneesChaines.setValsMasqueesChamp((HashMap<String, HashSet<String>>) Choix.get("valmasquees"));
+			donneesChaines.setValsNbMasqueesChamp((boolean[]) Choix.get("valNbmasquees"));
+			donneesChaines.setValsNulleMasqueesChamp((HashSet<String>) Choix.get("valNullemasquees"));
+			this.valsAffichees1cachees = (HashSet<String>) Choix.get("valsAffichees1cachees");
+			this.noparagraphecachees = (ArrayList<Integer>) Choix.get("noparagraphecachees");
+			activehistogramme.setSelected(choixCommande.get("activehistogramme").equals("vrai"));
+			if (choixCommande.get("saisieChampAffiche") != null) {
+				saisieChampAffiche.setSelectedItem(choixCommande.get("saisieChampAffiche"));
+			}
+			else {
+				saisieChampAffiche.effSelection();
+			}
+			if (choixCommande.get("saisieChampChaine") != null) {
+				saisieChampChaine.setSelectedItem(choixCommande.get("saisieChampChaine"));
+			}
+			else {
+				saisieChampChaine.effSelection();
+			}
+			if (choixCommande.get("saisieChampStatistique") != null) {
+				saisieChampStatistique.setSelectedItem(choixCommande.get("saisieChampStatistique"));
+			}
+			else {
+				saisieChampStatistique.effSelection();
+			}
+			
+			saisieChampChaine.addActionListener(this);
+			saisieChampAffiche.addActionListener(this);
+			saisieChampStatistique.addActionListener(this);
+			
+			
+			if (saisieChampAffiche.pasdeSelection()) {
+				initCouleursNbElts();
+			}
+			else {
+				initCouleursChamp(saisieChampAffiche.getSelection());
+			}
+			initChaineChamp();
+			initParagraphechamp();
+			afficherchaines();
+			afficherstat();
+		}
+		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 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("saisieChampAffiche", saisieChampAffiche.pasdeSelection() ? null : saisieChampAffiche.getSelection());
+		choixCommande.put("saisieChampChaine", saisieChampChaine.pasdeSelection() ? null : saisieChampChaine.getSelection());
+		choixCommande.put("saisieChampStatistique", saisieChampStatistique.pasdeSelection() ? null : saisieChampStatistique.getSelection());
+		choixCommande.put("activehistogramme", activehistogramme.isSelected() ? "vrai" : "faux");
+		Choix.put("valmasquees", donneesChaines.getValsMasqueesChamp());
+		Choix.put("valNbmasquees", donneesChaines.getValsNbMasqueesChamp());
+		Choix.put("valNullemasquees", donneesChaines.getValsNulleMasqueesChamp());
+		Choix.put("valsAffichees1cachees", valsAffichees1cachees);
+		Choix.put("noparagraphecachees", noparagraphecachees);
+		Choix.put("choixCommande2", choixCommande);
+		Choix.put("nomFichier", Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC));
+		FichiersJava.enregistrerChaineSous(Choix);
+	}
+	
+	public HashSet<GChaines> getSuiteGChaines() {
+		return this.suiteGChaines;
+	}
+	
+	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;
+			}
+		}
+		// on crée les colonnes
+		if (champ.length == 3) {
+			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.saisieChampChaine.pasdeSelection() ? ""
+									: this.saisieChampChaine.getSelection();
+							break;
+						case 2:
+							titre[compteurTitre] = "Numéro de paragraphe";
+							break;
+					}
+					compteurTitre = compteurTitre + 1;
+				}
+			}
+			donnees.add(titre);
+			for (GChaines chaine : this.suiteGChaines) {
+				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.saisieChampChaine.pasdeSelection() ? ""
+											: vue.getValeurChamp(unit.chaine, this.saisieChampChaine.getSelection());
+									break;
+								case 2:
+									row[compteur] = chaine.noSegments[j];
+									break;
+							}
+							compteur = compteur + 1;
+						}
+					}
+					donnees.add(row);
+				}
+			}
+		}
+		return donnees.toArray(new Object[donnees.size()][nbchamp + 1]);
+	}
+	
 }
Index: tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuStatGenerale.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuStatGenerale.java	(revision 3077)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuStatGenerale.java	(revision 3078)
@@ -20,702 +20,747 @@
 import visuAnalec.util.GVisu.*;
 import visuAnalec.util.GVisu.Val0ComboBox;
 import visuAnalec.vue.*;
+
 /**
  *
  * @author Marc
  */
-public class VisuStatGenerale extends JFrame implements Vue.VueListener, ActionListener{
-  private Vue vue;
-  private ModeleChaines donneesChaines;
-  private String[] typesChainesAffiches;
-  private HashSet<String> typesChainesMasques=new HashSet();
-  private Val0ComboBox saisieUniteComptage;
-  private JList legendeTypeUnite;
-  private Val0ComboBox saisieAxeOrdonnee;
-  private Val0ComboBox saisieAxeAbscisse;
-  private Val0ComboBox saisieModeAffichage;
-  private JPopupMenu popupChamp = new JPopupMenu();
-  private PanneauEditeur panneauEditeur;
-  private Box listeStat = Box.createVerticalBox();
-  private ChartPanel graphique;  
-  private JMenuBar menuBar = new JMenuBar();
-  private String[] StatPossiblesAbscisses = new String[]{"Nombre de chainons","Numéro de paragraphe"};
-  private String[] StatPossiblesOrdonnees;
-  private String[] ModesPossibles = new String[]{"Activer l'interpolation","Désactiver l'affichage des valeurs nulles"};
-  private Object[][] donneesGenerales = new Object[0][0];
-  
-  public VisuStatGenerale(Container fenetre,final Vue vue, PanneauEditeur pEditeur){
-    super("Analyse générale du texte");
-    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);
-    typesChainesMasques = new HashSet();
-    this.panneauEditeur = pEditeur;   
-    saisieUniteComptage = new Val0ComboBox("Caractère");
-    saisieUniteComptage.addActionListener(this);
-    saisieAxeOrdonnee = new Val0ComboBox("Rien");
-    saisieAxeOrdonnee.addActionListener(this);
-    saisieAxeAbscisse = new Val0ComboBox("Rien");
-    saisieAxeAbscisse.addActionListener(this);
-    saisieModeAffichage = new Val0ComboBox("Normal");
-    saisieModeAffichage.addActionListener(this);
-    Box commandes = Box.createVerticalBox();
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Statistiques : "));   
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Selectionner une unité de comptage : "));
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(saisieUniteComptage);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Type unité : "));
-    commandes.add(Box.createVerticalGlue());
-        
-    legendeTypeUnite = new JList();
-    legendeTypeUnite.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()) {//if the event shows the menu
-          popupChampInit(legendeTypeUnite.locationToIndex(e.getPoint()));
-          popupChamp.show(legendeTypeUnite, e.getX(), e.getY());
-        }
-      }
-    });
-    commandes.add(legendeTypeUnite);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Ordonnée : "));
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(saisieAxeOrdonnee);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Abscisse : "));
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(saisieAxeAbscisse);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(new JLabel("Mode d'Affichage : "));
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(saisieModeAffichage);
-    commandes.add(Box.createVerticalGlue());
-    commandes.add(listeStat);
-    saisieUniteComptage.setAlignmentX(0);
-    legendeTypeUnite.setAlignmentX(0);
-    saisieAxeOrdonnee.setAlignmentX(0);
-    saisieAxeAbscisse.setAlignmentX(0);
-    saisieModeAffichage.setAlignmentX(0);
-    
-    JScrollPane scrollcommandes = new JScrollPane(commandes);
-    graphique =  Courbe.courbeFactory();
-    JScrollPane scrollcourbe = new JScrollPane(graphique);
-    JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,scrollcommandes,scrollcourbe);
-    split.setDividerLocation(1./2);
-    setJMenuBar(menuBar);
-    JMenu corpusMenu = new JMenu("Paramètres d'affichage");
-    menuBar.add(corpusMenu);;
-    corpusMenu.add(new GAction("Reprendre un affichage") {
-      public void executer() {
-         importerAffichage();
-      }
-    });
-    corpusMenu.add(new GAction("Sauver les paramètres d'affichage") {
-      public void executer() {
-         exporterAffichage();
-      }
-    });    
-    JMenu csvMenu = new JMenu("Exporter les données");
-    menuBar.add(csvMenu);;
-    csvMenu.add(new GAction("Exporter les données de filtrage") {
-      public void executer() {
-          ArrayList<Object[]> donnees = new ArrayList();
-          donnees.add(new Object[]{"Unité","type d'unité"});
-          for(String typeUnit : vue.getTypesUnitesAVoir()){
-              if(!typesChainesMasques.contains(typeUnit)){
-                for(Unite unit : vue.getUnites(typeUnit)){
-                    donnees.add(new Object[]{vue.getTexteUnite(unit),unit.getType()});
-                }
-              }
-          }
-          ExportCSV.exporterCSV(donnees.toArray(new Object[donnees.size()][2]));
-      }
-    });
-    csvMenu.add(new GAction("Exporter les statiques générales") {
-      public void executer() {
-          ExportCSV.exporterCSV(donneesGenerales);
-      }
-    }); 
-    getContentPane().add(split);
-    setVisible(true);    
-        // Fermeture de la fenêtre
-    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
-    addWindowListener(new WindowAdapter() {
-      @Override
-      public void windowClosing(WindowEvent evt) {
-        fermerFenetre();
-      }
-    });
-    donneesChaines = new ModeleChaines(vue, new GChaines(this));
-    donneesChaines.permettreaffichage(false);
-    saisieUniteComptage.setModele(new String[]{"Mots","Caractère"});
-    saisieAxeAbscisse.setModele(StatPossiblesAbscisses);
-    saisieModeAffichage.setModele(ModesPossibles);
-  }
-  
-    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 actionPerformed(ActionEvent evt) {
-    try {
-      if (evt.getSource().equals(saisieUniteComptage)) {
-          if(vue.getTypesUnitesAVoir()==null || saisieUniteComptage.pasdeSelection()){
-           initVide();   
-          }
-          else{
-        init();
-          }
-        return;
-      }
-      if (evt.getSource().equals(saisieAxeOrdonnee)) {
-          if(!saisieAxeAbscisse.pasdeSelection() && !saisieAxeOrdonnee.pasdeSelection()){
-           affichercourbe();
-          }
-        return;
-      }
-    if (evt.getSource().equals(saisieAxeAbscisse)) {
-        if(!saisieUniteComptage.pasdeSelection()){
-        initChampOrdonnee();
-        }
-        return;
-      }
-    if (evt.getSource().equals(saisieModeAffichage)) {
-          if(!saisieAxeAbscisse.pasdeSelection() && !saisieAxeOrdonnee.pasdeSelection()){
-           affichercourbe();
-          }        
-        return;
-      }    
-      throw new UnsupportedOperationException("Evénement non prévu : "+evt.paramString());
-    } catch (Throwable ex) {
-      GMessages.erreurFatale(ex);
-    }
-  }
-  
-  private void initTypeUnite(){
-    String[] legende = new String[typesChainesAffiches.length];
-    for(int i = 0; i < typesChainesAffiches.length; i++){
-        if(typesChainesMasques.contains(typesChainesAffiches[i])){
-            legende[i] = "" +typesChainesAffiches[i].toString() + "     Non";
-        }
-        else{
-            legende[i] = "" +typesChainesAffiches[i].toString() + "     Oui";
-        }
-    }
-    legendeTypeUnite.setListData(legende);    
-  }
-  
-    private void popupChampInit(final int index) {
-    final boolean masquee;
-    masquee = typesChainesMasques.contains(typesChainesAffiches[index]);
-    popupChamp.removeAll();
-          popupChamp.add(new GAction(masquee ? "Montrer ce type d'unité" : 
-              "Masquer ce type d'unité") {
-        public void executer() {
-          modifierStatutValChampType(masquee, index, false);
-        }
-      });
-      popupChamp.add(new GAction(masquee ? "Montrer tous les types" : 
-              "Ne montrer que ce type d'unité") {
-        public void executer() {
-          modifierStatutValChampType(masquee, index, true);
-        }
-      });
-    
-  }
-    
-  private void modifierStatutValChampType(boolean masquee, int index, boolean tous) {
-    if(!tous){ 
-        if(masquee){
-            typesChainesMasques.remove(typesChainesAffiches[index]);
-        }
-        else{
-            typesChainesMasques.add(typesChainesAffiches[index]);    
-        }
-    }
-    else if(masquee){ 
-        typesChainesMasques.clear();
-    }
-    else{ 
-        typesChainesMasques.clear();
-        for(String valeur : typesChainesAffiches){
-            if(!valeur.equals(typesChainesAffiches[index])){
-                typesChainesMasques.add(valeur);
-            }
-        }
-    
-    }
-    afficherCalculs();
-    if(!saisieAxeAbscisse.pasdeSelection() && !saisieAxeOrdonnee.pasdeSelection()){
-    affichercourbe();
-    }
-  }
-  
-  private void initVide(){
-      listeStat.removeAll();
-      saisieAxeOrdonnee.setModeleVide();
-      legendeTypeUnite.setListData(new String[0]);
-  }
-  
-  private String[] getTypesAutorises(){
-      String[] retour;
-      if(typesChainesAffiches.length - typesChainesMasques.size()>0){
-        retour = new String[typesChainesAffiches.length - typesChainesMasques.size()];
-        int compte  = 0;
-        for(String type : typesChainesAffiches){
-            if(!typesChainesMasques.contains(type)){
-                retour[compte] = type;
-                compte = compte + 1 ;
-            }
-        }
-      }
-      else{
-        retour = new String[typesChainesAffiches.length];
-        int compte  = 0;
-        for(String type : typesChainesAffiches){
-                retour[compte] = type;
-                compte = compte + 1 ;
-        }
-      }
-      return retour;
-  }
-  
-  private void init(){
-      typesChainesAffiches = vue.getTypesUnitesAVoir();
-        saisieAxeAbscisse.setModele(StatPossiblesAbscisses);
-       initChampOrdonnee();
-      afficherCalculs();
-
-  }
-  private void afficherCalculs(){
-      initTypeUnite();
-      String unite = saisieUniteComptage.getSelection();
-      listeStat.removeAll();
-      this.donneesGenerales=new Object[20][2];
-      int donnee;
-      float donneef;
-      String[] typesDispo =getTypesAutorises() ;
-      listeStat.add(Box.createVerticalGlue());
-      donnee = ChaineUtil.nbCaractere(vue);
-      listeStat.add(new JLabel("Nombre de Caractères : " + donnee));
-      this.donneesGenerales[0][0]= "Nombre de Caractères";
-      this.donneesGenerales[0][1]= donnee;
-      listeStat.add(Box.createVerticalGlue());
-      donnee = ChaineUtil.nbMot(vue);
-      listeStat.add(new JLabel("Nombre de Mots : " + donnee));
-      this.donneesGenerales[1][0]= "Nombre de Mots";
-      this.donneesGenerales[1][1]= donnee;
-      listeStat.add(Box.createVerticalGlue());
-      donnee = ChaineUtil.nbParagraphe(vue);
-      listeStat.add(new JLabel("Nombre de Paragraphes : " + donnee));
-      this.donneesGenerales[2][0]= "Nombre de Paragraphes";
-      this.donneesGenerales[2][1]= donnee;
-      listeStat.add(Box.createVerticalGlue());
-      donnee = ChaineUtil.getUniteesTrieesEtFiltrees(typesDispo,vue).length;
-      listeStat.add(new JLabel("Nombre d'unités : " + donnee));
-      this.donneesGenerales[3][0]= "Nombre d'unités";
-      this.donneesGenerales[3][1]= donnee;
-      listeStat.add(Box.createVerticalGlue());
-      donnee = ChaineUtil.nombreDeReference(typesDispo,vue);
-      listeStat.add(new JLabel("Nombre de Références : " + donnee));
-      this.donneesGenerales[4][0]= "Nombre de Références";
-      this.donneesGenerales[4][1]= donnee;
-      listeStat.add(Box.createVerticalGlue());
-      donnee = ChaineUtil.nbChaines(vue);
-      listeStat.add(new JLabel("Nombre de Chaines : " + donnee));
-      this.donneesGenerales[5][0]= "Nombre de Chaines";
-      this.donneesGenerales[5][1]= donnee;
-      listeStat.add(Box.createVerticalGlue());
-      Integer[] tmp = ChaineUtil.nombreDeChainons(typesDispo,vue).toArray(new Integer[0]);
-      donneef = ChaineUtil.Esperance(tmp);
-      listeStat.add(new JLabel("Nombre moyen de Chainons par Chaine : " + donneef));
-      this.donneesGenerales[6][0]= "Nombre moyen de Chainons par Chaine";
-      this.donneesGenerales[6][1]= donneef;
-      listeStat.add(Box.createVerticalGlue());
-      donneef = ChaineUtil.Variance(tmp);
-      listeStat.add(new JLabel("Variance du Nombre de Chainons par Chaine : " + donneef));
-      this.donneesGenerales[7][0]= "Variance du Nombre de Chainons par Chaine";
-      this.donneesGenerales[7][1]= donneef;
-      listeStat.add(Box.createVerticalGlue());
-      donneef = ChaineUtil.densiteReferentielle("Paragraphe", typesDispo,vue);
-      listeStat.add(new JLabel("Densité référentielle par paragraphe : " + donneef));
-      this.donneesGenerales[8][0]= "Densité référentielle par paragraphe";
-      this.donneesGenerales[8][1]= donneef;
-      listeStat.add(Box.createVerticalGlue());
-      switch(unite){
-          case "Mots" :
-              donneef = ChaineUtil.densiteReferentielle("Mot", typesDispo,vue);
-              listeStat.add(new JLabel("Densité référentielle par nombre de mots : " + donneef));
-              this.donneesGenerales[9][0]= "Densité référentielle par nombre de mots";
-              this.donneesGenerales[9][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              tmp = ChaineUtil.positionUnite(typesDispo,vue).toArray(new Integer[0]);
-              //ici la position moyenne est calculé en caractère puis convertit en mots pour plus de précisions
-              donneef = ChaineUtil.calculerPositionMotCorpus(Math.round(ChaineUtil.Esperance(tmp)),vue);
-              listeStat.add(new JLabel("Position moyenne des unités : " + donneef));
-              this.donneesGenerales[10][0]= "Position moyenne des unités";
-              this.donneesGenerales[10][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              tmp = ChaineUtil.positionUniteEnMot(typesDispo,vue).toArray(new Integer[0]);
-              donneef = ChaineUtil.Variance(tmp);              
-              listeStat.add(new JLabel("Variance des positions des unités : " + donneef));
-              this.donneesGenerales[11][0]= "Variance des positions des unités";
-              this.donneesGenerales[11][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              tmp = ChaineUtil.ecartUniteMot(typesDispo,vue).toArray(new Integer[0]);
-              donneef = ChaineUtil.Esperance(tmp);   
-              listeStat.add(new JLabel("Ecart moyen entre les unités : " + donneef));
-              this.donneesGenerales[12][0]= "Ecart moyen entre les unités";
-              this.donneesGenerales[12][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              donneef = ChaineUtil.Variance(tmp);   
-              listeStat.add(new JLabel("Variance des écarts des unités : " + donneef));
-              this.donneesGenerales[13][0]= "Variance des écarts des unités";
-              this.donneesGenerales[13][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              tmp = ChaineUtil.longueurUniteMot(typesDispo,vue).toArray(new Integer[0]);
-              donnee = ChaineUtil.somme(tmp); 
-              listeStat.add(new JLabel("Longueur totale des unités : " + donnee));
-              this.donneesGenerales[14][0]= "Nombre de Mots";
-              this.donneesGenerales[14][1]= donnee;
-              listeStat.add(Box.createVerticalGlue());
-              donneef = ChaineUtil.Esperance(tmp);
-              listeStat.add(new JLabel("Longueur moyenne des unités : " + donneef));
-              this.donneesGenerales[15][0]= "Longueur moyenne des unités";
-              this.donneesGenerales[15][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              donneef = ChaineUtil.Variance(tmp);
-              listeStat.add(new JLabel("Variance des longueurs des unités : " + donneef));
-              this.donneesGenerales[16][0]= "Variance des longueurs des unités";
-              this.donneesGenerales[16][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              tmp = ChaineUtil.longueurChaineMot(typesDispo,vue).toArray(new Integer[0]);
-              donnee = ChaineUtil.somme(tmp); 
-              listeStat.add(new JLabel("Longueur totale des chaines de coréférences : " + donnee));
-              this.donneesGenerales[17][0]= "Longueur totale des chaines de coréférences";
-              this.donneesGenerales[17][1]= donnee;
-              listeStat.add(Box.createVerticalGlue());
-              donneef = ChaineUtil.Esperance(tmp);
-              listeStat.add(new JLabel("Longueur moyenne des chaines de coréférences : " + donneef));
-              this.donneesGenerales[18][0]= "Nombre de Mots";
-              this.donneesGenerales[18][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              donneef = ChaineUtil.Variance(tmp);
-              listeStat.add(new JLabel("Variance des longueurs des chaines de coréférences : " + donneef));
-              this.donneesGenerales[19][0]= "Variance des longueurs des chaines de coréférences";
-              this.donneesGenerales[19][1]= donneef;
-              
-              
-              break;
-          case "Caractère" :
-              donneef = ChaineUtil.densiteReferentielle("Caractère", typesDispo,vue);
-              listeStat.add(new JLabel("Densité référentielle par nombre de caractères : " + donneef));
-              this.donneesGenerales[9][0]= "Densité référentielle par nombre de caractères";
-              this.donneesGenerales[9][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              tmp = ChaineUtil.positionUnite(typesDispo,vue).toArray(new Integer[0]);
-              donneef = ChaineUtil.Esperance(tmp);
-              listeStat.add(new JLabel("Position moyenne des unités : " + donneef));
-              this.donneesGenerales[10][0]= "Position moyenne des unités";
-              this.donneesGenerales[10][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              donneef = ChaineUtil.Variance(tmp);
-              listeStat.add(new JLabel("Variance des positions des unités : " + donneef));
-              this.donneesGenerales[11][0]= "Variance des positions des unités";
-              this.donneesGenerales[11][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              tmp = ChaineUtil.ecartUniteCaractere(typesDispo,vue).toArray(new Integer[0]);
-              donneef = ChaineUtil.Esperance(tmp);
-              listeStat.add(new JLabel("Ecart moyen entre les unités : " + donneef));
-              this.donneesGenerales[12][0]= "Ecart moyen entre les unités";
-              this.donneesGenerales[12][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              donneef = ChaineUtil.Variance(tmp);
-              listeStat.add(new JLabel("Variance des écarts des unités : " + donneef));
-              this.donneesGenerales[13][0]= "Variance des écarts des unités";
-              this.donneesGenerales[13][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              tmp = ChaineUtil.longueurUniteCaractere(typesDispo,vue).toArray(new Integer[0]);
-              donnee = ChaineUtil.somme(tmp);
-              listeStat.add(new JLabel("Longueur totale des unités : " + donnee));
-              this.donneesGenerales[14][0]= "Longueur totale des unités";
-              this.donneesGenerales[14][1]= donnee;
-              listeStat.add(Box.createVerticalGlue());
-              donneef = ChaineUtil.Esperance(tmp);
-              listeStat.add(new JLabel("Longueur moyenne des unités : " + donneef));
-              this.donneesGenerales[15][0]= "Longueur moyenne des unités";
-              this.donneesGenerales[15][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              donneef = ChaineUtil.Variance(tmp);
-              listeStat.add(new JLabel("Variance des longueurs des unités : " + donneef));
-              this.donneesGenerales[16][0]= "Variance des longueurs des unités";
-              this.donneesGenerales[16][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              tmp = ChaineUtil.longueurChaineCaractere(typesDispo,vue).toArray(new Integer[0]);
-              donnee = ChaineUtil.somme(tmp);
-              listeStat.add(new JLabel("Longueur totale des chaines de coréférences : " + donnee));
-              this.donneesGenerales[17][0]= "Longueur totale des chaines de coréférences";
-              this.donneesGenerales[17][1]= donnee;
-              listeStat.add(Box.createVerticalGlue());
-              donneef = ChaineUtil.Esperance(tmp);
-              listeStat.add(new JLabel("Longueur moyenne des chaines de coréférences : " + donneef));
-              this.donneesGenerales[18][0]= "Longueur moyenne des chaines de coréférences";
-              this.donneesGenerales[18][1]= donneef;
-              listeStat.add(Box.createVerticalGlue());
-              donneef = ChaineUtil.Variance(tmp);
-              listeStat.add(new JLabel("Variance des longueurs des chaines de coréférences : " + donneef));
-              this.donneesGenerales[19][0]= "Variance des longueurs des chaines de coréférences";
-              this.donneesGenerales[19][1]= donneef;
-              break;
-          default : 
-              break;
-      }      
-  }
-  
-  private void initChampOrdonnee(){
-      if(!saisieAxeAbscisse.pasdeSelection()){
-        switch(saisieAxeAbscisse.getSelection()){
-            case "Nombre de chainons" :
-                StatPossiblesOrdonnees = new String[]{"Nombre de Chaines de coreference"};
-                break;
-            case "Numéro de paragraphe" :
-                StatPossiblesOrdonnees = new String[]{"Nombre de chainons","Nombre de Chaines de coreference",
-                "ratio nombre de chainons par nombre de " + saisieUniteComptage.getSelection(),"Densité référentielle"};
-                break;            
-            default :
-                StatPossiblesOrdonnees = new String[]{};
-                break;
-        }
-      }
-      else{
-        StatPossiblesOrdonnees = new String[]{};  
-      }
-      saisieAxeOrdonnee.setModele(StatPossiblesOrdonnees);
-  }
-  private void affichercourbe(){
-              switch(saisieAxeAbscisse.getSelection()){
-            case "Nombre de chainons" :
-                switch(saisieAxeOrdonnee.getSelection()){
-                    case "Nombre de Chaines de coreference" :
-                        HashMap donnee = ChaineUtil.calculerdonneecourbechainons(getTypesAutorises(),vue);
-                        afficherNbChainesEnFonctionNbChainons(donnee);
-                    break;
-                };
-                break;
-            case "Numéro de paragraphe" :
-                HashMap donnee = ChaineUtil.calculedonneecourbe(getTypesAutorises(),saisieUniteComptage.getSelection(),vue);
-                switch(saisieAxeOrdonnee.getSelection()){
-                    case "Nombre de Chaines de coreference" :
-                        afficherEnFonctionParagraphe(donnee);                        
-                    break;
-                    case "Nombre de chainons":
-                        afficherEnFonctionParagraphe(donnee);                         
-                    break;
-                    case "ratio nombre de chainons par nombre de " + "Mots":
-                        afficherEnFonctionParagraphe(donnee);                          
-                    break;
-                    case "ratio nombre de chainons par nombre de " + "Caractère":
-                        afficherEnFonctionParagraphe(donnee);                          
-                    break;                        
-                    case "Densité référentielle":
-                        afficherEnFonctionParagraphe(donnee);                          
-                    break;    
-                };                
-                break; 
-            default :
-                break;
-        }
-  }
-
-  
-  private void afficherEnFonctionParagraphe(HashMap<Integer,HashMap<String,Integer>> donnees){
-      ArrayList<Integer> classement = new ArrayList();
-      ArrayList<Integer> ordonnee = new ArrayList();
-      for(Integer nopa : donnees.keySet()){
-        classement.add(nopa,nopa);
-        ordonnee.add(nopa,donnees.get(nopa).get(saisieAxeOrdonnee.getSelection()));
-          
-      }
-      if(!saisieModeAffichage.pasdeSelection() && saisieModeAffichage.getSelection()=="Désactiver l'affichage des valeurs nulles"){
-          for(int nopa  = 0; nopa < ordonnee.size();nopa++){
-              if(nopa!=0 && nopa < ordonnee.size() - 1 && ordonnee.get(nopa)==0){
-                  classement.remove(nopa);
-                  ordonnee.remove(nopa);
-                  nopa = nopa - 1;
-              }
-          }
-          
-      }
-      
-      if(!saisieModeAffichage.pasdeSelection() && saisieModeAffichage.getSelection()=="Activer l'interpolation"){
-          ArrayList<Integer> valeurlagrange = new ArrayList();
-          for(int i  = 0;i< classement.size();i++){
-              valeurlagrange.add(i,ChaineUtil.interpolationLagrangienne(classement.toArray(new Integer[0]),
-                      ordonnee.toArray(new Integer[0]),i));
-          }
-          ordonnee = valeurlagrange;
-      }
-      Courbe.updatePanel(graphique,"Représentation de " + saisieAxeOrdonnee.getSelection()+ " en fonction du numéro pararaphe",
-              classement.toArray(new Integer[0]), ordonnee.toArray(new Integer[0]), 
-              Color.blue, -1,"numéro pararaphe",saisieAxeOrdonnee.getSelection());
-  }   
-  
-
-  
-  private void afficherNbChainesEnFonctionNbChainons(HashMap<Integer,Integer> donnees){
-      int max = 0;//on cherche l'abscisse maximum
-      for(Integer elt : donnees.keySet()){
-          if(elt>max){
-              max = elt;
-          }
-      }
-      ArrayList<Integer> abscisse;
-      ArrayList<Integer> ordonnee;
-      
-      if(saisieModeAffichage.pasdeSelection() || saisieModeAffichage.getSelection()!="Activer l'interpolation"){
-        abscisse = new ArrayList();
-        ordonnee = new ArrayList();  
-        for(int i = 0;i<max+1;i++){
-            abscisse.add(i,i);
-          if(donnees.containsKey(i)){
-              ordonnee.add(i,donnees.get(i));
-          }
-          else{
-              ordonnee.add(i,0) ;
-          }
-        }
-        if(!saisieModeAffichage.pasdeSelection() && saisieModeAffichage.getSelection().equals("Désactiver l'affichage des valeurs nulles")){
-             for(int nopa  = 0; nopa < ordonnee.size();nopa++){
-                 if(nopa!=0 && nopa < ordonnee.size() - 1 && ordonnee.get(nopa)==0){
-                     abscisse.remove(nopa);
-                     ordonnee.remove(nopa);
-                     nopa = nopa - 1;
-                 }
-             }
-
-         }
-      }
-      else{
-        Integer[] abscisses = new Integer[donnees.size()];
-        Integer[] ordonnees = new Integer[donnees.size()]; 
-        int compteur = 0;
-        for(int i = 0;i<max+1;i++){
-            
-          if(donnees.containsKey(i)){
-              abscisses[compteur] = i;
-              ordonnees[compteur] = donnees.get(i);
-              compteur = compteur + 1;
-          }        
-        }
-        abscisse = new ArrayList();
-        ordonnee = new ArrayList();  
-        for(int i = 0;i<max+1;i++){
-            abscisse.add(i,i);
-            ordonnee.add(i,ChaineUtil.interpolationLagrangienne(abscisses,ordonnees,i));
-        } 
-      }
-      Courbe.updatePanel(graphique,"Représentation de " + "nombre de chaines"+ " en fonction du nombre de chainons",
-              abscisse.toArray(new Integer[0]), ordonnee.toArray(new Integer[0]), 
-              Color.blue, -1,"numéro pararaphe",saisieAxeOrdonnee.getSelection());
-  }
-
-  private void importerAffichage(){
-      HashMap<String,Object> Choix = FichiersJava.ouvrirChaineVue();
-      if(Choix!=null && Choix.containsKey("choixCommande3") &&
-              Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC).equals(Choix.get("nomFichier"))){
-        HashMap<String,String> choixCommande = (HashMap<String,String>) Choix.get("choixCommande3");
-        saisieUniteComptage.removeActionListener(this);
-        saisieUniteComptage.setSelectedItem(choixCommande.get("saisieUniteComptage"));
-        saisieUniteComptage.addActionListener(this);
-        if(vue.getTypesUnitesAVoir()==null || saisieUniteComptage.pasdeSelection()){
-          initVide();   
-        }
-        else{
-          init();
-        }
-        this.typesChainesMasques = (HashSet<String>) Choix.get("typesChainesMasques");
-        saisieAxeOrdonnee.removeActionListener(this);
-        saisieAxeAbscisse.removeActionListener(this);
-        saisieModeAffichage.removeActionListener(this);
-
-
-        saisieAxeAbscisse.setSelectedItem(choixCommande.get("saisieAxeAbscisse"));
-        initChampOrdonnee();
-        saisieAxeOrdonnee.setSelectedItem(choixCommande.get("saisieAxeOrdonnee"));
-        saisieModeAffichage.setSelectedItem(choixCommande.get("saisieModeAffichage"));
-        saisieAxeOrdonnee.addActionListener(this);
-        saisieAxeAbscisse.addActionListener(this);
-        saisieModeAffichage.addActionListener(this);
-        affichercourbe();
-      }
-    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);
-    }
-      
-      
-  }
-  private void exporterAffichage(){
-      
-      HashMap<String,Object> Choix = new HashMap();
-      HashMap<String,String> choixCommande = new HashMap();
-      
-      choixCommande.put("saisieUniteComptage",saisieUniteComptage.pasdeSelection() ? null : saisieUniteComptage.getSelection());
-      choixCommande.put("saisieAxeOrdonnee",saisieAxeOrdonnee.pasdeSelection() ? null : saisieAxeOrdonnee.getSelection());
-      choixCommande.put("saisieAxeAbscisse",saisieAxeAbscisse.pasdeSelection() ? null : saisieAxeAbscisse.getSelection());
-      choixCommande.put("saisieModeAffichage",saisieModeAffichage.pasdeSelection() ? null : saisieModeAffichage.getSelection());
-      Choix.put("typesChainesMasques",typesChainesMasques);
-      Choix.put("choixCommande3",choixCommande);
-      Choix.put("nomFichier",Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC));
-      FichiersJava.enregistrerChaineSous(Choix);      
-  }
-  
-  /*renvoie un tableau contenant les statistiques générales du texte*/
-  public Object[][] donneesCSV(){
-      return this.donneesGenerales;
-  }
-  
+public class VisuStatGenerale extends JFrame implements Vue.VueListener, ActionListener {
+	
+	private Vue vue;
+	
+	private ModeleChaines donneesChaines;
+	
+	private String[] typesChainesAffiches;
+	
+	private HashSet<String> typesChainesMasques = new HashSet();
+	
+	private Val0ComboBox saisieUniteComptage;
+	
+	private JList legendeTypeUnite;
+	
+	private Val0ComboBox saisieAxeOrdonnee;
+	
+	private Val0ComboBox saisieAxeAbscisse;
+	
+	private Val0ComboBox saisieModeAffichage;
+	
+	private JPopupMenu popupChamp = new JPopupMenu();
+	
+	private PanneauEditeur panneauEditeur;
+	
+	private Box listeStat = Box.createVerticalBox();
+	
+	private ChartPanel graphique;
+	
+	private JMenuBar menuBar = new JMenuBar();
+	
+	private String[] StatPossiblesAbscisses = new String[] { "Nombre de chainons", "Numéro de paragraphe" };
+	
+	private String[] StatPossiblesOrdonnees;
+	
+	private String[] ModesPossibles = new String[] { "Activer l'interpolation", "Désactiver l'affichage des valeurs nulles" };
+	
+	private Object[][] donneesGenerales = new Object[0][0];
+	
+	public VisuStatGenerale(Container fenetre, final Vue vue, PanneauEditeur pEditeur) {
+		super("Analyse générale du texte");
+		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);
+		typesChainesMasques = new HashSet();
+		this.panneauEditeur = pEditeur;
+		saisieUniteComptage = new Val0ComboBox("Caractère");
+		saisieUniteComptage.addActionListener(this);
+		saisieAxeOrdonnee = new Val0ComboBox("Rien");
+		saisieAxeOrdonnee.addActionListener(this);
+		saisieAxeAbscisse = new Val0ComboBox("Rien");
+		saisieAxeAbscisse.addActionListener(this);
+		saisieModeAffichage = new Val0ComboBox("Normal");
+		saisieModeAffichage.addActionListener(this);
+		Box commandes = Box.createVerticalBox();
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Statistiques : "));
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Selectionner une unité de comptage : "));
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(saisieUniteComptage);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Type unité : "));
+		commandes.add(Box.createVerticalGlue());
+		
+		legendeTypeUnite = new JList();
+		legendeTypeUnite.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(legendeTypeUnite.locationToIndex(e.getPoint()));
+					popupChamp.show(legendeTypeUnite, e.getX(), e.getY());
+				}
+			}
+		});
+		commandes.add(legendeTypeUnite);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Ordonnée : "));
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(saisieAxeOrdonnee);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Abscisse : "));
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(saisieAxeAbscisse);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(new JLabel("Mode d'Affichage : "));
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(saisieModeAffichage);
+		commandes.add(Box.createVerticalGlue());
+		commandes.add(listeStat);
+		saisieUniteComptage.setAlignmentX(0);
+		legendeTypeUnite.setAlignmentX(0);
+		saisieAxeOrdonnee.setAlignmentX(0);
+		saisieAxeAbscisse.setAlignmentX(0);
+		saisieModeAffichage.setAlignmentX(0);
+		
+		JScrollPane scrollcommandes = new JScrollPane(commandes);
+		graphique = Courbe.courbeFactory();
+		JScrollPane scrollcourbe = new JScrollPane(graphique);
+		JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scrollcommandes, scrollcourbe);
+		split.setDividerLocation(1. / 2);
+		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);
+		;
+		csvMenu.add(new GAction("Exporter les données de filtrage") {
+			
+			@Override
+			public void executer() {
+				ArrayList<Object[]> donnees = new ArrayList<>();
+				donnees.add(new Object[] { "Unité", "type d'unité" });
+				for (String typeUnit : vue.getTypesUnitesAVoir()) {
+					if (!typesChainesMasques.contains(typeUnit)) {
+						for (Unite unit : vue.getUnites(typeUnit)) {
+							donnees.add(new Object[] { vue.getTexteUnite(unit), unit.getType() });
+						}
+					}
+				}
+				ExportCSV.exporterCSV(donnees.toArray(new Object[donnees.size()][2]));
+			}
+		});
+		csvMenu.add(new GAction("Exporter les statiques générales") {
+			
+			@Override
+			public void executer() {
+				ExportCSV.exporterCSV(donneesGenerales);
+			}
+		});
+		getContentPane().add(split);
+		setVisible(true);
+		// Fermeture de la fenêtre
+		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+		addWindowListener(new WindowAdapter() {
+			
+			@Override
+			public void windowClosing(WindowEvent evt) {
+				fermerFenetre();
+			}
+		});
+		donneesChaines = new ModeleChaines(vue, new GChaines(this));
+		donneesChaines.permettreaffichage(false);
+		saisieUniteComptage.setModele(new String[] { "Mots", "Caractère" });
+		saisieAxeAbscisse.setModele(StatPossiblesAbscisses);
+		saisieModeAffichage.setModele(ModesPossibles);
+	}
+	
+	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 {
+			if (evt.getSource().equals(saisieUniteComptage)) {
+				if (vue.getTypesUnitesAVoir() == null || saisieUniteComptage.pasdeSelection()) {
+					initVide();
+				}
+				else {
+					init();
+				}
+				return;
+			}
+			if (evt.getSource().equals(saisieAxeOrdonnee)) {
+				if (!saisieAxeAbscisse.pasdeSelection() && !saisieAxeOrdonnee.pasdeSelection()) {
+					affichercourbe();
+				}
+				return;
+			}
+			if (evt.getSource().equals(saisieAxeAbscisse)) {
+				if (!saisieUniteComptage.pasdeSelection()) {
+					initChampOrdonnee();
+				}
+				return;
+			}
+			if (evt.getSource().equals(saisieModeAffichage)) {
+				if (!saisieAxeAbscisse.pasdeSelection() && !saisieAxeOrdonnee.pasdeSelection()) {
+					affichercourbe();
+				}
+				return;
+			}
+			throw new UnsupportedOperationException("Evénement non prévu : " + evt.paramString());
+		}
+		catch (Throwable ex) {
+			GMessages.erreurFatale(ex);
+		}
+	}
+	
+	private void initTypeUnite() {
+		String[] legende = new String[typesChainesAffiches.length];
+		for (int i = 0; i < typesChainesAffiches.length; i++) {
+			if (typesChainesMasques.contains(typesChainesAffiches[i])) {
+				legende[i] = "" + typesChainesAffiches[i].toString() + "     Non";
+			}
+			else {
+				legende[i] = "" + typesChainesAffiches[i].toString() + "     Oui";
+			}
+		}
+		legendeTypeUnite.setListData(legende);
+	}
+	
+	private void popupChampInit(final int index) {
+		final boolean masquee;
+		masquee = typesChainesMasques.contains(typesChainesAffiches[index]);
+		popupChamp.removeAll();
+		popupChamp.add(new GAction(masquee ? "Montrer ce type d'unité" : "Masquer ce type d'unité") {
+			
+			@Override
+			public void executer() {
+				modifierStatutValChampType(masquee, index, false);
+			}
+		});
+		popupChamp.add(new GAction(masquee ? "Montrer tous les types" : "Ne montrer que ce type d'unité") {
+			
+			@Override
+			public void executer() {
+				modifierStatutValChampType(masquee, index, true);
+			}
+		});
+		
+	}
+	
+	private void modifierStatutValChampType(boolean masquee, int index, boolean tous) {
+		if (!tous) {
+			if (masquee) {
+				typesChainesMasques.remove(typesChainesAffiches[index]);
+			}
+			else {
+				typesChainesMasques.add(typesChainesAffiches[index]);
+			}
+		}
+		else if (masquee) {
+			typesChainesMasques.clear();
+		}
+		else {
+			typesChainesMasques.clear();
+			for (String valeur : typesChainesAffiches) {
+				if (!valeur.equals(typesChainesAffiches[index])) {
+					typesChainesMasques.add(valeur);
+				}
+			}
+			
+		}
+		afficherCalculs();
+		if (!saisieAxeAbscisse.pasdeSelection() && !saisieAxeOrdonnee.pasdeSelection()) {
+			affichercourbe();
+		}
+	}
+	
+	private void initVide() {
+		listeStat.removeAll();
+		saisieAxeOrdonnee.setModeleVide();
+		legendeTypeUnite.setListData(new String[0]);
+	}
+	
+	private String[] getTypesAutorises() {
+		String[] retour;
+		if (typesChainesAffiches.length - typesChainesMasques.size() > 0) {
+			retour = new String[typesChainesAffiches.length - typesChainesMasques.size()];
+			int compte = 0;
+			for (String type : typesChainesAffiches) {
+				if (!typesChainesMasques.contains(type)) {
+					retour[compte] = type;
+					compte = compte + 1;
+				}
+			}
+		}
+		else {
+			retour = new String[typesChainesAffiches.length];
+			int compte = 0;
+			for (String type : typesChainesAffiches) {
+				retour[compte] = type;
+				compte = compte + 1;
+			}
+		}
+		return retour;
+	}
+	
+	private void init() {
+		typesChainesAffiches = vue.getTypesUnitesAVoir();
+		saisieAxeAbscisse.setModele(StatPossiblesAbscisses);
+		initChampOrdonnee();
+		afficherCalculs();
+		
+	}
+	
+	private void afficherCalculs() {
+		initTypeUnite();
+		String unite = saisieUniteComptage.getSelection();
+		listeStat.removeAll();
+		this.donneesGenerales = new Object[20][2];
+		int donnee;
+		float donneef;
+		String[] typesDispo = getTypesAutorises();
+		listeStat.add(Box.createVerticalGlue());
+		donnee = ChaineUtil.nbCaractere(vue);
+		listeStat.add(new JLabel("Nombre de Caractères : " + donnee));
+		this.donneesGenerales[0][0] = "Nombre de Caractères";
+		this.donneesGenerales[0][1] = donnee;
+		listeStat.add(Box.createVerticalGlue());
+		donnee = ChaineUtil.nbMot(vue);
+		listeStat.add(new JLabel("Nombre de Mots : " + donnee));
+		this.donneesGenerales[1][0] = "Nombre de Mots";
+		this.donneesGenerales[1][1] = donnee;
+		listeStat.add(Box.createVerticalGlue());
+		donnee = ChaineUtil.nbParagraphe(vue);
+		listeStat.add(new JLabel("Nombre de Paragraphes : " + donnee));
+		this.donneesGenerales[2][0] = "Nombre de Paragraphes";
+		this.donneesGenerales[2][1] = donnee;
+		listeStat.add(Box.createVerticalGlue());
+		donnee = ChaineUtil.getUniteesTrieesEtFiltrees(typesDispo, vue).length;
+		listeStat.add(new JLabel("Nombre d'unités : " + donnee));
+		this.donneesGenerales[3][0] = "Nombre d'unités";
+		this.donneesGenerales[3][1] = donnee;
+		listeStat.add(Box.createVerticalGlue());
+		donnee = ChaineUtil.nombreDeReference(typesDispo, vue);
+		listeStat.add(new JLabel("Nombre de Références : " + donnee));
+		this.donneesGenerales[4][0] = "Nombre de Références";
+		this.donneesGenerales[4][1] = donnee;
+		listeStat.add(Box.createVerticalGlue());
+		donnee = ChaineUtil.nbChaines(vue);
+		listeStat.add(new JLabel("Nombre de Chaines : " + donnee));
+		this.donneesGenerales[5][0] = "Nombre de Chaines";
+		this.donneesGenerales[5][1] = donnee;
+		listeStat.add(Box.createVerticalGlue());
+		Integer[] tmp = ChaineUtil.nombreDeChainons(typesDispo, vue).toArray(new Integer[0]);
+		donneef = ChaineUtil.Esperance(tmp);
+		listeStat.add(new JLabel("Nombre moyen de Chainons par Chaine : " + donneef));
+		this.donneesGenerales[6][0] = "Nombre moyen de Chainons par Chaine";
+		this.donneesGenerales[6][1] = donneef;
+		listeStat.add(Box.createVerticalGlue());
+		donneef = ChaineUtil.Variance(tmp);
+		listeStat.add(new JLabel("Variance du Nombre de Chainons par Chaine : " + donneef));
+		this.donneesGenerales[7][0] = "Variance du Nombre de Chainons par Chaine";
+		this.donneesGenerales[7][1] = donneef;
+		listeStat.add(Box.createVerticalGlue());
+		donneef = ChaineUtil.densiteReferentielle("Paragraphe", typesDispo, vue);
+		listeStat.add(new JLabel("Densité référentielle par paragraphe : " + donneef));
+		this.donneesGenerales[8][0] = "Densité référentielle par paragraphe";
+		this.donneesGenerales[8][1] = donneef;
+		listeStat.add(Box.createVerticalGlue());
+		switch (unite) {
+			case "Mots":
+				donneef = ChaineUtil.densiteReferentielle("Mot", typesDispo, vue);
+				listeStat.add(new JLabel("Densité référentielle par nombre de mots : " + donneef));
+				this.donneesGenerales[9][0] = "Densité référentielle par nombre de mots";
+				this.donneesGenerales[9][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				tmp = ChaineUtil.positionUnite(typesDispo, vue).toArray(new Integer[0]);
+				// ici la position moyenne est calculé en caractère puis convertit en mots pour plus de précisions
+				donneef = ChaineUtil.calculerPositionMotCorpus(Math.round(ChaineUtil.Esperance(tmp)), vue);
+				listeStat.add(new JLabel("Position moyenne des unités : " + donneef));
+				this.donneesGenerales[10][0] = "Position moyenne des unités";
+				this.donneesGenerales[10][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				tmp = ChaineUtil.positionUniteEnMot(typesDispo, vue).toArray(new Integer[0]);
+				donneef = ChaineUtil.Variance(tmp);
+				listeStat.add(new JLabel("Variance des positions des unités : " + donneef));
+				this.donneesGenerales[11][0] = "Variance des positions des unités";
+				this.donneesGenerales[11][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				tmp = ChaineUtil.ecartUniteMot(typesDispo, vue).toArray(new Integer[0]);
+				donneef = ChaineUtil.Esperance(tmp);
+				listeStat.add(new JLabel("Ecart moyen entre les unités : " + donneef));
+				this.donneesGenerales[12][0] = "Ecart moyen entre les unités";
+				this.donneesGenerales[12][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				donneef = ChaineUtil.Variance(tmp);
+				listeStat.add(new JLabel("Variance des écarts des unités : " + donneef));
+				this.donneesGenerales[13][0] = "Variance des écarts des unités";
+				this.donneesGenerales[13][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				tmp = ChaineUtil.longueurUniteMot(typesDispo, vue).toArray(new Integer[0]);
+				donnee = ChaineUtil.somme(tmp);
+				listeStat.add(new JLabel("Longueur totale des unités : " + donnee));
+				this.donneesGenerales[14][0] = "Nombre de Mots";
+				this.donneesGenerales[14][1] = donnee;
+				listeStat.add(Box.createVerticalGlue());
+				donneef = ChaineUtil.Esperance(tmp);
+				listeStat.add(new JLabel("Longueur moyenne des unités : " + donneef));
+				this.donneesGenerales[15][0] = "Longueur moyenne des unités";
+				this.donneesGenerales[15][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				donneef = ChaineUtil.Variance(tmp);
+				listeStat.add(new JLabel("Variance des longueurs des unités : " + donneef));
+				this.donneesGenerales[16][0] = "Variance des longueurs des unités";
+				this.donneesGenerales[16][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				tmp = ChaineUtil.longueurChaineMot(typesDispo, vue).toArray(new Integer[0]);
+				donnee = ChaineUtil.somme(tmp);
+				listeStat.add(new JLabel("Longueur totale des chaines de coréférences : " + donnee));
+				this.donneesGenerales[17][0] = "Longueur totale des chaines de coréférences";
+				this.donneesGenerales[17][1] = donnee;
+				listeStat.add(Box.createVerticalGlue());
+				donneef = ChaineUtil.Esperance(tmp);
+				listeStat.add(new JLabel("Longueur moyenne des chaines de coréférences : " + donneef));
+				this.donneesGenerales[18][0] = "Nombre de Mots";
+				this.donneesGenerales[18][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				donneef = ChaineUtil.Variance(tmp);
+				listeStat.add(new JLabel("Variance des longueurs des chaines de coréférences : " + donneef));
+				this.donneesGenerales[19][0] = "Variance des longueurs des chaines de coréférences";
+				this.donneesGenerales[19][1] = donneef;
+				
+				
+				break;
+			case "Caractère":
+				donneef = ChaineUtil.densiteReferentielle("Caractère", typesDispo, vue);
+				listeStat.add(new JLabel("Densité référentielle par nombre de caractères : " + donneef));
+				this.donneesGenerales[9][0] = "Densité référentielle par nombre de caractères";
+				this.donneesGenerales[9][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				tmp = ChaineUtil.positionUnite(typesDispo, vue).toArray(new Integer[0]);
+				donneef = ChaineUtil.Esperance(tmp);
+				listeStat.add(new JLabel("Position moyenne des unités : " + donneef));
+				this.donneesGenerales[10][0] = "Position moyenne des unités";
+				this.donneesGenerales[10][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				donneef = ChaineUtil.Variance(tmp);
+				listeStat.add(new JLabel("Variance des positions des unités : " + donneef));
+				this.donneesGenerales[11][0] = "Variance des positions des unités";
+				this.donneesGenerales[11][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				tmp = ChaineUtil.ecartUniteCaractere(typesDispo, vue).toArray(new Integer[0]);
+				donneef = ChaineUtil.Esperance(tmp);
+				listeStat.add(new JLabel("Ecart moyen entre les unités : " + donneef));
+				this.donneesGenerales[12][0] = "Ecart moyen entre les unités";
+				this.donneesGenerales[12][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				donneef = ChaineUtil.Variance(tmp);
+				listeStat.add(new JLabel("Variance des écarts des unités : " + donneef));
+				this.donneesGenerales[13][0] = "Variance des écarts des unités";
+				this.donneesGenerales[13][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				tmp = ChaineUtil.longueurUniteCaractere(typesDispo, vue).toArray(new Integer[0]);
+				donnee = ChaineUtil.somme(tmp);
+				listeStat.add(new JLabel("Longueur totale des unités : " + donnee));
+				this.donneesGenerales[14][0] = "Longueur totale des unités";
+				this.donneesGenerales[14][1] = donnee;
+				listeStat.add(Box.createVerticalGlue());
+				donneef = ChaineUtil.Esperance(tmp);
+				listeStat.add(new JLabel("Longueur moyenne des unités : " + donneef));
+				this.donneesGenerales[15][0] = "Longueur moyenne des unités";
+				this.donneesGenerales[15][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				donneef = ChaineUtil.Variance(tmp);
+				listeStat.add(new JLabel("Variance des longueurs des unités : " + donneef));
+				this.donneesGenerales[16][0] = "Variance des longueurs des unités";
+				this.donneesGenerales[16][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				tmp = ChaineUtil.longueurChaineCaractere(typesDispo, vue).toArray(new Integer[0]);
+				donnee = ChaineUtil.somme(tmp);
+				listeStat.add(new JLabel("Longueur totale des chaines de coréférences : " + donnee));
+				this.donneesGenerales[17][0] = "Longueur totale des chaines de coréférences";
+				this.donneesGenerales[17][1] = donnee;
+				listeStat.add(Box.createVerticalGlue());
+				donneef = ChaineUtil.Esperance(tmp);
+				listeStat.add(new JLabel("Longueur moyenne des chaines de coréférences : " + donneef));
+				this.donneesGenerales[18][0] = "Longueur moyenne des chaines de coréférences";
+				this.donneesGenerales[18][1] = donneef;
+				listeStat.add(Box.createVerticalGlue());
+				donneef = ChaineUtil.Variance(tmp);
+				listeStat.add(new JLabel("Variance des longueurs des chaines de coréférences : " + donneef));
+				this.donneesGenerales[19][0] = "Variance des longueurs des chaines de coréférences";
+				this.donneesGenerales[19][1] = donneef;
+				break;
+			default:
+				break;
+		}
+	}
+	
+	private void initChampOrdonnee() {
+		if (!saisieAxeAbscisse.pasdeSelection()) {
+			switch (saisieAxeAbscisse.getSelection()) {
+				case "Nombre de chainons":
+					StatPossiblesOrdonnees = new String[] { "Nombre de Chaines de coreference" };
+					break;
+				case "Numéro de paragraphe":
+					StatPossiblesOrdonnees = new String[] { "Nombre de chainons", "Nombre de Chaines de coreference",
+							"ratio nombre de chainons par nombre de " + saisieUniteComptage.getSelection(), "Densité référentielle" };
+					break;
+				default:
+					StatPossiblesOrdonnees = new String[] {};
+					break;
+			}
+		}
+		else {
+			StatPossiblesOrdonnees = new String[] {};
+		}
+		saisieAxeOrdonnee.setModele(StatPossiblesOrdonnees);
+	}
+	
+	private void affichercourbe() {
+		switch (saisieAxeAbscisse.getSelection()) {
+			case "Nombre de chainons":
+				switch (saisieAxeOrdonnee.getSelection()) {
+					case "Nombre de Chaines de coreference":
+						HashMap donnee = ChaineUtil.calculerdonneecourbechainons(getTypesAutorises(), vue);
+						afficherNbChainesEnFonctionNbChainons(donnee);
+						break;
+				}
+				;
+				break;
+			case "Numéro de paragraphe":
+				HashMap donnee = ChaineUtil.calculedonneecourbe(getTypesAutorises(), saisieUniteComptage.getSelection(), vue);
+				switch (saisieAxeOrdonnee.getSelection()) {
+					case "Nombre de Chaines de coreference":
+						afficherEnFonctionParagraphe(donnee);
+						break;
+					case "Nombre de chainons":
+						afficherEnFonctionParagraphe(donnee);
+						break;
+					case "ratio nombre de chainons par nombre de " + "Mots":
+						afficherEnFonctionParagraphe(donnee);
+						break;
+					case "ratio nombre de chainons par nombre de " + "Caractère":
+						afficherEnFonctionParagraphe(donnee);
+						break;
+					case "Densité référentielle":
+						afficherEnFonctionParagraphe(donnee);
+						break;
+				}
+				;
+				break;
+			default:
+				break;
+		}
+	}
+	
+	
+	private void afficherEnFonctionParagraphe(HashMap<Integer, HashMap<String, Integer>> donnees) {
+		ArrayList<Integer> classement = new ArrayList<>();
+		ArrayList<Integer> ordonnee = new ArrayList<>();
+		for (Integer nopa : donnees.keySet()) {
+			classement.add(nopa, nopa);
+			ordonnee.add(nopa, donnees.get(nopa).get(saisieAxeOrdonnee.getSelection()));
+			
+		}
+		if (!saisieModeAffichage.pasdeSelection() && saisieModeAffichage.getSelection() == "Désactiver l'affichage des valeurs nulles") {
+			for (int nopa = 0; nopa < ordonnee.size(); nopa++) {
+				if (nopa != 0 && nopa < ordonnee.size() - 1 && ordonnee.get(nopa) == 0) {
+					classement.remove(nopa);
+					ordonnee.remove(nopa);
+					nopa = nopa - 1;
+				}
+			}
+			
+		}
+		
+		if (!saisieModeAffichage.pasdeSelection() && saisieModeAffichage.getSelection() == "Activer l'interpolation") {
+			ArrayList<Integer> valeurlagrange = new ArrayList<>();
+			for (int i = 0; i < classement.size(); i++) {
+				valeurlagrange.add(i, ChaineUtil.interpolationLagrangienne(classement.toArray(new Integer[0]),
+						ordonnee.toArray(new Integer[0]), i));
+			}
+			ordonnee = valeurlagrange;
+		}
+		Courbe.updatePanel(graphique, "Représentation de " + saisieAxeOrdonnee.getSelection() + " en fonction du numéro pararaphe",
+				classement.toArray(new Integer[0]), ordonnee.toArray(new Integer[0]),
+				Color.blue, -1, "numéro pararaphe", saisieAxeOrdonnee.getSelection());
+	}
+	
+	
+	
+	private void afficherNbChainesEnFonctionNbChainons(HashMap<Integer, Integer> donnees) {
+		int max = 0;// on cherche l'abscisse maximum
+		for (Integer elt : donnees.keySet()) {
+			if (elt > max) {
+				max = elt;
+			}
+		}
+		ArrayList<Integer> abscisse;
+		ArrayList<Integer> ordonnee;
+		
+		if (saisieModeAffichage.pasdeSelection() || saisieModeAffichage.getSelection() != "Activer l'interpolation") {
+			abscisse = new ArrayList<>();
+			ordonnee = new ArrayList<>();
+			for (int i = 0; i < max + 1; i++) {
+				abscisse.add(i, i);
+				if (donnees.containsKey(i)) {
+					ordonnee.add(i, donnees.get(i));
+				}
+				else {
+					ordonnee.add(i, 0);
+				}
+			}
+			if (!saisieModeAffichage.pasdeSelection() && saisieModeAffichage.getSelection().equals("Désactiver l'affichage des valeurs nulles")) {
+				for (int nopa = 0; nopa < ordonnee.size(); nopa++) {
+					if (nopa != 0 && nopa < ordonnee.size() - 1 && ordonnee.get(nopa) == 0) {
+						abscisse.remove(nopa);
+						ordonnee.remove(nopa);
+						nopa = nopa - 1;
+					}
+				}
+				
+			}
+		}
+		else {
+			Integer[] abscisses = new Integer[donnees.size()];
+			Integer[] ordonnees = new Integer[donnees.size()];
+			int compteur = 0;
+			for (int i = 0; i < max + 1; i++) {
+				
+				if (donnees.containsKey(i)) {
+					abscisses[compteur] = i;
+					ordonnees[compteur] = donnees.get(i);
+					compteur = compteur + 1;
+				}
+			}
+			abscisse = new ArrayList<>();
+			ordonnee = new ArrayList<>();
+			for (int i = 0; i < max + 1; i++) {
+				abscisse.add(i, i);
+				ordonnee.add(i, ChaineUtil.interpolationLagrangienne(abscisses, ordonnees, i));
+			}
+		}
+		Courbe.updatePanel(graphique, "Représentation de " + "nombre de chaines" + " en fonction du nombre de chainons",
+				abscisse.toArray(new Integer[0]), ordonnee.toArray(new Integer[0]),
+				Color.blue, -1, "numéro pararaphe", saisieAxeOrdonnee.getSelection());
+	}
+	
+	private void importerAffichage() {
+		HashMap<String, Object> Choix = FichiersJava.ouvrirChaineVue();
+		if (Choix != null && Choix.containsKey("choixCommande3") &&
+				Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC).equals(Choix.get("nomFichier"))) {
+			HashMap<String, String> choixCommande = (HashMap<String, String>) Choix.get("choixCommande3");
+			saisieUniteComptage.removeActionListener(this);
+			saisieUniteComptage.setSelectedItem(choixCommande.get("saisieUniteComptage"));
+			saisieUniteComptage.addActionListener(this);
+			if (vue.getTypesUnitesAVoir() == null || saisieUniteComptage.pasdeSelection()) {
+				initVide();
+			}
+			else {
+				init();
+			}
+			this.typesChainesMasques = (HashSet<String>) Choix.get("typesChainesMasques");
+			saisieAxeOrdonnee.removeActionListener(this);
+			saisieAxeAbscisse.removeActionListener(this);
+			saisieModeAffichage.removeActionListener(this);
+			
+			
+			saisieAxeAbscisse.setSelectedItem(choixCommande.get("saisieAxeAbscisse"));
+			initChampOrdonnee();
+			saisieAxeOrdonnee.setSelectedItem(choixCommande.get("saisieAxeOrdonnee"));
+			saisieModeAffichage.setSelectedItem(choixCommande.get("saisieModeAffichage"));
+			saisieAxeOrdonnee.addActionListener(this);
+			saisieAxeAbscisse.addActionListener(this);
+			saisieModeAffichage.addActionListener(this);
+			affichercourbe();
+		}
+		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);
+		}
+		
+		
+	}
+	
+	private void exporterAffichage() {
+		
+		HashMap<String, Object> Choix = new HashMap();
+		HashMap<String, String> choixCommande = new HashMap();
+		
+		choixCommande.put("saisieUniteComptage", saisieUniteComptage.pasdeSelection() ? null : saisieUniteComptage.getSelection());
+		choixCommande.put("saisieAxeOrdonnee", saisieAxeOrdonnee.pasdeSelection() ? null : saisieAxeOrdonnee.getSelection());
+		choixCommande.put("saisieAxeAbscisse", saisieAxeAbscisse.pasdeSelection() ? null : saisieAxeAbscisse.getSelection());
+		choixCommande.put("saisieModeAffichage", saisieModeAffichage.pasdeSelection() ? null : saisieModeAffichage.getSelection());
+		Choix.put("typesChainesMasques", typesChainesMasques);
+		Choix.put("choixCommande3", choixCommande);
+		Choix.put("nomFichier", Fichiers.getNomFichierCourant(Fichiers.TypeFichier.DOC_ANALEC));
+		FichiersJava.enregistrerChaineSous(Choix);
+	}
+	
+	/* renvoie un tableau contenant les statistiques générales du texte */
+	public Object[][] donneesCSV() {
+		return this.donneesGenerales;
+	}
+	
 }
Index: tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ModeleStatChaine.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ModeleStatChaine.java	(revision 3077)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/chaines/ModeleStatChaine.java	(revision 3078)
@@ -5,6 +5,7 @@
  */
 
 package visuAnalec.chaines;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -12,213 +13,220 @@
 import visuAnalec.elements.Schema;
 import visuAnalec.elements.Unite;
 import visuAnalec.vue.Vue;
+
 /**
  *
  * @author Marc
  */
-public class ModeleStatChaine extends AbstractTableModel{
-
-    private Object[][] donnees;
-    private String[] entetes= new String[]{"Trigramme","Nombre d'occurences","Fréquence","Position moyenne"};
-    	@Override
+public class ModeleStatChaine extends AbstractTableModel {
+	
+	private Object[][] donnees;
+	
+	private String[] entetes = new String[] { "Trigramme", "Nombre d'occurences", "Fréquence", "Position moyenne" };
+	
+	@Override
 	public int getColumnCount() {
 		return entetes.length;
-        }
-        @Override
+	}
+	
+	@Override
 	public String getColumnName(int columnIndex) {
 		return entetes[columnIndex];
 	}
-        public ModeleStatChaine(Object[][] donnees,String[] titres){
-            this.donnees = donnees;
-            this.entetes= titres;
-        }
-        public ModeleStatChaine(){
-            this.donnees = new Object[0][0];
-            this.entetes = new String[0];
-        }
-        public int getRowCount() {
+	
+	public ModeleStatChaine(Object[][] donnees, String[] titres) {
+		this.donnees = donnees;
+		this.entetes = titres;
+	}
+	
+	public ModeleStatChaine() {
+		this.donnees = new Object[0][0];
+		this.entetes = new String[0];
+	}
+	
+	@Override
+	public int getRowCount() {
 		return donnees.length;
 	}
-
+	
 	@Override
 	public Object getValueAt(int rowIndex, int columnIndex) {
 		return donnees[rowIndex][columnIndex];
 	}
-        @Override
-        public Class getColumnClass(int columnIndex){
-            switch(columnIndex){
-                    case 0:
-                            return String.class;
-                    default:
-                            return Float.class;
-            }
-        }
-        
-        public HashMap<Object,HashMap<Object,Float>> conversionNbOccurencesToFrequence(
-                HashMap<Object,HashMap<Object,Float>> donnees){
-            float sommepartielle;
-            for(Object val : donnees.keySet()){
-                sommepartielle = 0.0f;
-                for(Object val1 : donnees.get(val).keySet()){
-                    sommepartielle = sommepartielle + (donnees.get(val)).get(val1);
-                }
-                for(Object val1 : donnees.get(val).keySet()){
-                    (donnees.get(val)).put(val1,(sommepartielle!=0.0f ?
-                            (donnees.get(val)).get(val1)*10000.0f/sommepartielle/100.0f : 0.0f));
-                }
-            }
-            return donnees;
-        }
-        
-        public void getTableau(HashMap<Object,HashMap<Object,Float>> donnees,int nbcolonnes,String observation){
-            Object[][] resultat = new Object[donnees.size()][nbcolonnes+2];
-            String[] titre = new String[nbcolonnes+2];
-            int i = 0;
-            HashMap<Object,Integer> idcolonnes = new HashMap();
-            donnees = conversionNbOccurencesToFrequence(donnees);
-            titre[0]=observation;
-            //on choisit les colonnes des valeurs
-            //grossier
-            for(Object val : donnees.keySet()){
-                i = 0;
-                for(Object val1 : donnees.get(val).keySet()){
-                    titre[i+1] = val1.toString();
-                    idcolonnes.put(val1,i+1);
-                    i = i + 1;
-                }
-            }
-            i=0;
-            for(Object val : donnees.keySet()){
-                //on écrit l'objet surlequel porte l'observation
-                resultat[i][0]=val;
-                for(Object val1 : donnees.get(val).keySet()){
-                    resultat[i][idcolonnes.get(val1)] = (donnees.get(val)).get(val1);
-                }
-                i = i + 1;
-            }
-            this.entetes = titre;
-            this.donnees = resultat;
-            
-        }
-        
-        //@require : typeChampLigne n'a aucune case nulle, typeUnite et typeChaine sont non-null
-        // typeChampColonne est défini 
-        //génère un modèle pour un tableau en comptant le nombre d'occurrence de la valeur du champ en tête de
-        //colonne par par valeur du ou des champs en tête de ligne
-        public static ModeleStatChaine calculateStatCoref(String nomChampChaine ,
-                String nomChampUnite, Collection<String> valeurChaineCachees,
-                String typeChampColonne, String[] typeChampLigne, Vue vue, ModeleChaines donneesChaine,
-                ArrayList paragrapheCaches, String typeChaine, String typeUnite, String[] valNbElements){
-            HashMap<Object,HashMap<Object,Float>> retour = new HashMap();
-            Unite[] listeUnites = donneesChaine.getUnites();
-            int[] noparag = (vue.getCorpus()).calculerNoParagraphe(listeUnites);
-            
-            //on créé une ligne par défaut
-            HashMap defaultLine = new HashMap();
-        switch (typeChampColonne) {
-            case "Chaine":
-                //un champ de la chaine ne peut pas être nul
-                for(String val : vue.getValeursChamp(Schema.class, typeChaine, nomChampChaine)){
-                    defaultLine.put(val, 0.0f);
-                }
-                defaultLine.put("Aucune valeur",0.0f);
-                break;
-            case "Unite":
-                for(String val : (nomChampUnite == null ? valNbElements
-                        : vue.getValeursChamp(Unite.class, typeUnite, nomChampUnite))){
-                    defaultLine.put(val, 0.0f);
-                }
-                defaultLine.put("Aucune valeur",0.0f);
-                break;
-            default:
-                for(int val : noparag){
-                    defaultLine.put("  Paragraphe " + val, 0.0f);
-                }
-                break;
-        }
-            
-            
-            int numeroUnite = 0;
-            for(Unite unit : listeUnites){
-                Schema chaine = donneesChaine.getchainesUnitesNonFiltrees().get(unit);
-                
-                //on filtre les unités
-                String propUnite = ( nomChampUnite==null ? valNbElements
-                                    [donneesChaine.calculerValNbElements(
-                                            donneesChaine.getChainonUnites().get(unit).nbEltsChaine)]
-                                    : vue.getValeurChamp(unit, nomChampUnite));
-                
-                String propChaine = chaine==null ? null : (vue.getValeurChamp(chaine, nomChampChaine)) ;
-                
-                if(!paragrapheCaches.contains(noparag[numeroUnite]) && chaine!=null &&
-                        !(nomChampUnite==null ? donneesChaine.isMasqueeValNbElements(donneesChaine.
-                        calculerValNbElements(donneesChaine.getChainonUnites().get(unit).nbEltsChaine))
-                        : donneesChaine.isMasqueeValChamp(nomChampUnite, propUnite)) && 
-                        !valeurChaineCachees.contains(propChaine)){
-                    
-                    //on calcule la clé de la ligne sous forme de chaine de caractère
-                    String key1 = new String();
-                    for(int i = 0;i<typeChampLigne.length;i++){
-                        switch (typeChampLigne[i]) {
-                            case "Chaine": 
-                                key1 = key1 + "  " + (propChaine == null || propChaine.equals("")
-                                        ? "Aucune valeur" : propChaine);
-                                break;
-                            case "Unite":
-                                key1 = key1 + "  " + (propUnite == null || propUnite.equals("") ? 
-                                        "Aucune valeur" : propUnite);
-                                break;
-                            default:
-                                key1 = key1 + "  Paragraphe " + noparag[numeroUnite];
-                                break;
-                        }
-                    }
-                    //on cherche la clé de la colonne et on initialise les valeurs
-                    String key2 = new String();
-                    switch (typeChampColonne) {
-                        case "Chaine":
-                            key2 = key2 + (propChaine == null || propChaine.equals("")
-                                    ? "Aucune valeur" : propChaine);
-                            break;
-                        case "Unite": 
-                            key2 = key2 + (propUnite == null || propUnite.equals("")
-                                    ? "Aucune valeur" : propUnite);
-                            break;
-                        default:
-                            key2 = key2 + "  Paragraphe " + noparag[numeroUnite];
-                            break;
-                    }
-                    //on ajoute l'unité dans la table correspondante
-                    HashMap<Object,Float> ligne = (retour.containsKey(key1) ? retour.get(key1) :
-                            (HashMap<Object,Float>) defaultLine.clone());
-                    ligne.put(key2 , ligne.get(key2) + 1);
-                    retour.put(key1, ligne);   
-                }
-                numeroUnite++;
-            }
-            
-            String titreLigne = new String();
-            for(String type : typeChampLigne){
-                switch (type) {
-                    case "Chaine":
-                        titreLigne = titreLigne + "  Valeur Champ Chaine";
-                        break;
-                    case "Unite":
-                        titreLigne = titreLigne + "  Valeur Champ Unite";
-                        break;
-                    default:
-                        titreLigne = titreLigne + "  Numero Paragraphe";
-                        break;
-                }
-            }
-            ModeleStatChaine modele = new ModeleStatChaine();
-            modele.getTableau(retour,defaultLine.size(),titreLigne);
-            return modele;
-        }
-        
-    
-
-        
-        
-
+	
+	@Override
+	public Class getColumnClass(int columnIndex) {
+		switch (columnIndex) {
+			case 0:
+				return String.class;
+			default:
+				return Float.class;
+		}
+	}
+	
+	public HashMap<Object, HashMap<Object, Float>> conversionNbOccurencesToFrequence(
+			HashMap<Object, HashMap<Object, Float>> donnees) {
+		float sommepartielle;
+		for (Object val : donnees.keySet()) {
+			sommepartielle = 0.0f;
+			for (Object val1 : donnees.get(val).keySet()) {
+				sommepartielle = sommepartielle + (donnees.get(val)).get(val1);
+			}
+			for (Object val1 : donnees.get(val).keySet()) {
+				(donnees.get(val)).put(val1, (sommepartielle != 0.0f ? (donnees.get(val)).get(val1) * 10000.0f / sommepartielle / 100.0f : 0.0f));
+			}
+		}
+		return donnees;
+	}
+	
+	public void getTableau(HashMap<Object, HashMap<Object, Float>> donnees, int nbcolonnes, String observation) {
+		Object[][] resultat = new Object[donnees.size()][nbcolonnes + 2];
+		String[] titre = new String[nbcolonnes + 2];
+		int i = 0;
+		HashMap<Object, Integer> idcolonnes = new HashMap();
+		donnees = conversionNbOccurencesToFrequence(donnees);
+		titre[0] = observation;
+		// on choisit les colonnes des valeurs
+		// grossier
+		for (Object val : donnees.keySet()) {
+			i = 0;
+			for (Object val1 : donnees.get(val).keySet()) {
+				titre[i + 1] = val1.toString();
+				idcolonnes.put(val1, i + 1);
+				i = i + 1;
+			}
+		}
+		i = 0;
+		for (Object val : donnees.keySet()) {
+			// on écrit l'objet surlequel porte l'observation
+			resultat[i][0] = val;
+			for (Object val1 : donnees.get(val).keySet()) {
+				resultat[i][idcolonnes.get(val1)] = (donnees.get(val)).get(val1);
+			}
+			i = i + 1;
+		}
+		this.entetes = titre;
+		this.donnees = resultat;
+		
+	}
+	
+	// @require : typeChampLigne n'a aucune case nulle, typeUnite et typeChaine sont non-null
+	// typeChampColonne est défini
+	// génère un modèle pour un tableau en comptant le nombre d'occurrence de la valeur du champ en tête de
+	// colonne par par valeur du ou des champs en tête de ligne
+	public static ModeleStatChaine calculateStatCoref(String nomChampChaine,
+			String nomChampUnite, Collection<String> valeurChaineCachees,
+			String typeChampColonne, String[] typeChampLigne, Vue vue, ModeleChaines donneesChaine,
+			ArrayList paragrapheCaches, String typeChaine, String typeUnite, String[] valNbElements) {
+		HashMap<Object, HashMap<Object, Float>> retour = new HashMap<>();
+		Unite[] listeUnites = donneesChaine.getUnites();
+		int[] noparag = (vue.getCorpus()).calculerNoParagraphe(listeUnites);
+		
+		// on créé une ligne par défaut
+		HashMap<String, Float> defaultLine = new HashMap<>();
+		switch (typeChampColonne) {
+			case "Chaine":
+				// un champ de la chaine ne peut pas être nul
+				for (String val : vue.getValeursChamp(Schema.class, typeChaine, nomChampChaine)) {
+					defaultLine.put(val, 0.0f);
+				}
+				defaultLine.put("Aucune valeur", 0.0f);
+				break;
+			case "Unite":
+				for (String val : (nomChampUnite == null ? valNbElements
+						: vue.getValeursChamp(Unite.class, typeUnite, nomChampUnite))) {
+					defaultLine.put(val, 0.0f);
+				}
+				defaultLine.put("Aucune valeur", 0.0f);
+				break;
+			default:
+				for (int val : noparag) {
+					defaultLine.put("  Paragraphe " + val, 0.0f);
+				}
+				break;
+		}
+		
+		
+		int numeroUnite = 0;
+		for (Unite unit : listeUnites) {
+			Schema chaine = donneesChaine.getchainesUnitesNonFiltrees().get(unit);
+			
+			// on filtre les unités
+			String propUnite = (nomChampUnite == null ? valNbElements[donneesChaine.calculerValNbElements(
+					donneesChaine.getChainonUnites().get(unit).nbEltsChaine)]
+					: vue.getValeurChamp(unit, nomChampUnite));
+			
+			String propChaine = chaine == null ? null : (vue.getValeurChamp(chaine, nomChampChaine));
+			
+			if (!paragrapheCaches.contains(noparag[numeroUnite]) && chaine != null &&
+					!(nomChampUnite == null ? donneesChaine.isMasqueeValNbElements(donneesChaine.calculerValNbElements(donneesChaine.getChainonUnites().get(unit).nbEltsChaine))
+							: donneesChaine.isMasqueeValChamp(nomChampUnite, propUnite)) &&
+					!valeurChaineCachees.contains(propChaine)) {
+				
+				// on calcule la clé de la ligne sous forme de chaine de caractère
+				String key1 = new String();
+				for (int i = 0; i < typeChampLigne.length; i++) {
+					switch (typeChampLigne[i]) {
+						case "Chaine":
+							key1 = key1 + "  " + (propChaine == null || propChaine.equals("")
+									? "Aucune valeur"
+									: propChaine);
+							break;
+						case "Unite":
+							key1 = key1 + "  " + (propUnite == null || propUnite.equals("") ? "Aucune valeur" : propUnite);
+							break;
+						default:
+							key1 = key1 + "  Paragraphe " + noparag[numeroUnite];
+							break;
+					}
+				}
+				// on cherche la clé de la colonne et on initialise les valeurs
+				String key2 = new String();
+				switch (typeChampColonne) {
+					case "Chaine":
+						key2 = key2 + (propChaine == null || propChaine.equals("")
+								? "Aucune valeur"
+								: propChaine);
+						break;
+					case "Unite":
+						key2 = key2 + (propUnite == null || propUnite.equals("")
+								? "Aucune valeur"
+								: propUnite);
+						break;
+					default:
+						key2 = key2 + "  Paragraphe " + noparag[numeroUnite];
+						break;
+				}
+				// on ajoute l'unité dans la table correspondante
+				HashMap<Object, Float> ligne = (retour.containsKey(key1) ? retour.get(key1) : (HashMap<Object, Float>) defaultLine.clone());
+				ligne.put(key2, ligne.get(key2) + 1);
+				retour.put(key1, ligne);
+			}
+			numeroUnite++;
+		}
+		
+		String titreLigne = new String();
+		for (String type : typeChampLigne) {
+			switch (type) {
+				case "Chaine":
+					titreLigne = titreLigne + "  Valeur Champ Chaine";
+					break;
+				case "Unite":
+					titreLigne = titreLigne + "  Valeur Champ Unite";
+					break;
+				default:
+					titreLigne = titreLigne + "  Numero Paragraphe";
+					break;
+			}
+		}
+		ModeleStatChaine modele = new ModeleStatChaine();
+		modele.getTableau(retour, defaultLine.size(), titreLigne);
+		return modele;
+	}
+	
+	
+	
+	
+	
+	
 }
Index: tmp/org.txm.analec.rcp/src/visuAnalec/chaines/NgrammesModel.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/chaines/NgrammesModel.java	(revision 3077)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/chaines/NgrammesModel.java	(revision 3078)
@@ -18,337 +18,362 @@
  * @author marc
  */
 public class NgrammesModel {
-       public class ngramme{
-            private HashSet<Unite[]> unites;
-            private ArrayList<String> suivant;
-            private float frequence;
-            private float posmoyenne;
-            public HashSet<Unite[]> getUnites(){
-                return unites;
-            }
-            public int getnboccurences(){
-                return unites.size();
-            }
-            public float getfrequence(){
-                return frequence;
-            }
-            public float getposmoyenne(){
-                return posmoyenne;
-            }
-            public void setposmoyenne(){
-                float somme = 0.0f;
-                for(Unite[] unit : unites){
-                    somme = somme + unit[0].getDeb();
-                }
-                this.posmoyenne= somme / unites.size();
-            }
-            public void setfrequence(HashMap<String,ngramme> total){
-                int somme = 0;
-                for(String code : total.keySet()){
-                    somme = somme + total.get(code).getnboccurences();
-                }
-                this.frequence = this.unites.size() * 10000.0f / somme / 100.0f;
-            }
-            public void addUnites(Unite[] donnees){
-                this.unites.add(donnees);
-            }
-            public void addSuivant(String suivant){
-                this.suivant.add(suivant);
-            }
-            public ngramme(){
-                this.unites = new HashSet();
-                this.frequence = 0.0f;
-                this.posmoyenne = 0.0f;
-                this.suivant = new ArrayList();
-            }
-            public ngramme(HashSet<Unite[]> unites,ArrayList<String> suivant){
-                this.frequence = 0.0f;
-                this.unites = unites;
-                this.suivant = suivant;
-                setposmoyenne();
-            }
-       }
-       private HashMap<String,ngramme> collection;
-       public NgrammesModel(){
-           this.collection = new HashMap();
-       }
-       public NgrammesModel(HashMap<String,ngramme> collection){
-           this.collection = collection;
-       }
-       public void setallfrequence(){
-           for(String code : this.collection.keySet()){
-               this.collection.get(code).setfrequence(this.collection);
-           }
-       }
-       public void setallposmoyenne(){
-           for(String code : this.collection.keySet()){
-               this.collection.get(code).setposmoyenne();
-           }
-       }
-
-       
-    //@require : les unités doivent être classées par ordre d'apparition       
-       public void ngrammeUpdate(int nbLettre,HashMap<String,Character> legende
-               ,String champ,Vue vue,boolean glissant,ModeleChaines donnees,boolean singleton,String typeChamp,
-               boolean activeParagraphe){
-           
-           ArrayList<Character> suiteLettre = new ArrayList();
-           String ngrammeCourant;
-           Unite[] unites=donnees.getUnites();
-           HashMap<String,ngramme> collection = new HashMap();
-           HashMap<Unite,Integer> noparagraphe = ChaineUtil.unitenumeroparagraphe(unites,vue);
-           int pas;
-           //on définit le pas de boucle en fonction du choix de l'utilisateur (glissant ou pas glissant)
-           if(glissant){
-               pas = 1;
-           }
-           else{
-               pas  = nbLettre;
-           }
-           //on crée la chaîne de lettres
-           for(int i = 0; i < unites.length; 
-                   i++){
-                Schema chaine;
-                if(singleton || donnees.getSchemacontenantunite((donnees.getUnites())[i])!=null){
-                    switch(typeChamp){
-                        case "Chaine":
-                            chaine=donnees.getSchemacontenantunite(unites[i]);
-                            suiteLettre.add(chaine==null ? legende.get("singleton") : (legende.get(vue.getValeurChamp(
-                      chaine,champ)))==null ? legende.get("autre") : legende.get(vue.getValeurChamp(chaine,champ)));
-                            break;
-                        default :
-                            suiteLettre.add(legende.get(vue.getValeurChamp(
-                      unites[i],champ))==null ? legende.get("autre") : legende.get(vue.getValeurChamp(unites[i],champ)));
-                            break;
-                    }
-                    if(activeParagraphe && i < (unites.length - 1) && noparagraphe.get(unites[i])<noparagraphe.get(unites[i+1])){
-                        suiteLettre.add('0');
-                    }
-               }
-           }
-           //on retient le numéro d'unité qui va être lue
-           int numeroUnite=0;
-           //on parcours la chaîne pour créer les ngrammes
-           for(int i = 0; i < suiteLettre.size()-(nbLettre-1); i = i + pas){
-               ArrayList<Unite> ajout=new ArrayList();
-               ngrammeCourant="";
-               int nbUnite=0;
-               //on crée le code constitué de nbLettre lettres
-               for(int j = 0; j < nbLettre;j++){
-                   ngrammeCourant=ngrammeCourant+suiteLettre.get(j+i);
-                   //si ce n'est pas un saut de paragraphe alors on incrémente le numéro de l'unité qui va être lue
-                   if(!suiteLettre.get(j+i).equals('0')){
-                       ajout.add(unites[numeroUnite+nbUnite]);
-                       nbUnite++;
-                   }
-               }
-               //on crée le ngramme obtenu
-               if(!collection.containsKey(ngrammeCourant)){
-                   collection.put(ngrammeCourant,new ngramme());
-               }
-               (collection.get(ngrammeCourant)).addUnites(
-                       ajout.toArray(new Unite[0]));
-               //on recherche l'éventuel suivant
-               if(i < suiteLettre.size() - nbLettre){
-                   (collection.get(ngrammeCourant)).addSuivant(suiteLettre.get(i+nbLettre).toString());
-               }
-               //si la première lettre correspond à une unité et non un suat de paragraphe on incrémente numeroUnite
-               if(!suiteLettre.get(i).equals('0')){
-                   numeroUnite++;
-               }
-           }
-           this.collection = collection;
-           setallfrequence();
-           setallposmoyenne();
-       }
-
-
-       public HashMap<String,ngramme> getCollection(){
-           return this.collection;
-       }
-       public Object[][] gettableau(boolean[] ligneSup){
-           Object[][] donnees;
-           int nbRowSup=0;   
-           for(int i = 0;i<ligneSup.length;i++){  
-               if(ligneSup[i]){
-                    nbRowSup++;
-               }
-           }
-           donnees = new Object[collection.size() + nbRowSup][4]; 
-           
-           int compte = 0;
-           for(String unit : collection.keySet()){
-               donnees[compte][0] = unit ;
-               donnees[compte][1] = collection.get(unit).getnboccurences() ;
-               donnees[compte][2] = collection.get(unit).getfrequence() ;
-               donnees[compte][3] = collection.get(unit).getposmoyenne();
-               compte++;
-           }
-           if(collection.size()>0){
-                //on ajoute les éventuelles lignes supplémentaires
-                switch(this.collection.keySet().iterator().next().length()){
-                    //si on a des digrammes
-                    case 2 :
-                         if(ligneSup[0]){
-                             donnees[compte] = calculXX();   
-                             compte++;
-                         }
-                        break;
-                     //si on a des trigrammes
-                    case 3 :
-                         if(ligneSup[0]){
-                             donnees[compte] = calculXOX();
-                             compte++;
-                         }
-                         if(ligneSup[1]){
-                             donnees[compte] = calculXOY();
-                             compte++;
-                         }
-                         if(ligneSup[2]){
-                             donnees[compte] = calculXYZ();
-                             compte++;
-                         }
-                         if(ligneSup[3]){
-                             donnees[compte] = calculXXX();
-                             compte++;
-                         }           
-                        break;
-                    default :
-                        break;
-                }
-           }
-           return donnees;
-           
-       }
-       //@require : le ngrammes contient des digrammes
-       public Object[] calculXX(){
-           Object[] retour  = new Object[4];
-           Float frequencecumulee = 0.0f;
-           Float positionmoyenne = 0.0f;
-           Integer Nboccurences = 0;
-           for(String doubletcourant : this.collection.keySet()){
-               if(doubletcourant.charAt(0)==doubletcourant.charAt(1)){
-                   frequencecumulee = frequencecumulee + this.collection.get(doubletcourant).getfrequence();
-                   positionmoyenne = positionmoyenne + this.collection.get(doubletcourant).getnboccurences()
-                           * this.collection.get(doubletcourant).getposmoyenne();
-                   Nboccurences = Nboccurences + this.collection.get(doubletcourant).getnboccurences();
-               }
-           }
-           positionmoyenne = Math.round(100 * positionmoyenne / Nboccurences)/100.0f;
-           retour[0] = "xx";
-           retour[1] = Nboccurences;
-           retour[2] = frequencecumulee;
-           retour[3] = positionmoyenne;
-           return retour;
-       } 
-       
-       public String[] infoSuivant(String code){
-           HashMap<String,Integer> totaux = new HashMap();
-           //on recense les lettres suivants le ngramme identifié par "code"
-           for(String next : this.collection.get(code).suivant){
-               if(totaux.containsKey(next)){
-                   totaux.put(next, totaux.get(next) + 1);
-               }
-               else{
-                   totaux.put(next, 1);
-               }
-           }
-           String[] retour = new String[totaux.size()];
-           int i = 0;
-           //on calcule des statistiques
-           for(String next : totaux.keySet()){
-               retour[i] = code + next + "   Nombre d'occurences : " + totaux.get(next).toString() +
-                       "   Fréquence : " + (Math.round(100.0f * totaux.get(next) / this.collection.get(code).suivant.size())/100.0f);
-               i = i + 1;
-           }
-           return retour;
-       }    
-       //@require : le ngrammes contient des digrammes
-       public Object[] calculXOX(){
-           Object[] retour  = new Object[4];
-           Float frequencecumulee = 0.0f;
-           Float positionmoyenne = 0.0f;
-           Integer Nboccurences = 0;
-           for(String tripletcourant : this.collection.keySet()){
-               if(tripletcourant.charAt(0)==tripletcourant.charAt(2) && tripletcourant.charAt(1)=='0'){
-                   frequencecumulee = frequencecumulee + this.collection.get(tripletcourant).getfrequence();
-                   positionmoyenne = positionmoyenne + this.collection.get(tripletcourant).getnboccurences()
-                           * this.collection.get(tripletcourant).getposmoyenne();
-                   Nboccurences = Nboccurences + this.collection.get(tripletcourant).getnboccurences();
-               }
-           }
-           positionmoyenne = Math.round(100 * positionmoyenne / Nboccurences)/100.0f;
-           retour[0] = "x0x";
-           retour[1] = Nboccurences;
-           retour[2] = frequencecumulee;
-           retour[3] = positionmoyenne;
-           return retour;
-       }
-              //@require : le ngrammes contient des digrammes
-//on recherche les triplets séparés par des paragraphe au extrémités différentes
-       public Object[] calculXOY(){
-           Object[] retour  = new Object[4];
-           Float frequencecumulee = 0.0f;
-           Float positionmoyenne = 0.0f;
-           Integer Nboccurences = 0;
-           for(String tripletcourant : this.collection.keySet()){
-               if(tripletcourant.charAt(1)=='0' && tripletcourant.charAt(0)!=tripletcourant.charAt(2)){
-                   frequencecumulee = frequencecumulee + this.collection.get(tripletcourant).getfrequence();
-                   positionmoyenne = positionmoyenne + this.collection.get(tripletcourant).getnboccurences()
-                           * this.collection.get(tripletcourant).getposmoyenne();
-                   Nboccurences = Nboccurences + this.collection.get(tripletcourant).getnboccurences();
-               }
-           }
-           positionmoyenne = Math.round(100 * positionmoyenne / Nboccurences)/100.0f;
-           retour[0] = "x0y";
-           retour[1] = Nboccurences;
-           retour[2] = frequencecumulee;
-           retour[3] = positionmoyenne;
-           return retour;
-       } 
-              //@require : le ngrammes contient des digrammes
-        public Object[] calculXYZ(){
-           Object[] retour  = new Object[4];
-           Float frequencecumulee = 0.0f;
-           Float positionmoyenne = 0.0f;
-           Integer Nboccurences = 0;
-           for(String tripletcourant : this.collection.keySet()){
-               if(tripletcourant.charAt(1)!=tripletcourant.charAt(2) && tripletcourant.charAt(0)!=tripletcourant.charAt(1) &&
-                       tripletcourant.charAt(0)!=tripletcourant.charAt(2) && tripletcourant.charAt(1)!='0'){
-                   frequencecumulee = frequencecumulee + this.collection.get(tripletcourant).getfrequence();
-                   positionmoyenne = positionmoyenne + this.collection.get(tripletcourant).getnboccurences()
-                           * this.collection.get(tripletcourant).getposmoyenne();
-                   Nboccurences = Nboccurences + this.collection.get(tripletcourant).getnboccurences();
-               }
-           }
-           positionmoyenne = Math.round(100 * positionmoyenne / Nboccurences)/100.0f;
-           retour[0] = "xyz";
-           retour[1] = Nboccurences;
-           retour[2] = frequencecumulee;
-           retour[3] = positionmoyenne;
-           return retour;
-       }
-       //@require : le ngrammes contient des digrammes
-       public Object[] calculXXX(){
-           Object[] retour  = new Object[4];
-           Float frequencecumulee = 0.0f;
-           Float positionmoyenne = 0.0f;
-           Integer Nboccurences = 0;
-           for(String tripletcourant : this.collection.keySet()){
-               if(tripletcourant.charAt(1)==tripletcourant.charAt(2) && tripletcourant.charAt(0)==tripletcourant.charAt(1)){
-                   frequencecumulee = frequencecumulee + this.collection.get(tripletcourant).getfrequence();
-                   positionmoyenne = positionmoyenne + this.collection.get(tripletcourant).getnboccurences()
-                           * this.collection.get(tripletcourant).getposmoyenne();
-                   Nboccurences = Nboccurences + this.collection.get(tripletcourant).getnboccurences();
-               }
-           }
-           positionmoyenne = Math.round(100 * positionmoyenne / Nboccurences)/100.0f;
-           retour[0] = "xxx";
-           retour[1] = Nboccurences;
-           retour[2] = frequencecumulee;
-           retour[3] = positionmoyenne;
-           return retour;
-       }         
-    
-    
+	
+	public class ngramme {
+		
+		private HashSet<Unite[]> unites;
+		
+		private ArrayList<String> suivant;
+		
+		private float frequence;
+		
+		private float posmoyenne;
+		
+		public HashSet<Unite[]> getUnites() {
+			return unites;
+		}
+		
+		public int getnboccurences() {
+			return unites.size();
+		}
+		
+		public float getfrequence() {
+			return frequence;
+		}
+		
+		public float getposmoyenne() {
+			return posmoyenne;
+		}
+		
+		public void setposmoyenne() {
+			float somme = 0.0f;
+			for (Unite[] unit : unites) {
+				somme = somme + unit[0].getDeb();
+			}
+			this.posmoyenne = somme / unites.size();
+		}
+		
+		public void setfrequence(HashMap<String, ngramme> total) {
+			int somme = 0;
+			for (String code : total.keySet()) {
+				somme = somme + total.get(code).getnboccurences();
+			}
+			this.frequence = this.unites.size() * 10000.0f / somme / 100.0f;
+		}
+		
+		public void addUnites(Unite[] donnees) {
+			this.unites.add(donnees);
+		}
+		
+		public void addSuivant(String suivant) {
+			this.suivant.add(suivant);
+		}
+		
+		public ngramme() {
+			this.unites = new HashSet<>();
+			this.frequence = 0.0f;
+			this.posmoyenne = 0.0f;
+			this.suivant = new ArrayList<>();
+		}
+		
+		public ngramme(HashSet<Unite[]> unites, ArrayList<String> suivant) {
+			this.frequence = 0.0f;
+			this.unites = unites;
+			this.suivant = suivant;
+			setposmoyenne();
+		}
+	}
+	
+	private HashMap<String, ngramme> collection;
+	
+	public NgrammesModel() {
+		this.collection = new HashMap();
+	}
+	
+	public NgrammesModel(HashMap<String, ngramme> collection) {
+		this.collection = collection;
+	}
+	
+	public void setallfrequence() {
+		for (String code : this.collection.keySet()) {
+			this.collection.get(code).setfrequence(this.collection);
+		}
+	}
+	
+	public void setallposmoyenne() {
+		for (String code : this.collection.keySet()) {
+			this.collection.get(code).setposmoyenne();
+		}
+	}
+	
+	
+	// @require : les unités doivent être classées par ordre d'apparition
+	public void ngrammeUpdate(int nbLettre, HashMap<String, Character> legende, String champ, Vue vue, boolean glissant, ModeleChaines donnees, boolean singleton, String typeChamp,
+			boolean activeParagraphe) {
+		
+		ArrayList<Character> suiteLettre = new ArrayList<>();
+		String ngrammeCourant;
+		Unite[] unites = donnees.getUnites();
+		HashMap<String, ngramme> collection = new HashMap<>();
+		HashMap<Unite, Integer> noparagraphe = ChaineUtil.unitenumeroparagraphe(unites, vue);
+		int pas;
+		// on définit le pas de boucle en fonction du choix de l'utilisateur (glissant ou pas glissant)
+		if (glissant) {
+			pas = 1;
+		}
+		else {
+			pas = nbLettre;
+		}
+		// on crée la chaîne de lettres
+		for (int i = 0; i < unites.length; i++) {
+			Schema chaine;
+			if (singleton || donnees.getSchemacontenantunite((donnees.getUnites())[i]) != null) {
+				switch (typeChamp) {
+					case "Chaine":
+						chaine = donnees.getSchemacontenantunite(unites[i]);
+						suiteLettre.add(chaine == null ? legende.get("singleton")
+								: (legende.get(vue.getValeurChamp(
+										chaine, champ))) == null ? legende.get("autre") : legende.get(vue.getValeurChamp(chaine, champ)));
+						break;
+					default:
+						suiteLettre.add(legende.get(vue.getValeurChamp(
+								unites[i], champ)) == null ? legende.get("autre") : legende.get(vue.getValeurChamp(unites[i], champ)));
+						break;
+				}
+				if (activeParagraphe && i < (unites.length - 1) && noparagraphe.get(unites[i]) < noparagraphe.get(unites[i + 1])) {
+					suiteLettre.add('0');
+				}
+			}
+		}
+		// on retient le numéro d'unité qui va être lue
+		int numeroUnite = 0;
+		// on parcours la chaîne pour créer les ngrammes
+		for (int i = 0; i < suiteLettre.size() - (nbLettre - 1); i = i + pas) {
+			ArrayList<Unite> ajout = new ArrayList<>();
+			ngrammeCourant = "";
+			int nbUnite = 0;
+			// on crée le code constitué de nbLettre lettres
+			for (int j = 0; j < nbLettre; j++) {
+				ngrammeCourant = ngrammeCourant + suiteLettre.get(j + i);
+				// si ce n'est pas un saut de paragraphe alors on incrémente le numéro de l'unité qui va être lue
+				if (!suiteLettre.get(j + i).equals('0')) {
+					ajout.add(unites[numeroUnite + nbUnite]);
+					nbUnite++;
+				}
+			}
+			// on crée le ngramme obtenu
+			if (!collection.containsKey(ngrammeCourant)) {
+				collection.put(ngrammeCourant, new ngramme());
+			}
+			(collection.get(ngrammeCourant)).addUnites(
+					ajout.toArray(new Unite[0]));
+			// on recherche l'éventuel suivant
+			if (i < suiteLettre.size() - nbLettre) {
+				(collection.get(ngrammeCourant)).addSuivant(suiteLettre.get(i + nbLettre).toString());
+			}
+			// si la première lettre correspond à une unité et non un suat de paragraphe on incrémente numeroUnite
+			if (!suiteLettre.get(i).equals('0')) {
+				numeroUnite++;
+			}
+		}
+		this.collection = collection;
+		setallfrequence();
+		setallposmoyenne();
+	}
+	
+	
+	public HashMap<String, ngramme> getCollection() {
+		return this.collection;
+	}
+	
+	public Object[][] gettableau(boolean[] ligneSup) {
+		Object[][] donnees;
+		int nbRowSup = 0;
+		for (int i = 0; i < ligneSup.length; i++) {
+			if (ligneSup[i]) {
+				nbRowSup++;
+			}
+		}
+		donnees = new Object[collection.size() + nbRowSup][4];
+		
+		int compte = 0;
+		for (String unit : collection.keySet()) {
+			donnees[compte][0] = unit;
+			donnees[compte][1] = collection.get(unit).getnboccurences();
+			donnees[compte][2] = collection.get(unit).getfrequence();
+			donnees[compte][3] = collection.get(unit).getposmoyenne();
+			compte++;
+		}
+		if (collection.size() > 0) {
+			// on ajoute les éventuelles lignes supplémentaires
+			switch (this.collection.keySet().iterator().next().length()) {
+				// si on a des digrammes
+				case 2:
+					if (ligneSup[0]) {
+						donnees[compte] = calculXX();
+						compte++;
+					}
+					break;
+				// si on a des trigrammes
+				case 3:
+					if (ligneSup[0]) {
+						donnees[compte] = calculXOX();
+						compte++;
+					}
+					if (ligneSup[1]) {
+						donnees[compte] = calculXOY();
+						compte++;
+					}
+					if (ligneSup[2]) {
+						donnees[compte] = calculXYZ();
+						compte++;
+					}
+					if (ligneSup[3]) {
+						donnees[compte] = calculXXX();
+						compte++;
+					}
+					break;
+				default:
+					break;
+			}
+		}
+		return donnees;
+		
+	}
+	
+	// @require : le ngrammes contient des digrammes
+	public Object[] calculXX() {
+		Object[] retour = new Object[4];
+		Float frequencecumulee = 0.0f;
+		Float positionmoyenne = 0.0f;
+		Integer Nboccurences = 0;
+		for (String doubletcourant : this.collection.keySet()) {
+			if (doubletcourant.charAt(0) == doubletcourant.charAt(1)) {
+				frequencecumulee = frequencecumulee + this.collection.get(doubletcourant).getfrequence();
+				positionmoyenne = positionmoyenne + this.collection.get(doubletcourant).getnboccurences()
+						* this.collection.get(doubletcourant).getposmoyenne();
+				Nboccurences = Nboccurences + this.collection.get(doubletcourant).getnboccurences();
+			}
+		}
+		positionmoyenne = Math.round(100 * positionmoyenne / Nboccurences) / 100.0f;
+		retour[0] = "xx";
+		retour[1] = Nboccurences;
+		retour[2] = frequencecumulee;
+		retour[3] = positionmoyenne;
+		return retour;
+	}
+	
+	public String[] infoSuivant(String code) {
+		HashMap<String, Integer> totaux = new HashMap();
+		// on recense les lettres suivants le ngramme identifié par "code"
+		for (String next : this.collection.get(code).suivant) {
+			if (totaux.containsKey(next)) {
+				totaux.put(next, totaux.get(next) + 1);
+			}
+			else {
+				totaux.put(next, 1);
+			}
+		}
+		String[] retour = new String[totaux.size()];
+		int i = 0;
+		// on calcule des statistiques
+		for (String next : totaux.keySet()) {
+			retour[i] = code + next + "   Nombre d'occurences : " + totaux.get(next).toString() +
+					"   Fréquence : " + (Math.round(100.0f * totaux.get(next) / this.collection.get(code).suivant.size()) / 100.0f);
+			i = i + 1;
+		}
+		return retour;
+	}
+	
+	// @require : le ngrammes contient des digrammes
+	public Object[] calculXOX() {
+		Object[] retour = new Object[4];
+		Float frequencecumulee = 0.0f;
+		Float positionmoyenne = 0.0f;
+		Integer Nboccurences = 0;
+		for (String tripletcourant : this.collection.keySet()) {
+			if (tripletcourant.charAt(0) == tripletcourant.charAt(2) && tripletcourant.charAt(1) == '0') {
+				frequencecumulee = frequencecumulee + this.collection.get(tripletcourant).getfrequence();
+				positionmoyenne = positionmoyenne + this.collection.get(tripletcourant).getnboccurences()
+						* this.collection.get(tripletcourant).getposmoyenne();
+				Nboccurences = Nboccurences + this.collection.get(tripletcourant).getnboccurences();
+			}
+		}
+		positionmoyenne = Math.round(100 * positionmoyenne / Nboccurences) / 100.0f;
+		retour[0] = "x0x";
+		retour[1] = Nboccurences;
+		retour[2] = frequencecumulee;
+		retour[3] = positionmoyenne;
+		return retour;
+	}
+	
+	// @require : le ngrammes contient des digrammes
+	// on recherche les triplets séparés par des paragraphe au extrémités différentes
+	public Object[] calculXOY() {
+		Object[] retour = new Object[4];
+		Float frequencecumulee = 0.0f;
+		Float positionmoyenne = 0.0f;
+		Integer Nboccurences = 0;
+		for (String tripletcourant : this.collection.keySet()) {
+			if (tripletcourant.charAt(1) == '0' && tripletcourant.charAt(0) != tripletcourant.charAt(2)) {
+				frequencecumulee = frequencecumulee + this.collection.get(tripletcourant).getfrequence();
+				positionmoyenne = positionmoyenne + this.collection.get(tripletcourant).getnboccurences()
+						* this.collection.get(tripletcourant).getposmoyenne();
+				Nboccurences = Nboccurences + this.collection.get(tripletcourant).getnboccurences();
+			}
+		}
+		positionmoyenne = Math.round(100 * positionmoyenne / Nboccurences) / 100.0f;
+		retour[0] = "x0y";
+		retour[1] = Nboccurences;
+		retour[2] = frequencecumulee;
+		retour[3] = positionmoyenne;
+		return retour;
+	}
+	
+	// @require : le ngrammes contient des digrammes
+	public Object[] calculXYZ() {
+		Object[] retour = new Object[4];
+		Float frequencecumulee = 0.0f;
+		Float positionmoyenne = 0.0f;
+		Integer Nboccurences = 0;
+		for (String tripletcourant : this.collection.keySet()) {
+			if (tripletcourant.charAt(1) != tripletcourant.charAt(2) && tripletcourant.charAt(0) != tripletcourant.charAt(1) &&
+					tripletcourant.charAt(0) != tripletcourant.charAt(2) && tripletcourant.charAt(1) != '0') {
+				frequencecumulee = frequencecumulee + this.collection.get(tripletcourant).getfrequence();
+				positionmoyenne = positionmoyenne + this.collection.get(tripletcourant).getnboccurences()
+						* this.collection.get(tripletcourant).getposmoyenne();
+				Nboccurences = Nboccurences + this.collection.get(tripletcourant).getnboccurences();
+			}
+		}
+		positionmoyenne = Math.round(100 * positionmoyenne / Nboccurences) / 100.0f;
+		retour[0] = "xyz";
+		retour[1] = Nboccurences;
+		retour[2] = frequencecumulee;
+		retour[3] = positionmoyenne;
+		return retour;
+	}
+	
+	// @require : le ngrammes contient des digrammes
+	public Object[] calculXXX() {
+		Object[] retour = new Object[4];
+		Float frequencecumulee = 0.0f;
+		Float positionmoyenne = 0.0f;
+		Integer Nboccurences = 0;
+		for (String tripletcourant : this.collection.keySet()) {
+			if (tripletcourant.charAt(1) == tripletcourant.charAt(2) && tripletcourant.charAt(0) == tripletcourant.charAt(1)) {
+				frequencecumulee = frequencecumulee + this.collection.get(tripletcourant).getfrequence();
+				positionmoyenne = positionmoyenne + this.collection.get(tripletcourant).getnboccurences()
+						* this.collection.get(tripletcourant).getposmoyenne();
+				Nboccurences = Nboccurences + this.collection.get(tripletcourant).getnboccurences();
+			}
+		}
+		positionmoyenne = Math.round(100 * positionmoyenne / Nboccurences) / 100.0f;
+		retour[0] = "xxx";
+		retour[1] = Nboccurences;
+		retour[2] = frequencecumulee;
+		retour[3] = positionmoyenne;
+		return retour;
+	}
+	
+	
 }
Index: tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuConversion.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuConversion.java	(revision 3077)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/chaines/VisuConversion.java	(revision 3078)
@@ -51,11 +51,11 @@
 	
 	private String[] typesSourceDisponibles = new String[0];
 	
-	private ArrayList<String> primaryKeyDisponibles = new ArrayList();
+	private ArrayList<String> primaryKeyDisponibles = new ArrayList<>();
 	
 	private ArrayList<String> otherKeyDisponibles = new ArrayList<>();
 	
-	private ArrayList<String> otherKeyAjoutees = new ArrayList();
+	private ArrayList<String> otherKeyAjoutees = new ArrayList<>();
 	
 	public VisuConversion(Container fenetre, Vue vue, PanneauEditeur pEditeur) {
 		super("Conversion de données en schéma");
@@ -164,7 +164,7 @@
 								addOtherKey.removeActionListener(this);
 								addOtherKey.setModele(otherKeyDisponibles.toArray(new String[0]));
 								addOtherKey.addActionListener(this);
-								otherKeyAjoutees = new ArrayList();
+								otherKeyAjoutees = new ArrayList<>();
 								removeOtherKey.removeActionListener(this);
 								removeOtherKey.setModele(otherKeyAjoutees.toArray(new String[0]));
 								removeOtherKey.addActionListener(this);
@@ -294,7 +294,7 @@
 					typeSource.removeActionListener(this);
 					typeSource.setModele(typesSourceDisponibles);
 					typeSource.addActionListener(this);
-					this.primaryKeyDisponibles = new ArrayList();
+					this.primaryKeyDisponibles = new ArrayList<>();
 					primaryKey.removeActionListener(this);
 					this.primaryKey.setModele(this.primaryKeyDisponibles.toArray(new String[0]));
 					primaryKey.addActionListener(this);
Index: tmp/org.txm.analec.rcp/src/visuAnalec/util/GMessages.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/util/GMessages.java	(revision 3077)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/util/GMessages.java	(revision 3078)
@@ -14,89 +14,103 @@
  * @author Bernard
  */
 public class GMessages {
-  public static boolean confirmationAction(String texte) {
-    return (JOptionPane.showConfirmDialog(null, texte, "Confirmation d'action",
-            JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE)
-            !=JOptionPane.CANCEL_OPTION);
-  }
-
-  public static void pasImplemente() {
-    JOptionPane.showMessageDialog(null, "Désolé, cette fonctionnalité n'est pas encore implémentée",
-            "Patience...", JOptionPane.INFORMATION_MESSAGE);
-    return;
-  }
-
-  public static void impossibiliteAction(String texte) {
-    JOptionPane.showMessageDialog(null, texte,
-            "Désolé...", JOptionPane.INFORMATION_MESSAGE);
-    return;
-  }
-
-  public static void erreurFatale(Throwable ex) {
-    String message = "<center><b>Désolé pour ce bug... Vous allez devoir relancer Analec.</b></center>"
-            +"<i><br>Veuillez recopier  le message d'erreur ci-dessous et l'envoyer au concepteur du logiciel"
-            +" <br>en précisant les conditions dans lequel ce bug s'est produit</i>";
-    String erreur = "<p>"+ex.toString();
-    ex.printStackTrace();
-    for (StackTraceElement tr : ex.getStackTrace())
-      if (tr.getClassName().startsWith("visuAnalec")||tr.getClassName().startsWith("JamaPlus") )
-        erreur += "<br>"+tr.getClassName()+" : "+tr.getMethodName()+" ligne "+tr.getLineNumber();
-    JEditorPane dialogue = new JEditorPane("text/html", message+erreur);
-    JOptionPane.showMessageDialog(null, dialogue, "Oups !", JOptionPane.ERROR_MESSAGE);
-   // System.exit(1);
-  }
-
-  public abstract static class GAction extends AbstractAction {
-    public GAction(String nom) {
-      super(nom);
-    }
-
-    public GAction(String nom, Icon icone) {
-      super(nom, icone);
-    }
-
-    public abstract void executer();
-
-    public void actionPerformed(ActionEvent evt) {
-      try {
-        executer();
-      } catch (Throwable ex) {
-        erreurFatale(ex);
-      }
-    }
-  }
-
-  public abstract static class GActionClavier extends GAction {
-    public GActionClavier(JComponent composant, String nom, String... touches) {
-      super(nom);
-      for(String touche: touches) {
-        composant.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
-                KeyStroke.getKeyStroke(touche), nom);
-      }
-      composant.getActionMap().put(nom, this);
-    }
-  }
-  public static class GProgression extends ProgressMonitor  {
-    private int compteur;
-    private String elementsTraites;
-
-    public GProgression(int max, String traitement, String elementsTraites) {
-      super(null, traitement + " en cours", "Démarrage", 0, max);
-      this.elementsTraites = elementsTraites;
-//      setMillisToPopup(0);
-      compteur = 0;
-     }
-
-    public void setNbTraites(int nb) {
-      compteur = nb;
-      SwingUtilities.invokeLater(new MiseAJour());
-    }
-
-    class MiseAJour implements Runnable {
-      public void run() {
-        setProgress(compteur);
-        setNote(compteur +" "+ elementsTraites + " traités");
-      }
-    }
-  }
-}
\ No newline at end of file
+	
+	public static boolean confirmationAction(String texte) {
+		return (JOptionPane.showConfirmDialog(null, texte, "Confirmation d'action",
+				JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.CANCEL_OPTION);
+	}
+	
+	public static void pasImplemente() {
+		JOptionPane.showMessageDialog(null, "Désolé, cette fonctionnalité n'est pas encore implémentée",
+				"Patience...", JOptionPane.INFORMATION_MESSAGE);
+		return;
+	}
+	
+	public static void impossibiliteAction(String texte) {
+		JOptionPane.showMessageDialog(null, texte,
+				"Désolé...", JOptionPane.INFORMATION_MESSAGE);
+		return;
+	}
+	
+	public static void erreurFatale(Throwable ex) {
+		String message = "<center><b>Désolé pour ce bug... Vous allez devoir relancer Analec.</b></center>"
+				+ "<i><br>Veuillez recopier  le message d'erreur ci-dessous et l'envoyer au concepteur du logiciel"
+				+ " <br>en précisant les conditions dans lequel ce bug s'est produit</i>";
+		String erreur = "<p>" + ex.toString();
+		ex.printStackTrace();
+		for (StackTraceElement tr : ex.getStackTrace())
+			if (tr.getClassName().startsWith("visuAnalec") || tr.getClassName().startsWith("JamaPlus"))
+				erreur += "<br>" + tr.getClassName() + " : " + tr.getMethodName() + " ligne " + tr.getLineNumber();
+		JEditorPane dialogue = new JEditorPane("text/html", message + erreur);
+		JOptionPane.showMessageDialog(null, dialogue, "Oups !", JOptionPane.ERROR_MESSAGE);
+		// System.exit(1);
+	}
+	
+	public abstract static class GAction extends AbstractAction {
+		
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
+		
+		public GAction(String nom) {
+			super(nom);
+		}
+		
+		public GAction(String nom, Icon icone) {
+			super(nom, icone);
+		}
+		
+		public abstract void executer();
+		
+		@Override
+		public void actionPerformed(ActionEvent evt) {
+			try {
+				executer();
+			}
+			catch (Throwable ex) {
+				erreurFatale(ex);
+			}
+		}
+	}
+	
+	public abstract static class GActionClavier extends GAction {
+		
+		public GActionClavier(JComponent composant, String nom, String... touches) {
+			super(nom);
+			for (String touche : touches) {
+				composant.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
+						KeyStroke.getKeyStroke(touche), nom);
+			}
+			composant.getActionMap().put(nom, this);
+		}
+	}
+	
+	public static class GProgression extends ProgressMonitor {
+		
+		private int compteur;
+		
+		private String elementsTraites;
+		
+		public GProgression(int max, String traitement, String elementsTraites) {
+			super(null, traitement + " en cours", "Démarrage", 0, max);
+			this.elementsTraites = elementsTraites;
+			// setMillisToPopup(0);
+			compteur = 0;
+		}
+		
+		public void setNbTraites(int nb) {
+			compteur = nb;
+			SwingUtilities.invokeLater(new MiseAJour());
+		}
+		
+		class MiseAJour implements Runnable {
+			
+			@Override
+			public void run() {
+				setProgress(compteur);
+				setNote(compteur + " " + elementsTraites + " traités");
+			}
+		}
+	}
+}
Index: tmp/org.txm.analec.rcp/src/visuAnalec/PanneauChamps.java
===================================================================
--- tmp/org.txm.analec.rcp/src/visuAnalec/PanneauChamps.java	(revision 3077)
+++ tmp/org.txm.analec.rcp/src/visuAnalec/PanneauChamps.java	(revision 3078)
@@ -22,127 +22,149 @@
  * @author Bernard, cplancq
  */
 public class PanneauChamps extends JPanel {
-  ArrayList<GChamp> champs = new ArrayList<GChamp>();
-  private Vue vue;
-  private Element element = null;
-  private Class<? extends Element> classe = null;
-  private String type = null;
-  private JPanel cadre;
-  public PanneauChamps(PanneauEditeur pEdit, Vue vue) {
-    super(new BorderLayout());
-    setBorder(new TitledBorder("Champs"));
-    cadre = new JPanel(new GridLayout(0, 1));
-    JScrollPane scroll = new JScrollPane(cadre);
-    add(scroll, BorderLayout.CENTER);
-    this.vue = vue;
-  }
-  void reafficher() {
-    if (element == null) return;
-    type = null;
-    afficher(element);
-  }
-  void afficher(Element elt) {
-    this.element = elt;
-    if (elt.getClass() != classe || !elt.getType().equals(type)) {
-      type = elt.getType();
-      classe = elt.getClass();
-      afficherTouslesChamps();
-    }
-    ((TitledBorder) getBorder()).setTitle("Champs " + GVisu.getNomDeLaClasse(elt) + " :  \"" +
-            vue.getIdElement(elt) + "\"");
-    for (GChamp gc : champs) {
-      gc.afficher(elt);
-    }
-    revalidate();
-    repaint();
-  }
-  void effacer() {
-    cadre.removeAll();
-    type = null;
-    element = null;
-    ((TitledBorder) getBorder()).setTitle("Champs");
-    revalidate();
-    repaint();
-  }
-  private void afficherTouslesChamps() {
-    cadre.removeAll();
-    champs.clear();
-
-    int niveau = 0;
-    for (String[] champsniveau : vue.getChamps(classe, type)) {
-      JPanel panneauniveau = new JPanel();
- //     panneauniveau.setBorder(new TitledBorder("Niveau " + ++niveau));
-      for (String champ : champsniveau) {
-        GChamp gc = new GChamp(vue, classe, type, champ);
-        champs.add(gc);
-        panneauniveau.add(gc);
-      }
-      cadre.add(panneauniveau);
-    }
-  }
-
-  private static class GChamp extends JPanel implements ActionListener {
-    JComboBox afficheValeurChamp;
-    Vue vue;
-    Class<? extends Element> classe;
-    String type;
-    String champ;
-    Element element = null;
-    GChamp(Vue vue, Class<? extends Element> classe, String type, String champ) {
-      super();
-      this.vue = vue;
-      this.classe = classe;
-      this.type = type;
-      this.champ = champ;
-      Box groupe = Box.createVerticalBox();
-      Box titre = Box.createHorizontalBox();
-      titre.add(Box.createHorizontalGlue());
-      JLabel label = new JLabel(champ, JLabel.CENTER);
- //     label.setPreferredSize(new Dimension(50, 10));
-      titre.add(label);
-      titre.add(Box.createHorizontalGlue());
-      groupe.add(titre);
-      groupe.add(Box.createVerticalStrut(2));
-      afficheValeurChamp = new JComboBox(vue.getValeursChamp(classe, type, champ));
-      /*
-      * CP: JComboBox avec autocompletion. Dépend de la lib glazedlists
-      * (http://www.glazedlists.com/), (https://github.com/glazedlists/glazedlists)
-      */
-      AutoCompleteSupport support = AutoCompleteSupport.install(afficheValeurChamp, GlazedLists.eventListOf(vue.getValeursChamp(classe, type, champ)));
-      support.setCorrectsCase(false);
-      afficheValeurChamp.setEditable(vue.isChampModifiable(classe, type, champ));
-      afficheValeurChamp.addActionListener(this);
-      groupe.add(afficheValeurChamp);
-      add(groupe);
-    }
-    void afficher(Element elt) {
-      this.element = elt;
-      afficheValeurChamp.removeActionListener(this);
-      String val = vue.getValeurChamp(elt, champ);
-      if (val.isEmpty()) afficheValeurChamp.setSelectedIndex(-1);
-      else afficheValeurChamp.setSelectedItem(val);
-      afficheValeurChamp.addActionListener(this);
-    }
-    public void actionPerformed(ActionEvent evt) {
-      try {
-        if (!afficheValeurChamp.isEditable()) {
-          JOptionPane.showMessageDialog(getTopLevelAncestor(), "Champ non modifiable pour ce type d'éléments",
-                  "Modification impossible", JOptionPane.ERROR_MESSAGE);
-          afficher(element);
-          return;
-        }
-        String newval = ((String) afficheValeurChamp.getSelectedItem());
-        if (newval == null) newval = "";
-        else newval = newval.trim();
-        
-        if (!vue.setValeurChamp(element, champ, newval)) {
-          JOptionPane.showMessageDialog(getTopLevelAncestor(), "Champ non défini pour cet élément",
-                  "Saisie de valeur de champ impossible", JOptionPane.ERROR_MESSAGE);
-          afficher(element);
-        }
-      } catch (Throwable ex) {
-        GMessages.erreurFatale(ex);
-      }
-    }
-  }
+	
+	ArrayList<GChamp> champs = new ArrayList<>();
+	
+	private Vue vue;
+	
+	private Element element = null;
+	
+	private Class<? extends Element> classe = null;
+	
+	private String type = null;
+	
+	private JPanel cadre;
+	
+	public PanneauChamps(PanneauEditeur pEdit, Vue vue) {
+		super(new BorderLayout());
+		setBorder(new TitledBorder("Champs"));
+		cadre = new JPanel(new GridLayout(0, 1));
+		JScrollPane scroll = new JScrollPane(cadre);
+		add(scroll, BorderLayout.CENTER);
+		this.vue = vue;
+	}
+	
+	void reafficher() {
+		if (element == null) return;
+		type = null;
+		afficher(element);
+	}
+	
+	void afficher(Element elt) {
+		this.element = elt;
+		if (elt.getClass() != classe || !elt.getType().equals(type)) {
+			type = elt.getType();
+			classe = elt.getClass();
+			afficherTouslesChamps();
+		}
+		((TitledBorder) getBorder()).setTitle("Champs " + GVisu.getNomDeLaClasse(elt) + " :  \"" +
+				vue.getIdElement(elt) + "\"");
+		for (GChamp gc : champs) {
+			gc.afficher(elt);
+		}
+		revalidate();
+		repaint();
+	}
+	
+	void effacer() {
+		cadre.removeAll();
+		type = null;
+		element = null;
+		((TitledBorder) getBorder()).setTitle("Champs");
+		revalidate();
+		repaint();
+	}
+	
+	private void afficherTouslesChamps() {
+		cadre.removeAll();
+		champs.clear();
+		
+		int niveau = 0;
+		for (String[] champsniveau : vue.getChamps(classe, type)) {
+			JPanel panneauniveau = new JPanel();
+			// panneauniveau.setBorder(new TitledBorder("Niveau " + ++niveau));
+			for (String champ : champsniveau) {
+				GChamp gc = new GChamp(vue, classe, type, champ);
+				champs.add(gc);
+				panneauniveau.add(gc);
+			}
+			cadre.add(panneauniveau);
+		}
+	}
+	
+	private static class GChamp extends JPanel implements ActionListener {
+		
+		JComboBox afficheValeurChamp;
+		
+		Vue vue;
+		
+		Class<? extends Element> classe;
+		
+		String type;
+		
+		String champ;
+		
+		Element element = null;
+		
+		GChamp(Vue vue, Class<? extends Element> classe, String type, String champ) {
+			super();
+			this.vue = vue;
+			this.classe = classe;
+			this.type = type;
+			this.champ = champ;
+			Box groupe = Box.createVerticalBox();
+			Box titre = Box.createHorizontalBox();
+			titre.add(Box.createHorizontalGlue());
+			JLabel label = new JLabel(champ, JLabel.CENTER);
+			// label.setPreferredSize(new Dimension(50, 10));
+			titre.add(label);
+			titre.add(Box.createHorizontalGlue());
+			groupe.add(titre);
+			groupe.add(Box.createVerticalStrut(2));
+			afficheValeurChamp = new JComboBox(vue.getValeursChamp(classe, type, champ));
+			/*
+			 * CP: JComboBox avec autocompletion. Dépend de la lib glazedlists
+			 * (http://www.glazedlists.com/), (https://github.com/glazedlists/glazedlists)
+			 */
+			AutoCompleteSupport<String> support = AutoCompleteSupport.install(afficheValeurChamp, GlazedLists.eventListOf(vue.getValeursChamp(classe, type, champ)));
+			support.setCorrectsCase(false);
+			afficheValeurChamp.setEditable(vue.isChampModifiable(classe, type, champ));
+			afficheValeurChamp.addActionListener(this);
+			groupe.add(afficheValeurChamp);
+			add(groupe);
+		}
+		
+		void afficher(Element elt) {
+			this.element = elt;
+			afficheValeurChamp.removeActionListener(this);
+			String val = vue.getValeurChamp(elt, champ);
+			if (val.isEmpty()) afficheValeurChamp.setSelectedIndex(-1);
+			else afficheValeurChamp.setSelectedItem(val);
+			afficheValeurChamp.addActionListener(this);
+		}
+		
+		@Override
+		public void actionPerformed(ActionEvent evt) {
+			try {
+				if (!afficheValeurChamp.isEditable()) {
+					JOptionPane.showMessageDialog(getTopLevelAncestor(), "Champ non modifiable pour ce type d'éléments",
+							"Modification impossible", JOptionPane.ERROR_MESSAGE);
+					afficher(element);
+					return;
+				}
+				String newval = ((String) afficheValeurChamp.getSelectedItem());
+				if (newval == null) newval = "";
+				else newval = newval.trim();
+				
+				if (!vue.setValeurChamp(element, champ, newval)) {
+					JOptionPane.showMessageDialog(getTopLevelAncestor(), "Champ non défini pour cet élément",
+							"Saisie de valeur de champ impossible", JOptionPane.ERROR_MESSAGE);
+					afficher(element);
+				}
+			}
+			catch (Throwable ex) {
+				GMessages.erreurFatale(ex);
+			}
+		}
+	}
 }
Index: tmp/org.txm.para.core/plugin.xml
===================================================================
--- tmp/org.txm.para.core/plugin.xml	(revision 3077)
+++ tmp/org.txm.para.core/plugin.xml	(revision 3078)
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>  
-
-</plugin>
Index: tmp/org.txm.libs.cqp.win32/build.properties
===================================================================
--- tmp/org.txm.libs.cqp.win32/build.properties	(revision 3077)
+++ tmp/org.txm.libs.cqp.win32/build.properties	(revision 3078)
@@ -2,5 +2,6 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               res/
-#qualifier=svn
\ No newline at end of file
+               res/,\
+               OSGI-INF/
+#qualifier=svn
