// ============================================================================
//
// 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.composite;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataprofiler.core.ImageLib;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage;
import org.talend.dataprofiler.core.ui.editor.analysis.ColumnSetAnalysisDetailsPage;
import org.talend.dataprofiler.core.ui.editor.analysis.CorrelationAnalysisDetailsPage;
import org.talend.dataprofiler.core.ui.editor.preview.ColumnSetIndicatorUnit;
import org.talend.dataprofiler.core.ui.utils.OpeningHelpWizardDialog;
import org.talend.dataprofiler.core.ui.wizard.indicator.IndicatorOptionsWizard;
import org.talend.dataprofiler.core.ui.wizard.indicator.forms.FormEnum;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.domain.Domain;
import org.talend.dataquality.helpers.IndicatorHelper;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dataquality.indicators.IndicatorParameters;
import org.talend.dataquality.indicators.columnset.AllMatchIndicator;
import org.talend.dataquality.indicators.columnset.ColumnSetMultiValueIndicator;
import org.talend.dataquality.indicators.columnset.CountAvgNullIndicator;
import org.talend.dataquality.indicators.columnset.MinMaxDateIndicator;
import org.talend.dataquality.indicators.columnset.SimpleStatIndicator;
import org.talend.dataquality.indicators.columnset.WeakCorrelationIndicator;
import org.talend.dq.nodes.indicator.type.IndicatorEnum;
/**
* DOC yyi class global comment. Detailled comment
*/
public class IndicatorsComp extends AbstractPagePart {
protected static Logger log = Logger.getLogger(IndicatorsComp.class);
public static final String INDICATOR_KEY = "INDICATOR_KEY"; //$NON-NLS-1$
private Composite parentComp;
private Tree tree;
private List<TdColumn> columnSetMultiValueList;
private AbstractAnalysisMetadataPage masterPage;
private ColumnSetMultiValueIndicator columnSetIndicator;
public IndicatorsComp(Composite parent) {
parentComp = parent;
tree = createTree(parent);
tree.setData(this);
columnSetMultiValueList = new ArrayList<TdColumn>();
}
public IndicatorsComp(Composite parent, AbstractAnalysisMetadataPage masterPage) {
this(parent);
this.masterPage = masterPage;
this.setDirty(false);
}
/**
* @param parent
*/
private Tree createTree(Composite parent) {
final Tree newTree = new Tree(parent, SWT.MULTI | SWT.BORDER);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(newTree);
newTree.setHeaderVisible(true);
TreeColumn column1 = new TreeColumn(newTree, SWT.CENTER);
column1.setWidth(190);
column1.setText(DefaultMessagesImpl.getString("IndicatorsComp.Indicators")); //$NON-NLS-1$
TreeColumn column2 = new TreeColumn(newTree, SWT.CENTER);
column2.setWidth(80);
column2.setText(DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.options")); //$NON-NLS-1$
parent.layout();
return newTree;
}
// input composite indicator
public void setInput(Object... obj) {
List<ColumnSetIndicatorUnit> indicatortList = new ArrayList<ColumnSetIndicatorUnit>();
for (Object indicatorObj : obj) {
// for SimpleStatIndicator, CountAvgNullIndicator, MinMaxDateIndicator, WeakCorrelationIndicator
if (indicatorObj instanceof SimpleStatIndicator || indicatorObj instanceof CountAvgNullIndicator
|| indicatorObj instanceof MinMaxDateIndicator || indicatorObj instanceof WeakCorrelationIndicator) {
columnSetIndicator = (ColumnSetMultiValueIndicator) indicatorObj;
for (Indicator indicator : IndicatorHelper.getIndicatorLeavesBySingleNode(columnSetIndicator)) {
IndicatorEnum indicatorEnum = IndicatorEnum.findIndicatorEnum(indicator.eClass());
indicatortList.add(new ColumnSetIndicatorUnit(indicatorEnum, indicator));
}
// MOD msjian TDQ-8860: we always show the allMatchIndicator in the Indicators section
} else if (indicatorObj instanceof AllMatchIndicator) { // for AllMatchIndicator
AllMatchIndicator allMatchIndicator = (AllMatchIndicator) indicatorObj;
indicatortList.add(new ColumnSetIndicatorUnit(IndicatorEnum.AllMatchIndicatorEnum, allMatchIndicator));
// TDQ-8860~
}
// ~
}
setElements(indicatortList.toArray(new ColumnSetIndicatorUnit[indicatortList.size()]));
}
/**
*
* init elements for the tree
*
* @param indicatorUnits
*/
public void setElements(ColumnSetIndicatorUnit[] indicatorUnits) {
this.tree.dispose();
this.tree = createTree(this.parentComp);
tree.setData(this);
createIndicatorItems(indicatorUnits);
}
/**
*
*
*
* @param indicatorUnits
*/
private void createIndicatorItems(ColumnSetIndicatorUnit[] indicatorUnits) {
for (ColumnSetIndicatorUnit indicatorUnit : indicatorUnits) {
createOneUnit(indicatorUnit);
}
}
/**
*
* create element on the tree by indicatorUnit
*
* @param indicator
*/
public void createOneUnit(ColumnSetIndicatorUnit indicatorUnit) {
final TreeItem indicatorItem = new TreeItem(this.tree, SWT.NONE);
indicatorItem.setData(INDICATOR_KEY, indicatorUnit);
indicatorItem.setImage(0, ImageLib.getImage(ImageLib.IND_DEFINITION));
String indicatorName = indicatorUnit.getIndicatorName();
String label = indicatorName == null ? "unknown indicator" : indicatorName;//$NON-NLS-1$
indicatorItem.setText(0, label);
TreeEditor optionEditor;
optionEditor = new TreeEditor(tree);
final Label optionLabel = createTreeItemLabel(tree, ImageLib.OPTION, "AnalysisColumnTreeViewer.options"); //$NON-NLS-1$
optionLabel.setData(indicatorUnit);
optionLabel.addMouseListener(new MouseAdapter() {
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.MouseAdapter#mouseDown(org.eclipse.swt .events.MouseEvent)
*/
@Override
public void mouseDown(MouseEvent e) {
if (openIndicatorOptionDialog(Display.getCurrent().getActiveShell(), indicatorItem)) {
optionLabel.setImage(ImageLib.getImage(ImageLib.INDICATOR_OPTION_CHECKED));
}
}
});
optionEditor.minimumWidth = optionLabel.getImage().getBounds().width;
optionEditor.horizontalAlignment = SWT.CENTER;
optionEditor.setEditor(optionLabel, indicatorItem, 1);
if (hasIndicatorParameters(indicatorUnit.getIndicator())) {
optionLabel.setImage(ImageLib.getImage(ImageLib.INDICATOR_OPTION_CHECKED));
}
}
public boolean openIndicatorOptionDialog(Shell shell, TreeItem indicatorItem) {
if (isDirty()) {
masterPage.doSave(null);
}
ColumnSetIndicatorUnit indicatorUnit = (ColumnSetIndicatorUnit) indicatorItem.getData(INDICATOR_KEY);
if (indicatorUnit.isExsitingForm()) {
IndicatorOptionsWizard wizard = new IndicatorOptionsWizard(indicatorUnit);
String href = FormEnum.getFirstFormHelpHref(indicatorUnit);
OpeningHelpWizardDialog optionDialog = new OpeningHelpWizardDialog(shell, wizard, href);
if (Window.OK == optionDialog.open()) {
masterPage.setDirty(wizard.isDirty());
return hasIndicatorParameters(indicatorUnit.getIndicator());
}
} else {
MessageDialogWithToggle.openInformation(shell, DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.information"), //$NON-NLS-1$
DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.nooption")); //$NON-NLS-1$
}
return false;
}
private boolean hasIndicatorParameters(Indicator indicator) {
IndicatorParameters parameters = indicator.getParameters();
if (parameters == null) {
return false;
}
Domain indicatorValidDomain = parameters.getIndicatorValidDomain();
if (indicatorValidDomain != null) {
return true;
}
return false;
}
public List<TdColumn> getColumnSetMultiValueList() {
return this.columnSetMultiValueList;
}
/**
* Getter for analysis.
*
* @return the analysis
*/
public Analysis getAnalysis() {
if (masterPage instanceof ColumnSetAnalysisDetailsPage) {
return ((ColumnSetAnalysisDetailsPage) masterPage).getCurrentModelElement();
} else if (masterPage instanceof CorrelationAnalysisDetailsPage) {
return ((CorrelationAnalysisDetailsPage) masterPage).getCurrentModelElement();
}
return null;
}
public Tree getTree() {
return tree;
}
@Override
public void updateModelViewer() {
if (masterPage instanceof ColumnSetAnalysisDetailsPage) {
((ColumnSetAnalysisDetailsPage) masterPage).recomputeIndicators();
} else if (masterPage instanceof CorrelationAnalysisDetailsPage) {
((CorrelationAnalysisDetailsPage) masterPage).recomputeIndicators();
}
columnSetMultiValueList.clear();
}
}