// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.dataprofiler.core.ui.editor.preview;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.ui.editor.preview.DatasetUtils.DateValueAggregate;
import org.talend.dataprofiler.core.ui.utils.TOPChartUtils;
import org.talend.dataprofiler.service.utils.ValueAggregator;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.indicators.columnset.ColumnSetMultiValueIndicator;
import org.talend.dataquality.indicators.columnset.ColumnsetPackage;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* DOC bzhou class global comment. Detailled comment
*/
public class HideSeriesChartComposite {
private ColumnSetMultiValueIndicator indicator;
private ModelElement column;
private Object chart;
private Object chartComposite;
private static final String SERIES_KEY_ID = "SERIES_KEY"; //$NON-NLS-1$
// used for the bubble chart to add mouse listeners
private Map<Integer, Object> bubbleQueryMap;
private Map<Integer, Object> ganttQueryMap;
private Analysis analysis = null;
boolean isCoungAvg = false;
boolean isMinMax = false;
public HideSeriesChartComposite(Composite comp, Analysis ana, ColumnSetMultiValueIndicator indicator, ModelElement column,
boolean isNeedUtility) {
this.analysis = ana;
this.indicator = indicator;
this.column = column;
isCoungAvg = ColumnsetPackage.eINSTANCE.getCountAvgNullIndicator().equals(indicator.eClass());
isMinMax = ColumnsetPackage.eINSTANCE.getMinMaxDateIndicator().equals(indicator.eClass());
this.chart = createChart();
chartComposite = TOPChartUtils.getInstance().createChartCompositeForCorrelationAna(comp, chart,
indicator.getAnalyzedColumns().size() * 30 < 230 ? 230 : indicator.getAnalyzedColumns().size() * 30);
if (chart != null && isNeedUtility) {
createUtilityControl(comp);
}
addSpecifiedListeners(isCoungAvg, isMinMax);
}
private void addSpecifiedListeners(final boolean isAvg, final boolean isDate) {
if (isAvg) {
TOPChartUtils.getInstance().addSpecifiedListenersForCorrelationChart(chartComposite, chart, isAvg, isDate,
bubbleQueryMap);
} else if (isDate) {
TOPChartUtils.getInstance().addSpecifiedListenersForCorrelationChart(chartComposite, chart, isAvg, isDate,
ganttQueryMap);
}
}
/**
* DOC bzhou Comment method "createChart".
*
* @return
*/
private Object createChart() {
Object jchart = null;
if (isCoungAvg) {
jchart = createBubbleChart();
TOPChartUtils.getInstance().decorateChart(jchart, false);
} else {
if (isMinMax) {
final int indexOfDateCol = indicator.getDateColumns().indexOf(column);
assert indexOfDateCol != -1;
jchart = createGanttChart();
TOPChartUtils.getInstance().decorateChart(jchart, false);
}
}
return jchart;
}
/**
* DOC yyin Comment method "createGanttChart".
*
* @return
*/
private Object createGanttChart() {
final Map<String, DateValueAggregate> createGannttDatasets = DatasetUtils.createGanttDatasets(indicator, column);
Object ganttDataset = TOPChartUtils.getInstance().createTaskSeriesCollection();
final Iterator<String> iterator = createGannttDatasets.keySet().iterator();
while (iterator.hasNext()) {
final String next = iterator.next();
createGannttDatasets.get(next).addSeriesToGanttDataset(ganttDataset, next);
}
ganttQueryMap = DatasetUtils.getGanttQueryMap(createGannttDatasets, indicator, column, analysis);
String chartAxies = DefaultMessagesImpl.getString("TopChartFactory.chartAxies", column.getName()); //$NON-NLS-1$
Object jchart = TOPChartUtils.getInstance().createGanttChart(chartAxies, ganttDataset);
final int nbNominalColumns = indicator.getNominalColumns().size();
final int nbDateFunctions = indicator.getDateFunctions().size();
final int indexOfDateCol = indicator.getDateColumns().indexOf(column);
List<Object[]> shownRows = new ArrayList<Object[]>();
if (createGannttDatasets.size() != indicator.getListRows().size()) {// TDQ-6450 some null values
final int firstDateColumnIdx = nbNominalColumns + nbDateFunctions * indexOfDateCol;
for (Object[] row : indicator.getListRows()) {
final Object minObj = row[firstDateColumnIdx];
final Object maxobj = row[firstDateColumnIdx + 1];
if (minObj == null || maxobj == null) {
continue;
} else {
shownRows.add(row);
}
}
} else {
shownRows = indicator.getListRows();
}// ~end TDQ-6450
TOPChartUtils.getInstance().createAnnotOnGantt(jchart, shownRows,
nbNominalColumns + nbDateFunctions * indexOfDateCol + 3, nbNominalColumns);
return jchart;
}
/**
* DOC yyin Comment method "createBubbleChart".
*
* @return
*/
private Object createBubbleChart() {
final Map<String, ValueAggregator> createXYZDatasets = DatasetUtils.createXYZDatasets(indicator, column);
Object dataset = TOPChartUtils.getInstance().createDefaultXYZDataset();
final Iterator<String> iterator = createXYZDatasets.keySet().iterator();
while (iterator.hasNext()) {
final String next = iterator.next();
createXYZDatasets.get(next).addSeriesToXYZDataset(dataset, next, TOPChartUtils.getInstance().getChartService());
}
bubbleQueryMap = DatasetUtils.getQueryMap(createXYZDatasets, indicator, column, analysis);
String chartName = DefaultMessagesImpl.getString("TopChartFactory.ChartName", column.getName()); //$NON-NLS-1$
return TOPChartUtils.getInstance().createBubbleChart(chartName, dataset, createXYZDatasets);
}
private void createUtilityControl(Composite parent) {
Composite comp = new Composite(parent, SWT.BORDER);
comp.setLayout(new GridLayout());
comp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_END));
comp.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GRAY));
SelectionAdapter listener = (SelectionAdapter) TOPChartUtils.getInstance().createSelectionAdapterForButton(chart,
isCoungAvg, isMinMax);
if (this.isCoungAvg) {
int count = TOPChartUtils.getInstance().getSeriesCount(chart);
for (int i = 0; i < count; i++) {
Button checkBtn = new Button(comp, SWT.CHECK);
checkBtn.setText(TOPChartUtils.getInstance().getSeriesKeyOfBubbleChart(chart, i));
checkBtn.setSelection(true);
checkBtn.addSelectionListener(listener);
checkBtn.setData(SERIES_KEY_ID, i);
}
}
if (isMinMax) {
int count = TOPChartUtils.getInstance().getSeriesRowCount(chart);
for (int i = 0; i < count; i++) {
Button checkBtn = new Button(comp, SWT.CHECK);
checkBtn.setText(TOPChartUtils.getInstance().getSeriestKeyOfGanttChart(chart, i));
checkBtn.setSelection(true);
checkBtn.addSelectionListener(listener);
checkBtn.setData(SERIES_KEY_ID, i);
}
}
}
/**
* DOC yyin Comment method "setLayoutData".
*
* @param gd
*/
public void setLayoutData(GridData gd) {
((Composite) this.chartComposite).setLayoutData(gd);
}
}