// ============================================================================
//
// 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.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
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.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
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.ui.dialog.ColumnsSelectionDialog;
import org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage;
import org.talend.dataprofiler.core.ui.editor.analysis.FunctionalDependencyAnalysisDetailsPage;
import org.talend.dataprofiler.core.ui.grid.utils.Observerable;
import org.talend.dataprofiler.core.ui.grid.utils.TDQObserver;
import org.talend.dataprofiler.core.ui.views.DQRespositoryView;
import org.talend.dataprofiler.core.ui.views.RespositoryDetailView;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dataquality.indicators.columnset.ColumnDependencyIndicator;
import org.talend.dataquality.indicators.columnset.RowMatchingIndicator;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.DBColumnRepNode;
import org.talend.repository.model.RepositoryNode;
import orgomg.cwm.objectmodel.core.ModelElement;
import orgomg.cwm.resource.relational.ColumnSet;
/**
* DOC mzhao 2009-06-17 feature 5887.
*/
public class AnalysisColumnCompareTreeViewer extends AbstractPagePart implements Observerable<ModelElement[]>,
TDQObserver<Map<String, Integer>> {
private AbstractAnalysisMetadataPage masterPage;
private Composite parentComp;
private ScrolledForm form = null;
private List<RepositoryNode> columnListA;
// MOD mzhao 2009-06-17 feature 5887
private SelectionListener selectionListener = null;
// ADD mzhao 2009-02-03 Tableviewer creation stack that remember left or
// right position.
private List<TableViewer> tableViewerPosStack = null;
private List<RepositoryNode> columnListB;
private Section columnsComparisonSection = null;
private FormToolkit toolkit;
private Button checkComputeButton;
private TableViewer leftTableViewer = null;
private TableViewer rightTableViewer = null;
private Analysis analysis = null;
private boolean showCheckButton = true;
private boolean checkComputButton = false;
private boolean allowColumnDupcation = false;
private Button columnReverseButtion;
/**
* ADD msjian TDQ-11606: the preview data table, we will show all the columns of it. this table is the
* leftTableViewer's first column's owner.
*/
private ColumnSet previewDataColumnOwner = null;
private List<TDQObserver<ModelElement[]>> Observers = null;
/**
* AnalysisColumnCompareTreeViewer constructor used for FunctionalDependencyAnalysisDetailsPage.
*
* @param masterPage
* @param topComp
* @param columnSetA
* @param columnSetB
* @param mainTitle
* @param description
* @param showCheckButton
* @param allowColumnDupcation
*/
public AnalysisColumnCompareTreeViewer(AbstractAnalysisMetadataPage masterPage, Composite topComp,
List<RepositoryNode> columnSetA, List<RepositoryNode> columnSetB, String mainTitle, String description,
boolean showCheckButton, boolean allowColumnDupcation) {
this.masterPage = masterPage;
form = masterPage.getScrolledForm();
toolkit = masterPage.getEditor().getToolkit();
this.parentComp = topComp;
this.analysis = masterPage.getCurrentModelElement();
columnListA = new ArrayList<RepositoryNode>();
columnListB = new ArrayList<RepositoryNode>();
tableViewerPosStack = new ArrayList<TableViewer>();
this.showCheckButton = showCheckButton;
this.allowColumnDupcation = allowColumnDupcation;
columnListA.addAll(columnSetA);
columnListB.addAll(columnSetB);
if (columnListA != null && columnListA.size() > 0) {
previewDataColumnOwner = RepositoryNodeHelper.getColumnOwner(columnListA.get(0));
}
createAnalyzedColumnSetsSection(mainTitle, description);
}
/**
* AnalysisColumnCompareTreeViewer constructor used for RedundancyAnalysisDetailsPage.
*
* @param masterPage
* @param topComp
* @param analysis
* @param allowColumnDupcation
*/
public AnalysisColumnCompareTreeViewer(AbstractAnalysisMetadataPage masterPage, Composite topComp, Analysis analysis,
boolean allowColumnDupcation) {
// MOD mzhao bug:12766 2010-04-27. Initialize the coloumnListA and columnListB.
this.masterPage = masterPage;
form = masterPage.getScrolledForm();
toolkit = masterPage.getEditor().getToolkit();
this.parentComp = topComp;
columnListA = new ArrayList<RepositoryNode>();
columnListB = new ArrayList<RepositoryNode>();
tableViewerPosStack = new ArrayList<TableViewer>();
this.showCheckButton = true;
this.allowColumnDupcation = allowColumnDupcation;
if (analysis.getResults().getIndicators().size() > 0) {
EList<Indicator> indicators = analysis.getResults().getIndicators();
RowMatchingIndicator rowMatchingIndicatorA = (RowMatchingIndicator) indicators.get(0);
for (TdColumn tdColumn : rowMatchingIndicatorA.getColumnSetA()) {
RepositoryNode recursiveFind = RepositoryNodeHelper.recursiveFind(tdColumn);
if (recursiveFind == null) {
recursiveFind = RepositoryNodeHelper.createRepositoryNode(tdColumn);
}
columnListA.add(recursiveFind);
}
for (TdColumn tdColumn : rowMatchingIndicatorA.getColumnSetB()) {
RepositoryNode recursiveFind = RepositoryNodeHelper.recursiveFind(tdColumn);
if (recursiveFind == null) {
recursiveFind = RepositoryNodeHelper.createRepositoryNode(tdColumn);
}
columnListB.add(recursiveFind);
}
}
String mainTitle = DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.analyzedColumnSets");//$NON-NLS-1$
String description = DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.SelectTableOrColumnsCompare");//$NON-NLS-1$
createAnalyzedColumnSetsSection(mainTitle, description);
// ~
this.analysis = analysis;
checkComputButton = analysis.getParameters().getDeactivatedIndicators().size() != 0;
// ADD by msjian 2011-5-6 21022: the checkbox to "compute only number of A rows not in B" value is not saved
if (null != checkComputeButton) {
checkComputeButton.setSelection(checkComputButton);
}
}
private void createAnalyzedColumnSetsSection(String mainTitle, String description) {
columnsComparisonSection = masterPage.createSection(form, parentComp, mainTitle, description);
Composite sectionClient = toolkit.createComposite(columnsComparisonSection);
sectionClient.setLayout(new GridLayout());
// sectionClient.setLayout(new GridLayout(2, true));
// this.createSectionPart(form, sectionClient, "left Columns");
// this.createSectionPart(form, sectionClient, "Right Columns");
if (showCheckButton) {
checkComputeButton = new Button(sectionClient, SWT.CHECK);
GridData layoutData = new GridData(GridData.FILL_BOTH);
layoutData.horizontalAlignment = SWT.CENTER;
checkComputeButton.setLayoutData(layoutData);
checkComputeButton.setText(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.Compute")); //$NON-NLS-1$
checkComputeButton.setToolTipText(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.WhenUnchecked")); //$NON-NLS-1$
checkComputeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
masterPage.setDirty(true);
}
});
checkComputeButton.setSelection(checkComputButton);
}
Composite columnComp = toolkit.createComposite(sectionClient);
columnComp.setLayoutData(new GridData(GridData.FILL_BOTH));
columnComp.setLayout(new GridLayout());
Composite compareToplevelComp = toolkit.createComposite(columnComp);
GridLayout compareToplevelLayout = new GridLayout();
compareToplevelLayout.numColumns = 2;
compareToplevelComp.setLayout(compareToplevelLayout);
// !MOD mzhao 2010-03-08,Feature 11387. Add reverse action to make it easy for columns comparing on opposite
// way.
// MOD qiongli 2010-6-10,bug 13600:remove "reverse columns" button for
// ColumnSet comparison analysis.s
if (masterPage instanceof FunctionalDependencyAnalysisDetailsPage) {
columnReverseButtion = toolkit.createButton(compareToplevelComp, "Reverse columns", SWT.NONE); //$NON-NLS-1$
columnReverseButtion.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
handleColumnReverseAction();
}
});
columnReverseButtion.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.keyCode == 13) {
handleColumnReverseAction();
}
}
});
masterPage.createRunButton(compareToplevelComp);
} else {
masterPage.createConnBindWidget(compareToplevelComp);
}
// ~
SashForm sashForm = new SashForm(sectionClient, SWT.NULL);
sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
String leftSelectButtonText = DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.selectColumnsForASet"); //$NON-NLS-1$
String rightSelectButtonText = DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.selectColumnsForBSet"); //$NON-NLS-1$
String leftSelectButtonTooltip;
String rightSelectButtonTooltip;
if (masterPage instanceof FunctionalDependencyAnalysisDetailsPage) {
leftSelectButtonTooltip = DefaultMessagesImpl.getString("AnalysisColumnCompareTreeViewer.DeterminantCol"); //$NON-NLS-1$
rightSelectButtonTooltip = DefaultMessagesImpl.getString("AnalysisColumnCompareTreeViewer.DependentCol"); //$NON-NLS-1$
} else {
leftSelectButtonTooltip = DefaultMessagesImpl
.getString("AnalysisColumnCompareTreeViewer.selectColumnsForASetTooltip"); //$NON-NLS-1$
rightSelectButtonTooltip = DefaultMessagesImpl
.getString("AnalysisColumnCompareTreeViewer.selectColumnsForBSetTooltip"); //$NON-NLS-1$
}
Composite leftComp = toolkit.createComposite(sashForm);
leftComp.setLayoutData(new GridData(GridData.FILL_BOTH));
leftComp.setLayout(new GridLayout());
String leftSectionTitle = DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.leftColumns"); //$NON-NLS-1$
leftTableViewer = this.createSectionPart(leftComp, columnListA, leftSectionTitle, leftSelectButtonText,
leftSelectButtonTooltip, true);
Composite rightComp = toolkit.createComposite(sashForm);
rightComp.setLayoutData(new GridData(GridData.FILL_BOTH));
rightComp.setLayout(new GridLayout());
String rightSectionTitle = DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.rightColumns"); //$NON-NLS-1$
rightTableViewer = this.createSectionPart(rightComp, columnListB, rightSectionTitle, rightSelectButtonText,
rightSelectButtonTooltip, false);
// MOD mzhao 2009-05-05 bug:6587.
updateBindConnection(masterPage, tableViewerPosStack);
columnsComparisonSection.setClient(sectionClient);
}
/**
* DOC jet Comment method "refreash". redraw selected content.
*/
public void refreash() {
rightTableViewer.refresh();
leftTableViewer.refresh();
}
private TableViewer createSectionPart(Composite parentComp, final List<RepositoryNode> columnList, String sectionTitle,
String buttonText, String buttonTooltipText, final boolean isLeftPart) {
Section columnSetElementSection = masterPage.createSection(form, parentComp, sectionTitle, null);
Composite sectionComp = toolkit.createComposite(columnSetElementSection);
sectionComp.setLayout(new GridLayout());
Button selectColumnBtn = toolkit.createButton(sectionComp, buttonText, SWT.NONE);
selectColumnBtn.setToolTipText(buttonTooltipText);
GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(selectColumnBtn);
Composite columsComp = toolkit.createComposite(sectionComp, SWT.NULL);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).grab(true, true).applyTo(columsComp);
columsComp.setLayout(new GridLayout());
final TableViewer columnsElementViewer = createTreeViewer(columnList, columsComp);
// ~ADD mzhao for cheat sheets later open column selection dialog.
tableViewerPosStack.add(columnsElementViewer);
// ~
// DragAndDropDecorate decorate = new DragAndDropDecorate();
// decorate.toDecorateDragAndDrop(columnsElementViewer);
ComparisonTableViewerDNDDecorate dndDecorate = new ComparisonTableViewerDNDDecorate(this, masterPage,
tableViewerPosStack, allowColumnDupcation);
dndDecorate.installDND(columnsElementViewer, true, ComparisonTableViewerDNDDecorate.COLUMN_VALIDATETYPE, isLeftPart);
Composite buttonsComp = toolkit.createComposite(columsComp, SWT.NULL);
buttonsComp.setLayout(new GridLayout(4, true));
buttonsComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
final Button delButton = new Button(buttonsComp, SWT.NULL);
delButton.setImage(ImageLib.getImage(ImageLib.DELETE_ACTION));
GridData buttonGridData = new GridData(GridData.FILL_BOTH);
delButton.setLayoutData(buttonGridData);
final Button moveUpButton = new Button(buttonsComp, SWT.NULL);
moveUpButton.setText(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.moveUp")); //$NON-NLS-1$
moveUpButton.setLayoutData(buttonGridData);
final Button moveDownButton = new Button(buttonsComp, SWT.NULL);
moveDownButton.setText(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.moveDown")); //$NON-NLS-1$
moveDownButton.setLayoutData(buttonGridData);
Button sortButton = new Button(buttonsComp, SWT.NULL);
sortButton.setText(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.sort")); //$NON-NLS-1$
sortButton.setLayoutData(buttonGridData);
final Button[] buttons = new Button[] { delButton, moveUpButton, moveDownButton };
columnsElementViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
enabledButtons(buttons, event.getSelection() != null);
showDetailView(columnsElementViewer);
}
});
// ADD 2009-01-07 mzhao for feature:0005664
createTableViewerMenu(columnsElementViewer, columnList, buttons, isLeftPart);
delButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
columnList.removeAll(((IStructuredSelection) columnsElementViewer.getSelection()).toList());
columnsElementViewer.setInput(columnList);
enabledButtons(buttons, false);
masterPage.setDirty(true);
computeRefreshDataPreviewPart(isLeftPart, columnList, columnsElementViewer);
}
});
moveUpButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
moveElement(columnList, columnsElementViewer, false);
computeRefreshDataPreviewPart(isLeftPart, columnList, columnsElementViewer);
}
});
moveDownButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
moveElement(columnList, columnsElementViewer, true);
computeRefreshDataPreviewPart(isLeftPart, columnList, columnsElementViewer);
}
});
sortButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// MOD xqliu 2009-01-17, bug 5940: achieve the function of sort
// button
sortElement(columnList, columnsElementViewer);
computeRefreshDataPreviewPart(isLeftPart, columnList, columnsElementViewer);
}
});
this.enabledButtons(new Button[] { delButton, moveUpButton, moveDownButton }, false);
final List<RepositoryNode> columnsOfSectionPart = columnList;
selectColumnBtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
openColumnsSelectionDialog(columnsElementViewer, columnsOfSectionPart, isLeftPart);
enabledButtons(buttons, false);
}
});
columnSetElementSection.setClient(sectionComp);
return columnsElementViewer;
}
/**
* MOD mzhao 2009-02-03,remove the first parameter, extract it to class property filed for the convenience of
* invoking this method from cheat sheets.
*/
public void openColumnsSelectionDialog(TableViewer columnsElementViewer, List<RepositoryNode> columnsOfSectionPart,
boolean isLeftPart) {
RepositoryNode connNode = masterPage.getConnComboSelectNode();
ColumnsSelectionDialog dialog = new ColumnsSelectionDialog(masterPage, null,
DefaultMessagesImpl.getString("ColumnMasterDetailsPage.columnSelection"), columnsOfSectionPart, connNode,//$NON-NLS-1$
DefaultMessagesImpl.getString("ColumnMasterDetailsPage.columnSelections")); //$NON-NLS-1$
if (dialog.open() == Window.OK) {
Object[] columns = dialog.getResult();
List<RepositoryNode> columnSet = new ArrayList<RepositoryNode>();
for (Object obj : columns) {
if (obj instanceof DBColumnRepNode) {
columnSet.add((RepositoryNode) obj);
}
}
columnsElementViewer.setInput(columnSet);
columnsOfSectionPart.clear();
columnsOfSectionPart.addAll(columnSet);
computeRefreshDataPreviewPart(isLeftPart, columnSet, columnsElementViewer);
updateBindConnection(masterPage, tableViewerPosStack);
}
}
/**
* DOC msjian Comment method "computeRefreshDataPreviewPart".
*
* @param isLeftPart
* @param columnSet
* @return
*/
protected ColumnSet computeRefreshDataPreviewPart(boolean isLeftPart, List<RepositoryNode> columnSet,
TableViewer columnsElementViewer) {
ColumnSet columnOwner = null;
if (columnSet != null && columnSet.size() > 0) {
RepositoryNode node = columnSet.get(0);
columnOwner = RepositoryNodeHelper.getColumnOwner(node);
}
if (isLeftPart) {
if ((previewDataColumnOwner == null && columnOwner != null)
|| (previewDataColumnOwner != null && columnOwner == null) || (!previewDataColumnOwner.equals(columnOwner))) {
previewDataColumnOwner = columnOwner;
notifyObservers();
}
}
// set the columnsElementViewer's table name show
String tableName = columnOwner == null ? "" : columnOwner.getName();
columnsElementViewer.getTable().getColumn(0)
.setText(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.elements", tableName)); //$NON-NLS-1$
return columnOwner;
}
/**
* DOC rli Comment method "moveElement".
*
* @param columnList
* @param columnsElementViewer
*/
private void moveElement(List<RepositoryNode> columnList, TableViewer columnsElementViewer, boolean isDown) {
// Object firstElement = ((IStructuredSelection) columnsElementViewer.getSelection()).getFirstElement();
// int index = columnList.indexOf(firstElement);
// if (isDown) {
// if ((index + 1) < columnList.size()) {
// columnList.remove(firstElement);
// columnList.add((index + 1), (Column) firstElement);
// }
// } else {
// if ((index - 1) >= 0) {
// columnList.remove(firstElement);
// columnList.add((index - 1), (Column) firstElement);
// }
//
// }
// columnsElementViewer.setInput(columnList);
Object[] elementArray = ((IStructuredSelection) columnsElementViewer.getSelection()).toArray();
if (isDown) {
for (int i = elementArray.length - 1; i >= 0; i--) {
RepositoryNode currentElement = (RepositoryNode) elementArray[i];
int index = columnList.indexOf(currentElement);
if ((index + 1) < columnList.size()) {
columnList.remove(currentElement);
columnList.add((index + 1), currentElement);
} else {
break;
}
}
} else {
for (Object element : elementArray) {
RepositoryNode currentElement = (RepositoryNode) element;
int index = columnList.indexOf(currentElement);
if ((index - 1) >= 0) {
columnList.remove(currentElement);
columnList.add((index - 1), currentElement);
} else {
break;
}
}
}
columnsElementViewer.setInput(columnList);
}
/**
*
* DOC xqliu Comment method "sortElement".
*
* @param columnList
* @param columnsElementViewer
* @param asc
*/
private void sortElement(List<RepositoryNode> columnList, TableViewer columnsElementViewer) {
Collections.sort(columnList, new CaseInsensitiveComparator());
columnsElementViewer.setInput(columnList);
}
/**
*
* DOC xqliu ColumnsComparisonMasterDetailsPage class global comment. Detailled comment
*
* FIXME this inner class should be static. Confirm and fix the error.
*/
private class CaseInsensitiveComparator implements Comparator<Object> {
public int compare(Object element1, Object element2) {
TdColumn col1;
TdColumn col2;
if (element1 instanceof DBColumnRepNode && element2 instanceof DBColumnRepNode) {
col1 = ((DBColumnRepNode) element1).getTdColumn();
col2 = ((DBColumnRepNode) element2).getTdColumn();
} else {
col1 = (TdColumn) element1;
col2 = (TdColumn) element2;
}
String lower1 = col1.getName().toLowerCase();
String lower2 = col2.getName().toLowerCase();
return lower1.compareTo(lower2);
}
}
/**
* DOC rli Comment method "setColumnAB".
*/
public void setColumnABForMatchingIndicator(RowMatchingIndicator rowMatchingIndicator, List<RepositoryNode> columnsA,
List<RepositoryNode> columnsB) {
if (columnsA.size() != 0 && columnsA.get(0).getObject() instanceof MetadataColumnRepositoryObject) {
RepositoryNode node = columnsA.get(0);
MetadataColumnRepositoryObject columnObject = (MetadataColumnRepositoryObject) node.getObject();
TdColumn column = ((TdColumn) columnObject.getTdColumn());
ColumnSet columnSetOwner = ColumnHelper.getColumnOwnerAsColumnSet(column);
rowMatchingIndicator.setAnalyzedElement(columnSetOwner);
}
rowMatchingIndicator.getColumnSetA().clear();
for (RepositoryNode reposNode : columnsA) {
rowMatchingIndicator.getColumnSetA().add(
(TdColumn) ((MetadataColumnRepositoryObject) reposNode.getObject()).getTdColumn());
}
rowMatchingIndicator.getColumnSetB().clear();
for (RepositoryNode reposNode : columnsB) {
rowMatchingIndicator.getColumnSetB().add(
(TdColumn) ((MetadataColumnRepositoryObject) reposNode.getObject()).getTdColumn());
}
}
private TableViewer createTreeViewer(final List<RepositoryNode> columnList, Composite columsComp) {
TableViewer columnsElementViewer = new TableViewer(columsComp, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.MULTI);
Table table = columnsElementViewer.getTable();
GridDataFactory.fillDefaults().grab(true, true).applyTo(table);
((GridData) table.getLayoutData()).heightHint = 280;
table.setHeaderVisible(true);
table.setDragDetect(true);
table.setToolTipText(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.reorderElementsByDragAnddrop")); //$NON-NLS-1$
final TableColumn columnHeader = new TableColumn(table, SWT.CENTER);
columnHeader.setWidth(260);
columnHeader.setAlignment(SWT.CENTER);
if (columnList.size() > 0) {
RepositoryNode column = columnList.get(0);
if (column != null) {
MetadataColumnRepositoryObject colObject = (MetadataColumnRepositoryObject) column.getObject();
String tableName = ColumnHelper.getColumnOwnerAsColumnSet(colObject.getTdColumn()).getName();
columnHeader.setText(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.element", tableName)); //$NON-NLS-1$
} else {
columnList.remove(column);
columnHeader.setText("The connection is not available now!"); //$NON-NLS-1$
}
}
ColumnsElementViewerProvider provider = new ColumnsElementViewerProvider();
columnsElementViewer.setContentProvider(provider);
columnsElementViewer.setLabelProvider(provider);
columnsElementViewer.setInput(columnList);
return columnsElementViewer;
}
private void createTableViewerMenu(final TableViewer columnsElementViewer, final List<RepositoryNode> columnList,
final Button[] buttons, final boolean isLeftPart) {
Table table = columnsElementViewer.getTable();
Menu menu = new Menu(table);
MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
menuItem.setImage(ImageLib.getImage(ImageLib.DELETE_ACTION));
menuItem.setText(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.removeElement")); //$NON-NLS-1$
menuItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (columnList.remove(((IStructuredSelection) columnsElementViewer.getSelection()).getFirstElement())) {
columnsElementViewer.setInput(columnList);
enabledButtons(buttons, false);
masterPage.setDirty(true);
computeRefreshDataPreviewPart(isLeftPart, columnList, columnsElementViewer);
}
}
});
MenuItem showMenuItem = new MenuItem(menu, SWT.CASCADE);
showMenuItem.setText(DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.showDQElement")); //$NON-NLS-1$
showMenuItem.setImage(ImageLib.getImage(ImageLib.EXPLORE_IMAGE));
showMenuItem.addSelectionListener(new SelectionAdapter() {
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse .swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
showSelectedElements(columnsElementViewer);
}
});
table.setMenu(menu);
}
public void showDetailView(TableViewer tableView) {
TableItem[] selection = tableView.getTable().getSelection();
if (selection.length > 0) {
RespositoryDetailView detailView = CorePlugin.getDefault().getRespositoryDetailView();
if (detailView == null) {
return;
}
DQRespositoryView dqview = CorePlugin.getDefault().getRepositoryView();
detailView.selectionChanged(dqview, new StructuredSelection(selection[0].getData()));
}
}
/**
*
* DOC mzhao Comment method "showSelectedElements".
*
* @param newTree
*/
private void showSelectedElements(TableViewer tableView) {
TableItem[] selection = tableView.getTable().getSelection();
if (selection.length > 0) {
// if DqRepository view is not openning we will not do anything
DQRespositoryView dqview = CorePlugin.getDefault().findAndOpenRepositoryView();
if (dqview != null) {
dqview.showSelectedElements(selection[0].getData());
}
}
}
private void enabledButtons(Button[] buttons, boolean enabled) {
for (Button button : buttons) {
button.setEnabled(enabled);
}
}
/**
* The provider for ColumnsElementViewer.
*/
class ColumnsElementViewerProvider extends LabelProvider implements IStructuredContentProvider {
@SuppressWarnings("unchecked")
public Object[] getElements(Object inputElement) {
List<Object> columnSet = (List<Object>) inputElement;
return columnSet.toArray();
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// MOD yyi 2012-02-29 TDQ-3605 Dirty editor if selection changes.
if (newInput instanceof List && oldInput != null) {
if (!((List<?>) newInput).equals(oldInput)) {
masterPage.setDirty(true);
}
}
}
@Override
public Image getImage(Object element) {
if (element instanceof RepositoryNode
&& ((RepositoryNode) element).getObject() instanceof MetadataColumnRepositoryObject) {
return ImageLib.getImage(ImageLib.TD_COLUMN);
}
return null;
}
@Override
public String getText(Object element) {
if (element instanceof DBColumnRepNode) {
TdColumn column = (TdColumn) ((MetadataColumnRepositoryObject) (((DBColumnRepNode) element).getObject()))
.getTdColumn();
return column.getName();
}
return PluginConstant.EMPTY_STRING;
}
}
/**
*
* DOC mzhao Open column selection dialog for left column set. this method is intended to use from cheat sheets.
*/
public void openColumnsSetASelectionDialog() {
openColumnsSelectionDialog(tableViewerPosStack.get(0), columnListA, true);
}
/**
*
* DOC mzhao Open column selection dialog for right column set. this method is intended to use from cheat sheets.
*/
public void openColumnsSetBSelectionDialog() {
openColumnsSelectionDialog(tableViewerPosStack.get(1), columnListB, false);
}
@Override
public void updateModelViewer() {
if (analysis.getResults().getIndicators().size() != 0) {
EList<Indicator> indicators = analysis.getResults().getIndicators();
// MOD qiongli bug 0012766,2010-6-8,to the instance of
// ColumnDependencyIndicator and update view
if (indicators.get(0) instanceof ColumnDependencyIndicator) {
columnListA.clear();
columnListB.clear();
ColumnDependencyIndicator cdi = null;
for (int i = 0; i < indicators.size(); i++) {
cdi = (ColumnDependencyIndicator) indicators.get(i);
columnListA.add(RepositoryNodeHelper.recursiveFind(cdi.getColumnA()));
columnListB.add(RepositoryNodeHelper.recursiveFind(cdi.getColumnB()));
}
tableViewerPosStack.get(0).setInput(columnListA);
tableViewerPosStack.get(1).setInput(columnListB);
} else {
RowMatchingIndicator rowMatchingIndicatorA = (RowMatchingIndicator) indicators.get(0);
columnListA.clear();
// columnListA.addAll(rowMatchingIndicatorA.getColumnSetA());
for (TdColumn tdColumn : rowMatchingIndicatorA.getColumnSetA()) {
columnListA.add(RepositoryNodeHelper.recursiveFind(tdColumn));
}
tableViewerPosStack.get(0).setInput(columnListA);
columnListB.clear();
// columnListB.addAll(rowMatchingIndicatorA.getColumnSetB());
for (TdColumn tdColumn : rowMatchingIndicatorA.getColumnSetB()) {
columnListB.add(RepositoryNodeHelper.recursiveFind(tdColumn));
}
tableViewerPosStack.get(1).setInput(columnListB);
}
} else {
// MOD mzhao bug 12766, 2010-04-22 refresh the viewer.
columnListA.clear();
columnListB.clear();
// MOD qiongli 2010-6-8, bug 13595
// tableViewerPosStack.get(0).setInput(null);
// tableViewerPosStack.get(1).setInput(null);
tableViewerPosStack.get(0).setInput(columnListA);
tableViewerPosStack.get(1).setInput(columnListB);
// ~
}
}
public Section getColumnsComparisonSection() {
return columnsComparisonSection;
}
public Button getCheckComputeButton() {
return checkComputeButton;
}
public List<RepositoryNode> getColumnListA() {
return columnListA;
}
public List<RepositoryNode> getColumnListB() {
return columnListB;
}
/**
*
* DOC mzhao feature 11387, 2010-03-08, AnalysisColumnCompareTreeViewer class global comment. Detailled comment
*/
private void handleColumnReverseAction() {
if (columnListA.size() != columnListB.size()) {
return;
}
if (columnListA != null && columnListA.size() > 0) {
int idx = 0;
List<Integer> needToReverseIndex = new ArrayList<Integer>();
for (RepositoryNode column : columnListA) {
if (canReverse(column, columnListB.get(idx))) {
needToReverseIndex.add(idx);
}
idx++;
}
for (Integer index : needToReverseIndex) {
columnListB.add(columnListA.get(index));
columnListA.add(columnListB.get(index));
leftTableViewer.add(columnListB.get(index));
rightTableViewer.add(columnListA.get(index));
// Show on tree view
masterPage.setDirty(true);
}
}
}
private Boolean canReverse(RepositoryNode colA, RepositoryNode colB) {
int idx = 0;
for (RepositoryNode col : columnListA) {
if (col.getObject().getId().equals(colB.getObject().getId())) {
return !((idx > columnListB.size() - 1) || (columnListB.get(idx) == colA));
}
idx++;
}
return true;
}
public SelectionListener getSelectionListener() {
return this.selectionListener;
}
public void setSelectionListener(SelectionListener selectionListener) {
this.selectionListener = selectionListener;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataprofiler.core.ui.grid.utils.Observerable#addObserver(org.talend.dataprofiler.core.ui.grid.utils
* .TalendObserver)
*/
public boolean addObserver(TDQObserver<ModelElement[]> observer) {
initObserverable();
return Observers.add(observer);
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataprofiler.core.ui.grid.utils.Observerable#removeObserver(org.talend.dataprofiler.core.ui.grid.utils
* .TalendObserver)
*/
public boolean removeObserver(TDQObserver<ModelElement[]> observer) {
if (Observers == null) {
return false;
}
return Observers.remove(observer);
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.utils.Observerable#clearObserver()
*/
public void clearObserver() {
if (Observers == null) {
return;
}
Observers.clear();
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.utils.Observerable#notifyObservers()
*/
public void notifyObservers() {
if (Observers == null) {
return;
}
for (TDQObserver<ModelElement[]> observer : Observers) {
if (previewDataColumnOwner != null) {
List<TdColumn> columns = ColumnSetHelper.getColumns(previewDataColumnOwner);
ModelElement[] modelElements = columns.toArray(new TdColumn[columns.size()]);
observer.update(modelElements);
} else {
observer.update(new ModelElement[0]);
}
}
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.utils.Observerable#initObserverable()
*/
private void initObserverable() {
if (Observers == null) {
Observers = new ArrayList<TDQObserver<ModelElement[]>>();
}
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.utils.TDQObserver#update(java.lang.Object)
*/
public void update(Map<String, Integer> columnIndexMap) {
// do nothing until now
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.utils.TDQObserver#update(int)
*/
public void update(int EventType) {
// do nothing until now
}
public ColumnSet getPreviewDataColumnOwner() {
return this.previewDataColumnOwner;
}
}