// ============================================================================ // // 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.List; import org.eclipse.core.resources.IFile; 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.Transfer; import org.eclipse.swt.dnd.TreeDropTargetEffect; 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.repository.model.repositoryObject.MetadataTableRepositoryObject; import org.talend.cwm.helper.TaggedValueHelper; import org.talend.dataprofiler.core.model.TableIndicator; import org.talend.dataprofiler.core.ui.editor.composite.AbstractTableDropTree; import org.talend.dataprofiler.core.ui.editor.composite.AnalysisTableTreeViewer; import org.talend.dataprofiler.core.ui.utils.WorkbenchUtils; import org.talend.dataquality.rules.WhereRule; import org.talend.dq.helper.resourcehelper.DQRuleResourceFileHelper; import org.talend.dq.nodes.DBTableRepNode; import org.talend.dq.nodes.DBViewRepNode; import org.talend.dq.nodes.RuleRepNode; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.RepositoryNode; import org.talend.resource.ResourceManager; import orgomg.cwm.resource.relational.NamedColumnSet; /** * DOC xqliu class global comment. Detailled comment */ public abstract class TableViewerDND { private TableViewerDND() { } private static int lastValidOperation; /** * DOC xqliu Comment method "installDND". * * @param targetControl */ 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; @Override public void dragEnter(DropTargetEvent event) { super.dragEnter(event); IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection(); Object object = selection.getFirstElement(); if (object instanceof RuleRepNode) { receiver = new DQRuleReceiver(); } if (object instanceof NamedColumnSet) { receiver = new TableReceiver(); } if (object instanceof DBTableRepNode) { receiver = new TableReceiver(); } if (object instanceof DBViewRepNode) { receiver = new TableReceiver(); } if (receiver == null) { event.detail = DND.DROP_NONE; } else { event.feedback = DND.FEEDBACK_EXPAND; receiver.doDropValidation(event, commonViewer); } } @Override public void dragOver(DropTargetEvent event) { super.dragOver(event); if (receiver != null) { receiver.doDropValidation(event, commonViewer); } } @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); } 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; } } } if (receiver != null) { receiver.drop(event, commonViewer, index); } } }; dropTarget.addDropListener(dndListener); } /** * DOC xqliu TableViewerDND class global comment. Detailled comment */ interface ISelectionReceiver { void doDropValidation(DropTargetEvent event, CommonViewer commonViewer); void drop(DropTargetEvent event, CommonViewer commonViewer, int index); } /** * DOC xqliu DQRuleReceiver class global comment. Detailled comment */ static class DQRuleReceiver 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 RuleRepNode) { RuleRepNode firstElement2 = (RuleRepNode) firstElement; IFile file = ResourceManager.getRoot().getProject(firstElement2.getProject().getTechnicalLabel()) .getFile(WorkbenchUtils.getFilePath(firstElement2)); if (FactoriesUtil.DQRULE.equals(file.getFileExtension())) { WhereRule whereRule = DQRuleResourceFileHelper.getInstance().findWhereRule(file); if (whereRule != null && TaggedValueHelper.getValidStatus(whereRule)) { is = false; } } } if (event.item == null || is) { event.detail = DND.DROP_NONE; } else { Object data = event.item.getData(AnalysisTableTreeViewer.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) { List list = ((StructuredSelection) commonViewer.getSelection()).toList(); List<RuleRepNode> ruleNodes = new ArrayList<RuleRepNode>(); for (Object obj : list) { if (obj instanceof RuleRepNode) { RuleRepNode node2 = (RuleRepNode) obj; ruleNodes.add(node2); } } TreeItem item = (TreeItem) event.item; if (item != null) { Object obj = item.getData(AnalysisTableTreeViewer.TABLE_INDICATOR_KEY); if (obj != null && obj instanceof TableIndicator) { TableIndicator data = (TableIndicator) obj; AnalysisTableTreeViewer viewer = (AnalysisTableTreeViewer) item.getParent().getData( AnalysisTableTreeViewer.VIEWER_KEY); viewer.dropWhereRules(data, ruleNodes, index, item); } } } public void dragOver(DropTargetEvent event) { event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_INSERT_AFTER | DND.FEEDBACK_SCROLL | DND.FEEDBACK_SELECT; } } /** * DOC xqliu TableViewerDND class global comment. Detailled comment */ static class TableReceiver implements ISelectionReceiver { // @Override public void doDropValidation(DropTargetEvent event, CommonViewer commonViewer) { // MOD klliu select a table node to table ana for analyze on DQRepostitory event.detail = DND.DROP_NONE; Object firstElement = ((StructuredSelection) LocalSelectionTransfer.getTransfer().getSelection()).getFirstElement(); IRepositoryNode tableNOde = (IRepositoryNode) firstElement; if (tableNOde instanceof DBTableRepNode || tableNOde instanceof DBViewRepNode) { MetadataTableRepositoryObject tableViewObject = (MetadataTableRepositoryObject) tableNOde.getObject(); NamedColumnSet set = (NamedColumnSet) tableViewObject.getTable(); Tree tree = (Tree) ((DropTarget) event.widget).getControl(); AbstractTableDropTree viewer = (AbstractTableDropTree) tree.getData(); if (viewer != null && viewer.canDrop(set)) { 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(); AbstractTableDropTree viewer = (AbstractTableDropTree) control.getData(); StructuredSelection selection = (StructuredSelection) localSelection.getSelection(); List<RepositoryNode> list = selection.toList(); List<NamedColumnSet> selectedTableList = new ArrayList<NamedColumnSet>(); for (RepositoryNode tableNOde : list) { MetadataTableRepositoryObject tableViewObject = (MetadataTableRepositoryObject) tableNOde.getObject(); NamedColumnSet set = (NamedColumnSet) tableViewObject.getTable(); selectedTableList.add(set); } int size1 = selection.size(); int size2 = selectedTableList.size(); if (size1 == size2) { viewer.dropTables(selectedTableList, index); } localSelection = null; } } }