// ============================================================================
//
// 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.wizard.indicator.forms.impl;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.talend.core.model.metadata.builder.connection.MetadataColumn;
import org.talend.cwm.helper.SwitchHelpers;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataprofiler.core.ImageLib;
import org.talend.dataprofiler.core.PluginConstant;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.ui.utils.CheckValueUtils;
import org.talend.dataprofiler.core.ui.utils.DateTimeDialog;
import org.talend.dataprofiler.core.ui.utils.UIMessages;
import org.talend.dataprofiler.core.ui.wizard.indicator.forms.AbstractIndicatorForm;
import org.talend.dataprofiler.core.ui.wizard.indicator.forms.FormEnum;
import org.talend.dataquality.helpers.IndicatorHelper;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dataquality.indicators.IndicatorParameters;
import org.talend.dq.nodes.indicator.type.IndicatorEnum;
import org.talend.utils.sql.Java2SqlType;
import org.talend.utils.sql.TalendTypeConvert;
import org.talend.utils.sugars.ReturnCode;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* DOC zqin class global comment. Detailled comment
*/
public class DataThresholdsForm extends AbstractIndicatorForm {
protected static final String LOWER_LESS_HIGHER = UIMessages.MSG_LOWER_LESS_HIGHER;
protected Text lowerText, higherText;
protected Group group;
private boolean isRangeForDate;
private boolean isDatetime;
private Button lowerBTN, higherBTN;
private Button lowerDelBTN, higherDelBTN;
public DataThresholdsForm(Composite parent, int style, IndicatorParameters parameters) {
super(parent, style, parameters);
// MOD qiongli 2011-11-25,TDQ-4033,consider the date type.
Indicator currentIndicator = (Indicator) parameters.eContainer();
IndicatorEnum currentIndicatorType = IndicatorEnum.findIndicatorEnum(currentIndicator.eClass());
ModelElement analyzedElement = currentIndicator.getAnalyzedElement();
if (null != analyzedElement) {
int sqlType = 0;
if (SwitchHelpers.NAMED_COLUMN_SET_SWITCH.doSwitch(analyzedElement) != null) {
isRangeForDate = false;
isDatetime = false;
} else if (SwitchHelpers.COLUMN_SWITCH.doSwitch(analyzedElement) == null
&& SwitchHelpers.METADATA_COLUMN_SWITCH.doSwitch(analyzedElement) != null) {
MetadataColumn mColumn = SwitchHelpers.METADATA_COLUMN_SWITCH.doSwitch(analyzedElement);
sqlType = TalendTypeConvert.convertToJDBCType(mColumn.getTalendType());
isRangeForDate = Java2SqlType.isDateInSQL(sqlType) && currentIndicatorType == IndicatorEnum.RangeIndicatorEnum;
} else {
sqlType = ((TdColumn) analyzedElement).getSqlDataType().getJavaDataType();
isRangeForDate = Java2SqlType.isDateInSQL(sqlType) && currentIndicatorType == IndicatorEnum.RangeIndicatorEnum;
}
if (isRangeForDate) {
isDatetime = Java2SqlType.isDateTimeSQL(sqlType);
}
}
setupForm();
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.utils.AbstractForm#addFields()
*/
@Override
protected void addFields() {
group = new Group(this, SWT.NONE);
int colsForLayout = 2;
if (isRangeForDate) {
colsForLayout = 4;
}
group.setLayout(new GridLayout(colsForLayout, false));
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
group.setText(DefaultMessagesImpl.getString("DataThresholdsForm.setThresholds")); //$NON-NLS-1$
GridData gdText = new GridData(GridData.FILL_HORIZONTAL);
Label lowerLabel = new Label(group, SWT.NONE);
lowerLabel.setText(DefaultMessagesImpl.getString("DataThresholdsForm.lowerThreshold")); //$NON-NLS-1$
lowerText = new Text(group, SWT.BORDER);
lowerText.setLayoutData(gdText);
// MOD qiongli 2011-11-25,TDQ-4033,consider the date type.
if (isRangeForDate) {
lowerBTN = new Button(group, SWT.PUSH);
lowerBTN.setText("..."); //$NON-NLS-1$
lowerBTN.setToolTipText(DefaultMessagesImpl.getString("IndicatorThresholdsForm.SelectLowerThreshold")); //$NON-NLS-1$
lowerDelBTN = new Button(group, SWT.PUSH);
lowerDelBTN.setImage(ImageLib.getImage(ImageLib.DELETE_ACTION));
lowerDelBTN.setToolTipText(DefaultMessagesImpl.getString("IndicatorThresholdsForm.RemoveLowerThreshold")); //$NON-NLS-1$
lowerText.setEditable(false);
lowerText.setEnabled(false);
}
Label higherLabel = new Label(group, SWT.NONE);
higherLabel.setText(DefaultMessagesImpl.getString("DataThresholdsForm.higherThreshold")); //$NON-NLS-1$
higherText = new Text(group, SWT.BORDER);
higherText.setLayoutData(gdText);
if (isRangeForDate) {
higherBTN = new Button(group, SWT.PUSH);
higherBTN.setText("..."); //$NON-NLS-1$
higherBTN.setToolTipText(DefaultMessagesImpl.getString("IndicatorThresholdsForm.SelectHigherThreshold")); //$NON-NLS-1$
higherDelBTN = new Button(group, SWT.PUSH);
higherDelBTN.setImage(ImageLib.getImage(ImageLib.DELETE_ACTION));
higherDelBTN.setToolTipText(DefaultMessagesImpl.getString("IndicatorThresholdsForm.RemoveHigherThreshold")); //$NON-NLS-1$
higherText.setEditable(false);
higherText.setEnabled(false);
}
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.utils.AbstractForm#addFieldsListeners()
*/
@Override
protected void addFieldsListeners() {
lowerText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
String min = lowerText.getText();
String max = higherText.getText();
if (isRangeForDate) {
ReturnCode rc0 = checkDateFilds(min, max);
if (rc0.isOk()) {
updateStatus(IStatus.OK, MSG_OK);
} else {
updateStatus(IStatus.ERROR, rc0.getMessage());
}
} else {
if (!min.trim().equals("") && !CheckValueUtils.isRealNumberValue(min)) { //$NON-NLS-1$
updateStatus(IStatus.ERROR, MSG_ONLY_NUMBER);
} else if (CheckValueUtils.isAoverB(min, max)) {
updateStatus(IStatus.ERROR, UIMessages.MSG_LOWER_LESS_HIGHER);
} else {
updateStatus(IStatus.OK, MSG_OK);
}
}
}
});
higherText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
String max = higherText.getText();
String min = lowerText.getText();
if (isRangeForDate) {
ReturnCode rc0 = checkDateFilds(min, max);
if (rc0.isOk()) {
updateStatus(IStatus.OK, MSG_OK);
} else {
updateStatus(IStatus.ERROR, rc0.getMessage());
}
} else {
if (!max.trim().equals("") && !CheckValueUtils.isRealNumberValue(max)) { //$NON-NLS-1$
updateStatus(IStatus.ERROR, MSG_ONLY_NUMBER);
} else if (CheckValueUtils.isAoverB(min, max)) {
updateStatus(IStatus.ERROR, UIMessages.MSG_LOWER_LESS_HIGHER);
} else {
updateStatus(IStatus.OK, MSG_OK);
}
}
}
});
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.utils.AbstractForm#initialize()
*/
@Override
protected void initialize() {
String[] dataThreshold = IndicatorHelper.getDataThreshold(parameters);
if (dataThreshold != null) {
lowerText.setText(dataThreshold[0]);
higherText.setText(dataThreshold[1]);
}
}
@Override
public FormEnum getFormEnum() {
return FormEnum.DataThresholdsForm;
}
@Override
public boolean performFinish() {
String min = lowerText.getText();
String max = higherText.getText();
if ("".equals(min) && "".equals(max)) { //$NON-NLS-1$ //$NON-NLS-2$
parameters.setDataValidDomain(null);
} else {
IndicatorHelper.setDataThreshold(parameters, min, max);
Indicator indicator = (Indicator) parameters.eContainer();
IndicatorHelper.propagateDataThresholdsInChildren(indicator);
}
return true;
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.utils.AbstractForm#adaptFormToReadOnly()
*/
@Override
protected void adaptFormToReadOnly() {
}
/*
* Add qiongli 2011-11-25 TDQ-4033.
*/
@Override
protected void addUtilsButtonListeners() {
if (isRangeForDate) {
lowerBTN.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
DateTimeDialog dialog = new DateTimeDialog(null, isDatetime);
if (Window.OK == dialog.open()) {
lowerText.setText(dialog.getSelectDate());
}
}
});
higherBTN.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
DateTimeDialog dialog = new DateTimeDialog(null, isDatetime);
if (Window.OK == dialog.open()) {
higherText.setText(dialog.getSelectDate());
}
}
});
lowerDelBTN.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
lowerText.setText(""); //$NON-NLS-1$
}
});
higherDelBTN.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
higherText.setText(""); //$NON-NLS-1$
}
});
}
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.utils.AbstractForm#checkFieldsValue()
*/
@Override
protected boolean checkFieldsValue() {
return false;
}
protected ReturnCode checkDateFilds(String min, String max) {
ReturnCode rc = new ReturnCode(true);
String statusLabelText = PluginConstant.EMPTY_STRING;
if ((!CheckValueUtils.isDateValue(min) && !CheckValueUtils.isEmpty(min))
|| (!CheckValueUtils.isDateValue(max) && !CheckValueUtils.isEmpty(max))) {
rc.setOk(false);
statusLabelText += MSG_ONLY_DATE + System.getProperty("line.separator"); //$NON-NLS-1$
}
if (CheckValueUtils.isAoverB(min, max)) {
rc.setOk(false);
statusLabelText += UIMessages.MSG_LOWER_LESS_HIGHER + System.getProperty("line.separator"); //$NON-NLS-1$
}
rc.setMessage(statusLabelText);
return rc;
}
}