// ============================================================================
//
// 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.util.ArrayList;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
import org.eclipse.ui.forms.widgets.Section;
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.model.dynamic.DynamicIndicatorModel;
import org.talend.dataprofiler.core.ui.events.DynamicBAWChartEventReceiver;
import org.talend.dataprofiler.core.ui.events.DynamicChartEventReceiver;
import org.talend.dataprofiler.core.ui.events.EventEnum;
import org.talend.dataprofiler.core.ui.events.EventManager;
import org.talend.dataprofiler.core.ui.events.EventReceiver;
import org.talend.dataprofiler.core.ui.utils.AnalysisUtils;
import org.talend.dataprofiler.core.ui.utils.WorkbenchUtils;
import org.talend.dataprofiler.core.ui.utils.pagination.UIPagination;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dq.analysis.AnalysisHandler;
import org.talend.dq.indicators.preview.EIndicatorChartType;
/**
* DOC zqin class global comment. Detailled comment
*/
public class ColumnAnalysisResultPage extends AbstractAnalysisResultPage implements PropertyChangeListener {
private Composite resultComp;
ColumnAnalysisDetailsPage masterPage;
private Section resultSection = null;
private UIPagination uiPagination = null;
protected Map<Indicator, EventReceiver> eventReceivers = new IdentityHashMap<Indicator, EventReceiver>();
private EventReceiver registerDynamicRefreshEvent;
private EventReceiver switchBetweenPageEvent;
private Composite chartComposite;
/**
* DOC zqin ColumnAnalysisResultPage constructor comment.
*
* @param editor
* @param id
* @param title
*/
public ColumnAnalysisResultPage(FormEditor editor, String id, String title) {
super(editor, id, title);
AnalysisEditor analysisEditor = (AnalysisEditor) editor;
this.masterPage = (ColumnAnalysisDetailsPage) analysisEditor.getMasterPage();
}
@Override
protected void createFormContent(IManagedForm managedForm) {
super.createFormContent(managedForm);
if (topComposite != null && !topComposite.isDisposed()) {
resultComp = toolkit.createComposite(topComposite);
resultComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
resultComp.setLayout(new GridLayout());
createResultSection(resultComp);
form.reflow(true);
}
}
@Override
protected AnalysisHandler getAnalysisHandler() {
return this.masterPage.getAnalysisHandler();
}
/**
* create CollapseAll Link for result section.
*
* @param composite
*/
private void createCollapseAllLink(Composite composite) {
ImageHyperlink collapseAllImageLink = toolkit.createImageHyperlink(composite, SWT.NONE);
collapseAllImageLink.setToolTipText(DefaultMessagesImpl.getString("CollapseAllColumns")); //$NON-NLS-1$
WorkbenchUtils.setHyperlinkImage(collapseAllImageLink, ImageLib.getImage(ImageLib.COLLAPSE_ALL));
collapseAllImageLink.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
List<ExpandableComposite> expandableCompositeList = getExpandableCompositeList();
if (expandableCompositeList != null && !expandableCompositeList.isEmpty()) {
for (ExpandableComposite comp : expandableCompositeList) {
comp.setExpanded(false);
comp.getParent().pack();
}
}
form.reflow(true);
}
});
}
/**
* create ExpandAll Link for result section.
*
* @param composite
*/
private void createExpandAllLink(Composite composite) {
ImageHyperlink expandAllImageLink = toolkit.createImageHyperlink(composite, SWT.NONE);
expandAllImageLink.setToolTipText(DefaultMessagesImpl.getString("ExpandAllColumns")); //$NON-NLS-1$
WorkbenchUtils.setHyperlinkImage(expandAllImageLink, ImageLib.getImage(ImageLib.EXPAND_ALL));
expandAllImageLink.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
if (!resultSection.isExpanded()) {
resultSection.setExpanded(true);
}
List<ExpandableComposite> expandableCompositeList = getExpandableCompositeList();
if (expandableCompositeList != null && !expandableCompositeList.isEmpty()) {
for (ExpandableComposite comp : expandableCompositeList) {
comp.setExpanded(true);
comp.getParent().pack();
}
}
form.reflow(true);
}
});
}
/**
* DOC msjian Comment method "getExpandableCompositeList".
*
* @return
*/
protected List<ExpandableComposite> getExpandableCompositeList() {
List<ExpandableComposite> allExpandableCompositeList = new ArrayList<ExpandableComposite>();
if (uiPagination == null) {
return allExpandableCompositeList;
}
return ((IndicatorPaginationInfo) uiPagination.getCurrentPage()).getAllExpandableCompositeList();
}
@Override
protected void createResultSection(Composite parent) {
resultSection = createSection(form, parent,
DefaultMessagesImpl.getString("ColumnAnalysisResultPage.analysisResult"), null); //$NON-NLS-1$
// TDQ-11525 msjian: Add "expand all" and "fold all" icon buttons in the "Analysis Results" section
Composite collapseExpandComposite = toolkit.createComposite(resultSection);
GridLayout gdLayout = new GridLayout();
gdLayout.numColumns = 2;
collapseExpandComposite.setLayout(gdLayout);
createCollapseAllLink(collapseExpandComposite);
createExpandAllLink(collapseExpandComposite);
resultSection.setTextClient(collapseExpandComposite);
// TDQ-11525
Composite chartTableComposite = toolkit.createComposite(resultSection);
chartTableComposite.setLayout(new GridLayout());
chartTableComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
final ModelElementIndicator[] modelElementIndicatores = masterPage.getCurrentModelElementIndicators();
// ~ MOD mzhao 2009-04-20, Do pagination. Bug 6512.
uiPagination = new UIPagination(toolkit, chartTableComposite);
int pageSize = IndicatorPaginationInfo.getPageSize();
int totalPages = modelElementIndicatores.length / pageSize;
List<ModelElementIndicator> modelElementIndLs = null;
for (int index = 0; index < totalPages; index++) {
modelElementIndLs = new ArrayList<ModelElementIndicator>();
for (int idx = 0; idx < pageSize; idx++) {
modelElementIndLs.add(modelElementIndicatores[index * pageSize + idx]);
}
IndicatorPaginationInfo pginfo = new ResultPaginationInfo(form, modelElementIndLs, masterPage, uiPagination);
uiPagination.addPage(pginfo);
}
int left = modelElementIndicatores.length % pageSize;
if (left != 0) {
modelElementIndLs = new ArrayList<ModelElementIndicator>();
for (int leftIdx = 0; leftIdx < left; leftIdx++) {
modelElementIndLs.add(modelElementIndicatores[totalPages * pageSize + leftIdx]);
}
IndicatorPaginationInfo pginfo = new ResultPaginationInfo(form, modelElementIndLs, masterPage, uiPagination);
uiPagination.addPage(pginfo);
}
chartComposite = toolkit.createComposite(chartTableComposite);
chartComposite.setLayout(new GridLayout());
chartComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
// ~
resultSection.setClient(chartTableComposite);
uiPagination.setChartComposite(chartComposite);
uiPagination.init();
chartComposite.layout();
chartComposite.pack();
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.editor.AbstractFormPage#setDirty(boolean)
*/
@Override
public void setDirty(boolean isDirty) {
// no implementation
}
/*
* (non-Javadoc)
*
* @seejava.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 masterPage1) {
this.masterPage = (ColumnAnalysisDetailsPage) masterPage1;
disposeComposite();
createFormContent(getManagedForm());
}
private void disposeComposite() {
if (summaryComp != null && !summaryComp.isDisposed()) {
summaryComp.dispose();
}
if (resultComp != null && !resultComp.isDisposed()) {
resultComp.dispose();
}
}
/**
* Added TDQ-8787 20140613 yyin: create all charts before running, register each chart with its related indicator.
*/
public void registerDynamicEvent() {
// get all indicators and datasets
List<DynamicIndicatorModel> indiAndDatasets = uiPagination.getAllIndcatorAndDatasetOfCurrentPage();
// register dynamic event,for the indicator (for each column)
for (DynamicIndicatorModel oneCategoryIndicatorModel : indiAndDatasets) {
TableViewer tableViewer = oneCategoryIndicatorModel.getTableViewer();
if (EIndicatorChartType.SUMMARY_STATISTICS.equals(oneCategoryIndicatorModel.getChartType())) {
// when all/not-all summary indicators are selected
DynamicBAWChartEventReceiver bawReceiver = AnalysisUtils.createDynamicBAWChartEventReceiver(
oneCategoryIndicatorModel, eventReceivers);
bawReceiver.setChartComposite(chartComposite);
bawReceiver.setParentChartComposite((Composite) oneCategoryIndicatorModel.getBawParentChartComp());
bawReceiver.refreshChart();
bawReceiver.setTableViewer(tableViewer);
// no need to register the parent baw receiver with one of summary indicator, no need to handle baw
// actually
} else {
int index = 0;
for (Indicator oneIndicator : oneCategoryIndicatorModel.getIndicatorList()) {
DynamicChartEventReceiver eReceiver = AnalysisUtils.createDynamicChartEventReceiver(
oneCategoryIndicatorModel, index++, oneIndicator);
eReceiver.setChartComposite(chartComposite);
eReceiver.refreshChart();
eReceiver.setTableViewer(tableViewer);
// clear data
eReceiver.clearValue();
registerIndicatorEvent(oneIndicator, eReceiver);
}
}
}
reLayoutChartComposite();
registerOtherDynamicEvent();
}
private void registerIndicatorEvent(Indicator oneIndicator, DynamicChartEventReceiver eReceiver) {
eventReceivers.put(oneIndicator, eReceiver);
EventManager.getInstance().register(oneIndicator, EventEnum.DQ_DYMANIC_CHART, eReceiver);
}
public void reLayoutChartComposite() {
chartComposite.getParent().layout();
chartComposite.layout();
}
/**
* refresh the composite of the chart, to show the changes on the chart.
*/
private void registerOtherDynamicEvent() {
registerDynamicRefreshEvent = new EventReceiver() {
@Override
public boolean handle(Object data) {
reLayoutChartComposite();
return true;
}
};
EventManager.getInstance().register(chartComposite, EventEnum.DQ_DYNAMIC_REFRESH_DYNAMIC_CHART,
registerDynamicRefreshEvent);
// register a event to handle switch between master and result page
switchBetweenPageEvent = new EventReceiver() {
int times = 0;
@Override
public boolean handle(Object data) {
if (times == 0) {
times++;
masterPage.refreshGraphicsInSettingsPage();
}
return true;
}
};
EventManager.getInstance().register(masterPage.getCurrentModelElement(), EventEnum.DQ_DYNAMIC_SWITCH_MASTER_RESULT_PAGE,
switchBetweenPageEvent);
}
/**
* unregister every dynamic events which registered before executing analysis
*
* @param eventReceivers
*/
public void unRegisterDynamicEvent() {
EventManager.getInstance()
.clearEvent(masterPage.getCurrentModelElement(), EventEnum.DQ_DYNAMIC_SWITCH_MASTER_RESULT_PAGE);
for (Indicator oneIndicator : eventReceivers.keySet()) {
DynamicChartEventReceiver eventReceiver = (DynamicChartEventReceiver) eventReceivers.get(oneIndicator);
eventReceiver.clear();
EventManager.getInstance().clearEvent(oneIndicator, EventEnum.DQ_DYMANIC_CHART);
}
eventReceivers.clear();
EventManager.getInstance().clearEvent(chartComposite, EventEnum.DQ_DYNAMIC_REFRESH_DYNAMIC_CHART);
if (uiPagination != null) {
uiPagination.clearAllDynamicMapOfCurrentPage();
}
masterPage.clearDynamicDatasets();
}
}