// ============================================================================
//
// 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.dqrules;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.talend.cwm.relational.TdExpression;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.ui.wizard.parserrule.ParserRuleLanguageEnum;
import org.talend.dataquality.rules.ParserRule;
/**
* DOC klliu class global comment. bug 8791 2009-08-31.
*/
public class ParserRuleTableViewer {
protected static Logger log = Logger.getLogger(ParserRuleTableViewer.class);
private ParserRuleMasterDetailsPage masterPage;
private TableViewer parserRuleTableViewer;
private List<TdExpression> parserRuleTdExpression;
private List<TdExpression> copyTdExpression;
private Composite parentComposite;
private ParserRule parserRule;
private String[] headers = { "Name", "Type", "Value" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
private int[] widths = { 100, 100, 300 };
private Table ruleTable;
private boolean isDirty = false;
public ParserRuleTableViewer(Composite parent, ParserRuleMasterDetailsPage masterPage) {
this(parent, masterPage.getCurrentModelElement());
this.masterPage = masterPage;
}
public ParserRuleTableViewer(Composite parent, ParserRule parserRule) {
this.parentComposite = parent;
this.parserRule = parserRule;
this.ruleTable = createTable(parent);
}
/**
* DOC klliu Comment method "createTable".
*
* @param parent
*/
private Table createTable(Composite parent) {
int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
final Table table = new Table(parentComposite, style);
table.setHeaderVisible(true);
table.setLinesVisible(true);
GridData gd = new GridData(GridData.FILL_BOTH);
table.setLayoutData(gd);
for (int i = 0; i < headers.length; ++i) {
TableColumn tableColumn = new TableColumn(table, SWT.LEFT, i);
tableColumn.setText(headers[i]);
tableColumn.setWidth(widths[i]);
}
parserRuleTableViewer = new TableViewer(table);
parserRuleTableViewer.setUseHashlookup(true);
parserRuleTableViewer.setColumnProperties(headers);
CellEditor[] editors = new CellEditor[headers.length];
for (int i = 0; i < editors.length; ++i) {
switch (i) {
case 0:
case 2:
editors[i] = new TextCellEditor(table);
break;
case 1:
editors[i] = new ComboBoxCellEditor(table, ParserRuleLanguageEnum.getAllTypes(), SWT.READ_ONLY);
break;
}
}
parserRuleTableViewer.setCellModifier(new TDExpresstionCellModifier(headers, parserRuleTableViewer));
parserRuleTableViewer.setCellEditors(editors);
parserRuleTableViewer.setColumnProperties(headers);
parserRuleTableViewer.setContentProvider(new TdExpressionContentProvider());
parserRuleTableViewer.setLabelProvider(new TdExpressionLabelProvider());
parserRuleTableViewer.setInput(getParserRuleTdExpressions());
table.setData(this);
GridData tableGD = new GridData(GridData.FILL_BOTH);
tableGD.heightHint = 130;
table.setLayoutData(tableGD);
return table;
}
/**
* DOC klliu Comment method "addTdExpression".
*
* @return
*/
public TdExpression addTdExpression() {
TdExpression tdExpression = org.talend.cwm.relational.RelationalFactory.eINSTANCE.createTdExpression();
tdExpression.setBody("\"\"");//$NON-NLS-1$
tdExpression.setLanguage(DefaultMessagesImpl.getString("ParserRuleTableViewer.languageSelection"));//$NON-NLS-1$
tdExpression.setName("\"\"");//$NON-NLS-1$
TdExpressionContentProvider contentProvider = (TdExpressionContentProvider) parserRuleTableViewer.getContentProvider();
List<TdExpression> movedElements = contentProvider.getMovedElements();
movedElements.add(tdExpression);
parserRuleTableViewer.setInput(movedElements);
this.parserRuleTdExpression.add(tdExpression);
setDirty(true);
this.parserRuleTableViewer.refresh();
return tdExpression;
}
public void copyTdExpression(List<TdExpression> copyTdExpressions) {
copyTdExpression = new ArrayList<TdExpression>();
copyTdExpression.addAll(copyTdExpressions);
}
public void pasteTdExpression() {
if (copyTdExpression != null) {
for (TdExpression tdExpression : copyTdExpression) {
TdExpression newExpresstion = org.talend.cwm.relational.RelationalFactory.eINSTANCE.createTdExpression();
newExpresstion.setBody(tdExpression.getBody());
newExpresstion.setLanguage(tdExpression.getLanguage());
newExpresstion.setName(tdExpression.getName());
TdExpressionContentProvider contentProvider = (TdExpressionContentProvider) parserRuleTableViewer
.getContentProvider();
List<TdExpression> movedElements = contentProvider.getMovedElements();
movedElements.add(newExpresstion);
parserRuleTableViewer.setInput(movedElements);
this.parserRuleTdExpression.add(newExpresstion);
}
setDirty(true);
this.parserRuleTableViewer.refresh();
}
}
/**
* DOC klliu Comment method "getSelection".
*
* @return
*/
public ISelection getSelection() {
return this.parserRuleTableViewer.getSelection();
}
/**
* DOC klliu Comment method "removeTdExpression".
*
* @param tdExpression
*/
public void removeTdExpression(TdExpression tdExpression) {
TdExpressionContentProvider contentProvider = (TdExpressionContentProvider) parserRuleTableViewer.getContentProvider();
List<TdExpression> movedElements = contentProvider.getMovedElements();
movedElements.remove(tdExpression);
this.parserRuleTdExpression.remove(tdExpression);
parserRuleTableViewer.setInput(movedElements);
setDirty(true);
parserRuleTableViewer.refresh();
}
/**
*
* zshen remove all of expression on the tableViewer.
*/
public void removeAllTdExpression() {
List<TdExpression> movedElements = new ArrayList<TdExpression>();
this.parserRuleTdExpression.clear();
parserRuleTableViewer.setInput(movedElements);
setDirty(true);
parserRuleTableViewer.refresh();
}
/**
*
* zshen add one expression List on the tableViewer.
*/
public void addAllTdExpression(List<TdExpression> movedElements) {
parserRuleTdExpression.addAll(movedElements);
parserRuleTableViewer.setInput(movedElements);
setDirty(true);
parserRuleTableViewer.refresh();
}
/**
* DOC klliu Comment method "moveTdExpression".
*
* @param tdExpression
*/
public void moveTdExpression(TdExpression tdExpression, int type) {
LinkedList<Object> sorter = new LinkedList<Object>();
TdExpressionContentProvider contentProvider = (TdExpressionContentProvider) parserRuleTableViewer.getContentProvider();
List<TdExpression> movedElements = contentProvider.getMovedElements();
sorter.addAll(movedElements);
int indexOf = sorter.indexOf(tdExpression);
if (type == 1) {
if (!(indexOf - 1 < 0)) {
sorter.remove(tdExpression);
sorter.add(indexOf - 1, tdExpression);
}
} else {
if (!(indexOf + 1 >= sorter.size())) {
sorter.remove(tdExpression);
sorter.add(indexOf + 1, tdExpression);
}
}
parserRuleTableViewer.setInput(sorter);
}
/**
* DOC klliu IndicatorDefinitionMaterPage class global comment. Detailled comment
*/
private final class TDExpresstionCellModifier implements ICellModifier {
private List<String> columeNames;
private TableViewer tableViewer;
public TDExpresstionCellModifier(String[] columeNames, TableViewer tableViewer) {
super();
this.columeNames = new ArrayList<String>();
for (String columnName : columeNames) {
this.columeNames.add(columnName);
}
this.tableViewer = tableViewer;
}
public boolean canModify(Object element, String property) {
return true;
}
public Object getValue(Object element, String property) {
int columnIndex = columeNames.indexOf(property);
Object result = null;
TdExpression tdExpression = (TdExpression) element;
switch (columnIndex) {
case 0:
result = tdExpression == null ? "" : tdExpression.getName(); //$NON-NLS-1$
break;
case 1:
//result = tdExpression == null ? "" : tdExpression.getLanguage(); //$NON-NLS-1$
String stringValue = tdExpression.getLanguage();
int i = ParserRuleLanguageEnum.getAllTypes().length - 1;
while (!stringValue.equals(ParserRuleLanguageEnum.getAllTypes()[i]) && i > 0) {
--i;
}
result = new Integer(i);
break;
case 2:
result = tdExpression == null ? "" : tdExpression.getBody(); //$NON-NLS-1$
break;
default:
result = ""; //$NON-NLS-1$
}
return result;
}
public void modify(Object element, String property, Object value) {
int columnIndex = this.columeNames.indexOf(property);
TableItem tableItem = (TableItem) element;
if (tableItem != null) {
TdExpression tdExpression = (TdExpression) tableItem.getData();
if (tdExpression != null) {
String valueString = String.valueOf(value).trim();
switch (columnIndex) {
case 0:
tdExpression.setName(valueString);
break;
case 1:
valueString = ParserRuleLanguageEnum.getAllTypes()[((Integer) value).intValue()].trim();
if (!tdExpression.getLanguage().equals(valueString)) {
tdExpression.setLanguage(valueString);
}
tdExpression.setLanguage(valueString);
break;
case 2:
tdExpression.setBody(valueString);
break;
default:
}
tableViewer.update(tdExpression, null);
setDirty(true);
}
}
}
}
/**
* DOC klliu IndicatorDefinitionMaterPage class global comment. Detailled comment
*
*/
private final static class TdExpressionContentProvider implements IStructuredContentProvider {
private List<TdExpression> resorter;
public Object[] getElements(Object inputElement) {
if (inputElement != null) {
if (inputElement instanceof List) {
resorter = new ArrayList<TdExpression>();
resorter.addAll((Collection<? extends TdExpression>) inputElement);
return ((List) inputElement).toArray();
}
}
return null;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public List<TdExpression> getMovedElements() {
return resorter;
}
}
/**
* DOC klliu IndicatorDefinitionMaterPage class global comment. Detailled comment
*
*/
private static class TdExpressionLabelProvider extends LabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
String result = ""; //$NON-NLS-1$
TdExpression tdExpression = (TdExpression) element;
switch (columnIndex) {
case 0:
result = tdExpression == null ? "" : tdExpression.getName(); //$NON-NLS-1$
break;
case 1:
if (tdExpression.getLanguage().equals("SELECT")) {//$NON-NLS-1$
result = ParserRuleLanguageEnum.Default.getLiteral().trim();
break;
}
result = tdExpression == null ? "" : tdExpression.getLanguage(); //$NON-NLS-1$
break;
case 2:
result = tdExpression == null ? "" : tdExpression.getBody(); //$NON-NLS-1$
break;
default:
result = ""; //$NON-NLS-1$
}
return result;
}
}
public List<TdExpression> getParserRuleTdExpressions() {
parserRuleTdExpression = parserRule.getSqlGenericExpression();
return this.parserRuleTdExpression;
}
public boolean isDirty() {
return isDirty;
}
public void setDirty(boolean isDirty) {
this.isDirty = isDirty;
if (this.masterPage != null) {
this.masterPage.setDirty(isDirty);
}
}
public Table getRuleTable() {
return ruleTable;
}
public TableViewer getParserRuleTableViewer() {
return parserRuleTableViewer;
}
}