// ============================================================================ // // 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.views; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.DropTargetListener; import org.eclipse.swt.dnd.TableDropTargetEffect; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TreeDropTargetEffect; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.navigator.CommonViewer; import org.talend.commons.emf.FactoriesUtil; 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.cwm.helper.TaggedValueHelper; import org.talend.cwm.relational.TdColumn; import org.talend.cwm.relational.TdTable; import org.talend.dataprofiler.core.PluginConstant; import org.talend.dataprofiler.core.helper.ModelElementIndicatorHelper; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.model.ModelElementIndicator; import org.talend.dataprofiler.core.pattern.PatternUtilities; import org.talend.dataprofiler.core.ui.action.provider.NewSourcePatternActionProvider; import org.talend.dataprofiler.core.ui.editor.composite.AbstractColumnDropTree; import org.talend.dataprofiler.core.ui.editor.composite.AnalysisColumnNominalIntervalTreeViewer; import org.talend.dataprofiler.core.ui.editor.composite.AnalysisColumnSetTreeViewer; import org.talend.dataprofiler.core.ui.editor.composite.AnalysisColumnTreeViewer; import org.talend.dataprofiler.core.ui.editor.preview.IndicatorUnit; import org.talend.dataprofiler.core.ui.events.EventEnum; import org.talend.dataprofiler.core.ui.events.EventManager; import org.talend.dataprofiler.core.ui.utils.MessageUI; import org.talend.dataprofiler.core.ui.utils.UDIUtils; import org.talend.dataprofiler.core.ui.utils.WorkbenchUtils; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.analysis.ExecutionLanguage; import org.talend.dataquality.domain.pattern.ExpressionType; import org.talend.dataquality.domain.pattern.Pattern; import org.talend.dataquality.helpers.DomainHelper; import org.talend.dataquality.indicators.definition.IndicatorDefinition; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.helper.UDIHelper; import org.talend.dq.helper.resourcehelper.IndicatorResourceFileHelper; import org.talend.dq.helper.resourcehelper.PatternResourceFileHelper; import org.talend.dq.nodes.DBColumnFolderRepNode; import org.talend.dq.nodes.DBColumnRepNode; import org.talend.dq.nodes.DBTableRepNode; import org.talend.dq.nodes.DFColumnRepNode; import org.talend.dq.nodes.DQRepositoryNode; import org.talend.dq.nodes.PatternRepNode; import org.talend.dq.nodes.SysIndicatorDefinitionRepNode; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.RepositoryNode; import org.talend.resource.EResourceConstant; import org.talend.resource.ResourceManager; import org.talend.utils.sugars.TypedReturnCode; /** * DOC zqin class global comment. Detailled comment * * When changing the sharing codes with the AnalysisColumnTreeViewer and AnalysisColumnSetTreeViewer pleases test them * both are OK in Column Analysis and Column Set Analysis. * * @link org.talend.dataprofiler.core.ui.editor.composite.AnalysisColumnSetTreeViewer * @link org.talend.dataprofiler.core.ui.editor.composite.AnalysisColumnTreeViewer */ public class ColumnViewerDND { private static Logger log = Logger.getLogger(ColumnViewerDND.class); ISelectionReceiver receiver = null; private static int lastValidOperation; /** * DOC qzhang Comment method "installDND". */ public static void installDND(final Tree targetControl) { IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); DQRespositoryView findView = (DQRespositoryView) activePage.findView(DQRespositoryView.ID); final CommonViewer commonViewer = findView.getCommonViewer(); final LocalSelectionTransfer transfer = LocalSelectionTransfer.getTransfer(); int operations = DND.DROP_COPY | DND.DROP_MOVE; Transfer[] transfers = new Transfer[] { transfer }; DropTarget dropTarget = new DropTarget(targetControl, operations); dropTarget.setTransfer(transfers); DropTargetListener dndListener = new TreeDropTargetEffect(targetControl) { ISelectionReceiver receiver = null; /* * (non-Javadoc) * * @see org.eclipse.swt.dnd.DropTargetAdapter#dragEnter(org.eclipse.swt .dnd.DropTargetEvent) */ @Override public void dragEnter(DropTargetEvent event) { super.dragEnter(event); IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection(); Object object = selection.getFirstElement(); // if (object instanceof IFile) { if (object instanceof SysIndicatorDefinitionRepNode) { receiver = new UDIReceiver(); } else if (object instanceof PatternRepNode) { receiver = new PatternReceiver(); } // } // // MOD mzhao 9848 2010-01-14, Allowing drag table. // if (object instanceof TdColumn || object instanceof TdTable) { // receiver = new ColumnReceiver(); // } // MOD klliu 15750 2011-01-17 for Drag&Drop On columnset if (object instanceof DBColumnRepNode || object instanceof DBTableRepNode || object instanceof DFColumnRepNode) { receiver = new ColumnReceiver(); } if (receiver == null) { event.detail = DND.DROP_NONE; } else { event.feedback = DND.FEEDBACK_EXPAND; receiver.doDropValidation(event, commonViewer); } } /* * (non-Javadoc) * * @see org.eclipse.swt.dnd.TreeDropTargetEffect#dragOver(org.eclipse .swt.dnd.DropTargetEvent) */ @Override public void dragOver(DropTargetEvent event) { super.dragOver(event); // MOD yyi 2009-09-18 bug: 9044 if (null != receiver) { receiver.doDropValidation(event, commonViewer); } } /* * (non-Javadoc) * * @see org.eclipse.swt.dnd.DropTargetAdapter#drop(org.eclipse.swt.dnd .DropTargetEvent) */ @Override public void drop(DropTargetEvent event) { int index = targetControl.getItemCount(); super.drop(event); if (event.item == null) { // TreeItem item = new TreeItem(targetControl, SWT.NONE); // item.setText(texts); // item.setText(text); index = 0; } else { TreeItem item = (TreeItem) event.item; TreeItem[] items = targetControl.getItems(); for (int i = 0; i < items.length; i++) { if (items[i] == item) { index = i; break; } } } receiver.drop(event, commonViewer, index); } }; dropTarget.addDropListener(dndListener); } /** * * DOC zqin ColumnDNDFactory class global comment. Detailled comment */ interface ISelectionReceiver { void doDropValidation(DropTargetEvent event, CommonViewer commonViewer); void drop(DropTargetEvent event, CommonViewer commonViewer, int index); } /** * * DOC zqin ColumnDNDFactory class global comment. Detailled comment */ static class PatternReceiver implements ISelectionReceiver { // @Override public void doDropValidation(DropTargetEvent event, CommonViewer commonViewer) { if (event.detail != DND.DROP_NONE) { lastValidOperation = event.detail; } boolean is = true; Object firstElement = ((StructuredSelection) commonViewer.getSelection()).getFirstElement(); if (firstElement instanceof PatternRepNode) { PatternRepNode firstElement2 = (PatternRepNode) firstElement; IPath itemPath = WorkbenchUtils.getFilePath(firstElement2); IFile fe = ResourceManager.getRoot().getProject(firstElement2.getProject().getTechnicalLabel()).getFile(itemPath); if (NewSourcePatternActionProvider.EXTENSION_PATTERN.equals(fe.getFileExtension())) { Pattern pattern = PatternResourceFileHelper.getInstance().findPattern(fe); if (pattern != null && TaggedValueHelper.getValidStatus(pattern)) { is = false; } TreeItem item = (TreeItem) event.item; Object viewer = item == null ? null : item.getParent().getData(); if (viewer instanceof AnalysisColumnSetTreeViewer) { String expressionType = DomainHelper.getExpressionType(pattern); boolean isSQLPattern = (ExpressionType.SQL_LIKE.getLiteral().equals(expressionType)); Analysis analysis = ((AnalysisColumnSetTreeViewer) viewer).getAnalysis(); if (isSQLPattern || ExecutionLanguage.SQL.equals(analysis.getParameters().getExecutionLanguage())) { is = true; } } else if (viewer instanceof AnalysisColumnTreeViewer) { // MOD gdbu 2011-8-26 bug : String expressionType = DomainHelper.getExpressionType(pattern); boolean isSQLPattern = (ExpressionType.SQL_LIKE.getLiteral().equals(expressionType)); Analysis analysis = ((AnalysisColumnTreeViewer) viewer).getAnalysis(); if (isSQLPattern && ExecutionLanguage.JAVA.equals(analysis.getParameters().getExecutionLanguage())) { is = true; } } } } if (event.item == null || is) { event.detail = DND.DROP_NONE; } else { Object data = event.item.getData(AnalysisColumnTreeViewer.INDICATOR_UNIT_KEY); if (data != null) { event.detail = DND.DROP_NONE; } else { event.detail = lastValidOperation; } } } // @Override public void drop(DropTargetEvent event, CommonViewer commonViewer, int index) { // MOD mzhao, bug 13993 cannot drag and drop patterns to MDM elements currently. 2010-07-05 TreeItem item = (TreeItem) event.item; Object indData = item.getData(AnalysisColumnTreeViewer.MODELELEMENT_INDICATOR_KEY); // MOD yyi 2011-06-15 22419:column set pattern for MDM if (indData instanceof ModelElementIndicator) { // ColumnIndicator data = (ColumnIndicator) indData; ModelElementIndicator data = (ModelElementIndicator) indData; // MOD klliu 2010-06-12 bug 13696 StructuredSelection ts = (StructuredSelection) commonViewer.getSelection(); AbstractColumnDropTree viewer = null; Analysis analysis = null; ArrayList<IFile> al = new ArrayList<IFile>(); if (ts.iterator() != null) { Iterator<IRepositoryNode> iter = ts.iterator(); while (iter.hasNext()) { DQRepositoryNode next = (DQRepositoryNode) iter.next(); IFile fe = ResourceManager.getRoot().getProject(next.getProject().getTechnicalLabel()) .getFile(WorkbenchUtils.getFilePath(next)); al.add(fe); } for (IFile fe : al) { // MOD yyi 2010-07-01 13993: Drag&drop patterns to column set analysis,get NPE. viewer = (AbstractColumnDropTree) item.getParent().getData(); if (viewer instanceof AnalysisColumnTreeViewer) { analysis = ((AnalysisColumnTreeViewer) viewer).getAnalysis(); TypedReturnCode<IndicatorUnit> trc = PatternUtilities.createIndicatorUnit(fe, data, analysis); if (trc.isOk()) { ((AnalysisColumnTreeViewer) viewer).createOneUnit(item, trc.getObject()); } else if (trc.getMessage() != null && !trc.getMessage().trim().equals("")) { //$NON-NLS-1$ MessageUI.openError(trc.getMessage()); } } else if (viewer instanceof AnalysisColumnSetTreeViewer) { analysis = ((AnalysisColumnSetTreeViewer) viewer).getAnalysis(); TypedReturnCode<IndicatorUnit> trc = PatternUtilities.createIndicatorUnit(fe, data, analysis); if (trc.isOk()) { ((AnalysisColumnSetTreeViewer) viewer).createOneUnit(item, trc.getObject()); // ADD msjian TDQ-8860 2014-4-30:only for column set analysis, when there have // pattern(s) when java engine,show all match indicator in the Indicators section. EventManager.getInstance().publish(analysis, EventEnum.DQ_COLUMNSET_SHOW_MATCH_INDICATORS, null); // TDQ-8860~ } else if (trc.getMessage() != null && !trc.getMessage().trim().equals("")) { //$NON-NLS-1$ MessageUI.openError(trc.getMessage()); } } } viewer.setDirty(true); } } } } /** * * DOC zqin ColumnDNDFactory class global comment. Detailled comment */ static class ColumnReceiver implements ISelectionReceiver { // @Override public void doDropValidation(DropTargetEvent event, CommonViewer commonViewer) { event.detail = DND.DROP_NONE; StructuredSelection structuredSelection = (StructuredSelection) LocalSelectionTransfer.getTransfer().getSelection(); RepositoryNode firstElement = (RepositoryNode) structuredSelection.getFirstElement(); // MOD mzhao 9848 2010-01-14, Allowing drag table. // Make sure the selected elements are the same type. // Iterator it = structuredSelection.iterator(); // Object pre = firstElement; // while (it.hasNext()) { // Object current = it.next(); // if (!isSameType(pre, current)) { // return; // } // pre = current; // } Tree tree = (Tree) ((DropTarget) event.widget).getControl(); AbstractColumnDropTree viewer = (AbstractColumnDropTree) tree.getData(); // IRepositoryViewObject repViewObj = firstElement.getObject(); // object instanceof DBColumnRepNode || object instanceof DBTableRepNode if (firstElement instanceof DBTableRepNode) { DBColumnFolderRepNode columnFolderNode = (DBColumnFolderRepNode) firstElement.getChildren().get(0); List<IRepositoryNode> children = columnFolderNode.getChildren(); for (IRepositoryNode node : children) { DBColumnRepNode columnNode = (DBColumnRepNode) node; if (viewer != null && viewer.canDrop(columnNode)) {// i < children.size()) { event.detail = DND.DROP_MOVE; } } } else if (firstElement instanceof DBColumnRepNode) { if (viewer != null && viewer.canDrop(firstElement)) { event.detail = DND.DROP_MOVE; } } else if (firstElement instanceof DFColumnRepNode) { if (viewer != null && viewer.canDrop(firstElement)) { event.detail = DND.DROP_MOVE; } } // if (repViewObj instanceof MetadataColumnRepositoryObject) { // if (viewer != null && viewer.canDrop(firstElement)) { // event.detail = DND.DROP_MOVE; // } // // } else if (repViewObj instanceof MetadataTableRepositoryObject) { // if (viewer != null && viewer.canDrop(firstElement)) { // event.detail = DND.DROP_MOVE; // } // } } // @Override public void drop(DropTargetEvent event, CommonViewer commonViewer, int index) { LocalSelectionTransfer localSelection = LocalSelectionTransfer.getTransfer(); Tree control = (Tree) ((DropTarget) event.widget).getControl(); boolean isAnalysisColumnSetTreeViewer = control.getData() instanceof AnalysisColumnSetTreeViewer; boolean isAnalysisColumnTreeViewer = control.getData() instanceof AnalysisColumnTreeViewer; boolean isAnalysisColumnNominalIntervalTreeViewer = control.getData() instanceof AnalysisColumnNominalIntervalTreeViewer; AbstractColumnDropTree viewer = (AbstractColumnDropTree) control.getData(); StructuredSelection selection = (StructuredSelection) localSelection.getSelection(); Iterator it = selection.iterator(); List<IRepositoryNode> selectedColumn = new ArrayList<IRepositoryNode>(); StringBuffer inValidColumnNames = null; while (it.hasNext()) { // MOD mzhao 9848 2010-01-14, Allowing drag table. RepositoryNode next = (RepositoryNode) it.next(); IRepositoryViewObject repViewObj = next.getObject(); if (repViewObj instanceof MetadataTableRepositoryObject) { // Get column nodes. List<IRepositoryNode> columns = next.getChildren().get(0).getChildren(); if (isAnalysisColumnTreeViewer) { // check wheter all of columns are come from same table ModelElementIndicator[] modelElementIndicators = ((AnalysisColumnTreeViewer) viewer) .getModelElementIndicator(); if (ModelElementIndicatorHelper.checkSameTable(modelElementIndicators)) { for (ModelElementIndicator modelElementIndicator : modelElementIndicators) { if (RepositoryNodeHelper.containsModelElementNode(columns, modelElementIndicator.getModelElementRepositoryNode())) { columns.remove(modelElementIndicator.getModelElementRepositoryNode()); } } } else { MessageDialog .openError( control.getShell(), DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.error"), DefaultMessagesImpl.getString( //$NON-NLS-1$ "ColumnMasterDetailsPage.noSameTableWarning", //$NON-NLS-1$ PluginConstant.SPACE_STRING)); return; } } else if (isAnalysisColumnNominalIntervalTreeViewer) { List<RepositoryNode> oriColumns = ((AnalysisColumnNominalIntervalTreeViewer) viewer) .getColumnSetMultiValueList(); for (RepositoryNode column : oriColumns) { // if (columns.contains(column)) { if (RepositoryNodeHelper.containsModelElementNode(columns, column)) { columns.remove(column); } } } else if (isAnalysisColumnSetTreeViewer) { List<IRepositoryNode> oriColumns = ((AnalysisColumnSetTreeViewer) viewer).getColumnSetMultiValueList(); for (IRepositoryNode column : oriColumns) { if (columns.contains(column)) { columns.remove(column); } } } selectedColumn.addAll(columns); } else if (repViewObj instanceof MetadataColumnRepositoryObject) { if (isAnalysisColumnTreeViewer) { // check wheter all of columns are come from same table ModelElementIndicator[] modelElementIndicators = ((AnalysisColumnTreeViewer) viewer) .getModelElementIndicator(); if (ModelElementIndicatorHelper.checkSameTable(modelElementIndicators)) { if (modelElementIndicators.length > 0 && !ModelElementIndicatorHelper.checkSameTable((MetadataColumnRepositoryObject) repViewObj, modelElementIndicators[0])) { if (inValidColumnNames == null) { inValidColumnNames = new StringBuffer(); inValidColumnNames.append(PluginConstant.PARENTHESIS_LEFT); } else { inValidColumnNames.append(PluginConstant.COMMA_STRING); } inValidColumnNames.append(((MetadataColumnRepositoryObject) repViewObj).getModelElement() .getName()); continue; } } else { MessageDialog .openError( control.getShell(), DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.error"), DefaultMessagesImpl.getString( //$NON-NLS-1$ "ColumnMasterDetailsPage.noSameTableWarning", //$NON-NLS-1$ PluginConstant.SPACE_STRING)); return; } } RepositoryNode column = next; selectedColumn.add(column); } else { RepositoryNode column = next; selectedColumn.add(column); } } if (inValidColumnNames != null) { MessageDialog.openError(control.getShell(), DefaultMessagesImpl .getString("ColumnsComparisonMasterDetailsPage.error"), DefaultMessagesImpl.getString( //$NON-NLS-1$ "ColumnMasterDetailsPage.selectDataNoSameTableWarning", //$NON-NLS-1$ inValidColumnNames.append(PluginConstant.PARENTHESIS_RIGHT).toString(), PluginConstant.SPACE_STRING)); } // int size1 = selection.size(); // int size2 = selectedColumn.size(); // // if (size1 == size2) { viewer.dropModelElements(selectedColumn, index); // } localSelection = null; } } /** * * DOC mzhao Comment method "isSameType". MOD mzhao 9848 2010-01-14, Allowing drag table. * * @param model1 * @param model2 * @return */ static boolean isSameType(Object model1, Object model2) { if (model1 instanceof TdTable && model2 instanceof TdTable) { return true; } if (model1 instanceof TdColumn && model2 instanceof TdColumn) { return true; } return false; } /** * DOC xqliu ColumnViewerDND class global comment. Detailled comment */ static class XmlElementReceiver implements ISelectionReceiver { // @Override public void doDropValidation(DropTargetEvent event, CommonViewer commonViewer) { event.detail = DND.DROP_NONE; } // @Override public void drop(DropTargetEvent event, CommonViewer commonViewer, int index) { LocalSelectionTransfer localSelection = LocalSelectionTransfer.getTransfer(); Tree control = (Tree) ((DropTarget) event.widget).getControl(); AbstractColumnDropTree viewer = (AbstractColumnDropTree) control.getData(); StructuredSelection selection = (StructuredSelection) localSelection.getSelection(); Iterator it = selection.iterator(); List<RepositoryNode> selectedXmlElement = new ArrayList<RepositoryNode>(); while (it.hasNext()) { RepositoryNode xmlElement = (RepositoryNode) it.next(); selectedXmlElement.add(xmlElement); } int size1 = selection.size(); int size2 = selectedXmlElement.size(); if (size1 == size2) { viewer.dropModelElements(selectedXmlElement, index); } localSelection = null; } } /** * DOC xqliu ColumnViewerDND class global comment. Detailled comment */ static class UDIReceiver implements ISelectionReceiver { // @Override public void doDropValidation(DropTargetEvent event, CommonViewer commonViewer) { Object treeData = ((DropTarget) event.widget).getControl().getData(); if (treeData == null || treeData instanceof AnalysisColumnSetTreeViewer) { event.detail = DND.DROP_NONE; return; } if (event.detail != DND.DROP_NONE) { lastValidOperation = event.detail; } boolean is = true; Object firstElement = ((StructuredSelection) commonViewer.getSelection()).getFirstElement(); if (firstElement instanceof SysIndicatorDefinitionRepNode) { SysIndicatorDefinitionRepNode firstElement2 = (SysIndicatorDefinitionRepNode) firstElement; IFile fe = ResourceManager.getRoot().getProject(firstElement2.getProject().getTechnicalLabel()) .getFile(WorkbenchUtils.getFilePath(firstElement2)); // if (firstElement instanceof IFile) { // IFile fe = (IFile) firstElement; // MOD qiongli 2010-8-3 bug 14579:If it is systemIndicator,it is not to be darg. if (fe.getProjectRelativePath().toString().contains(EResourceConstant.SYSTEM_INDICATORS.getPath())) { event.detail = DND.DROP_NONE; return; } boolean equals = FactoriesUtil.DEFINITION.equals(fe.getFileExtension()); if (equals) { IndicatorDefinition udi = IndicatorResourceFileHelper.getInstance().findIndDefinition(fe); // MOD yyi 2009-09-16 // Feature :8866 if (udi != null && (TaggedValueHelper.getValidStatus(udi) | UDIHelper.isUDIValid(udi))) { is = false; } } // } } if (event.item == null || is) { event.detail = DND.DROP_NONE; } else { Object data = event.item.getData(AnalysisColumnTreeViewer.INDICATOR_UNIT_KEY); if (data != null) { event.detail = DND.DROP_NONE; } else { event.detail = lastValidOperation; } } } // @Override public void drop(DropTargetEvent event, CommonViewer commonViewer, int index) { // MOD klliu 2010-06-17 UDI drag&drop several items StructuredSelection ts = (StructuredSelection) commonViewer.getSelection(); AnalysisColumnTreeViewer viewer = null; Analysis analysis = null; ArrayList<IndicatorDefinition> al = new ArrayList<IndicatorDefinition>(); if (ts.toList() != null) { // Iterator<IFile> iter = (Iterator<IFile>) ts.iterator(); List list = ts.toList(); // while (iter.hasNext()) { for (Object obj : list) { if (obj instanceof SysIndicatorDefinitionRepNode) { SysIndicatorDefinitionRepNode node2 = (SysIndicatorDefinitionRepNode) obj; al.add(node2.getIndicatorDefinition()); } } for (IndicatorDefinition udid : al) { TreeItem item = (TreeItem) event.item; // MOD 20130606 TDQ-5852 should include using delimitedfile indicator type, ModelElementIndicator data = (ModelElementIndicator) item .getData(AnalysisColumnTreeViewer.MODELELEMENT_INDICATOR_KEY); viewer = (AnalysisColumnTreeViewer) item.getParent().getData(AnalysisColumnTreeViewer.VIEWER_KEY); analysis = viewer.getAnalysis(); IndicatorUnit[] addIndicatorUnits = null; try { addIndicatorUnits = UDIUtils.createIndicatorUnit(udid, data, analysis); } catch (Throwable e) { log.error(e, e); MessageDialog.openError(commonViewer.getTree().getShell(), DefaultMessagesImpl.getString("ColumnsComparisonMasterDetailsPage.error"), e.getMessage());//$NON-NLS-1$ } if (addIndicatorUnits != null && addIndicatorUnits.length > 0) { for (IndicatorUnit unit : addIndicatorUnits) { viewer.createOneUnit(item, unit); } viewer.setDirty(true); } } } } } /** * DOC xqliu Comment method "installDND". bug 8791 2009-08-31. * * @param myTable */ public static void installDND(final Table targetControl) { IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); DQRespositoryView findView = (DQRespositoryView) activePage.findView(DQRespositoryView.ID); final CommonViewer commonViewer = findView.getCommonViewer(); final LocalSelectionTransfer transfer = LocalSelectionTransfer.getTransfer(); int operations = DND.DROP_COPY | DND.DROP_MOVE; Transfer[] transfers = new Transfer[] { transfer }; DropTarget dropTarget = new DropTarget(targetControl, operations); dropTarget.setTransfer(transfers); DropTargetListener dndListener = new TableDropTargetEffect(targetControl) { ISelectionReceiver receiver = null; @Override public void dragEnter(DropTargetEvent event) { super.dragEnter(event); IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection(); Object object = selection.getFirstElement(); // MOD klliu 2011-03-08 bug 19286 if (object instanceof DBColumnRepNode) { receiver = new ColumnReceiverTable(); } if (receiver == null) { event.detail = DND.DROP_NONE; } else { event.feedback = DND.FEEDBACK_EXPAND; receiver.doDropValidation(event, commonViewer); } } @Override public void dragOver(DropTargetEvent event) { if (receiver == null) { return; } super.dragOver(event); receiver.doDropValidation(event, commonViewer); } @Override public void drop(DropTargetEvent event) { if (receiver == null) { return; } int index = targetControl.getItemCount(); super.drop(event); if (event.item == null) { index = -1; } else { // Widget widget = event.widget; // Object data = event.data; TableItem item = (TableItem) event.item; TableItem[] items = targetControl.getItems(); for (int i = 0; i < items.length; i++) { if (items[i] == item) { index = i; break; } } } receiver.drop(event, commonViewer, index); } }; dropTarget.addDropListener(dndListener); } /** * DOC xqliu ColumnViewerDND class global comment. bug 8791 2009-08-31. */ static class ColumnReceiverTable implements ISelectionReceiver { // @Override public void doDropValidation(DropTargetEvent event, CommonViewer commonViewer) { event.detail = DND.DROP_NONE; IRepositoryNode firstElement = (RepositoryNode) ((StructuredSelection) LocalSelectionTransfer.getTransfer() .getSelection()).getFirstElement(); IRepositoryViewObject repViewObj = firstElement.getObject(); if (repViewObj instanceof MetadataColumnRepositoryObject) { // MOD klliu 2011-03-08 bug 19286 Table table = (Table) ((DropTarget) event.widget).getControl(); AbstractColumnDropTree viewer = (AbstractColumnDropTree) table.getData(); if (viewer != null && viewer.canDrop(firstElement)) { event.detail = DND.DROP_MOVE; } } } // @Override public void drop(DropTargetEvent event, CommonViewer commonViewer, int index) { LocalSelectionTransfer localSelection = LocalSelectionTransfer.getTransfer(); Table control = (Table) ((DropTarget) event.widget).getControl(); AbstractColumnDropTree viewer = (AbstractColumnDropTree) control.getData(); StructuredSelection selection = (StructuredSelection) localSelection.getSelection(); Iterator it = selection.iterator(); List<RepositoryNode> selectedColumn = new ArrayList<RepositoryNode>(); if (it.hasNext()) { RepositoryNode column = (RepositoryNode) it.next(); selectedColumn.add(column); viewer.dropModelElements(selectedColumn, index); } localSelection = null; } } }