Index: tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/renderers/FCAItemSelectionRenderer.java
===================================================================
--- tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/renderers/FCAItemSelectionRenderer.java	(revision 189)
+++ tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/renderers/FCAItemSelectionRenderer.java	(revision 190)
@@ -12,13 +12,11 @@
 import java.text.DecimalFormat;
 import java.util.ArrayList;
 
-import org.jfree.chart.ChartPanel;
 import org.jfree.chart.labels.XYItemLabelGenerator;
 import org.jfree.chart.labels.XYToolTipGenerator;
 import org.jfree.data.xy.XYDataset;
 import org.txm.ca.core.chartsengine.jfreechart.datasets.FCAXYDataset;
 import org.txm.ca.core.messages.CACoreMessages;
-import org.txm.ca.core.renderers.FCAMultipleItemsSelector;
 import org.txm.chartsengine.core.ChartsEngine;
 import org.txm.chartsengine.core.messages.ChartsEngineCoreMessages;
 import org.txm.chartsengine.jfreechart.core.renderers.interfaces.IItemSelectionRenderer;
@@ -44,7 +42,6 @@
 	 */
 	public FCAItemSelectionRenderer() {
 		super();
-		this.multipleItemsSelector = new FCAMultipleItemsSelector(this);
 		this.setChartType(ChartsEngine.CHART_TYPE_CA_FACTORIAL_MAP);
 	}
 
Index: tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/chartcreators/JFCSingularValueChartCreator.java
===================================================================
--- tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/chartcreators/JFCSingularValueChartCreator.java	(revision 189)
+++ tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/chartcreators/JFCSingularValueChartCreator.java	(revision 190)
@@ -4,6 +4,7 @@
 import org.jfree.chart.axis.NumberAxis;
 import org.jfree.data.category.DefaultCategoryDataset;
 import org.jfree.data.general.DatasetUtilities;
+import org.txm.ca.core.chartsengine.jfreechart.themes.highcharts.renderers.CASingularValuesItemSelectionRenderer;
 import org.txm.ca.core.functions.CA;
 import org.txm.ca.core.messages.CACoreMessages;
 import org.txm.chartsengine.jfreechart.core.JFCChartCreator;
@@ -48,7 +49,7 @@
 			chart = this.getChartsEngine().createCategoryBarChart(dataset, CACoreMessages.ChartsEngine_CA_SINGULAR_VALUES_TITLE, CACoreMessages.ChartsEngine_CA_SINGULAR_VALUES_X_AXIS_LABEL, CACoreMessages.ChartsEngine_CA_SINGULAR_VALUES_Y_AXIS_LABEL, false, false, false);
 
 			// Custom renderer
-			chart.getCategoryPlot().setRenderer(this.getChartsEngine().getTheme().createCASingularValuesRenderer());
+			chart.getCategoryPlot().setRenderer(new CASingularValuesItemSelectionRenderer());
 	        ((IItemSelectionRenderer) chart.getCategoryPlot().getRenderer()).getItemsSelector().setResultData(ca);
 
 	        // Custom range axis for ticks drawing options
Index: tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/chartcreators/JFCCAChartCreator.java
===================================================================
--- tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/chartcreators/JFCCAChartCreator.java	(revision 189)
+++ tmp/org.txm.ca.core/src/org/txm/ca/core/chartsengine/jfreechart/themes/highcharts/chartcreators/JFCCAChartCreator.java	(revision 190)
@@ -2,8 +2,11 @@
 
 import java.awt.BasicStroke;
 import java.awt.Color;
+import java.text.Collator;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.TreeMap;
 
 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
@@ -15,6 +18,7 @@
 import org.jfree.chart.plot.XYPlot;
 import org.jfree.chart.renderer.xy.XYItemRenderer;
 import org.jfree.chart.title.LegendTitle;
+import org.jfree.data.xy.XYDataset;
 import org.jfree.ui.TextAnchor;
 import org.txm.ca.core.chartsengine.base.CAChartCreator;
 import org.txm.ca.core.chartsengine.base.Utils;
@@ -292,7 +296,7 @@
 			chart = ChartFactory.createScatterPlot(Utils.createCAFactorialMapChartTitle(ca), "", "", dataset, PlotOrientation.VERTICAL, TXMPreferences.getBoolean(CAPreferences.PREFERENCES_NODE, ChartsEnginePreferences.SHOW_LEGEND), false, false);
 
 			// Custom renderer
-			chart.getXYPlot().setRenderer(this.getChartsEngine().getTheme().createFCARenderer());
+			chart.getXYPlot().setRenderer(new FCAItemSelectionRenderer());
 
 
 		}
