// ============================================================================
//
// 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.analysis;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.model.ModelElementIndicator;
import org.talend.dataprofiler.core.model.dynamic.DynamicIndicatorModel;
import org.talend.dataprofiler.core.ui.editor.composite.AnalysisColumnTreeViewer;
import org.talend.dataprofiler.core.ui.editor.preview.CompositeIndicator;
import org.talend.dataprofiler.core.ui.editor.preview.IndicatorUnit;
import org.talend.dataprofiler.core.ui.editor.preview.model.ChartTypeStatesFactory;
import org.talend.dataprofiler.core.ui.editor.preview.model.states.IChartTypeStates;
import org.talend.dataprofiler.core.ui.editor.preview.model.states.SummaryStatisticsState;
import org.talend.dataprofiler.core.ui.editor.preview.model.states.pattern.PatternStatisticsState;
import org.talend.dataprofiler.core.ui.events.DynamicChartEventReceiver;
import org.talend.dataprofiler.core.ui.events.EventEnum;
import org.talend.dataprofiler.core.ui.events.EventManager;
import org.talend.dataprofiler.core.ui.events.IEventReceiver;
import org.talend.dataprofiler.core.ui.pref.EditorPreferencePage;
import org.talend.dataprofiler.core.ui.utils.AnalysisUtils;
import org.talend.dataprofiler.core.ui.utils.TOPChartUtils;
import org.talend.dataprofiler.core.ui.utils.pagination.UIPagination;
import org.talend.dataquality.analysis.ExecutionLanguage;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dq.indicators.preview.EIndicatorChartType;
/**
* DOC mzhao UIPagination class global comment. Detailled comment
*/
public class MasterPaginationInfo extends IndicatorPaginationInfo {
private List<ExpandableComposite> previewChartList;
private AnalysisColumnTreeViewer treeViewer;
// Added TDQ-9272 20140806, use the Dynamic model for SQL mode only, Java mode will not use it.
private boolean isSQLMode = true;
public MasterPaginationInfo(ScrolledForm form, List<ExpandableComposite> previewChartList,
List<? extends ModelElementIndicator> modelElementIndicators, UIPagination uiPagination) {
this(form, previewChartList, modelElementIndicators, uiPagination, null);
}
public MasterPaginationInfo(ScrolledForm form, List<ExpandableComposite> previewChartList,
List<? extends ModelElementIndicator> modelElementIndicators, UIPagination uiPagination,
AnalysisColumnTreeViewer treeViewer) {
super(form, modelElementIndicators, uiPagination);
this.previewChartList = previewChartList;
if (treeViewer != null) {
this.treeViewer = treeViewer;
if (ExecutionLanguage.JAVA.equals(treeViewer.getLanguage())) {
isSQLMode = false;
}
}
}
@Override
protected void render() {
// refresh analysis tree
if (treeViewer != null) {
treeViewer.setElements(modelElementIndicators.toArray(new ModelElementIndicator[modelElementIndicators.size()]),
false);
}
// chart composite don't display So need't consider it.
if (previewChartList == null || uiPagination.getChartComposite() == null) {
return;
}
previewChartList.clear();
clearDynamicList();
if (EditorPreferencePage.isHideGraphicsSectionForSettingsPage() || !TOPChartUtils.getInstance().isTOPChartInstalled()) {
return;
}
for (ModelElementIndicator modelElementIndicator : modelElementIndicators) {
final ExpandableComposite exComp = uiPagination.getToolkit().createExpandableComposite(
uiPagination.getChartComposite(), ExpandableComposite.TREE_NODE | ExpandableComposite.CLIENT_INDENT);
needDispostWidgets.add(exComp);
exComp.setText(DefaultMessagesImpl
.getString("ColumnMasterDetailsPage.column", modelElementIndicator.getElementName())); //$NON-NLS-1$
exComp.setLayout(new GridLayout());
exComp.setData(modelElementIndicator);
previewChartList.add(exComp);
Composite comp = uiPagination.getToolkit().createComposite(exComp);
comp.setLayout(new GridLayout());
comp.setLayoutData(new GridData(GridData.FILL_BOTH));
Map<EIndicatorChartType, List<IndicatorUnit>> indicatorComposite = CompositeIndicator.getInstance()
.getIndicatorComposite(modelElementIndicator);
for (EIndicatorChartType chartType : indicatorComposite.keySet()) {
List<IndicatorUnit> units = indicatorComposite.get(chartType);
if (!units.isEmpty()) {
if (chartType == EIndicatorChartType.UDI_FREQUENCY) {
for (IndicatorUnit unit : units) {
List<IndicatorUnit> specialUnit = new ArrayList<IndicatorUnit>();
specialUnit.add(unit);
createChart(comp, chartType, specialUnit);
}
} else {
createChart(comp, chartType, units);
}
}
}
exComp.addExpansionListener(new ExpansionAdapter() {
@Override
public void expansionStateChanged(ExpansionEvent e) {
uiPagination.getChartComposite().layout();
form.reflow(true);
if (e.getState()) {
exComp.setExpanded(e.getState());
exComp.getParent().pack();
}
}
});
exComp.setExpanded(true);
exComp.setClient(comp);
uiPagination.getChartComposite().layout();
}
}
/**
* DOC bZhou Comment method "createChart".
*
* @param comp
* @param chartType
* @param units
*/
private void createChart(Composite comp, EIndicatorChartType chartType, List<IndicatorUnit> units) {
final IChartTypeStates chartTypeState = ChartTypeStatesFactory.getChartState(chartType, units);
boolean isPattern = chartTypeState instanceof PatternStatisticsState;
Object chart = null;
try {
// MOD TDQ-8787 20140722 yyin:(when first switch from master to result) if there is some dynamic event for
// the
// current indicator, use its dataset directly (TDQ-9241)
IEventReceiver event = EventManager.getInstance().findRegisteredEvent(units.get(0).getIndicator(),
EventEnum.DQ_DYMANIC_CHART, 0);
if (event == null) {
chart = chartTypeState.getChart();
} else {
chart = chartTypeState.getChart(((DynamicChartEventReceiver) event).getDataset());
}// ~
if (chart == null) {
return;
}
if (!isPattern) { // need not to decorate the chart of Pattern(Regex/Sql/UdiMatch)
TOPChartUtils.getInstance().decorateChart(chart, false);
} else {
TOPChartUtils.getInstance().decoratePatternMatching(chart);
}
Object chartComp = TOPChartUtils.getInstance().createChartComposite(comp, SWT.NONE, chart, true);
addListenerToChartComp(chartComp, chartTypeState);
List<Indicator> indicators = getIndicators(units);
if (isSQLMode) {// use the dynamic model for SQL mode only.
DynamicIndicatorModel dyModel = AnalysisUtils.createDynamicModel(chartType, indicators, chart);
if (EIndicatorChartType.SUMMARY_STATISTICS.equals(chartType)) {
if (units.size() == SummaryStatisticsState.FULL_FLAG) {
indicators = getIndicatorsForTable(units, false);
}
dyModel.setSummaryIndicators(indicators);
}
this.dynamicList.add(dyModel);
if (EIndicatorChartType.SUMMARY_STATISTICS.equals(chartType)) {
// for summary indicators: need to record the chart composite, which is used for create BAW chart
dyModel.setBawParentChartComp(chartComp);
}
}
} catch (Error e) {
log.error(DefaultMessagesImpl.getString("IndicatorPaginationInfo.FailToCreateChart"), e); //$NON-NLS-1$
} catch (Exception exp) {
log.error(DefaultMessagesImpl.getString("IndicatorPaginationInfo.FailToCreateChart"), exp); //$NON-NLS-1$
}
}
/**
* Getter for previewChartList. not used any more
*
* @return the previewChartList
*/
@Deprecated
public List<ExpandableComposite> getPreviewChartList() {
return previewChartList;
}
}