// ============================================================================ // // 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.Dialog; 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.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; 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.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.talend.core.repository.model.repositoryObject.MetadataColumnRepositoryObject; import org.talend.cwm.helper.ColumnHelper; import org.talend.cwm.helper.ColumnSetHelper; import org.talend.cwm.relational.TdColumn; import org.talend.dataprofiler.core.CorePlugin; 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.model.ModelElementIndicator; import org.talend.dataprofiler.core.ui.editor.dqrules.DQRuleMasterDetailsPage; import org.talend.dataprofiler.core.ui.utils.MessageUI; import org.talend.dataprofiler.core.ui.views.ColumnViewerDND; import org.talend.dataprofiler.core.ui.views.DQRespositoryView; import org.talend.dataquality.rules.JoinElement; import org.talend.dataquality.rules.RulesFactory; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.RepositoryNode; import orgomg.cwm.objectmodel.core.ModelElement; import orgomg.cwm.objectmodel.core.Package; import orgomg.cwm.resource.relational.ColumnSet; /** * DOC xqliu class global comment. bug 8791 2009-08-31. */ public class JoinConditionTableViewer extends AbstractColumnDropTree { protected static Logger log = Logger.getLogger(JoinConditionTableViewer.class); private static final String COLUMN_A = "A"; //$NON-NLS-1$ private static final String COLUMN_B = "B"; //$NON-NLS-1$ private DQRuleMasterDetailsPage masterPage; private Table myTable; private TableViewer myTableViewer; private List<JoinElement> myJoinElement; private Composite parentComposite; private Package columnSetPackage; public JoinConditionTableViewer(Composite parent, DQRuleMasterDetailsPage masterPage) { this.parentComposite = parent; this.masterPage = masterPage; this.myJoinElement = masterPage.getTempJoinElements(); this.myTable = createTable(parent); if (this.myJoinElement.size() > 0) { updateColumnSetPackage((TdColumn) this.myJoinElement.get(0).getColA()); } } /** * DOC xqliu Comment method "updateColumnSetPackage". * * @param column * @return */ private boolean updateColumnSetPackage(TdColumn column) { Package parentCatalogOrSchema = ColumnSetHelper.getParentCatalogOrSchema(ColumnHelper.getColumnSetOwner(column)); if (this.columnSetPackage == null) { this.columnSetPackage = parentCatalogOrSchema; } else { if (!this.columnSetPackage.equals(parentCatalogOrSchema)) { MessageUI.openWarning(DefaultMessagesImpl.getString("JoinConditionTableViewer.warning")); //$NON-NLS-1$ return false; } } return true; } /** * DOC xqliu 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); table.setLayoutData(new GridData(GridData.FILL_BOTH)); String[] headers = { DefaultMessagesImpl.getString("JoinConditionTableViewer.TableA"), DefaultMessagesImpl.getString("JoinConditionTableViewer.TableAliasA"), DefaultMessagesImpl.getString("JoinConditionTableViewer.ColumnA"), DefaultMessagesImpl.getString("JoinConditionTableViewer.Operator"), DefaultMessagesImpl.getString("JoinConditionTableViewer.TableB"), DefaultMessagesImpl.getString("JoinConditionTableViewer.TableAliasB"), DefaultMessagesImpl.getString("JoinConditionTableViewer.ColumnB") }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ int[] widths = { 100, 100, 100, 70, 100, 100, 100 }; for (int i = 0; i < headers.length; ++i) { TableColumn tableColumn = new TableColumn(table, SWT.LEFT, i); tableColumn.setText(headers[i]); tableColumn.setWidth(widths[i]); } myTableViewer = new TableViewer(table); myTableViewer.setUseHashlookup(true); myTableViewer.setColumnProperties(headers); CellEditor[] editors = new CellEditor[headers.length]; for (int i = 0; i < editors.length; ++i) { switch (i) { case 1: case 5: editors[i] = new TextCellEditor(table); break; case 3: editors[i] = new ComboBoxCellEditor(table, PluginConstant.OPERATORS, SWT.READ_ONLY); break; default: editors[i] = null; } } myTableViewer.setCellEditors(editors); myTableViewer.setCellModifier(new JoinElementCellModifier(headers, myTableViewer)); myTableViewer.setContentProvider(new JoinElementContentProvider()); myTableViewer.setLabelProvider(new JoinElementLabelProvider()); myTableViewer.setInput(this.myJoinElement); // ADD xqliu 2009-09-01 bug 8790 table.setMenu(createMenus(table)); // ~ ColumnViewerDND.installDND(table); table.setData(this); GridData tableGD = new GridData(GridData.FILL_BOTH); tableGD.heightHint = 130; table.setLayoutData(tableGD); return table; } /** * DOC xqliu Comment method "createMenus". * * @param table * @return */ private Menu createMenus(final Table table) { Menu menu = new Menu(table); MenuItem menuItemA = new MenuItem(menu, SWT.CASCADE); menuItemA.setText(DefaultMessagesImpl.getString("JoinConditionTableViewer.showDQElementA")); //$NON-NLS-1$ menuItemA.setImage(ImageLib.getImage(ImageLib.EXPLORE_IMAGE)); menuItemA.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { showSelectedElements(table, COLUMN_A); } }); MenuItem menuItemB = new MenuItem(menu, SWT.CASCADE); menuItemB.setText(DefaultMessagesImpl.getString("JoinConditionTableViewer.showDQElementB")); //$NON-NLS-1$ menuItemB.setImage(ImageLib.getImage(ImageLib.EXPLORE_IMAGE)); menuItemB.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { showSelectedElements(table, COLUMN_B); } }); return menu; } /** * DOC xqliu Comment method "showSelectedElements". * * @param table * @param ab */ protected void showSelectedElements(Table table, String ab) { TableItem[] selection = table.getSelection(); if (selection.length > 0) { JoinElement join = (JoinElement) selection[0].getData(); ModelElement column = join.getColA(); if (COLUMN_B.equals(ab)) { column = join.getColB(); } DQRespositoryView dqview = CorePlugin.getDefault().findAndOpenRepositoryView(); // if DqRepository view is not openning will don'st should show the element immediately if (dqview != null) { RepositoryNode recursiveFind = RepositoryNodeHelper.recursiveFind(column); if (recursiveFind == null) { recursiveFind = RepositoryNodeHelper.createRepositoryNode(column); } dqview.showSelectedElements(recursiveFind); } } } /** * DOC xqliu Comment method "addJoinElement". * * @return */ public JoinElement addJoinElement() { JoinElement newJoinElement = RulesFactory.eINSTANCE.createJoinElement(); newJoinElement.setOperator(PluginConstant.DEFAULT_OPERATOR); this.myTableViewer.add(newJoinElement); this.myJoinElement.add(newJoinElement); this.masterPage.setDirty(true); return newJoinElement; } /** * DOC xqliu Comment method "getSelection". * * @return */ public ISelection getSelection() { return this.myTableViewer.getSelection(); } /** * DOC xqliu Comment method "removeJoinElement". * * @param join */ public void removeJoinElement(JoinElement join) { this.myTableViewer.remove(join); this.myJoinElement.remove(join); this.masterPage.getTempJoinElements().remove(join); this.masterPage.setDirty(true); if (this.myJoinElement.size() == 0) { this.columnSetPackage = null; } } @Override public void updateModelViewer() { this.myJoinElement = this.masterPage.getTempJoinElements(); this.myTableViewer.setInput(this.myJoinElement); if (this.myJoinElement.size() == 0) { this.columnSetPackage = null; } } /** * DOC xqliu IndicatorDefinitionMaterPage class global comment. Detailled comment */ private final class JoinElementCellModifier implements ICellModifier { private List<String> columeNames; private TableViewer tableViewer; public JoinElementCellModifier(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; JoinElement join = (JoinElement) element; TdColumn colA = (TdColumn) join.getColA(); TdColumn colB = (TdColumn) join.getColB(); ColumnSet tabA = colA == null ? null : ColumnHelper.getColumnSetOwner(colA); ColumnSet tabB = colB == null ? null : ColumnHelper.getColumnSetOwner(colB); switch (columnIndex) { case 0: result = tabA == null ? "" : tabA.getName(); //$NON-NLS-1$ break; case 1: result = join.getTableAliasA() == null ? "" : join.getTableAliasA(); //$NON-NLS-1$ break; case 2: result = colA == null ? "" : colA.getName(); //$NON-NLS-1$ break; case 3: String stringValue = join.getOperator(); int i = PluginConstant.OPERATORS.length - 1; while (!stringValue.equals(PluginConstant.OPERATORS[i]) && i > 0) { --i; } result = new Integer(i); break; case 4: result = tabB == null ? "" : tabB.getName(); //$NON-NLS-1$ break; case 5: result = join.getTableAliasB() == null ? "" : join.getTableAliasB(); //$NON-NLS-1$ break; case 6: result = colB == null ? "" : colB.getName(); //$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) { JoinElement join = (JoinElement) tableItem.getData(); if (join != null) { String valueString = String.valueOf(value).trim(); switch (columnIndex) { case 1: join.setTableAliasA(valueString); break; case 3: valueString = PluginConstant.OPERATORS[((Integer) value).intValue()].trim(); if (!join.getOperator().equals(valueString)) { join.setOperator(valueString); } join.setOperator(valueString); break; case 5: join.setTableAliasB(valueString); break; default: } tableViewer.update(join, null); JoinConditionTableViewer.this.masterPage.setDirty(true); } } } } /** * DOC xqliu IndicatorDefinitionMaterPage class global comment. Detailled comment * * FIXME this inner class should be static. Confirm and fix the error. */ private final class JoinElementContentProvider implements IStructuredContentProvider { public Object[] getElements(Object inputElement) { if (inputElement != null) { if (inputElement instanceof List) { return ((List) inputElement).toArray(); } } return null; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } /** * DOC xqliu IndicatorDefinitionMaterPage class global comment. Detailled comment * * FIXME this inner class should be static. Confirm and fix the error. */ private class JoinElementLabelProvider extends LabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { Image result = null; switch (columnIndex) { case 0: result = ImageLib.getImage(ImageLib.TABLE); break; case 2: result = ImageLib.getImage(ImageLib.TD_COLUMN); break; case 4: result = ImageLib.getImage(ImageLib.TABLE); break; case 6: result = ImageLib.getImage(ImageLib.TD_COLUMN); break; default: } return result; } public String getColumnText(Object element, int columnIndex) { String result = ""; //$NON-NLS-1$ JoinElement join = (JoinElement) element; TdColumn colA = (TdColumn) join.getColA(); TdColumn colB = (TdColumn) join.getColB(); ColumnSet tabA = colA == null ? null : ColumnHelper.getColumnSetOwner(colA); ColumnSet tabB = colB == null ? null : ColumnHelper.getColumnSetOwner(colB); switch (columnIndex) { case 0: result = tabA == null ? "" : tabA.getName(); //$NON-NLS-1$ break; case 1: result = join.getTableAliasA() == null ? "" : join.getTableAliasA(); //$NON-NLS-1$ break; case 2: result = colA == null ? "" : colA.getName(); //$NON-NLS-1$ break; case 3: result = join.getOperator(); break; case 4: result = tabB == null ? "" : tabB.getName(); //$NON-NLS-1$ break; case 5: result = join.getTableAliasB() == null ? "" : join.getTableAliasB(); //$NON-NLS-1$ break; case 6: result = colB == null ? "" : colB.getName(); //$NON-NLS-1$ break; default: result = ""; //$NON-NLS-1$ } return result; } } /** * DOC xqliu JoinConditionTableViewer class global comment. Detailled comment * * FIXME this inner class should be static. Confirm and fix the error. */ private class JoinElementColumnDialog extends Dialog { private String ab; public String getAb() { return ab; } public void setAb(String ab) { this.ab = ab; } /** * DOC xqliu JoinElementColumnDialog constructor comment. * * @param parentShell */ protected JoinElementColumnDialog(Shell parentShell) { super(parentShell); } @Override protected Control createDialogArea(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); comp.setLayout(new GridLayout(2, true)); comp.setLayoutData(new GridData(GridData.FILL_BOTH)); Button[] radios = new Button[2]; radios[0] = new Button(comp, SWT.RADIO); radios[0].setSelection(true); setAb(COLUMN_A); radios[0].setText(DefaultMessagesImpl.getString("JoinConditionTableViewer.ColumnA")); //$NON-NLS-1$ radios[0].addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } public void widgetSelected(SelectionEvent arg0) { setAb(COLUMN_A); } }); radios[1] = new Button(comp, SWT.RADIO); radios[1].setText(DefaultMessagesImpl.getString("JoinConditionTableViewer.ColumnB")); //$NON-NLS-1$ radios[1].addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } public void widgetSelected(SelectionEvent arg0) { setAb(COLUMN_B); } }); GridData radioGD = new GridData(GridData.FILL_BOTH); radios[0].setLayoutData(radioGD); radios[1].setLayoutData(radioGD); return comp; } } @Override public boolean canDrop(IRepositoryNode modelElement) { return true; } @Override public void dropModelElements(List<? extends IRepositoryNode> modelElements, int index) { List<TdColumn> columns = new ArrayList<TdColumn>(); for (IRepositoryNode repNode : modelElements) { if (repNode.getObject() instanceof MetadataColumnRepositoryObject) { TdColumn column = (TdColumn) ((MetadataColumnRepositoryObject) repNode.getObject()).getTdColumn(); if (column != null) { columns.add(column); } } } JoinElementColumnDialog joinElementColumnDialog = new JoinElementColumnDialog(null); if (joinElementColumnDialog.open() == Window.OK) { JoinElement join = (JoinElement) this.myTableViewer.getElementAt(index); if (join == null) { join = this.addJoinElement(); } if (join != null) { boolean dirty = false; for (TdColumn column : columns) { if (column != null) { if (!updateColumnSetPackage(column)) { break; } if (COLUMN_A.equals(joinElementColumnDialog.getAb())) { join.setColA(column); join.setColumnAliasA(column.getName()); join.setTableAliasA(ColumnHelper.getColumnSetFullName(column)); dirty = true; } else { join.setColB(column); join.setColumnAliasB(column.getName()); join.setTableAliasB(ColumnHelper.getColumnSetFullName(column)); dirty = true; } } } if (dirty) { this.masterPage.setDirty(true); this.myTableViewer.update(join, null); } } } } @Override public void addElements(ModelElementIndicator[] elements) { } @Override protected void setElements(ModelElementIndicator[] modelElementIndicator) { } }