@@ -330,10 +334,217 @@
 	public void updateChartCAFactorialMapSetLabelItemsSelectionOrder(Object chart, String[] rowLabels, String[] colLabels) {
 		
 		MultipleItemsSelector selector = (MultipleItemsSelector) ((FCAItemSelectionRenderer)((JFreeChart) chart).getXYPlot().getRenderer()).getItemsSelector();
-		selector.setCyclicItemsOrder(selector.getItemsAndSeriesOrderedByLabels((FCAXYDataset)((JFreeChart) chart).getXYPlot().getDataset(), rowLabels, colLabels)); 
+		selector.setCyclicItemsOrder(this.getItemsAndSeriesOrderedByLabels((FCAXYDataset)((JFreeChart) chart).getXYPlot().getDataset(), rowLabels, colLabels)); 
 	}
 
+	
+	/**
+	 * Gets a map where the values of the dataset are ordered according to the specified label arrays, keeping the order of these arrays and flatten but grouped by series.
+	 * @param dataset
+	 * @return
+	 */
+	public TreeMap<Object, ArrayList<Integer>> getItemsAndSeriesOrderedByLabels(FCAXYDataset dataset, String[] rowLabels, String[] colLabels)	{
+		
+		TreeMap<Object, ArrayList<Integer>> orderedValues = new TreeMap<Object, ArrayList<Integer>>();
+		
+		int[] rowIndices = dataset.getOrderedLabelIndices(0, rowLabels);
+		int[] colIndices = dataset.getOrderedLabelIndices(1, colLabels);
+		
+		int i = 0;
+		for(; i < rowIndices.length; i++) {
+			ArrayList<Integer> itemData = new ArrayList<Integer>(2);
+			itemData.add(0); // series
+			itemData.add(rowIndices[i]); // item
+			orderedValues.put(i, itemData);
+		}
+		for(int j = 0; j < colIndices.length; j++) {
+			ArrayList<Integer> itemData = new ArrayList<Integer>(2);
+			itemData.add(1); // series
+			itemData.add(colIndices[j]); // item
+			orderedValues.put(j + i, itemData);
+		}
+	
+		return orderedValues;
+	}
+	
+	
+	/**
+	 * Gets a map where the values of the dataset are orderer by X item value and flatten despite of the series.
+	 * @param dataset
+	 * @return
+	 */
+	public TreeMap<Object, ArrayList<Integer>> getItemsAndSeriesOrderedByXValues(XYDataset dataset)	{
+		HashMap<Object, ArrayList<Integer>> allFlattenValues = new HashMap<Object, ArrayList<Integer>>();
+		for(int i = 0; i < dataset.getSeriesCount(); i++) {
+			for(int j = 0; j < dataset.getItemCount(i); j++) {
+				ArrayList<Integer> itemData = new ArrayList<Integer>(2);
+				itemData.add(i); // series
+				itemData.add(j); // item
+				
+				// FIXME: tests, navigation clavier sur toutes les courbes en même temps d'une Progression (tri sur la valeur X du dataset, toute séries confondues)
+//				allFlattenValues.put((int) dataset.getXValue(i, j), itemData);
 
+
+				// Test FCAXYDataset
+				
+				// FIXME: tests, navigation clavier par ordre alphabétique d'une AFC (toute séries confondues)
+				String label = ((FCAXYDataset)dataset).getLabel(i,  j);
+				allFlattenValues.put(label, itemData);
+				
+				// FIXME: tests, navigation clavier par coord X d'une AFC (toute séries confondues)
+				//allFlattenValues.put(dataset.getX(i, j), itemData);
+				
+			}
+		}
+
+
+		// FIXME: tests, navigation clavier sur toutes les courbes en même temps d'une Progression
+	//	TreeMap<Object, ArrayList<Integer>> orderedValues = new TreeMap<Object, ArrayList<Integer>>(allFlattenValues);
+
+		// FIXME: tests, navigation clavier par ordre alphabétique d'une AFC
+		TreeMap<Object, ArrayList<Integer>> orderedValues = new TreeMap<Object, ArrayList<Integer>>(Collator.getInstance());
+		orderedValues.putAll(allFlattenValues);
+
+		
+		// FIXME : comparator tests
+//		TreeMap<String, Integer> treemap = new TreeMap<String, Integer>(new Comparator<String>() {
+//		    public int compare(String o1, String o2) {
+//		        return o1.toLowerCase().compareTo(o2.toLowerCase());
+//		    }
+//		});
+		
+		
+		// FIXME: DEbug
+//		Set cles = orderedValues.keySet();
+//		System.err.println("MultipleItemsSelector.getItemsAndSeriesOrderedByXValues() size: " + orderedValues.size());
+//		Iterator<Integer> it = cles.iterator();
+//		while(it.hasNext())	{
+//			Object key = it.next();
+//			ArrayList<Integer> value = orderedValues.get(key);
+//			System.out.println("MultipleItemsSelector.getItemsAndSeriesOrdererByXValues(): item position = " + key + " series = " + value.get(0) + " item = " + value.get(1));
+//		}
+
+		return orderedValues;
+	}
+	
+
+	
+
+	/**
+	 * Gets a map where the values of the dataset are orderer by label and flatten but grouped by series.
+	 * @param dataset
+	 * @return
+	 */
+	// FIXME: tests
+//	public TreeMap<Object, ArrayList<Integer>> getItemsAndSeriesOrderedByLabels(FCAXYDataset dataset)	{
+//		return this.getItemsAndSeriesOrderedByLabels(dataset, false, false);
+//	}
+//	
+	/**
+	 *  Gets a map where the values of the dataset are orderer by label and flatten but grouped by series.
+	 * @param dataset
+	 * @return
+	 */
+	// FIXME: tests, became useless ? (since we can give labels order with getItemsAndSeriesOrderedByLabels(FCAXYDataset dataset, String[] rowLabels, String[] colLabels)) )
+//	public TreeMap<Object, ArrayList<Integer>> getItemsAndSeriesOrderedByLabels(FCAXYDataset dataset, boolean rowsReverse, boolean colsReverse)	{
+//		
+//		Comparator rowsComparator;
+//		Comparator colsComparator;
+//		
+//		if(rowsReverse)	{
+//			rowsComparator = Collections.reverseOrder(Collator.getInstance());
+//		}
+//		else	{
+//			rowsComparator = Collator.getInstance();
+//		}
+//
+//		if(colsReverse)	{
+//			colsComparator = Collections.reverseOrder(Collator.getInstance());
+//		}
+//		else	{
+//			colsComparator = Collator.getInstance();
+//		}
+//
+//		
+//		TreeMap<Object, ArrayList<Integer>> allFlattenRowsValues = new TreeMap<Object, ArrayList<Integer>>(rowsComparator);
+//		TreeMap<Object, ArrayList<Integer>> allFlattenColsValues = new TreeMap<Object, ArrayList<Integer>>(colsComparator);
+//
+//		// sort the rows by label
+//		for(int i = 0; i < dataset.getItemCount(0); i++) {
+//			ArrayList<Integer> itemData = new ArrayList<Integer>(2);
+//			itemData.add(0); // series
+//			itemData.add(i); // item
+//			allFlattenRowsValues.put(((FCAXYDataset)dataset).getLabel(0,  i), itemData);
+//			
+//			// FIXME: tests, navigation clavier par coord X d'une AFC (toute séries confondues)
+//			//allFlattenRowsValues.put(dataset.getX(0, j), itemData);
+//		}
+//		
+//		
+//		// sort the cols by label
+//		for(int i = 0; i < dataset.getItemCount(1); i++) {
+//			ArrayList<Integer> itemData = new ArrayList<Integer>(2);
+//			itemData.add(1); // series
+//			itemData.add(i); // item
+//			allFlattenColsValues.put(((FCAXYDataset)dataset).getLabel(1,  i), itemData);
+//			
+//			// FIXME: tests, navigation clavier par coord X d'une AFC (toute séries confondues)
+//			//allFlattenColsValues.put(dataset.getX(1, j), itemData);
+//		}
+//
+//		
+//		
+//		// FIXME: tests, navigation clavier par ordre alphabétique d'une AFC
+//		TreeMap<Object, ArrayList<Integer>> orderedValues = new TreeMap<Object, ArrayList<Integer>>();
+////		if(revertedOrder)	{
+////			orderedValues = new TreeMap(Collections.reverseOrder());
+////		}
+//		
+//		
+//		// put the rows order
+//		int i = 0;
+//		Set keys = allFlattenRowsValues.keySet();
+//		Iterator<Integer> it = keys.iterator();
+//		while(it.hasNext())	{
+//			Object key = it.next();
+//			orderedValues.put(i, allFlattenRowsValues.get(key));
+//			i++;
+//		}
+//		// put the cols order
+//		keys = allFlattenColsValues.keySet();
+//		it = keys.iterator();
+//		while(it.hasNext())	{
+//			Object key = it.next();
+//			orderedValues.put(i, allFlattenColsValues.get(key));
+//			i++;
+//		}
+//
+//		
+//		
+//		//orderedValues.putAll(allFlattenRowsValues);
+//
+//		
+//		// FIXME : comparator tests
+////		TreeMap<String, Integer> treemap = new TreeMap<String, Integer>(new Comparator<String>() {
+////		    public int compare(String o1, String o2) {
+////		        return o1.toLowerCase().compareTo(o2.toLowerCase());
+////		    }
+////		});
+//		
+//		
+//		// FIXME: DEbug
+////		keys = orderedValues.keySet();
+////		System.err.println("MultipleItemsSelector.getItemsAndSeriesOrderedByXValues() size: " + orderedValues.size());
+////		it = keys.iterator();
+////		while(it.hasNext())	{
+////			Object key = it.next();
+////			ArrayList<Integer> value = orderedValues.get(key);
+////			System.out.println("MultipleItemsSelector.getItemsAndSeriesOrdererByXValues(): item position = " + key + " series = " + value.get(0) + " item = " + value.get(1));
+////		}
+//
+//		return orderedValues;
+//	}
+
 	@Override
 	public Class getResultDataClass() {
 		return CA.class;
