// ============================================================================
//
// 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.dialog;
import java.util.HashMap;
import org.apache.commons.lang.StringUtils;
import org.eclipse.help.HelpSystem;
import org.eclipse.help.IContext;
import org.eclipse.help.ui.internal.views.HelpTray;
import org.eclipse.help.ui.internal.views.ReusableHelpPart;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.talend.cwm.relational.TdExpression;
import org.talend.dataprofiler.core.PluginConstant;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.manager.DQPreferenceManager;
import org.talend.dataprofiler.core.ui.utils.UDIUtils;
import org.talend.dataprofiler.help.HelpPlugin;
import org.talend.dataquality.helpers.BooleanExpressionHelper;
import org.talend.dataquality.helpers.IndicatorCategoryHelper;
import org.talend.dataquality.indicators.definition.IndicatorCategory;
import org.talend.dq.dbms.GenericSQLHandler;
import org.talend.dq.helper.UDIHelper;
/**
* DOC yyi 2009-09-11 Feature:9030
*/
public class ExpressionEditDialog extends TrayDialog {
private static final String RESET = DefaultMessagesImpl.getString("ExpressionEditDialog.reset"); //$NON-NLS-1$
private static final String RESET_HINT = DefaultMessagesImpl.getString("ExpressionEditDialog.resetHintMessage"); //$NON-NLS-1$
private static final String TEMPLATES_TITLE = DefaultMessagesImpl.getString("ExpressionEditDialog.columnTitle"); //$NON-NLS-1$
private static final String MATCH_EXPRESSION_TITLE = DefaultMessagesImpl.getString("ExpressionEditDialog.matchExpression"); //$NON-NLS-1$
private static final String ORDER_BY_TITLE = DefaultMessagesImpl.getString("ExpressionEditDialog.orderBy"); //$NON-NLS-1$
private static final String GROUP_BY_TITLE = DefaultMessagesImpl.getString("ExpressionEditDialog.groupBy"); //$NON-NLS-1$
private static final String SECOND_COLUMN_TITLE = DefaultMessagesImpl.getString("ExpressionEditDialog.secondColumn"); //$NON-NLS-1$
private static final String FIRST_COLUMN_TITLE = DefaultMessagesImpl.getString("ExpressionEditDialog.firstColumn"); //$NON-NLS-1$
private static final String COLUMN_EXPRESSION_TITLE = DefaultMessagesImpl.getString("ExpressionEditDialog.columnExpression"); //$NON-NLS-1$
private static final String WHERE_EXPRESSION_TITLE = DefaultMessagesImpl.getString("ExpressionEditDialog.whereExpression"); //$NON-NLS-1$
private static final String EXPREEION = DefaultMessagesImpl.getString("ExpressionEditDialog.groupTitle"); //$NON-NLS-1$
private static final String TITLE = DefaultMessagesImpl.getString("ExpressionEditDialog.title"); //$NON-NLS-1$
private static final String tab0_name = DefaultMessagesImpl.getString("ExpressionEditDialog.tab0"); //$NON-NLS-1$
private static final String tab1_name = DefaultMessagesImpl.getString("ExpressionEditDialog.tab1"); //$NON-NLS-1$
private static final String tab2_name = DefaultMessagesImpl.getString("ExpressionEditDialog.tab2"); //$NON-NLS-1$
private static final String tab3_name = DefaultMessagesImpl.getString("ExpressionEditDialog.tab3"); //$NON-NLS-1$
private static final String tab4_name = DefaultMessagesImpl.getString("ExpressionEditDialog.tab4"); //$NON-NLS-1$
private static final String tab5_name = DefaultMessagesImpl.getString("ExpressionEditDialog.tab5"); //$NON-NLS-1$
private static final String tab6_name = DefaultMessagesImpl.getString("ExpressionEditDialog.tab6"); //$NON-NLS-1$
private String[] templates = new String[] { GenericSQLHandler.TABLE_NAME, GenericSQLHandler.COLUMN_NAMES,
GenericSQLHandler.WHERE_CLAUSE, GenericSQLHandler.AND_WHERE_CLAUSE, GenericSQLHandler.GROUP_BY_ALIAS,
GenericSQLHandler.UDI_INDICATOR_VALUE };
private String fullSqlContent;
private Text editTextNotUDI;
private Composite tab0Composite;
private Composite tab1Composite;
private Composite tab2Composite;
private Composite tab3Composite;
private Composite tab4Composite;
private Composite tab5Composite;
private Composite tab6Composite;
// for TAB0:
private Text tab0_count_where_var;
private Text tab0_realvalue_column_var;
private Text tab0_realvalue_where_var;
private Text tab0_fre_first_var;
private Text tab0_fre_second_var;
private Text tab0_fre_where_var;
private Text tab0_fre_groupby_var;
private Text tab0_fre_orderby_var;
private Text tab0_match_match_var;
private Text tab0_match_where_var;
private Button resetButton_tab1;
private Button resetButton_tab2_viewRows;
private Button resetButton_tab2_match;
private Button resetButton_tab3_match;
private Button resetButton_tab4_match;
private Button resetButton_tab5_match;
// for TAB1 all types :
private Text tab1_fullSql;
// for TAB2 all except match :
private Text tab2_viewRows;
// for TAB2 match only :
private Text tab2_match_viewvalidRows;
// for TAB3 match only :
private Text tab3_match_viewInvalidRows;
// for TAB4 match only :
private Text tab4_match_viewValidValues;
// for TAB5 match only :
private Text tab5_match_viewInvalidValues;
private TdExpression tempExpression;
private HashMap<String, String> tempVariableMap;
private IndicatorCategory category;
private String language;
private String version;
private int selectTabNumber = 0;
private TdExpression tempViewRowsExp;
private TdExpression tempViewValidRowsExp;
private TdExpression tempViewInvalidRowsExp;
private TdExpression tempViewValidValuesExp;
private TdExpression tempViewInvalidValuesExp;
// when tab0 text modified, set true, use autoGenQuery to fill other tabs(from tab1 to tab6),
// when the other tabs text modified, set false
private boolean useAutoGenQueryFlag = false;
// when tab1 or tab2 text is input by user, can not use the AutoGenQuery to overwriten
private boolean canBeOverwriten_tab1 = true;
private boolean canBeOverwriten_tab2_viewRows = true;
private boolean canBeOverwriten_tab2_match = true;
private boolean canBeOverwriten_tab3_match = true;
private boolean canBeOverwriten_tab4_match = true;
private boolean canBeOverwriten_tab5_match = true;
private boolean isUDIndicatorDefinition = false;
// the query generated from template
private String autoGenQuery = PluginConstant.EMPTY_STRING;
public ExpressionEditDialog(Shell parentShell, String patternText, boolean isUDIndicatorDefinition, TdExpression tdExpression) {
super(parentShell);
this.fullSqlContent = patternText;
this.isUDIndicatorDefinition = isUDIndicatorDefinition;
this.tempExpression = tdExpression;
if (isUDIndicatorDefinition) {
this.tempVariableMap = tempExpression.getExpressionVariableMap();
if (tempVariableMap == null) {
tempVariableMap = new HashMap<String, String>();
}
}
int shellStyle = getShellStyle();
setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE);
}
/**
* Getter for isUDIndicatorDefinition.
*
* @return the isUDIndicatorDefinition
*/
public boolean isUDIndicatorDefinition() {
return this.isUDIndicatorDefinition;
}
/**
* Sets the isUDIndicatorDefinition.
*
* @param isUDIndicatorDefinition the isUDIndicatorDefinition to set
*/
public void setUDIndicatorDefinition(boolean isUDIndicatorDefinition) {
this.isUDIndicatorDefinition = isUDIndicatorDefinition;
}
/**
* Sets the category.
*
* @param category the category to set
*/
public void setCategory(IndicatorCategory category) {
this.category = category;
}
/**
* Sets the language.
*
* @param language the language to set
*/
public void setLanguage(String language) {
this.language = language;
}
/**
* Sets the version.
*
* @param version the version to set
*/
public void setVersion(String version) {
this.version = version;
}
/**
* Getter for tempViewRowsExp.
*
* @return the tempViewRowsExp
*/
public TdExpression getTempViewRowsExp() {
return this.tempViewRowsExp;
}
/**
* Sets the tempViewRowsExp.
*
* @param tempViewRowsExp the tempViewRowsExp to set
*/
public void setTempViewRowsExp(TdExpression tempViewRowsExp) {
this.tempViewRowsExp = tempViewRowsExp;
}
/**
* Getter for tempViewValidRowsExp.
*
* @return the tempViewValidRowsExp
*/
public TdExpression getTempViewValidRowsExp() {
return this.tempViewValidRowsExp;
}
/**
* Sets the tempViewValidRowsExp.
*
* @param tempViewValidRowsExp the tempViewValidRowsExp to set
*/
public void setTempViewValidRowsExp(TdExpression tempViewValidRowsExp) {
this.tempViewValidRowsExp = tempViewValidRowsExp;
}
/**
* Getter for tempViewInvalidRowsExp.
*
* @return the tempViewInvalidRowsExp
*/
public TdExpression getTempViewInvalidRowsExp() {
return this.tempViewInvalidRowsExp;
}
/**
* Sets the tempViewInvalidRowsExp.
*
* @param tempViewInvalidRowsExp the tempViewInvalidRowsExp to set
*/
public void setTempViewInvalidRowsExp(TdExpression tempViewInvalidRowsExp) {
this.tempViewInvalidRowsExp = tempViewInvalidRowsExp;
}
/**
* Getter for tempViewValidValuesExp.
*
* @return the tempViewValidValuesExp
*/
public TdExpression getTempViewValidValuesExp() {
return this.tempViewValidValuesExp;
}
/**
* Sets the tempViewValidValuesExp.
*
* @param tempViewValidValuesExp the tempViewValidValuesExp to set
*/
public void setTempViewValidValuesExp(TdExpression tempViewValidValuesExp) {
this.tempViewValidValuesExp = tempViewValidValuesExp;
}
/**
* Getter for tempViewInvalidValuesExp.
*
* @return the tempViewInvalidValuesExp
*/
public TdExpression getTempViewInvalidValuesExp() {
return this.tempViewInvalidValuesExp;
}
/**
* Sets the tempViewInvalidValuesExp.
*
* @param tempViewInvalidValuesExp the tempViewInvalidValuesExp to set
*/
public void setTempViewInvalidValuesExp(TdExpression tempViewInvalidValuesExp) {
this.tempViewInvalidValuesExp = tempViewInvalidValuesExp;
}
/**
* Sets the tempExpression.
*
* @param tempExpression the tempExpression to set
*/
public void setTempExpression(TdExpression tempExpression) {
this.tempExpression = tempExpression;
}
/**
* get this tempExpression.
*
* @return
*/
public TdExpression getTempExpression() {
return tempExpression;
}
/**
* create Dialog Area For Not UDI.
*
* @param parent
* @return
*/
protected Control createDialogAreaForNotUDI(Composite parent) {
Composite comp = (Composite) super.createDialogArea(parent);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.widthHint = 750;
data.heightHint = 650;
comp.setLayoutData(data);
PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, HelpPlugin.getDefault().getExpressionEditContextID());
SashForm sform = new SashForm(comp, SWT.VERTICAL | SWT.SMOOTH | SWT.FILL);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
sform.setLayoutData(data);
editTextNotUDI = createTextPart(sform, EXPREEION, 20, fullSqlContent);
createTemplatesTablePart(sform);
sform.setWeights(new int[] { 2, 1 });
comp.layout();
return comp;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
Control comp;
// if the category is user define, then create tabs, else as before
if (isUDIndicatorDefinition && IndicatorCategoryHelper.isUserDefCategory(category)) {
comp = createDialogAreaForUDI(parent);
} else {
comp = createDialogAreaForNotUDI(parent);
}
return comp;
}
/**
* create Dialog Area For UDI.
*
* @param parent
* @return
*/
public Control createDialogAreaForUDI(Composite parent) {
final Composite comp = (Composite) super.createDialogArea(parent);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.widthHint = 750;
data.heightHint = 650;
comp.setLayoutData(data);
PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, HelpPlugin.getDefault().getExpressionEditContextID());
final TabFolder tabFolder = new TabFolder(comp, SWT.FILL);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.widthHint = convertWidthInCharsToPixels(200);
gridData.heightHint = convertHeightInCharsToPixels(300);
tabFolder.setLayoutData(gridData);
TabItem tab0 = new TabItem(tabFolder, SWT.NULL);
tab0.setText(tab0_name);
tab0Composite = new Composite(tabFolder, SWT.None);
tab0Composite.setLayout(new GridLayout());
tab0.setControl(tab0Composite);
selectTabNumber = 0;
createTabPart(tab0Composite);
TabItem tab1 = new TabItem(tabFolder, SWT.NULL);
tab1.setText(tab1_name);
tab1Composite = new Composite(tabFolder, SWT.None);
tab1Composite.setLayout(new GridLayout());
tab1.setControl(tab1Composite);
selectTabNumber = 1;
createTabPart(tab1Composite);
// for use define match, have more tabs belong to itself
if (IndicatorCategoryHelper.isUserDefMatching(category)) {
TabItem tab3 = new TabItem(tabFolder, SWT.NULL);
tab3.setText(tab3_name);
tab3Composite = new Composite(tabFolder, SWT.None);
tab3Composite.setLayout(new GridLayout());
tab3.setControl(tab3Composite);
selectTabNumber = 2;
createTabPart(tab3Composite);
TabItem tab4 = new TabItem(tabFolder, SWT.NULL);
tab4.setText(tab4_name);
tab4Composite = new Composite(tabFolder, SWT.None);
tab4Composite.setLayout(new GridLayout());
tab4.setControl(tab4Composite);
selectTabNumber = 3;
createTabPart(tab4Composite);
TabItem tab5 = new TabItem(tabFolder, SWT.NULL);
tab5.setText(tab5_name);
tab5Composite = new Composite(tabFolder, SWT.None);
tab5Composite.setLayout(new GridLayout());
tab5.setControl(tab5Composite);
selectTabNumber = 4;
createTabPart(tab5Composite);
TabItem tab6 = new TabItem(tabFolder, SWT.NULL);
tab6.setText(tab6_name);
tab6Composite = new Composite(tabFolder, SWT.None);
tab6Composite.setLayout(new GridLayout());
tab6.setControl(tab6Composite);
selectTabNumber = 5;
createTabPart(tab6Composite);
} else {
TabItem tab2 = new TabItem(tabFolder, SWT.NULL);
tab2.setText(tab2_name);
tab2Composite = new Composite(tabFolder, SWT.None);
tab2Composite.setLayout(new GridLayout());
tab2.setControl(tab2Composite);
selectTabNumber = 2;
createTabPart(tab2Composite);
}
tabFolder.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
String text = ((TabItem) e.item).getText();
selectTabNumber = tabFolder.getSelectionIndex();
if (tab0_name.equals(text)) {
// Indicator Definition
tab0Composite.layout();
} else {
if (tab1_name.equals(text)) {
// Full SQL Template
tab1Composite.layout();
} else if (tab2_name.equals(text)) {
// View Rows
tab2Composite.layout();
} else if (tab3_name.equals(text)) {
// View Valid Rows Template
tab3Composite.layout();
} else if (tab4_name.equals(text)) {
// View Invalid Rows Template
tab4Composite.layout();
} else if (tab5_name.equals(text)) {
// View Valid Values Template
tab5Composite.layout();
} else if (tab6_name.equals(text)) {
// View Invalid Values Template
tab6Composite.layout();
}
if (selectTabNumber == 1) {
resetButton_tab1.setEnabled(!getAutoGeneratedQuery().equals(tab1_fullSql.getText()));
} else if (selectTabNumber == 2) {
if (IndicatorCategoryHelper.isUserDefMatching(category)) {
// for match dis View Valid Rows template
resetButton_tab2_match.setEnabled(!getAutoGeneratedQuery().equals(tab2_match_viewvalidRows.getText()));
} else {
// for others is view rows template
resetButton_tab2_viewRows.setEnabled(!getAutoGeneratedQuery().equals(tab2_viewRows.getText()));
}
} else if (selectTabNumber == 3) {
// for match is View Invalid Rows Template
resetButton_tab3_match.setEnabled(!getAutoGeneratedQuery().equals(tab3_match_viewInvalidRows.getText()));
} else if (selectTabNumber == 4) {
// for match is View Valid Values Template
resetButton_tab4_match.setEnabled(!getAutoGeneratedQuery().equals(tab4_match_viewValidValues.getText()));
} else if (selectTabNumber == 5) {
// for match is View Invalid Values Template
resetButton_tab5_match.setEnabled(!getAutoGeneratedQuery().equals(tab5_match_viewInvalidValues.getText()));
}
}
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
// set the default selected tab
if (fullSqlContent == null || fullSqlContent.equals("")) { //$NON-NLS-1$
selectTabNumber = 0;
tabFolder.setSelection(selectTabNumber);
tab0Composite.layout();
} else {
selectTabNumber = 1;
tabFolder.setSelection(selectTabNumber);
tab1Composite.layout();
canBeOverwriten_tab1 = getAutoGeneratedQuery().equals(tab1_fullSql.getText());
resetButton_tab1.setEnabled(!canBeOverwriten_tab1);
}
comp.layout();
return comp;
}
/**
* create Reset Button.
*
* @param sform
*/
public Button createResetButton(Composite sform) {
Button resetButton = new Button(sform, SWT.PUSH);
resetButton.setBounds(10, 10, 60, 30);
resetButton.setText(RESET);
resetButton.setToolTipText(RESET_HINT);
resetButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
useAutoGenQueryFlag = true;
if (selectTabNumber == 1) {
tab1_fullSql.setText(getAutoGeneratedQuery());
} else if (selectTabNumber == 2) {
if (IndicatorCategoryHelper.isUserDefMatching(category)) {
// for match is View Valid Rows template
tab2_match_viewvalidRows.setText(getAutoGeneratedQuery());
} else {
// for others is view rows template
tab2_viewRows.setText(getAutoGeneratedQuery());
}
} else if (selectTabNumber == 3) {
tab3_match_viewInvalidRows.setText(getAutoGeneratedQuery());
} else if (selectTabNumber == 4) {
tab4_match_viewValidValues.setText(getAutoGeneratedQuery());
} else if (selectTabNumber == 5) {
tab5_match_viewInvalidValues.setText(getAutoGeneratedQuery());
}
setResetButtonStatus(false);
setTextOverWriteStatus(true);
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
return resetButton;
}
/**
* create tab1,tab2(for match is tab3456) part
*
* @param comp
*/
public void createTabPart(Composite comp) {
// create reset button, and set its status.
// if the text different from the template, then set the reset button default status is enable, else set
// unenable
if (selectTabNumber == 1) {
resetButton_tab1 = createResetButton(comp);
canBeOverwriten_tab1 = getAutoGeneratedQuery().equals(fullSqlContent);
resetButton_tab1.setEnabled(!canBeOverwriten_tab1);
} else if (selectTabNumber == 2) {
if (IndicatorCategoryHelper.isUserDefMatching(category)) {
// for match is View Valid Rows template
resetButton_tab2_match = createResetButton(comp);
canBeOverwriten_tab2_match = getAutoGeneratedQuery().equals(getExpressValue(tempViewValidRowsExp));
resetButton_tab2_match.setEnabled(!canBeOverwriten_tab2_match);
} else {
// for others is view rows template
resetButton_tab2_viewRows = createResetButton(comp);
canBeOverwriten_tab2_viewRows = getAutoGeneratedQuery().equals(getExpressValue(tempViewRowsExp));
resetButton_tab2_viewRows.setEnabled(!canBeOverwriten_tab2_viewRows);
}
} else if (selectTabNumber == 3) {
// for match is View Invalid Rows Template
resetButton_tab3_match = createResetButton(comp);
canBeOverwriten_tab3_match = getAutoGeneratedQuery().equals(getExpressValue(tempViewInvalidRowsExp));
resetButton_tab3_match.setEnabled(!canBeOverwriten_tab3_match);
} else if (selectTabNumber == 4) {
// for match is View Valid Values Template
resetButton_tab4_match = createResetButton(comp);
canBeOverwriten_tab4_match = getAutoGeneratedQuery().equals(getExpressValue(tempViewValidValuesExp));
resetButton_tab4_match.setEnabled(!canBeOverwriten_tab4_match);
} else if (selectTabNumber == 5) {
// for match is View Invalid Values Template
resetButton_tab5_match = createResetButton(comp);
canBeOverwriten_tab5_match = getAutoGeneratedQuery().equals(getExpressValue(tempViewInvalidValuesExp));
resetButton_tab5_match.setEnabled(!canBeOverwriten_tab5_match);
}
GridData data;
SashForm sform = new SashForm(comp, SWT.VERTICAL | SWT.SMOOTH | SWT.FILL);
data = new GridData();
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
data.grabExcessVerticalSpace = true;
sform.setLayoutData(data);
// create content for different tabs in sfrom
createTabPage(sform);
// create templates table part
createTemplatesTablePart(sform);
// set weights for sform
if (selectTabNumber == 0) {
if (IndicatorCategoryHelper.isUserDefCount(category)) {
sform.setWeights(new int[] { 2, 1 });
} else if (IndicatorCategoryHelper.isUserDefFrequency(category)) {
sform.setWeights(new int[] { 1, 1, 1, 1, 1, 2 });
} else if (IndicatorCategoryHelper.isUserDefRealValue(category)) {
sform.setWeights(new int[] { 1, 1, 1 });
} else if (IndicatorCategoryHelper.isUserDefMatching(category)) {
sform.setWeights(new int[] { 1, 1, 1 });
}
} else {
sform.setWeights(new int[] { 10, 5 });
}
}
/**
* create a Text with the given title, height, textContent.
*
* @param sform
* @param title
* @param height
* @param textContent
* @return
*/
private Text createTextPart(SashForm sform, String title, int height, String textContent) {
Group group = new Group(sform, SWT.NONE);
group.setText(title);
GridLayout gridLayout = new GridLayout();
gridLayout.marginHeight = height;
group.setLayout(gridLayout);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
Text text = new Text(group, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
text.setText(textContent);
text.setLayoutData(data);
// add Drag & Drop Listener
addDropVariableListenerToText(text);
// add Modify Listener
ModifyListener listener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
getButton(IDialogConstants.OK_ID).setEnabled(true);
}
};
text.addModifyListener(listener);
return text;
}
/**
* when Text Is Empty, return true.
*
* @return
*/
public boolean whenTextIsEmpty(Text text) {
return text.getText().trim().isEmpty();
}
/**
* get the auto generated query.
*/
public String getAutoGeneratedQuery() {
autoGenQuery = UDIHelper.getQueryFromTemplates(selectTabNumber, language, category);
// replace some variables in the auto generate sql
if (isUDIndicatorDefinition) {
GenericSQLHandler genericSQLHandler = new GenericSQLHandler(autoGenQuery);
if (IndicatorCategoryHelper.isUserDefCount(category)) {
// replace <WHERE_TEXT_FIELD>
genericSQLHandler.replaceUDIWhere(tab0_count_where_var.getText().trim());
} else if (IndicatorCategoryHelper.isUserDefRealValue(category)) {
// replace <COLUMN_EXPRESSION_TEXT_FIELD>
genericSQLHandler.replaceUDIColumn(tab0_realvalue_column_var.getText().trim());
// replace <WHERE_TEXT_FIELD>
genericSQLHandler.replaceUDIWhere(tab0_realvalue_where_var.getText().trim());
} else if (IndicatorCategoryHelper.isUserDefFrequency(category)) {
// replace <FIRST_COLUMN_EXPRESSION_TEXT_FIELD>
genericSQLHandler.replaceUDIFirstColumn(tab0_fre_first_var.getText().trim());
// replace <SECOND_COLUMN_EXPRESSION_TEXT_FIELD>
genericSQLHandler.replaceUDISecondColumn(tab0_fre_second_var.getText().trim());
// replace <WHERE_TEXT_FIELD>
genericSQLHandler.replaceUDIWhere(tab0_fre_where_var.getText().trim());
// replace <GROUP_BY_TEXT_FIELD>
genericSQLHandler.replaceUDIGroupBy(tab0_fre_groupby_var.getText().trim());
// replace <ORDER_BY_TEXT_FIELD>
genericSQLHandler.replaceUDIOrderBy(tab0_fre_orderby_var.getText().trim());
} else if (IndicatorCategoryHelper.isUserDefMatching(category)) {
// replace <MATCHING_EXPRESSION_TEXT_FIELD>
genericSQLHandler.replaceUDIMatching(tab0_match_match_var.getText().trim());
// replace <WHERE_TEXT_FIELD>
genericSQLHandler.replaceUDIWhere(tab0_match_where_var.getText().trim());
}
autoGenQuery = genericSQLHandler.replaceUDIQueryToMatch().getSqlString();
}
return autoGenQuery;
}
/**
* check whether use the auto generated query.
*
* @param old content
* @return
*/
public boolean checkUseAutoGenQuery(String oldContent) {
if (StringUtils.isEmpty(oldContent)) {
return true;
}
if (useAutoGenQueryFlag && autoGenQuery != null && !autoGenQuery.equals(PluginConstant.EMPTY_STRING)) {
return true;
}
return false;
}
/**
* get tdExpression body Value, when it is null, return blank.
*
* @return
*/
public String getExpressValue(TdExpression tdExp) {
return tdExp != null ? tdExp.getBody() : PluginConstant.EMPTY_STRING;
}
/**
* create Tab Page content.
*
* @param sform
*/
public void createTabPage(SashForm sform) {
ModifyListener listener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
useAutoGenQueryFlag = false;
setResetButtonStatus(true);
setTextOverWriteStatus(false);
}
};
if (selectTabNumber == 0) {
createTab0Page(sform);
} else if (selectTabNumber == 1) {
boolean checkUseAutoGenSql = checkUseAutoGenQuery(fullSqlContent);
tab1_fullSql = createTextPart(sform, EXPREEION, 20, checkUseAutoGenSql ? autoGenQuery : fullSqlContent);
if (checkUseAutoGenSql) {
resetButton_tab1.setEnabled(false);
canBeOverwriten_tab1 = true;
}
tab1_fullSql.addModifyListener(listener);
} else if (selectTabNumber == 2) {
if (IndicatorCategoryHelper.isUserDefMatching(category)) {
// for match dis View Valid Rows template
String expressValue = getExpressValue(tempViewValidRowsExp);
boolean checkUseAutoGenSql = checkUseAutoGenQuery(expressValue);
tab2_match_viewvalidRows = createTextPart(sform, EXPREEION, 20, checkUseAutoGenSql ? autoGenQuery : expressValue);
if (checkUseAutoGenSql) {
resetButton_tab2_match.setEnabled(false);
canBeOverwriten_tab2_match = true;
}
tab2_match_viewvalidRows.addModifyListener(listener);
} else {
// for others is view rows template
String expressValue = getExpressValue(tempViewRowsExp);
boolean checkUseAutoGenSql = checkUseAutoGenQuery(expressValue);
tab2_viewRows = createTextPart(sform, EXPREEION, 20, checkUseAutoGenSql ? autoGenQuery : expressValue);
if (checkUseAutoGenSql) {
resetButton_tab2_viewRows.setEnabled(false);
canBeOverwriten_tab2_viewRows = true;
}
tab2_viewRows.addModifyListener(listener);
}
} else if (selectTabNumber == 3) {
// for match is View Invalid Rows Template
String expressValue = getExpressValue(tempViewInvalidRowsExp);
boolean checkUseAutoGenSql = checkUseAutoGenQuery(expressValue);
tab3_match_viewInvalidRows = createTextPart(sform, EXPREEION, 20, checkUseAutoGenSql ? autoGenQuery : expressValue);
if (checkUseAutoGenSql) {
resetButton_tab3_match.setEnabled(false);
canBeOverwriten_tab3_match = true;
}
tab3_match_viewInvalidRows.addModifyListener(listener);
} else if (selectTabNumber == 4) {
// for match is View Valid Values Template
String expressValue = getExpressValue(tempViewValidValuesExp);
boolean checkUseAutoGenSql = checkUseAutoGenQuery(expressValue);
tab4_match_viewValidValues = createTextPart(sform, EXPREEION, 20, checkUseAutoGenSql ? autoGenQuery : expressValue);
if (checkUseAutoGenSql) {
resetButton_tab4_match.setEnabled(false);
canBeOverwriten_tab4_match = true;
}
tab4_match_viewValidValues.addModifyListener(listener);
} else if (selectTabNumber == 5) {
// for match is View Invalid Values Template
String expressValue = getExpressValue(tempViewInvalidValuesExp);
boolean checkUseAutoGenSql = checkUseAutoGenQuery(expressValue);
tab5_match_viewInvalidValues = createTextPart(sform, EXPREEION, 20, checkUseAutoGenSql ? autoGenQuery : expressValue);
if (checkUseAutoGenSql) {
resetButton_tab5_match.setEnabled(false);
canBeOverwriten_tab5_match = true;
}
tab5_match_viewInvalidValues.addModifyListener(listener);
}
}
/**
* set Reset Button Status and the overwrite flag value. when reset button is true, the overwrite flag is false
*
* @param isEnable
*/
private void setResetButtonStatus(boolean isEnable) {
if (selectTabNumber == 1) {
resetButton_tab1.setEnabled(isEnable);
} else if (selectTabNumber == 2) {
if (IndicatorCategoryHelper.isUserDefMatching(category)) {
// for match is View Valid Rows template
resetButton_tab2_match.setEnabled(isEnable);
} else {
// for others is view rows template
resetButton_tab2_viewRows.setEnabled(isEnable);
}
} else if (selectTabNumber == 3) {
resetButton_tab3_match.setEnabled(isEnable);
} else if (selectTabNumber == 4) {
resetButton_tab4_match.setEnabled(isEnable);
} else if (selectTabNumber == 5) {
resetButton_tab5_match.setEnabled(isEnable);
}
}
/**
* set Reset Button Status and the overwrite flag value. when reset button is true, the overwrite flag is false
*
* @param isEnable
*/
private void setTextOverWriteStatus(boolean canBeOverwriten) {
if (selectTabNumber == 1) {
canBeOverwriten_tab1 = canBeOverwriten;
} else if (selectTabNumber == 2) {
if (IndicatorCategoryHelper.isUserDefMatching(category)) {
// for match is View Valid Rows template
canBeOverwriten_tab2_match = canBeOverwriten;
} else {
// for others is view rows template
canBeOverwriten_tab2_viewRows = canBeOverwriten;
}
} else if (selectTabNumber == 3) {
canBeOverwriten_tab3_match = canBeOverwriten;
} else if (selectTabNumber == 4) {
canBeOverwriten_tab4_match = canBeOverwriten;
} else if (selectTabNumber == 5) {
canBeOverwriten_tab5_match = canBeOverwriten;
}
}
/**
* create Tab0 Page content.
*
* @param sform
*/
public void createTab0Page(SashForm sform) {
ModifyListener listener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
useAutoGenQueryFlag = true;
// the following is to set the other tabs values automatically.
int tempSelectNumber = selectTabNumber;
// Full SQL Template
if (canBeOverwriten_tab1) {
selectTabNumber = 1;
tab1_fullSql.setText(getAutoGeneratedQuery());
canBeOverwriten_tab1 = true;
}
if (IndicatorCategoryHelper.isUserDefMatching(category)) {
// View Valid Rows Template
if (canBeOverwriten_tab2_match) {
selectTabNumber = 2;
tab2_match_viewvalidRows.setText(getAutoGeneratedQuery());
canBeOverwriten_tab2_match = true;
}
// View Invalid Rows Template
if (canBeOverwriten_tab3_match) {
selectTabNumber = 3;
tab3_match_viewInvalidRows.setText(getAutoGeneratedQuery());
canBeOverwriten_tab3_match = true;
}
// View Valid Values Template
if (canBeOverwriten_tab4_match) {
selectTabNumber = 4;
tab4_match_viewValidValues.setText(getAutoGeneratedQuery());
canBeOverwriten_tab4_match = true;
}
// View Invalid Values Template
if (canBeOverwriten_tab5_match) {
selectTabNumber = 5;
tab5_match_viewInvalidValues.setText(getAutoGeneratedQuery());
canBeOverwriten_tab5_match = true;
}
} else {
// View Rows
if (canBeOverwriten_tab2_viewRows) {
selectTabNumber = 2;
tab2_viewRows.setText(getAutoGeneratedQuery());
canBeOverwriten_tab2_viewRows = true;
}
}
selectTabNumber = tempSelectNumber;
useAutoGenQueryFlag = true;
// end of setting the other tabs values.
}
};
if (IndicatorCategoryHelper.isUserDefCount(category)) {
tab0_count_where_var = createTextPart(sform, WHERE_EXPRESSION_TITLE, 20,
getVaribleFromMap(GenericSQLHandler.UDI_WHERE));
tab0_count_where_var.addModifyListener(listener);
} else if (IndicatorCategoryHelper.isUserDefRealValue(category)) {
tab0_realvalue_column_var = createTextPart(sform, COLUMN_EXPRESSION_TITLE, 10,
getVaribleFromMap(GenericSQLHandler.UDI_COLUMN));
tab0_realvalue_column_var.addModifyListener(listener);
tab0_realvalue_where_var = createTextPart(sform, WHERE_EXPRESSION_TITLE, 10,
getVaribleFromMap(GenericSQLHandler.UDI_WHERE));
tab0_realvalue_where_var.addModifyListener(listener);
} else if (IndicatorCategoryHelper.isUserDefFrequency(category)) {
tab0_fre_first_var = createTextPart(sform, FIRST_COLUMN_TITLE, 5,
getVaribleFromMap(GenericSQLHandler.UDI_FIRST_COLUMN));
tab0_fre_first_var.addModifyListener(listener);
tab0_fre_second_var = createTextPart(sform, SECOND_COLUMN_TITLE, 5,
getVaribleFromMap(GenericSQLHandler.UDI_SECOND_COLUMN));
tab0_fre_second_var.addModifyListener(listener);
tab0_fre_where_var = createTextPart(sform, WHERE_EXPRESSION_TITLE, 5, getVaribleFromMap(GenericSQLHandler.UDI_WHERE));
tab0_fre_where_var.addModifyListener(listener);
tab0_fre_groupby_var = createTextPart(sform, GROUP_BY_TITLE, 5, getVaribleFromMap(GenericSQLHandler.UDI_GROUP_BY));
tab0_fre_groupby_var.addModifyListener(listener);
tab0_fre_orderby_var = createTextPart(sform, ORDER_BY_TITLE, 5, getVaribleFromMap(GenericSQLHandler.UDI_ORDER_BY));
tab0_fre_orderby_var.addModifyListener(listener);
} else if (IndicatorCategoryHelper.isUserDefMatching(category)) {
tab0_match_match_var = createTextPart(sform, MATCH_EXPRESSION_TITLE, 10,
getVaribleFromMap(GenericSQLHandler.UDI_MATCHING));
tab0_match_match_var.addModifyListener(listener);
tab0_match_where_var = createTextPart(sform, WHERE_EXPRESSION_TITLE, 10,
getVaribleFromMap(GenericSQLHandler.UDI_WHERE));
tab0_match_where_var.addModifyListener(listener);
}
}
/**
* get Varible value From variableMap.
*
* @param key
* @return
*/
public String getVaribleFromMap(String key) {
return tempVariableMap == null ? PluginConstant.EMPTY_STRING : StringUtils.trimToEmpty(tempVariableMap.get(key));
}
/**
* create templates Table Part(only TAB0 use old paramaters, and others use new paramaters)
*
* @param sform
*/
public void createTemplatesTablePart(SashForm sform) {
GridData data;
final Table templatesTable = new Table(sform, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
templatesTable.setLinesVisible(false);
templatesTable.setHeaderVisible(true);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.heightHint = 200;
templatesTable.setLayoutData(data);
DragSource ds = new DragSource(templatesTable, DND.DROP_MOVE);
ds.setTransfer(new Transfer[] { TextTransfer.getInstance() });
ds.addDragListener(new DragSourceAdapter() {
@Override
public void dragSetData(DragSourceEvent event) {
event.data = templatesTable.getSelection()[0].getText();
}
});
TableColumn column = new TableColumn(templatesTable, SWT.NONE);
column.setText(TEMPLATES_TITLE);
for (String template : templates) {
TableItem item = new TableItem(templatesTable, SWT.NONE);
item.setText(0, template);
}
templatesTable.getColumn(0).pack();
}
/**
* add Drop Variable Listener To Text.
*
* @param text
*/
public void addDropVariableListenerToText(final Text text) {
DropTarget dt = new DropTarget(text, DND.DROP_MOVE);
dt.setTransfer(new Transfer[] { TextTransfer.getInstance() });
dt.addDropListener(new DropTargetAdapter() {
@Override
public void drop(DropTargetEvent event) {
String head, end;
Text editText = text;
head = editText.getText().substring(0, editText.getSelection().x);
end = editText.getText().substring(editText.getSelection().x + editText.getSelectionCount());
editText.setText(head + (String) event.data + end);
editText.setFocus();
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#create()
*/
@Override
public void create() {
super.create();
getShell().setText(TITLE);
if (!DQPreferenceManager.isBlockWeb()) {
showHelp();
}
getButton(IDialogConstants.OK_ID).setEnabled(false);
}
/**
* DOC yyi Comment method "showHelp".
*/
protected void showHelp() {
IContext context = HelpSystem.getContext(HelpPlugin.getDefault().getExpressionEditContextID());
if (null != context && 0 < context.getRelatedTopics().length) {
openTray(new HelpTray());
ReusableHelpPart helpPart = ((HelpTray) getTray()).getHelpPart();
helpPart.showURL(context.getRelatedTopics()[0].getHref());
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
@Override
protected void okPressed() {
// when the category is not user define indicator
if (!IndicatorCategoryHelper.isUserDefCategory(category)) {
// fullSqlContent = editTextNotUDI.getText();
tempExpression = storeTdExpValuesFromText(editTextNotUDI);
} else {
// fullSqlContent = tab1_fullSql.getText();
tempExpression = storeTdExpValuesFromText(tab1_fullSql);
tempVariableMap.clear();
if (IndicatorCategoryHelper.isUserDefMatching(category)) {
tempVariableMap.put(GenericSQLHandler.UDI_MATCHING, tab0_match_match_var.getText().trim());
tempVariableMap.put(GenericSQLHandler.UDI_WHERE, tab0_match_where_var.getText().trim());
storeExpForMatch();
} else {
if (IndicatorCategoryHelper.isUserDefCount(category)) {
tempVariableMap.put(GenericSQLHandler.UDI_WHERE, tab0_count_where_var.getText().trim());
} else if (IndicatorCategoryHelper.isUserDefRealValue(category)) {
tempVariableMap.put(GenericSQLHandler.UDI_COLUMN, tab0_realvalue_column_var.getText().trim());
tempVariableMap.put(GenericSQLHandler.UDI_WHERE, tab0_realvalue_where_var.getText().trim());
} else if (IndicatorCategoryHelper.isUserDefFrequency(category)) {
tempVariableMap.put(GenericSQLHandler.UDI_FIRST_COLUMN, tab0_fre_first_var.getText().trim());
tempVariableMap.put(GenericSQLHandler.UDI_SECOND_COLUMN, tab0_fre_second_var.getText().trim());
tempVariableMap.put(GenericSQLHandler.UDI_WHERE, tab0_fre_where_var.getText().trim());
tempVariableMap.put(GenericSQLHandler.UDI_GROUP_BY, tab0_fre_groupby_var.getText().trim());
tempVariableMap.put(GenericSQLHandler.UDI_ORDER_BY, tab0_fre_orderby_var.getText().trim());
}
storeViewRowsExp();
}
tempExpression.setExpressionVariableMap(tempVariableMap);
}
super.okPressed();
}
/**
* store Expression values when indicator is user define match.
*/
public void storeExpForMatch() {
tempViewValidRowsExp = storeTdExpValuesFromText(tab2_match_viewvalidRows);
tempViewInvalidRowsExp = storeTdExpValuesFromText(tab3_match_viewInvalidRows);
tempViewValidValuesExp = storeTdExpValuesFromText(tab4_match_viewValidValues);
tempViewInvalidValuesExp = storeTdExpValuesFromText(tab5_match_viewInvalidValues);
}
/**
* store text value to temp ViewRows Expression.
*/
public void storeViewRowsExp() {
tempViewRowsExp = storeTdExpValuesFromText(tab2_viewRows);
}
/**
* set Text value as body of TdExpression.
*
* @param text
*/
public TdExpression storeTdExpValuesFromText(Text text) {
TdExpression result = BooleanExpressionHelper.createTdExpression(language, text.getText().trim(), version);
result.setModificationDate(UDIUtils.getCurrentDateTime());
return result;
}
}