// ============================================================================
//
// 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.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.help.HelpSystem;
import org.eclipse.help.IContext;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.events.HelpEvent;
import org.eclipse.swt.events.HelpListener;
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.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.repositoryObject.MetadataColumnRepositoryObject;
import org.talend.core.repository.model.repositoryObject.MetadataTableRepositoryObject;
import org.talend.core.repository.model.repositoryObject.MetadataXmlElementTypeRepositoryObject;
import org.talend.cwm.helper.ColumnSetHelper;
import org.talend.cwm.helper.ModelElementHelper;
import org.talend.cwm.helper.ResourceHelper;
import org.talend.cwm.relational.TdTable;
import org.talend.dataprofiler.core.ImageLib;
import org.talend.dataprofiler.core.helper.ModelElementIndicatorHelper;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.manager.DQPreferenceManager;
import org.talend.dataprofiler.core.model.DelimitedFileIndicator;
import org.talend.dataprofiler.core.model.ModelElementIndicator;
import org.talend.dataprofiler.core.ui.dialog.composite.TooltipTree;
import org.talend.dataprofiler.core.ui.editor.AbstractAnalysisActionHandler;
import org.talend.dataprofiler.core.ui.editor.AbstractMetadataFormPage;
import org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage;
import org.talend.dataprofiler.core.ui.editor.analysis.ColumnAnalysisDetailsPage;
import org.talend.dataprofiler.core.ui.editor.preview.IndicatorUnit;
import org.talend.dataprofiler.core.ui.grid.IndicatorSelectDialog;
import org.talend.dataprofiler.core.ui.utils.UDIUtils;
import org.talend.dataprofiler.core.ui.views.ColumnViewerDND;
import org.talend.dataprofiler.help.HelpPlugin;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.analysis.ExecutionLanguage;
import org.talend.dataquality.helpers.MetadataHelper;
import org.talend.dataquality.indicators.CompositeIndicator;
import org.talend.dataquality.indicators.DataminingType;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dataquality.indicators.definition.IndicatorDefinition;
import org.talend.dataquality.indicators.sql.UserDefIndicator;
import org.talend.dq.dbms.DbmsLanguage;
import org.talend.dq.dbms.DbmsLanguageFactory;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.SysIndicatorDefinitionRepNode;
import org.talend.repository.model.IRepositoryNode;
import org.talend.utils.sugars.TypedReturnCode;
import orgomg.cwm.foundation.softwaredeployment.DataManager;
import orgomg.cwm.objectmodel.core.Expression;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* @author rli
*
*/
public class AnalysisColumnTreeViewer extends AbstractColumnDropTree {
protected static Logger log = Logger.getLogger(AnalysisColumnTreeViewer.class);
public static final String VIEWER_KEY = "org.talend.dataprofiler.core.ui.editor.composite.AnasisColumnTreeViewer"; //$NON-NLS-1$
private Composite parentComp;
final private ColumnAnalysisDetailsPage masterPage;
// ADD xqliu 2009-08-24 bug 8776
private ExecutionLanguage language;
private Composite buttonsComp;
private boolean isGridPreviewColumnMoved = false;
public ExecutionLanguage getLanguage() {
return language;
}
public void setLanguage(ExecutionLanguage language) {
this.language = language;
}
public AnalysisColumnTreeViewer(Composite parent, ColumnAnalysisDetailsPage masterPage) {
this.viewKey = VIEWER_KEY;
absMasterPage = masterPage;
parentComp = parent;
this.tree = createTree(parent);
this.masterPage = masterPage;
this.createUpDownButtons(parent);
this.setDirty(false);
}
/**
* @param parent
*/
private Tree createTree(Composite parent) {
final Tree newTree = new TooltipTree(parent, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION) {
@Override
protected boolean isValidItem(TreeItem item) {
if (item == null) {
return false;
}
Object itemData = item.getData(INDICATOR_UNIT_KEY);
Object columnItemData = item.getData(MODELELEMENT_INDICATOR_KEY);
if (itemData != null) {
IndicatorUnit indicatorUnit = (IndicatorUnit) item.getData(INDICATOR_UNIT_KEY);
if (indicatorUnit != null && !(indicatorUnit.getIndicator() instanceof CompositeIndicator)) {
return true;
}
return false;
} else {
if (columnItemData != null) {
ModelElementIndicator modelElementIndicator = (ModelElementIndicator) columnItemData;
IRepositoryNode modelElementRepositoryNode = modelElementIndicator.getModelElementRepositoryNode();
return modelElementRepositoryNode == null ? false : true;
}
return false;
}
}
@Override
protected String getItemTooltipText(TreeItem item) {
String expCont = isExpressionNull(item);
if (expCont == null) {
return DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.queryNotGen"); //$NON-NLS-1$
}
return expCont;
}
};
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(newTree);
newTree.setHeaderVisible(true);
createTreeItem(newTree, 300, "AnalysisColumnTreeViewer.analyzedColumns"); //$NON-NLS-1$
createTreeDataminingItem(newTree);
createTreeItem(newTree, 80, "AnalysisColumnTreeViewer.pattern"); //$NON-NLS-1$
createTreeItem(newTree, 80, "AnalysisColumnTreeViewer.udi"); //$NON-NLS-1$
createTreeItem(newTree, 80, "AnalysisColumnTreeViewer.operation"); //$NON-NLS-1$
// TDQ-11622 : add a column here, let the width = 1 and text = EMPTY_STRING TODO need to find a better solution!
TreeColumn blankColumn = new TreeColumn(newTree, SWT.CENTER);
blankColumn.setWidth(1);
// ~ TDQ-11622
parent.layout();
AbstractAnalysisActionHandler actionHandler = new AbstractAnalysisActionHandler(parent) {
@Override
protected void handleRemove() {
removeSelectedElements(newTree);
}
};
parent.setData(AbstractMetadataFormPage.ACTION_HANDLER, actionHandler);
ColumnViewerDND.installDND(newTree);
this.addTreeListener(newTree);
newTree.setData(this);
return newTree;
}
/**
* DOC yyi create Up Down and Delete Buttons.
*
* @param parent
*/
private void createUpDownButtons(Composite parent) {
if (null != buttonsComp) {
buttonsComp.dispose();
}
buttonsComp = masterPage.getEditor().getToolkit().createComposite(parent, SWT.NONE);
buttonsComp.setLayout(new GridLayout(3, true));
buttonsComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridData buttonGridData = new GridData(SWT.CENTER, SWT.CENTER, true, false);
Button delButton = new Button(buttonsComp, SWT.NONE);
delButton.setImage(ImageLib.getImage(ImageLib.DELETE_ACTION));
delButton.setLayoutData(buttonGridData);
delButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
removeSelectedElements(tree);
notifyObservers();
}
});
Button moveUpButton = new Button(buttonsComp, SWT.NONE);
moveUpButton.setText(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.moveUp")); //$NON-NLS-1$
moveUpButton.setLayoutData(buttonGridData);
moveUpButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
moveSelectedElements(tree, -1);
notifyObservers();
}
});
Button moveDownButton = new Button(buttonsComp, SWT.NONE);
moveDownButton.setText(DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.moveDown")); //$NON-NLS-1$
moveDownButton.setLayoutData(buttonGridData);
moveDownButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
moveSelectedElements(tree, 1);
notifyObservers();
}
});
parent.layout();
}
/**
* DOC yyi to set the Up Down and Delete Buttons is visible.
*
* @param isShow
*/
public void setControlButtonsVisible(boolean isShow) {
buttonsComp.setVisible(isShow);
}
/**
* DOC yyi 7466 2010-03-22 change the order of appearence of indicators.
*
* @param newTree
* @param step
*/
protected void moveSelectedElements(Tree newTree, int step) {
TreeItem[] selection = newTree.getSelection();
if (selection != null) {
// used to set the selected columns focus at last
List<Object> selectedDataList = new ArrayList<Object>();
// TDQ-11530 msjian: get all selected data's list first to check how to move
List<IndicatorUnit> indicatorUnitList = new ArrayList<IndicatorUnit>();
List<ModelElementIndicator> dataList = new ArrayList<ModelElementIndicator>();
for (TreeItem item : selection) {
IndicatorUnit indicatorUnit = (IndicatorUnit) item.getData(INDICATOR_UNIT_KEY);
if (indicatorUnit != null) {
indicatorUnitList.add(indicatorUnit);
} else {
ModelElementIndicator data = (ModelElementIndicator) item.getData(MODELELEMENT_INDICATOR_KEY);
dataList.add(data);
}
}
for (TreeItem item : selection) {
IndicatorUnit indicatorUnit = (IndicatorUnit) item.getData(INDICATOR_UNIT_KEY);
ModelElementIndicator data = (ModelElementIndicator) item.getData(MODELELEMENT_INDICATOR_KEY);
if (indicatorUnit != null) {
TypedReturnCode<IndicatorUnit[]> code = sortIndicatorUnits(data.getIndicatorUnits(), indicatorUnit, step,
indicatorUnitList);
if (code.isOk()) {
if (null != code.getObject()) {
Indicator[] inds = new Indicator[code.getObject().length];
for (int i = 0; i < code.getObject().length; i++) {
inds[i] = code.getObject()[i].getIndicator();
}
data.setIndicators(inds);
}
selectedDataList.add(indicatorUnit);
}
} else {
int index = ArrayUtils.indexOf(modelElementIndicators, data);
int changeIndex = index + step;
if (changeIndex > -1 && changeIndex < modelElementIndicators.length) {
ModelElementIndicator tmpElement = modelElementIndicators[changeIndex];
// when the changed one is the selected one too, get next one
while (dataList.contains(tmpElement)) {
tmpElement = modelElementIndicators[++changeIndex];
}
modelElementIndicators[changeIndex] = modelElementIndicators[index];
modelElementIndicators[index] = tmpElement;
// after the data changed successfully remove it from the selected list
dataList.remove(data);
selectedDataList.add(data);
}
}
}
setElements(modelElementIndicators, true, false);
for (Object obj : selectedDataList) {
selectElement(tree.getItems(), obj);
}
masterPage.synNagivatorStat();
}
}
/**
* DOC yyi select element after moved.
*
* @param items
* @param data
*/
private void selectElement(TreeItem[] items, Object data) {
if (data instanceof ModelElementIndicator) {
for (TreeItem item : items) {
ModelElementIndicator model = (ModelElementIndicator) item.getData(MODELELEMENT_INDICATOR_KEY);
if (model == data) {
tree.setSelection(item);
} else {
selectElement(item.getItems(), data);
}
}
} else if (data instanceof IndicatorUnit) {
for (TreeItem item : items) {
IndicatorUnit unit = (IndicatorUnit) item.getData(INDICATOR_UNIT_KEY);
if (unit != null && ((IndicatorUnit) data).getIndicator() == unit.getIndicator()) {
tree.setSelection(item);
} else {
selectElement(item.getItems(), data);
}
}
}
}
/**
* DOC yyi Sort indicators.
*
* @param units
* @param targetUnit
* @param step
* @return
*/
private TypedReturnCode<IndicatorUnit[]> sortIndicatorUnits(IndicatorUnit[] units, IndicatorUnit targetUnit, int step,
List<IndicatorUnit> indicatorUnitList) {
TypedReturnCode<IndicatorUnit[]> code = new TypedReturnCode<IndicatorUnit[]>();
int index = -1;
for (int i = 0; i < units.length; i++) {
if (targetUnit.getIndicator() == units[i].getIndicator()) {
index = i;
break;
} else if (null != units[i].getChildren()) {
TypedReturnCode<IndicatorUnit[]> code2 = sortIndicatorUnits(units[i].getChildren(), targetUnit, step,
indicatorUnitList);
if (null != code2.getObject()) {
units[i].setChildren(code2.getObject());
code.setOk(true);
break;
}
}
}
int changeIndex = index + step;
if (-1 != index && changeIndex > -1 && changeIndex < units.length) {
IndicatorUnit tmpUnit = units[changeIndex];
// when the changed one is the selected one too, get next one
while (indicatorUnitList.contains(tmpUnit)) {
tmpUnit = units[++changeIndex];
}
units[changeIndex] = units[index];
units[index] = tmpUnit;
// after the data changed successfully remove it from the selected list
indicatorUnitList.remove(targetUnit);
code.setReturnCode("", true, units);//$NON-NLS-1$
}
return code;
}
@Override
public void setElements(ModelElementIndicator[] elements) {
setElements(elements, true);
}
public void setElements(ModelElementIndicator[] elements, boolean isDirty) {
setElements(elements, isDirty, false);
}
public void setElements(ModelElementIndicator[] elements, boolean isDirty, boolean isExpandAll) {
removeAllItemElements();
tree.setData(VIEWER_KEY, this);
this.modelElementIndicators = elements;
addItemElements(elements, isExpandAll);
if (isDirty) {
this.setDirty(true);
}
initializedConnection(elements);
// MOD mzhao 2009-05-5, bug 6587.
updateBindConnection(masterPage, modelElementIndicators, tree);
createUpDownButtons(this.parentComp);
}
/**
* DOC talend Comment method "removeAllItemElements".
*/
private void removeAllItemElements() {
for (Control control : tree.getChildren()) {
if (control != null) {
control.dispose();
}
}
for (TreeItem treeItem : tree.getItems()) {
if (treeItem != null) {
treeItem.dispose();
}
}
}
/**
* MOD mzhao 2009-06-16 feature 5887.
*/
@Override
public void updateModelViewer() {
masterPage.recomputeIndicators();
modelElementIndicators = masterPage.getCurrentModelElementIndicators();
masterPage.refreshPreviewTable(modelElementIndicators, true);
masterPage.refreshTheTree(modelElementIndicators);
}
@Override
public void addElements(final ModelElementIndicator[] elements) {
ModelElementIndicator[] newsArray = new ModelElementIndicator[getAllTheElementIndicator().length + elements.length];
System.arraycopy(getAllTheElementIndicator(), 0, newsArray, 0, getAllTheElementIndicator().length);
for (int i = 0; i < elements.length; i++) {
newsArray[getAllTheElementIndicator().length + i] = elements[i];
}
this.addItemElements(elements, false);
this.setDirty(true);
initializedConnection(elements);
// MOD mzhao 2009-05-5, bug 6587.
updateBindConnection(masterPage, modelElementIndicators, tree);
masterPage.refreshPreviewTable(newsArray, true);
masterPage.refreshTheTree(newsArray);
masterPage.goLastPage();
if (elements != null && elements.length > 0) {
selectElement(tree.getItems(), elements[0]);
}
}
private void addItemElements(final ModelElementIndicator[] elements, boolean isExpandAll) {
for (ModelElementIndicator element : elements) {
final TreeItem treeItem = new TreeItem(tree, SWT.NONE);
treeItem.setImage(ImageLib.getImage(ImageLib.TD_COLUMN));
final ModelElementIndicator meIndicator = element;
treeItem.setText(0, ModelElementIndicatorHelper.getModelElementDisplayName(meIndicator));
treeItem.setData(MODELELEMENT_INDICATOR_KEY, meIndicator);
TreeEditor comboEditor = new TreeEditor(tree);
final CCombo combo = new CCombo(tree, SWT.BORDER);
for (DataminingType type : DataminingType.values()) {
combo.add(type.getLiteral()); // MODSCA 2008-04-10 use literal
// for presentation
}
final ModelElement modelElement = RepositoryNodeHelper
.getSubModelElement(meIndicator.getModelElementRepositoryNode());
DataminingType dataminingType = MetadataHelper.getDataminingType(modelElement);
// MOD qiongli 2010-11-15 feature 16796
if (meIndicator instanceof DelimitedFileIndicator) {
dataminingType = MetadataHelper.getDefaultDataminingType(meIndicator.getJavaType());
}
if (dataminingType == null) {
combo.select(0);
} else {
combo.setText(dataminingType.getLiteral());
}
combo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
MetadataHelper.setDataminingType(DataminingType.get(combo.getText()), modelElement);
setDirty(true);
}
});
combo.setEditable(false);
comboEditor.minimumWidth = WIDTH1_CELL;
comboEditor.setEditor(combo, treeItem, 1);
TreeEditor addPatternEditor = new TreeEditor(tree);
Label addPatternLabl = createTreeItemLabel(tree, ImageLib.ADD_PATTERN, "AnalysisColumnTreeViewer.addPattern"); //$NON-NLS-1$
// MOD mzhao feature:13040, 2010-05-21
addPatternLabl.addMouseListener(new PatternMouseAdapter(this, masterPage, meIndicator, treeItem));
addPatternEditor.minimumWidth = addPatternLabl.getImage().getBounds().width;
addPatternEditor.setEditor(addPatternLabl, treeItem, 2);
// ADD xqliu 2010-02-23 feature 11617
TreeEditor addUdiEditor = addColumnUdi(treeItem, meIndicator, 3);
// ~
TreeEditor delLabelEditor = new TreeEditor(tree);
Label delLabel = createTreeItemLabel(tree, ImageLib.DELETE_ACTION, "AnalysisColumnTreeViewer.delete"); //$NON-NLS-1$
delLabel.setData(treeItem);
delLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
// // here is the delLable which is behind of column, so need to remove current column and it's all
// of
TreeItem currentTreeItem = (TreeItem) e.widget.getData();
removeSelectedElements(new TreeItem[] { currentTreeItem });
notifyObservers();
}
});
delLabelEditor.minimumWidth = delLabel.getImage().getBounds().width;
delLabelEditor.horizontalAlignment = SWT.CENTER;
delLabelEditor.setEditor(delLabel, treeItem, 4);
treeItem.setData(ITEM_EDITOR_KEY, new TreeEditor[] { comboEditor, delLabelEditor, addPatternEditor, addUdiEditor });
if (meIndicator.hasIndicators()) {
createIndicatorItems(treeItem, meIndicator.getIndicatorUnits());
}
treeItem.setExpanded(isExpandAll);
}
}
/**
* DOC xqliu Comment method "addColumnUdi". ADD xqliu 2010-02-23 feature 11617
*
* @param treeItem
* @param meIndicator
* @param columnIndex
* @return
*/
private TreeEditor addColumnUdi(final TreeItem treeItem, final ModelElementIndicator meIndicator, int columnIndex) {
TreeEditor addUdiEditor = new TreeEditor(tree);
Label addUdiLabl = createTreeItemLabel(tree, ImageLib.ADD_IND_DEFINITION, "AnalysisColumnTreeViewer.addUdi"); //$NON-NLS-1$
addUdiLabl.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
DataManager dm = getAnalysis().getContext().getConnection();
if (dm == null) {
masterPage.doSave(null);
}
CheckedTreeSelectionDialog dialog = UDIUtils.createUdiCheckedTreeSelectionDialog(meIndicator);
if (dialog.open() == Window.OK) {
// MOD qiongli 2012-10-24 TDQ-6308,just remove some deselected indicatorUnit then set dirty to
// true,just create new indicatorUnit for some new added UDI then set dirty to true.
List<IndicatorDefinition> allSelectedIndicatorDefinitions = new ArrayList<IndicatorDefinition>();
Set<String> allSelectedIndNames = new HashSet<String>();
for (Object obj : dialog.getResult()) {
if (obj instanceof SysIndicatorDefinitionRepNode) {
IndicatorDefinition udid = ((SysIndicatorDefinitionRepNode) obj).getIndicatorDefinition();
allSelectedIndicatorDefinitions.add(udid);
if (udid != null) {
allSelectedIndNames.add(udid.getName());
}
}
}
Set<String> oldSelectedIndNames = new HashSet<String>();
for (IndicatorUnit indicatorUnit : meIndicator.getIndicatorUnits()) {
Indicator indicator = indicatorUnit.getIndicator();
if (indicator instanceof UserDefIndicator) {
if (allSelectedIndNames.contains(indicator.getName())) {
oldSelectedIndNames.add(indicator.getName());
} else {
// remove the UDI from UI need to insert this UDI into removeList
deleteIndicatorItems(meIndicator, indicatorUnit);
if (!isDirty()) {
setDirty(true);
}
}
}
}
treeItem.removeAll();
for (IndicatorDefinition udid : allSelectedIndicatorDefinitions) {
if (udid != null && oldSelectedIndNames.contains(udid.getName())) {
continue;
}
IndicatorUnit[] addIndicatorUnits = null;
try {
addIndicatorUnits = UDIUtils.createIndicatorUnit(udid, meIndicator, getAnalysis());
} catch (Throwable e1) {
log.warn(e1, e1);
}
if (addIndicatorUnits != null && addIndicatorUnits.length > 0) {
for (IndicatorUnit unit : addIndicatorUnits) {
createOneUnit(treeItem, unit);
}
if (!isDirty()) {
setDirty(true);
}
}
}
treeItem.setExpanded(true);
masterPage.refreshTheTree(masterPage.getCurrentModelElementIndicators());
}
}
});
addUdiEditor.minimumWidth = addUdiLabl.getImage().getBounds().width;
addUdiEditor.setEditor(addUdiLabl, treeItem, columnIndex);
return addUdiEditor;
}
/**
* Open the dialog for select indicator
*
* @param shell
* @return The array of ModelElementIndicator which selected by user if user click ok button. If cancel button be
* clicked then the size of return array will be zero. If have a Where Clause is error will return null
*/
public ModelElementIndicator[] openIndicatorSelectDialog(Shell shell) {
List<Object[]> previewData = masterPage.getSampleTable().getExistPreviewData();
final IndicatorSelectDialog dialog = new IndicatorSelectDialog(
shell,
DefaultMessagesImpl.getString("AnalysisColumnTreeViewer.indicatorSelection"), masterPage.getCurrentModelElementIndicators(), previewData); //$NON-NLS-1$
dialog.setLimitNumber(this.masterPage.getPreviewLimit());
dialog.create();
if (!DQPreferenceManager.isBlockWeb()) {
dialog.getShell().addShellListener(new ShellAdapter() {
@Override
public void shellActivated(ShellEvent e) {
dialog.getShell().setFocus();
IContext context = HelpSystem.getContext(HelpPlugin.getDefault().getIndicatorSelectorHelpContextID());
PlatformUI.getWorkbench().getHelpSystem().displayHelp(context);
}
});
dialog.getShell().addHelpListener(new HelpListener() {
public void helpRequested(HelpEvent e) {
IContext context = HelpSystem.getContext(HelpPlugin.getDefault().getIndicatorSelectorHelpContextID());
PlatformUI.getWorkbench().getHelpSystem().displayHelp(context);
}
});
}
if (dialog.open() == Window.OK) {
isGridPreviewColumnMoved = dialog.isGridPreviewColumnMoved();
ModelElementIndicator[] result = dialog.getResult();
for (ModelElementIndicator modelElementIndicator : result) {
modelElementIndicator.storeTempIndicator();
}
return result;
} else {
ModelElementIndicator[] result = dialog.getResult();
for (ModelElementIndicator modelElementIndicator : result) {
modelElementIndicator.getTempIndicator().clear();
}
return null;
}
}
/**
* Remove the selected elements(eg:TdColumn or Indicator) from tree.
*
* @param newTree
*/
private void removeSelectedElements(Tree newTree) {
TreeItem[] selection = newTree.getSelection();
removeSelectedElements(selection);
}
private void removeSelectedElements(TreeItem[] items) {
boolean branchIndicatorExist = false;
for (TreeItem item : items) {
IndicatorUnit indicatorUnit = (IndicatorUnit) item.getData(INDICATOR_UNIT_KEY);
if (indicatorUnit != null) {
deleteIndicatorItems((ModelElementIndicator) item.getData(MODELELEMENT_INDICATOR_KEY), indicatorUnit);
} else {
deleteModelElementItems((ModelElementIndicator) item.getData(MODELELEMENT_INDICATOR_KEY));
}
// if the item's parent item is a indicator item, when current
// indicator item removed, it's parent item
// should be removed and recreate the tree;else,just need remove
// current item and it's branch.
if (item.getParentItem() != null && item.getParentItem().getData(INDICATOR_UNIT_KEY) != null) {
branchIndicatorExist = true;
continue;
} else {
removeItemBranch(item);
}
}
if (branchIndicatorExist) {
setElements(modelElementIndicators);
} else {
masterPage.synNagivatorStat();
if (modelElementIndicators.length == 0) {
masterPage.refreshTheTree(getAllTheElementIndicator());
}
}
// MOD mzhao 2009-05-5, bug 6587.
// MOD mzhao 2009-06-8, bug 5887.
// updateBindConnection(masterPage, getColumnIndicator(), tree);
}
private String isExpressionNull(TreeItem item) {
String expressContent = null;
ModelElement me = null;
IndicatorUnit indicatorUnit = (IndicatorUnit) item.getData(INDICATOR_UNIT_KEY);
ModelElementIndicator meIndicator = (ModelElementIndicator) item.getData(MODELELEMENT_INDICATOR_KEY);
if (indicatorUnit != null) {
IRepositoryViewObject reposViewObj = meIndicator.getModelElementRepositoryNode().getObject();
// MOD klliu 2010-01-30 Distinguish MetadataColumnRepositoryObject and
// MetadataXmlElementTypeRepositoryObject
if (reposViewObj instanceof MetadataColumnRepositoryObject) {
me = ((MetadataColumnRepositoryObject) reposViewObj).getTdColumn();
}
Connection dataprovider = ModelElementHelper.getTdDataProvider(me);
DbmsLanguage dbmsLang = DbmsLanguageFactory.createDbmsLanguage(dataprovider);
Expression expression = dbmsLang.getInstantiatedExpression(indicatorUnit.getIndicator());
if (expression != null) {
expressContent = expression.getBody();
}
} else {
IRepositoryNode parentNodeForColumnNode = RepositoryNodeHelper.getParentNodeForColumnNode(meIndicator
.getModelElementRepositoryNode());
expressContent = DefaultMessagesImpl.getString(
"AnalysisColumnTreeViewer.columnParent", parentNodeForColumnNode.getObject().getLabel()); //$NON-NLS-1$ //;
}
return expressContent;
}
private void addTreeListener(final Tree tree) {
tree.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
TreeItem item = (TreeItem) e.item;
if (item == null) {
Menu m = tree.getMenu();
if (m != null && !m.isDisposed()) {
m.dispose();
}
tree.setMenu(null);
} else {
AnalysisColumnColumnMenuProvider analysisColumnColumnMenuProvider = new AnalysisColumnColumnMenuProvider(tree);
analysisColumnColumnMenuProvider.createTreeMenu(Boolean.FALSE);
analysisColumnColumnMenuProvider.showDetailView(tree);
}
}
});
tree.addTreeListener(treeAdapter);
tree.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(MouseEvent e) {
TreeItem[] treeSelection = tree.getSelection();
if (treeSelection.length > 0) {
TreeItem item = treeSelection[0];
Object indicatorobj = item.getData(INDICATOR_UNIT_KEY);
Object meobj = item.getData(MODELELEMENT_INDICATOR_KEY);
if (meobj != null && indicatorobj == null) {
// open indicator selector
ModelElementIndicator[] modelElementIndicator = openIndicatorSelectDialog(masterPage.getEditor()
.getEditorSite().getShell());
if (modelElementIndicator != null) {
masterPage.refreshCurrentTreeViewer(modelElementIndicator);
if (isGridPreviewColumnMoved()) {
masterPage.refreshPreviewTable(true);
}
}
} else if (meobj != null && indicatorobj != null) {
// open indicator option wizard
openIndicatorOptionDialog(Display.getCurrent().getActiveShell(), item);
}
}
}
});
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataprofiler.core.ui.editor.composite.AbstractColumnDropTree#getTheSuitedComposite(org.eclipse.swt
* .events.SelectionEvent)
*/
@Override
public ExpandableComposite getTheSuitedComposite(SelectionEvent e) {
Composite[] previewChartCompsites = masterPage.getPreviewChartCompsites();
if (previewChartCompsites == null) {
return null;
}
Object obj = e.item.getData(MODELELEMENT_INDICATOR_KEY);
if (obj instanceof ModelElementIndicator) {
ModelElementIndicator meIndicator = (ModelElementIndicator) obj;
for (Composite comp : previewChartCompsites) {
if (comp.getData() == meIndicator) {
return (ExpandableComposite) comp;
}
}
}
return null;
}
/**
* Getter for analysis.
*
* @return the analysis
*/
public Analysis getAnalysis() {
return this.masterPage.getAnalysisHandler().getAnalysis();
}
/**
* Getter for analysis.
*
* @return the analysis
*/
public IRepositoryNode getAnalysisNode() {
return this.masterPage.getCurrentRepNode();
}
public Tree getTree() {
return tree;
}
@Override
public boolean canDrop(IRepositoryNode metadataRepositoryNode) {
IRepositoryViewObject metadataRepObject = metadataRepositoryNode.getObject();
ConnectionItem connItem = (ConnectionItem) metadataRepObject.getProperty().getItem();
// MOD qiongli 2010-8-19,bug 14436:could not come from diffrent connection
Connection tdProvider = connItem.getConnection();
if (tdProvider == null) {
return false;
} else if (this.getAnalysis().getContext().getConnection() != null
&& !ResourceHelper.areSame(tdProvider, this.getAnalysis().getContext().getConnection())) {
return false;
}
// MOD mzhao, 2010-07-23 bug 14014: If the editor is dirty, save it firstly before drag and drop an elements.
if (masterPage.isDirty()) {
masterPage.doSave(new NullProgressMonitor());
return false;
}
List<ModelElement> existModelElements = new ArrayList<ModelElement>();
for (ModelElementIndicator modelElementIndicator : this.getAllTheElementIndicator()) {
ModelElement me = RepositoryNodeHelper.getModelElementFromRepositoryNode(modelElementIndicator
.getModelElementRepositoryNode());
existModelElements.add(me);
}
// MOD mzhao 9848 2010-01-14, allowing to drag and drop table.
if (metadataRepObject instanceof MetadataTableRepositoryObject) {
MetadataTableRepositoryObject tableRepObject = (MetadataTableRepositoryObject) metadataRepObject;
return !existModelElements.containsAll(ColumnSetHelper.getColumns((TdTable) tableRepObject.getTable()));
}
if (metadataRepObject instanceof MetadataColumnRepositoryObject) {
if (existModelElements.contains(((MetadataColumnRepositoryObject) metadataRepObject).getTdColumn())) {
return false;
}
}
if (metadataRepObject instanceof MetadataXmlElementTypeRepositoryObject) {
return !metadataRepositoryNode.hasChildren();
}
return true;
}
@Override
public void setInput(Object[] objs) {
if (objs == null || objs.length == 0) {
this.removeSelectedElements(tree.getItems());
return;
}
super.setInput(objs);
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.editor.composite.AbstractColumnDropTree#getMasterPage()
*/
@Override
public AbstractAnalysisMetadataPage getMasterPage() {
return masterPage;
}
/**
* DOC yyi 2010-06-10 Refactor to ModelElementTreeMenuProvider
*/
class AnalysisColumnColumnMenuProvider extends ModelElementTreeMenuProvider {
/**
* DOC yyi ColumnModelElementTreeMenuProvider constructor comment. true *
*
* @param tree
*/
public AnalysisColumnColumnMenuProvider(Tree tree) {
super(tree);
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.editor.composite.ModelElementTreeMenuProvider#getAnalysis2()
*/
@Override
protected IRepositoryNode getAnalysis2() {
return getAnalysisNode();
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataprofiler.core.ui.editor.composite.ModelElementTreeMenuProvider#removeSelectedElements2(org
* .eclipse.swt.widgets.Tree)
*/
@Override
protected void removeSelectedElements2(Tree tree) {
removeSelectedElements(tree);
notifyObservers();
}
}
@Override
protected ModelElementIndicator[] getAllTheElementIndicator() {
return masterPage.getCurrentModelElementIndicators();
}
public boolean isGridPreviewColumnMoved() {
return this.isGridPreviewColumnMoved;
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.utils.TDQObserver#update(java.lang.Object)
*/
@Override
public void update(Map<String, Integer> columnIndexMap) {
ModelElementIndicator[] reorderModelElement = reorderModelElement(masterPage.getCurrentModelElementIndicators(),
columnIndexMap);
masterPage.refreshTheTree(reorderModelElement);
masterPage.restorePage();
masterPage.setDirty(true);
}
}