// ============================================================================ // // 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.dataquality.record.linkage.ui.section; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.talend.core.model.metadata.builder.connection.MetadataColumn; import org.talend.cwm.relational.TdColumn; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.record.linkage.ui.action.RefreshChartAction; import org.talend.dataquality.record.linkage.ui.composite.utils.ImageLib; import org.talend.dataquality.record.linkage.ui.i18n.internal.DefaultMessagesImpl; import org.talend.dataquality.rules.KeyDefinition; import org.talend.dq.helper.EObjectHelper; import org.talend.utils.sugars.ReturnCode; /** * created by zshen on Jul 31, 2013 Detailled comment * */ public abstract class AbstractMatchAnaysisTableSection extends AbstractSectionComposite implements ITableEditOperation { protected List<Object[]> matchRows = new ArrayList<Object[]>(); // <column instance, column index> protected Map<MetadataColumn, String> columnMap = null; protected Analysis analysis = null; protected Boolean isNeedSubChart = true; private Composite sectionClient = null; private boolean isAddColumn = false; private Composite subTableContent = null; private Composite subTableContentParent = null; private Composite subChartContent = null; /** * @param parent * @param style */ public AbstractMatchAnaysisTableSection(final ScrolledForm form, Composite parent, int style, FormToolkit toolkit, Analysis newAnalysis) { super(form, parent, style, toolkit); this.analysis = newAnalysis; } /** * DOC zshen Comment method "createContext". */ public Composite createContent() { section.setText(getSectionName()); sectionClient = toolkit.createComposite(section, SWT.NONE); sectionClient.setLayout(new GridLayout(getGridColumnNum(), true)); sectionClient.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); subTableContentParent = toolkit.createComposite(sectionClient, SWT.NONE); GridData data = new GridData(GridData.FILL_BOTH); data.heightHint = getTableDefaultHeight(); subTableContentParent.setLayoutData(data); GridLayout gridLayout = new GridLayout(1, false); gridLayout.marginWidth = 0; gridLayout.marginHeight = 0; subTableContentParent.setLayout(gridLayout); subTableContent = createSubContent(subTableContentParent); createButtons(subTableContent); if (isNeedSubChart()) { subChartContent = toolkit.createComposite(sectionClient, SWT.NONE); subChartContent.setLayout(gridLayout); subChartContent.setLayoutData(data); createSubChart(subChartContent); } section.setClient(sectionClient); return sectionClient; } /** * DOC zshen Comment method "getTableDefaultHeight". * * @return */ protected int getTableDefaultHeight() { return 300; } public void redrawnContent() { if (sectionClient != null && !sectionClient.isDisposed()) { sectionClient.dispose(); } createContent(); section.layout(); } public void redrawnSubTableContent() { if (subTableContent != null && !subTableContent.isDisposed()) { subTableContent.dispose(); } subTableContent = createSubContent(subTableContentParent); createButtons(subTableContent); subTableContentParent.layout(); } /** * Getter for isNeedSubChart. * * @return the isNeedSubChart */ public Boolean isNeedSubChart() { return this.isNeedSubChart; } /** * Sets the isNeedSubChart. * * @param isNeedSubChart the isNeedSubChart to set */ public void setIsNeedSubChart(Boolean isNeedASubChart) { this.isNeedSubChart = isNeedASubChart; } /** * DOC zshen Comment method "getColumnNum". * * @return */ private int getGridColumnNum() { if (isNeedSubChart()) { return 2; } else { return 1; } } protected void createButtons(Composite currentSectionClient) { if (isNeedSubChart) { createRefreshButton(currentSectionClient); } else { createEditOperationButtons(currentSectionClient); } } protected void createMoveButton(Composite buttonsComposite, GridData labelGd) { final Button upButton = new Button(buttonsComposite, SWT.NONE); upButton.setToolTipText(DefaultMessagesImpl.getString("AbstractMatchAnaysisTableSection.MoveUp_button_tooltip")); //$NON-NLS-1$ upButton.setImage(ImageLib.getImage(ImageLib.UP_ACTION)); upButton.setLayoutData(labelGd); upButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { moveUpTableItem(); } }); final Button downButton = new Button(buttonsComposite, SWT.NONE); downButton.setToolTipText(DefaultMessagesImpl.getString("AbstractMatchAnaysisTableSection.MoveDown_button_tooltip")); //$NON-NLS-1$ downButton.setImage(ImageLib.getImage(ImageLib.DOWN_ACTION)); downButton.setLayoutData(labelGd); downButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { moveDownTableItem(); } }); } /** * DOC zshen Comment method "createEditOperationButtons". * * @param sectionClient */ private void createEditOperationButtons(Composite parent) { Composite buttonsComposite = new Composite(parent, SWT.NONE); buttonsComposite.setLayout(new GridLayout(7, true)); GridData labelGd = new GridData(); labelGd.horizontalAlignment = SWT.LEFT; labelGd.widthHint = 30; createAddAndRemoveButton(buttonsComposite, labelGd); createMoveButton(buttonsComposite, labelGd); // TODO will be implemented later (copy and paste) } /** * DOC zshen Comment method "createAddAndRemoveButton". * * @param buttonsComposite * @param labelGd */ private void createAddAndRemoveButton(Composite buttonsComposite, GridData labelGd) { final Button addButton = new Button(buttonsComposite, SWT.NONE); addButton.setToolTipText(DefaultMessagesImpl.getString("AbstractMatchAnaysisTableSection.add_button_tooltip")); //$NON-NLS-1$ addButton.setImage(ImageLib.getImage(ImageLib.ADD_ACTION)); addButton.setLayoutData(labelGd); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { addTableItem(); } }); final Button delButton = new Button(buttonsComposite, SWT.NONE); delButton.setToolTipText(DefaultMessagesImpl.getString("AbstractMatchAnaysisTableSection.delete_button_tooltip")); //$NON-NLS-1$ delButton.setImage(ImageLib.getImage(ImageLib.DELETE_ACTION)); delButton.setLayoutData(labelGd); delButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { removeTableItem(); } }); } /** * DOC zshen Comment method "createButtons". */ private void createRefreshButton(Composite currentSectionClient) { Composite buttonsComposite = new Composite(currentSectionClient, SWT.NONE); buttonsComposite.setLayout(new GridLayout(10, true)); buttonsComposite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)); Composite commonButtonsComposite = new Composite(buttonsComposite, SWT.NONE); commonButtonsComposite.setLayout(new GridLayout(10, true)); commonButtonsComposite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 8, 1)); GridData labelGd = new GridData(); labelGd.horizontalAlignment = SWT.LEFT; labelGd.widthHint = 30; createAddAndRemoveButton(commonButtonsComposite, labelGd); createMoveButton(commonButtonsComposite, labelGd); Composite refreshButtonComposite = new Composite(buttonsComposite, SWT.NONE); refreshButtonComposite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 2, 1)); refreshButtonComposite.setLayout(new GridLayout(1, true)); labelGd = new GridData(); labelGd.horizontalAlignment = SWT.RIGHT; String buttonText = DefaultMessagesImpl.getString("AbstractMatchAnaysisTableSection.visulize_button_text"); //$NON-NLS-1$ labelGd.widthHint = buttonText.length() * 10; final Button refresh = new Button(refreshButtonComposite, SWT.NONE); refresh.setToolTipText(DefaultMessagesImpl.getString("AbstractMatchAnaysisTableSection.visulize_button_tooltip")); //$NON-NLS-1$ refresh.setText(buttonText); refresh.setLayoutData(labelGd); refresh.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { new RefreshChartAction(AbstractMatchAnaysisTableSection.this).run(); } }); } /** * need clear the old data every time * */ public void setDataInput(List<Object[]> allData) { matchRows.clear(); matchRows.addAll(allData); } public void setColumnNameInput(Map<MetadataColumn, String> newColumnMap) { this.columnMap = newColumnMap; } public void updateColumnPosition(TdColumn column, int newPosition) { columnMap.remove(column); columnMap.put(column, String.valueOf(newPosition)); } /** * Getter for isAddColumn. * * @return the isAddColumn */ public boolean isAddColumn() { return this.isAddColumn; } /** * Sets the isAddColumn. * * @param isAddColumn the isAddColumn to set */ public void setAddColumn(boolean isNeedAddColumn) { this.isAddColumn = isNeedAddColumn; } /** * DOC zshen Comment method "shouldMoveUp". * * @param blockKeyDefinition * @param blockKeyDefinition2 * @return */ protected boolean isSameWithCurrentModel(Object blockKeyDefinition, Object blockKeyDefinition2) { if (blockKeyDefinition.equals(blockKeyDefinition2)) { return false; } return true; } /* * (non-Javadoc) * * @see org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#pasteTableItem() */ @Override public void pasteTableItem() { // TODO Auto-generated method stub } /* * (non-Javadoc) * * @see org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#copyTableItem() */ @Override public void copyTableItem() { // TODO Auto-generated method stub } /* * (non-Javadoc) * * @see org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#moveDownTableItem() */ @Override public void moveDownTableItem() { // TODO Auto-generated method stub } /* * (non-Javadoc) * * @see org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#moveUpTableItem() */ @Override public void moveUpTableItem() { // TODO Auto-generated method stub } /* * (non-Javadoc) * * @see org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#removeTableItem() */ @Override public void removeTableItem() { // not need implement } /* * (non-Javadoc) * * @see org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#addTableItem() */ @Override public void addTableItem() { // not need implement } /** * DOC zshen Comment method "createSubChart". TODO re-order the protected and abstract key word. let "protected" * first. * * @param sectionClient */ abstract protected void createSubChart(Composite parent); /** * DOC zshen Comment method "createSubContent". * * @param sectionClient */ abstract protected Composite createSubContent(Composite parent); /** * DOC zshen Comment method "getSectionName". * * @return */ abstract protected String getSectionName(); public abstract void refreshChart(); public abstract Boolean isKeyDefinitionAdded(String columnName) throws Exception; /** * check if the key's name is same with some columns name * * @param keyName * @return */ public boolean hasSameColumnWithKeyName(String keyName) { if (this.columnMap == null) { return false; } for (MetadataColumn column : columnMap.keySet()) { if (StringUtils.equalsIgnoreCase(getColumnName(column), keyName)) { return true; } } return false;// columnMap.containsKey(keyName); } public void addColumn(MetadataColumn column, int index) { if (this.columnMap == null) { columnMap = new HashMap<MetadataColumn, String>(); } columnMap.put(column, String.valueOf(index)); } /** * When import:1) use key's name & key's column to compare, 2) set it empty when no match. If the key's column = * some column name, keep it; when key's name and key's column both no match, set it empty * * @param keyDefinition */ protected void setColumnValueIfMatch(KeyDefinition keyDefinition) { String columnName = StringUtils.EMPTY; if (this.columnMap != null) { for (MetadataColumn column : columnMap.keySet()) { if (StringUtils.equalsIgnoreCase(getColumnName(column), keyDefinition.getName())) { columnName = column.getLabel(); break; } } } keyDefinition.setColumn(columnName); } // For the columns from file connection, the name is null private String getColumnName(MetadataColumn column) { if (StringUtils.isBlank(column.getName())) { return column.getLabel(); } else { return column.getName(); } } /** * * check dirty status of current Section * * @return */ public ReturnCode checkResultStatus() { ReturnCode rc = new ReturnCode(true); return rc; } public void resolveAnalysis() { if (this.analysis.eIsProxy()) { analysis = (Analysis) EObjectHelper.resolveObject(analysis); } } public void clearChart() { // do nothing at here. } }