// ============================================================================ // // 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.analysis; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.IOError; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Logger; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableColorProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.nebula.widgets.pagination.AbstractPageControllerComposite; import org.eclipse.nebula.widgets.pagination.IPageChangedListener; import org.eclipse.nebula.widgets.pagination.IPageLoader; import org.eclipse.nebula.widgets.pagination.PageLoaderStrategyHelper; import org.eclipse.nebula.widgets.pagination.PageableController; import org.eclipse.nebula.widgets.pagination.collections.PageResult; import org.eclipse.nebula.widgets.pagination.collections.PageResultContentProvider; import org.eclipse.nebula.widgets.pagination.renderers.navigation.ResultAndNavigationPageGraphicsRenderer; import org.eclipse.nebula.widgets.pagination.table.SortTableColumnSelectionListener; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.graphics.Color; 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.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.talend.cwm.relational.TdColumn; import org.talend.dataprofiler.common.ui.editor.preview.ICustomerDataset; import org.talend.dataprofiler.common.ui.pagination.pageloder.MapDBPageConstant; import org.talend.dataprofiler.common.ui.pagination.pageloder.MapDBPageLoader; 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.ColumnSortListener; import org.talend.dataprofiler.core.ui.editor.analysis.renderer.ColumnSetNavigationPageGraphicsRenderer; import org.talend.dataprofiler.core.ui.editor.pattern.PatternsDataValidation; import org.talend.dataprofiler.core.ui.editor.preview.ColumnSetIndicatorUnit; import org.talend.dataprofiler.core.ui.editor.preview.IndicatorUnit; import org.talend.dataprofiler.core.ui.editor.preview.model.ChartTableFactory; import org.talend.dataprofiler.core.ui.editor.preview.model.ChartTypeStatesFactory; import org.talend.dataprofiler.core.ui.editor.preview.model.TableTypeStatesFactory; import org.talend.dataprofiler.core.ui.editor.preview.model.TableWithData; import org.talend.dataprofiler.core.ui.editor.preview.model.states.IChartTypeStates; import org.talend.dataprofiler.core.ui.editor.preview.model.states.table.ITableTypeStates; import org.talend.dataprofiler.core.ui.utils.TOPChartUtils; import org.talend.dataprofiler.core.ui.utils.TableUtils; import org.talend.dataprofiler.core.ui.wizard.patterns.DataFilterType; import org.talend.dataprofiler.core.ui.wizard.patterns.SelectPatternsWizard; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.helpers.AnalysisHelper; import org.talend.dataquality.indicators.Indicator; import org.talend.dataquality.indicators.RegexpMatchingIndicator; import org.talend.dataquality.indicators.columnset.AllMatchIndicator; import org.talend.dataquality.indicators.columnset.SimpleStatIndicator; import org.talend.dataquality.indicators.columnset.impl.AllMatchIndicatorImpl; import org.talend.dataquality.indicators.mapdb.AbstractDB; import org.talend.dataquality.indicators.mapdb.MapDBManager; import org.talend.dataquality.indicators.mapdb.MapDBUtils; import org.talend.dataquality.indicators.mapdb.StandardDBName; import org.talend.dq.analysis.AnalysisHandler; import org.talend.dq.analysis.explore.DataExplorer; import org.talend.dq.indicators.preview.EIndicatorChartType; import org.talend.dq.nodes.indicator.type.IndicatorEnum; /** * @author yyi 2009-12-16 */ public class ColumnSetAnalysisResultPage extends AbstractAnalysisResultPageWithChart implements PropertyChangeListener { protected static Logger log = Logger.getLogger(ColumnSetAnalysisResultPage.class); private Composite graphicsAndTableComp; private ColumnSetAnalysisDetailsPage masterPage; private SimpleStatIndicator simpleStaticIndicator; private AllMatchIndicator allMatchIndicator; private String executeData; private Section graphicsAndTableSection = null; private TableViewer columnsElementViewer; private TableFilterResult tableFilterResult = new TableFilterResult(null); private DataFilterType filterType = DataFilterType.ALL_DATA; private PageableController controller = null; private IPageChangedListener createLoadPageAndReplaceItemsListener = null; private Composite buttonComposite = null; private AbstractDB<Object> mapDB = null; private AbstractPageControllerComposite resultAndPageButtonsDecorator = null; /** * @param editor * @param id * @param title */ public ColumnSetAnalysisResultPage(FormEditor editor, String id, String title) { super(editor, id, title); AnalysisEditor analysisEditor = (AnalysisEditor) editor; this.masterPage = (ColumnSetAnalysisDetailsPage) analysisEditor.getMasterPage(); simpleStaticIndicator = masterPage.getSimpleStatIndicator(); allMatchIndicator = masterPage.getAllMatchIndicator(); } @Override protected void createFormContent(IManagedForm managedForm) { super.createFormContent(managedForm); if (topComposite != null && !topComposite.isDisposed()) { graphicsAndTableComp = toolkit.createComposite(topComposite); graphicsAndTableComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING)); graphicsAndTableComp.setLayout(new GridLayout()); createResultSection(graphicsAndTableComp); form.reflow(true); } } @Override protected AnalysisHandler getAnalysisHandler() { return this.masterPage.getAnalysisHandler(); } @Override protected void createResultSection(Composite parent) { executeData = getAnalysisHandler().getExecuteData(); graphicsAndTableSection = this.createSection(form, parent, DefaultMessagesImpl.getString("ColumnSetResultPage.AnalysisResult"), null); //$NON-NLS-1$ Composite sectionClient = toolkit.createComposite(graphicsAndTableSection); sectionClient.setLayout(new GridLayout()); sectionClient.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite graphicsComp = toolkit.createComposite(sectionClient); graphicsComp.setLayoutData(new GridData(GridData.FILL_BOTH)); graphicsComp.setLayout(new GridLayout()); if (executeData == null || executeData.equals(PluginConstant.EMPTY_STRING)) { return; } Composite simpleSatisticsComp = toolkit.createComposite(sectionClient); simpleSatisticsComp.setLayoutData(new GridData(GridData.FILL_BOTH)); simpleSatisticsComp.setLayout(new GridLayout()); if (executeData == null || executeData.equals(PluginConstant.EMPTY_STRING)) { return; } else { this.createSimpleStatisticsPart(sectionClient, DefaultMessagesImpl.getString("ColumnSetResultPage.SimpleStatistics"), simpleStaticIndicator); //$NON-NLS-1$ // match if (0 < allMatchIndicator.getCompositeRegexMatchingIndicators().size()) { this.createAllMatchPart(sectionClient, "All Match", allMatchIndicator);//$NON-NLS-1$ } } Composite tableComp = toolkit.createComposite(sectionClient); tableComp.setLayoutData(new GridData(GridData.FILL_BOTH)); tableComp.setLayout(new GridLayout()); if (executeData == null || executeData.equals(PluginConstant.EMPTY_STRING)) { return; } else { if (simpleStaticIndicator.isUsedMapDBMode() && AnalysisHelper.isJavaExecutionEngine(masterPage.getCurrentModelElement())) { this.createTableSectionPartForMapDB(sectionClient, DefaultMessagesImpl.getString("ColumnSetResultPage.Data"), simpleStaticIndicator); //$NON-NLS-1$ } else { this.createTableSectionPart(sectionClient, DefaultMessagesImpl.getString("ColumnSetResultPage.Data"), simpleStaticIndicator); //$NON-NLS-1$ } } graphicsAndTableSection.setExpanded(true); graphicsAndTableSection.setClient(sectionClient); } private Section createAllMatchPart(Composite parentComp, String title, AllMatchIndicator matchIndicator) { Section section = createSection(form, parentComp, title, null); section.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite sectionClient = toolkit.createComposite(section); sectionClient.setLayout(new GridLayout(2, false)); sectionClient.setLayoutData(new GridData(GridData.FILL_BOTH)); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).applyTo(sectionClient); List<IndicatorUnit> units = new ArrayList<IndicatorUnit>(); units.add(new ColumnSetIndicatorUnit(IndicatorEnum.AllMatchIndicatorEnum, allMatchIndicator)); EIndicatorChartType matchingType = EIndicatorChartType.PATTERN_MATCHING; ITableTypeStates tableTypeState = TableTypeStatesFactory.getInstance().getTableState(matchingType, units); TableWithData chartData = new TableWithData(matchingType, tableTypeState.getDataEntity()); TableViewer tableviewer = tableTypeState.getTableForm(sectionClient); tableviewer.setInput(chartData); // MOD qiongli feature 19192. if (masterPage.getCurrentModelElement().getParameters().isStoreData()) { ChartTableFactory.addMenuAndTip(tableviewer, tableTypeState.getDataExplorer(), masterPage.getCurrentModelElement()); } else { TableUtils.addTooltipForTable(tableviewer.getTable()); TableUtils.addActionTooltip(tableviewer.getTable()); } if (canShowChartForResultPage()) { IChartTypeStates chartTypeState = ChartTypeStatesFactory.getChartState(matchingType, units); Object chart = chartTypeState.getChart(); TOPChartUtils.getInstance().decorateChart(chart, false); if (chart != null) { TOPChartUtils.getInstance().createChartComposite(sectionClient, SWT.NONE, chart, true); } } section.setClient(sectionClient); return section; } private Section createSimpleStatisticsPart(Composite parentComp, String title, SimpleStatIndicator simpleStatIndicator) { // MOD sgandon 15/03/2010 bug 11769 : made descriotion null to remove empty space. Section section = createSection(form, parentComp, title, null); section.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite sectionClient = toolkit.createComposite(section); sectionClient.setLayout(new GridLayout(2, false)); sectionClient.setLayoutData(new GridData(GridData.FILL_BOTH)); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).applyTo(sectionClient); createSimpleTable2(form, sectionClient, simpleStatIndicator); section.setClient(sectionClient); return section; } private void createSimpleTable2(final ScrolledForm form, final Composite composite, final SimpleStatIndicator simpleStatIndicator) { List<IndicatorUnit> units = new ArrayList<IndicatorUnit>(); units.add(new ColumnSetIndicatorUnit(IndicatorEnum.RowCountIndicatorEnum, masterPage.getSimpleStatIndicator() .getRowCountIndicator())); units.add(new ColumnSetIndicatorUnit(IndicatorEnum.DistinctCountIndicatorEnum, masterPage.getSimpleStatIndicator() .getDistinctCountIndicator())); units.add(new ColumnSetIndicatorUnit(IndicatorEnum.DuplicateCountIndicatorEnum, masterPage.getSimpleStatIndicator() .getDuplicateCountIndicator())); units.add(new ColumnSetIndicatorUnit(IndicatorEnum.UniqueIndicatorEnum, masterPage.getSimpleStatIndicator() .getUniqueCountIndicator())); EIndicatorChartType simpleStatType = EIndicatorChartType.SIMPLE_STATISTICS; // create table firstly ITableTypeStates tableTypeState = TableTypeStatesFactory.getInstance().getTableState(simpleStatType, units); TableWithData chartData = new TableWithData(simpleStatType, tableTypeState.getDataEntity()); TableViewer tableviewer = tableTypeState.getTableForm(composite); tableviewer.setInput(chartData); // MOD qiongli feature 19192. DataExplorer dataExplorer = tableTypeState.getDataExplorer(); Analysis analysis = this.getAnalysisHandler().getAnalysis(); ChartTableFactory.addMenuAndTip(tableviewer, dataExplorer, analysis); // create chart if (canShowChartForResultPage()) { IChartTypeStates chartTypeState = ChartTypeStatesFactory.getChartState(simpleStatType, units); Object chart = chartTypeState.getChart(); TOPChartUtils.getInstance().decorateChart(chart, false); if (chart != null) { Object chartComposite2 = TOPChartUtils.getInstance().createChartComposite(composite, SWT.NONE, chart, true); addMenuToChartComp(chartComposite2, dataExplorer, analysis, ((ICustomerDataset) chartTypeState.getDataset()).getDataEntities()); } } } private Section createTableSectionPart(Composite parentComp, String title, SimpleStatIndicator ssIndicator) { Section columnSetElementSection = this.createSection(form, parentComp, title, null); Composite sectionTableComp = toolkit.createComposite(columnSetElementSection); // MOD yyi 2010-12-07 17282:create parameter section for storing data control if (ssIndicator.isStoreData()) { columnSetElementSection.setExpanded(true); columnSetElementSection.setEnabled(true); sectionTableComp.setLayoutData(new GridData(GridData.FILL_BOTH)); sectionTableComp.setLayout(new GridLayout()); // MOD zshen for feature 14000 Button filterDataBt = new Button(sectionTableComp, SWT.NONE); filterDataBt.setText(DefaultMessagesImpl.getString("ColumnSetResultPage.filterData"));//$NON-NLS-1$ filterDataBt.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false)); filterDataBt.setEnabled(containAllMatchIndicator()); filterDataBt.addMouseListener(new MouseListener() { public void mouseDoubleClick(MouseEvent e) { // TODO Auto-generated method stub } public void mouseDown(MouseEvent e) { List<Indicator> indicatorsList = masterPage.getCurrentModelElement().getResults().getIndicators(); SelectPatternsWizard wizard = new SelectPatternsWizard(indicatorsList); wizard.setFilterType(filterType); wizard.setOldTableInputList(ColumnSetAnalysisResultPage.this.tableFilterResult.getTableFilterResult()); WizardDialog dialog = new WizardDialog(null, wizard); dialog.setPageSize(300, 400); wizard.setContainer(dialog); wizard.setWindowTitle(DefaultMessagesImpl.getString("SelectPatternsWizard.title"));//$NON-NLS-1$ if (WizardDialog.OK == dialog.open()) { ColumnSetAnalysisResultPage.this.tableFilterResult = new TableFilterResult(wizard.getPatternSelectPage() .getTableInputList()); filterType = wizard.getPatternSelectPage().getFilterType(); columnsElementViewer.refresh(); } } public void mouseUp(MouseEvent e) { // TODO Auto-generated method stub } }); columnsElementViewer = new TableViewer(sectionTableComp, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER); Table table = columnsElementViewer.getTable(); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); List<String> tableColumnNames = ssIndicator.getColumnHeaders(); for (String tableColumnName : tableColumnNames) { final TableColumn columnHeader = new TableColumn(table, SWT.NONE); columnHeader.setText(tableColumnName); } table.setLinesVisible(true); table.setHeaderVisible(true); TableSectionViewerProvider provider = new TableSectionViewerProvider(); List<Object[]> tableRows = ssIndicator.getListRows(); columnsElementViewer.setContentProvider(provider); columnsElementViewer.setLabelProvider(provider); columnsElementViewer.setInput(tableRows); for (int i = 0; i < tableColumnNames.size(); i++) { table.getColumn(i).pack(); } columnSetElementSection.setClient(sectionTableComp); columnSetElementSection.setExpanded(false); // ADDED sgandon 15/03/2010 bug 11769 : setup the size of the table to avoid crash and add consistency. setupTableGridDataLimitedSize(table, tableRows.size()); addColumnSorters(columnsElementViewer, table.getColumns(), this.buildSorter(tableRows)); } else { columnSetElementSection.setExpanded(false); columnSetElementSection.setEnabled(false); } return columnSetElementSection; } private Section createTableSectionPartForMapDB(Composite parentComp, String title, SimpleStatIndicator ssIndicator) { Section columnSetElementSection = this.createSection(form, parentComp, title, null); Composite sectionTableComp = toolkit.createComposite(columnSetElementSection); // MOD yyi 2010-12-07 17282:create parameter section for storing data control if (ssIndicator.isStoreData()) { columnSetElementSection.setExpanded(true); columnSetElementSection.setEnabled(true); sectionTableComp.setLayoutData(new GridData(GridData.FILL_BOTH)); sectionTableComp.setLayout(new GridLayout()); // MOD zshen for feature 14000 try { mapDB = MapDBUtils.getMapDB(StandardDBName.dataSection.name(), ssIndicator); } catch (IOError error) { log.warn(error.getMessage(), error); } Button filterDataBt = new Button(sectionTableComp, SWT.NONE); filterDataBt.setText(DefaultMessagesImpl.getString("ColumnSetResultPage.filterData"));//$NON-NLS-1$ filterDataBt.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false)); filterDataBt.setEnabled(containAllMatchIndicator() && mapDB != null); filterDataBt.addMouseListener(new MouseListener() { public void mouseDoubleClick(MouseEvent e) { // do nothing until now } public void mouseDown(MouseEvent e) { List<Indicator> indicatorsList = masterPage.getCurrentModelElement().getResults().getIndicators(); SelectPatternsWizard wizard = new SelectPatternsWizard(indicatorsList); wizard.setFilterType(filterType); wizard.setOldTableInputList(ColumnSetAnalysisResultPage.this.tableFilterResult.getTableFilterResult()); WizardDialog dialog = new WizardDialog(null, wizard); dialog.setPageSize(300, 400); wizard.setContainer(dialog); wizard.setWindowTitle(DefaultMessagesImpl.getString("SelectPatternsWizard.title"));//$NON-NLS-1$ if (WizardDialog.OK == dialog.open()) { ColumnSetAnalysisResultPage.this.tableFilterResult = new TableFilterResult(wizard.getPatternSelectPage() .getTableInputList()); filterType = wizard.getPatternSelectPage().getFilterType(); columnsElementViewer.refresh(); redrawController(); } } public void mouseUp(MouseEvent e) { // do nothing until now } }); columnsElementViewer = new TableViewer(sectionTableComp, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER); Table table = columnsElementViewer.getTable(); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); table.setLinesVisible(true); table.setHeaderVisible(true); TableSectionViewerProvider provider = new TableSectionViewerProvider(); columnsElementViewer.setContentProvider(provider); columnSetElementSection.setClient(sectionTableComp); columnSetElementSection.setExpanded(false); int pageSize = 100; // // ADDED sgandon 15/03/2010 bug 11769 : setup the size of the table to avoid crash and add consistency. setupTableGridDataLimitedSize(table, pageSize); // add pagation control controller = new PageableController(MapDBPageConstant.NUMBER_PER_PAGE); if (mapDB != null) { redrawPagationComposite(sectionTableComp, null, true); } createColumns(controller, ssIndicator); // Set current page to 0 to refresh the table controller.reset(); for (TableColumn column : table.getColumns()) { column.pack(); } } else { columnSetElementSection.setExpanded(false); columnSetElementSection.setEnabled(false); } return columnSetElementSection; } private void redrawController() { Composite parent = buttonComposite.getParent(); if (ColumnSetAnalysisResultPage.this.tableFilterResult.isEmptyResult() || DataFilterType.ALL_DATA == filterType) { redrawPagationComposite(parent, null, true); } else { redrawPagationComposite(parent, ColumnSetAnalysisResultPage.this.tableFilterResult.getTableFilterResult(), false); } } /** * DOC zshen Comment method "redrawPagationComposite". * * @param parent */ private void redrawPagationComposite(Composite parent, List<Map<Integer, RegexpMatchingIndicator>> patternList, boolean withPageNumberButton) { final IPageLoader<PageResult<Object[]>> pageLoader = new MapDBPageLoader<Object>(mapDB, new PatternsDataValidation( patternList, filterType), mapDB.size()); controller.removePageChangedListener(createLoadPageAndReplaceItemsListener); controller.removePageChangedListener(resultAndPageButtonsDecorator); controller.setCurrentPage(-1); createLoadPageAndReplaceItemsListener = PageLoaderStrategyHelper.createLoadPageAndReplaceItemsListener(controller, columnsElementViewer, pageLoader, PageResultContentProvider.getInstance(), null); controller.addPageChangedListener(createLoadPageAndReplaceItemsListener); if (buttonComposite != null) { buttonComposite.dispose(); } buttonComposite = new Composite(parent, SWT.NONE); buttonComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); buttonComposite.setLayout(new GridLayout()); if (withPageNumberButton) { resultAndPageButtonsDecorator = new ResultAndNavigationPageGraphicsRenderer(buttonComposite, SWT.NONE, controller); } else { resultAndPageButtonsDecorator = new ColumnSetNavigationPageGraphicsRenderer(buttonComposite, SWT.NONE, controller); } GridData gridData = new GridData(GridData.FILL_BOTH); resultAndPageButtonsDecorator.setLayoutData(gridData); controller.reset(); parent.layout(); } /** * DOC talend Comment method "createColumns". * * @param columnsElementViewer2 * @param controller */ private void createColumns(PageableController controller, SimpleStatIndicator ssIndicator) { List<String> tableColumnNames = ssIndicator.getColumnHeaders(); for (String tableColumnName : tableColumnNames) { // First column is for the first name TableViewerColumn col = createTableViewerColumn(tableColumnName); TableSectionViewerProvider provider = new TableSectionViewerProvider(); col.setLabelProvider(provider); col.getColumn().addSelectionListener(new SortTableColumnSelectionListener(tableColumnName, controller)); } } private TableViewerColumn createTableViewerColumn(String title) { final TableViewerColumn viewerColumn = new TableViewerColumn(columnsElementViewer, SWT.NONE); final TableColumn column = viewerColumn.getColumn(); column.setText(title); column.setResizable(true); column.setMoveable(true); return viewerColumn; } /** * * DOC hcheng Comment method "addColumnSorters".For 8267. * * @param tableViewer * @param tableColumns * @param sorters */ protected void addColumnSorters(TableViewer tableViewer, TableColumn[] tableColumns, ViewerSorter[][] sorters) { for (int i = 0; i < tableColumns.length; ++i) { tableColumns[i].addSelectionListener(new ColumnSortListener(tableColumns, i, tableViewer, sorters)); } } private Color bg = new Color(null, 249, 139, 121); /** * DOC zshen ColumnSetResultPage class global comment. Detailled comment */ class TableSectionViewerProvider extends CellLabelProvider implements IStructuredContentProvider, ITableLabelProvider, ITableColorProvider { @SuppressWarnings("unchecked") public Object[] getElements(Object inputElement) { List<Object> columnDataSet = (List<Object>) inputElement; return columnDataSet.toArray(); } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // nothing need to do at here } public Image getImage(Object element) { if (element instanceof TdColumn) { return ImageLib.getImage(ImageLib.TD_COLUMN); } return null; } @Override public void dispose() { // TODO Auto-generated method stub } public Image getColumnImage(Object element, int columnIndex) { // TODO Auto-generated method stub return null; } public String getColumnText(Object element, int columnIndex) { if (List.class.isInstance(element)) { String[] keyArray = ((List<?>) element).toArray(new String[((List<?>) element).size()]); if (columnIndex < keyArray.length) { return keyArray[columnIndex]; } } else { for (int i = 0; i < ((Object[]) element).length; i++) { if (columnIndex == i) { return String.valueOf(((Object[]) element)[i]); } } } return null; } @Override public void addListener(ILabelProviderListener listener) { // TODO Auto-generated method stub } @Override public boolean isLabelProperty(Object element, String property) { // TODO Auto-generated method stub return false; } @Override public void removeListener(ILabelProviderListener listener) { // TODO Auto-generated method stub } public Color getBackground(Object element, int columnIndex) { Object[] elements = (Object[]) element; for (Object elem : elements) { if (elem == null || "".equals(elem)) { //$NON-NLS-1$ return bg; } } return null; } public Color getForeground(Object element, int columnIndex) { // MOD by zshen for feature 14000 return getMatchColor(element, columnIndex); // ~14000 } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.CellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell) */ @Override public void update(ViewerCell cell) { Object element = cell.getElement(); int index = cell.getColumnIndex(); cell.setText(getColumnText(element, index)); cell.setForeground(getForeground(element, index)); cell.setBackground(getBackground(element, index)); } } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.editor.AbstractFormPage#setDirty(boolean) */ @Override public void setDirty(boolean isDirty) { } /* * (non-Javadoc) * * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) */ public void propertyChange(PropertyChangeEvent evt) { if (PluginConstant.ISDIRTY_PROPERTY.equals(evt.getPropertyName())) { ((AnalysisEditor) this.getEditor()).firePropertyChange(IEditorPart.PROP_DIRTY); } } /* * (non-Javadoc) * * @see * org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisResultPage#refresh(org.talend.dataprofiler.core * .ui.editor.analysis.AbstractAnalysisMetadataPage) */ @Override public void refresh(AbstractAnalysisMetadataPage masterPage) { this.masterPage = (ColumnSetAnalysisDetailsPage) masterPage; simpleStaticIndicator = this.masterPage.getSimpleStatIndicator(); if (summaryComp != null && !summaryComp.isDisposed()) { summaryComp.dispose(); } if (graphicsAndTableComp != null && !graphicsAndTableComp.isDisposed()) { graphicsAndTableComp.dispose(); } createFormContent(getManagedForm()); } private boolean containAllMatchIndicator() { List<Indicator> indicatorsList = masterPage.getCurrentModelElement().getResults().getIndicators(); for (Indicator theIndicator : indicatorsList) { if (theIndicator instanceof AllMatchIndicatorImpl) { return true; } } return false; } @Override public void dispose() { if (bg != null) { bg.dispose(); } if (AnalysisHelper.isJavaExecutionEngine(masterPage.getCurrentModelElement())) { MapDBManager.getInstance().closeDB(masterPage.getCurrentModelElement()); } super.dispose(); } private CorrelationDataSorter[][] buildSorter(List<Object[]> tableRows) { CorrelationDataSorter[][] result = null; if (tableRows != null && tableRows.size() > 0) { Object[] objs = tableRows.get(0); int length = objs.length; result = new CorrelationDataSorter[length][2]; for (int i = 0; i < length; ++i) { result[i][0] = new CorrelationDataSorter(i + 1); result[i][1] = new CorrelationDataSorter(-(i + 1)); } } return result; } /** * * zshen Comment method "getMatchColor". * * @param element * @param columnIndex * @return get the color of the element. */ private Color getMatchColor(Object element, int columnIndex) { if (tableFilterResult.getTableFilterResult() != null) { for (Map<Integer, RegexpMatchingIndicator> tableItem : this.tableFilterResult.getTableFilterResult()) { RegexpMatchingIndicator regMatIndicator = tableItem.get(columnIndex); if (regMatIndicator == null) { continue; } String regex = regMatIndicator.getRegex(); Pattern p = java.util.regex.Pattern.compile(regex); if (element instanceof Object[]) { Object theElement = ((Object[]) element)[columnIndex]; if (theElement == null) { theElement = "null";//$NON-NLS-1$ } Matcher m = p.matcher(String.valueOf(theElement)); if (!m.find()) { return new Color(null, 255, 0, 0); } } } } return new Color(null, 0, 0, 0); } public List<Map<Integer, RegexpMatchingIndicator>> getTableFilterResult() { return tableFilterResult.getTableFilterResult(); } public void setTableFilterResult(List<Map<Integer, RegexpMatchingIndicator>> tableFilterResult) { this.tableFilterResult = new TableFilterResult(tableFilterResult); } }