2 |
2 |
|
3 |
3 |
import java.awt.BasicStroke;
|
4 |
4 |
import java.awt.Color;
|
|
5 |
import java.text.Collator;
|
5 |
6 |
import java.text.DecimalFormat;
|
6 |
7 |
import java.util.ArrayList;
|
|
8 |
import java.util.HashMap;
|
|
9 |
import java.util.TreeMap;
|
7 |
10 |
|
8 |
11 |
import org.jfree.chart.ChartFactory;
|
9 |
12 |
import org.jfree.chart.JFreeChart;
|
... | ... | |
15 |
18 |
import org.jfree.chart.plot.XYPlot;
|
16 |
19 |
import org.jfree.chart.renderer.xy.XYItemRenderer;
|
17 |
20 |
import org.jfree.chart.title.LegendTitle;
|
|
21 |
import org.jfree.data.xy.XYDataset;
|
18 |
22 |
import org.jfree.ui.TextAnchor;
|
19 |
23 |
import org.txm.ca.core.chartsengine.base.CAChartCreator;
|
20 |
24 |
import org.txm.ca.core.chartsengine.base.Utils;
|
... | ... | |
292 |
296 |
chart = ChartFactory.createScatterPlot(Utils.createCAFactorialMapChartTitle(ca), "", "", dataset, PlotOrientation.VERTICAL, TXMPreferences.getBoolean(CAPreferences.PREFERENCES_NODE, ChartsEnginePreferences.SHOW_LEGEND), false, false);
|
293 |
297 |
|
294 |
298 |
// Custom renderer
|
295 |
|
chart.getXYPlot().setRenderer(this.getChartsEngine().getTheme().createFCARenderer());
|
|
299 |
chart.getXYPlot().setRenderer(new FCAItemSelectionRenderer());
|
296 |
300 |
|
297 |
301 |
|
298 |
302 |
}
|
... | ... | |
330 |
334 |
public void updateChartCAFactorialMapSetLabelItemsSelectionOrder(Object chart, String[] rowLabels, String[] colLabels) {
|
331 |
335 |
|
332 |
336 |
MultipleItemsSelector selector = (MultipleItemsSelector) ((FCAItemSelectionRenderer)((JFreeChart) chart).getXYPlot().getRenderer()).getItemsSelector();
|
333 |
|
selector.setCyclicItemsOrder(selector.getItemsAndSeriesOrderedByLabels((FCAXYDataset)((JFreeChart) chart).getXYPlot().getDataset(), rowLabels, colLabels));
|
|
337 |
selector.setCyclicItemsOrder(this.getItemsAndSeriesOrderedByLabels((FCAXYDataset)((JFreeChart) chart).getXYPlot().getDataset(), rowLabels, colLabels));
|
334 |
338 |
}
|
335 |
339 |
|
|
340 |
|
|
341 |
/**
|
|
342 |
* 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.
|
|
343 |
* @param dataset
|
|
344 |
* @return
|
|
345 |
*/
|
|
346 |
public TreeMap<Object, ArrayList<Integer>> getItemsAndSeriesOrderedByLabels(FCAXYDataset dataset, String[] rowLabels, String[] colLabels) {
|
|
347 |
|
|
348 |
TreeMap<Object, ArrayList<Integer>> orderedValues = new TreeMap<Object, ArrayList<Integer>>();
|
|
349 |
|
|
350 |
int[] rowIndices = dataset.getOrderedLabelIndices(0, rowLabels);
|
|
351 |
int[] colIndices = dataset.getOrderedLabelIndices(1, colLabels);
|
|
352 |
|
|
353 |
int i = 0;
|
|
354 |
for(; i < rowIndices.length; i++) {
|
|
355 |
ArrayList<Integer> itemData = new ArrayList<Integer>(2);
|
|
356 |
itemData.add(0); // series
|
|
357 |
itemData.add(rowIndices[i]); // item
|
|
358 |
orderedValues.put(i, itemData);
|
|
359 |
}
|
|
360 |
for(int j = 0; j < colIndices.length; j++) {
|
|
361 |
ArrayList<Integer> itemData = new ArrayList<Integer>(2);
|
|
362 |
itemData.add(1); // series
|
|
363 |
itemData.add(colIndices[j]); // item
|
|
364 |
orderedValues.put(j + i, itemData);
|
|
365 |
}
|
|
366 |
|
|
367 |
return orderedValues;
|
|
368 |
}
|
|
369 |
|
|
370 |
|
|
371 |
/**
|
|
372 |
* Gets a map where the values of the dataset are orderer by X item value and flatten despite of the series.
|
|
373 |
* @param dataset
|
|
374 |
* @return
|
|
375 |
*/
|
|
376 |
public TreeMap<Object, ArrayList<Integer>> getItemsAndSeriesOrderedByXValues(XYDataset dataset) {
|
|
377 |
HashMap<Object, ArrayList<Integer>> allFlattenValues = new HashMap<Object, ArrayList<Integer>>();
|
|
378 |
for(int i = 0; i < dataset.getSeriesCount(); i++) {
|
|
379 |
for(int j = 0; j < dataset.getItemCount(i); j++) {
|
|
380 |
ArrayList<Integer> itemData = new ArrayList<Integer>(2);
|
|
381 |
itemData.add(i); // series
|
|
382 |
itemData.add(j); // item
|
|
383 |
|
|
384 |
// 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)
|
|
385 |
// allFlattenValues.put((int) dataset.getXValue(i, j), itemData);
|
336 |
386 |
|
|
387 |
|
|
388 |
// Test FCAXYDataset
|
|
389 |
|
|
390 |
// FIXME: tests, navigation clavier par ordre alphabétique d'une AFC (toute séries confondues)
|
|
391 |
String label = ((FCAXYDataset)dataset).getLabel(i, j);
|
|
392 |
allFlattenValues.put(label, itemData);
|
|
393 |
|
|
394 |
// FIXME: tests, navigation clavier par coord X d'une AFC (toute séries confondues)
|
|
395 |
//allFlattenValues.put(dataset.getX(i, j), itemData);
|
|
396 |
|
|
397 |
}
|
|
398 |
}
|
|
399 |
|
|
400 |
|
|
401 |
// FIXME: tests, navigation clavier sur toutes les courbes en même temps d'une Progression
|
|
402 |
// TreeMap<Object, ArrayList<Integer>> orderedValues = new TreeMap<Object, ArrayList<Integer>>(allFlattenValues);
|
|
403 |
|
|
404 |
// FIXME: tests, navigation clavier par ordre alphabétique d'une AFC
|
|
405 |
TreeMap<Object, ArrayList<Integer>> orderedValues = new TreeMap<Object, ArrayList<Integer>>(Collator.getInstance());
|
|
406 |
orderedValues.putAll(allFlattenValues);
|
|
407 |
|
|
408 |
|
|
409 |
// FIXME : comparator tests
|
|
410 |
// TreeMap<String, Integer> treemap = new TreeMap<String, Integer>(new Comparator<String>() {
|
|
411 |
// public int compare(String o1, String o2) {
|
|
412 |
// return o1.toLowerCase().compareTo(o2.toLowerCase());
|
|
413 |
// }
|
|
414 |
// });
|
|
415 |
|
|
416 |
|
|
417 |
// FIXME: DEbug
|
|
418 |
// Set cles = orderedValues.keySet();
|
|
419 |
// System.err.println("MultipleItemsSelector.getItemsAndSeriesOrderedByXValues() size: " + orderedValues.size());
|
|
420 |
// Iterator<Integer> it = cles.iterator();
|
|
421 |
// while(it.hasNext()) {
|
|
422 |
// Object key = it.next();
|
|
423 |
// ArrayList<Integer> value = orderedValues.get(key);
|
|
424 |
// System.out.println("MultipleItemsSelector.getItemsAndSeriesOrdererByXValues(): item position = " + key + " series = " + value.get(0) + " item = " + value.get(1));
|
|
425 |
// }
|
|
426 |
|
|
427 |
return orderedValues;
|
|
428 |
}
|
|
429 |
|
|
430 |
|
|
431 |
|
|
432 |
|
|
433 |
/**
|
|
434 |
* Gets a map where the values of the dataset are orderer by label and flatten but grouped by series.
|
|
435 |
* @param dataset
|
|
436 |
* @return
|
|
437 |
*/
|
|
438 |
// FIXME: tests
|
|
439 |
// public TreeMap<Object, ArrayList<Integer>> getItemsAndSeriesOrderedByLabels(FCAXYDataset dataset) {
|
|
440 |
// return this.getItemsAndSeriesOrderedByLabels(dataset, false, false);
|
|
441 |
// }
|
|
442 |
//
|
|
443 |
/**
|
|
444 |
* Gets a map where the values of the dataset are orderer by label and flatten but grouped by series.
|
|
445 |
* @param dataset
|
|
446 |
* @return
|
|
447 |
*/
|
|
448 |
// FIXME: tests, became useless ? (since we can give labels order with getItemsAndSeriesOrderedByLabels(FCAXYDataset dataset, String[] rowLabels, String[] colLabels)) )
|
|
449 |
// public TreeMap<Object, ArrayList<Integer>> getItemsAndSeriesOrderedByLabels(FCAXYDataset dataset, boolean rowsReverse, boolean colsReverse) {
|
|
450 |
//
|
|
451 |
// Comparator rowsComparator;
|
|
452 |
// Comparator colsComparator;
|
|
453 |
//
|
|
454 |
// if(rowsReverse) {
|
|
455 |
// rowsComparator = Collections.reverseOrder(Collator.getInstance());
|
|
456 |
// }
|
|
457 |
// else {
|
|
458 |
// rowsComparator = Collator.getInstance();
|
|
459 |
// }
|
|
460 |
//
|
|
461 |
// if(colsReverse) {
|
|
462 |
// colsComparator = Collections.reverseOrder(Collator.getInstance());
|
|
463 |
// }
|
|
464 |
// else {
|
|
465 |
// colsComparator = Collator.getInstance();
|
|
466 |
// }
|
|
467 |
//
|
|
468 |
//
|
|
469 |
// TreeMap<Object, ArrayList<Integer>> allFlattenRowsValues = new TreeMap<Object, ArrayList<Integer>>(rowsComparator);
|
|
470 |
// TreeMap<Object, ArrayList<Integer>> allFlattenColsValues = new TreeMap<Object, ArrayList<Integer>>(colsComparator);
|
|
471 |
//
|
|
472 |
// // sort the rows by label
|
|
473 |
// for(int i = 0; i < dataset.getItemCount(0); i++) {
|
|
474 |
// ArrayList<Integer> itemData = new ArrayList<Integer>(2);
|
|
475 |
// itemData.add(0); // series
|
|
476 |
// itemData.add(i); // item
|
|
477 |
// allFlattenRowsValues.put(((FCAXYDataset)dataset).getLabel(0, i), itemData);
|
|
478 |
//
|
|
479 |
// // FIXME: tests, navigation clavier par coord X d'une AFC (toute séries confondues)
|
|
480 |
// //allFlattenRowsValues.put(dataset.getX(0, j), itemData);
|
|
481 |
// }
|
|
482 |
//
|
|
483 |
//
|
|
484 |
// // sort the cols by label
|
|
485 |
// for(int i = 0; i < dataset.getItemCount(1); i++) {
|
|
486 |
// ArrayList<Integer> itemData = new ArrayList<Integer>(2);
|
|
487 |
// itemData.add(1); // series
|
|
488 |
// itemData.add(i); // item
|
|
489 |
// allFlattenColsValues.put(((FCAXYDataset)dataset).getLabel(1, i), itemData);
|
|
490 |
//
|
|
491 |
// // FIXME: tests, navigation clavier par coord X d'une AFC (toute séries confondues)
|
|
492 |
// //allFlattenColsValues.put(dataset.getX(1, j), itemData);
|
|
493 |
// }
|
|
494 |
//
|
|
495 |
//
|
|
496 |
//
|
|
497 |
// // FIXME: tests, navigation clavier par ordre alphabétique d'une AFC
|
|
498 |
// TreeMap<Object, ArrayList<Integer>> orderedValues = new TreeMap<Object, ArrayList<Integer>>();
|
|
499 |
//// if(revertedOrder) {
|
|
500 |
//// orderedValues = new TreeMap(Collections.reverseOrder());
|
|
501 |
//// }
|
|
502 |
//
|
|
503 |
//
|
|
504 |
// // put the rows order
|
|
505 |
// int i = 0;
|
|
506 |
// Set keys = allFlattenRowsValues.keySet();
|
|
507 |
// Iterator<Integer> it = keys.iterator();
|
|
508 |
// while(it.hasNext()) {
|
|
509 |
// Object key = it.next();
|
|
510 |
// orderedValues.put(i, allFlattenRowsValues.get(key));
|
|
511 |
// i++;
|
|
512 |
// }
|
|
513 |
// // put the cols order
|
|
514 |
// keys = allFlattenColsValues.keySet();
|
|
515 |
// it = keys.iterator();
|
|
516 |
// while(it.hasNext()) {
|
|
517 |
// Object key = it.next();
|
|
518 |
// orderedValues.put(i, allFlattenColsValues.get(key));
|
|
519 |
// i++;
|
|
520 |
// }
|
|
521 |
//
|
|
522 |
//
|
|
523 |
//
|
|
524 |
// //orderedValues.putAll(allFlattenRowsValues);
|
|
525 |
//
|
|
526 |
//
|
|
527 |
// // FIXME : comparator tests
|
|
528 |
//// TreeMap<String, Integer> treemap = new TreeMap<String, Integer>(new Comparator<String>() {
|
|
529 |
//// public int compare(String o1, String o2) {
|
|
530 |
//// return o1.toLowerCase().compareTo(o2.toLowerCase());
|
|
531 |
//// }
|
|
532 |
//// });
|
|
533 |
//
|
|
534 |
//
|
|
535 |
// // FIXME: DEbug
|
|
536 |
//// keys = orderedValues.keySet();
|
|
537 |
//// System.err.println("MultipleItemsSelector.getItemsAndSeriesOrderedByXValues() size: " + orderedValues.size());
|
|
538 |
//// it = keys.iterator();
|
|
539 |
//// while(it.hasNext()) {
|
|
540 |
//// Object key = it.next();
|
|
541 |
//// ArrayList<Integer> value = orderedValues.get(key);
|
|
542 |
//// System.out.println("MultipleItemsSelector.getItemsAndSeriesOrdererByXValues(): item position = " + key + " series = " + value.get(0) + " item = " + value.get(1));
|
|
543 |
//// }
|
|
544 |
//
|
|
545 |
// return orderedValues;
|
|
546 |
// }
|
|
547 |
|
337 |
548 |
@Override
|
338 |
549 |
public Class getResultDataClass() {
|
339 |
550 |
return CA.class;
|