// ============================================================================
//
// 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.List;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage;
import org.talend.dataprofiler.core.ui.views.AbstractSelectionReceiver;
import org.talend.dq.nodes.DBColumnRepNode;
/**
* The class can install a drag&drop function for target table viewer.
*/
public class ComparisonTableViewerDNDDecorate {
/**
* No need to validate the element of element.
*/
public static final int NON_VALIDATETYPE = 0;
/**
* Validate the element by the <code>Column</code> type.
*/
public static final int COLUMN_VALIDATETYPE = 1;
private Transfer[] transferTypes;
private Object dragSelectedElement;
private boolean allowDuplication = false;
private AbstractAnalysisMetadataPage masterPage;
private List<TableViewer> tableViewerPosStack;
private AnalysisColumnCompareTreeViewer compareTreeViewer;
public ComparisonTableViewerDNDDecorate(AnalysisColumnCompareTreeViewer compareTreeViewer,
AbstractAnalysisMetadataPage masterPage, List<TableViewer> tableViewerPosStack, boolean allowDuplication) {
final LocalSelectionTransfer transfer = LocalSelectionTransfer.getTransfer();
transferTypes = new Transfer[] { transfer, TextTransfer.getInstance() };
this.allowDuplication = allowDuplication;
this.masterPage = masterPage;
this.tableViewerPosStack = tableViewerPosStack;
this.compareTreeViewer = compareTreeViewer;
}
/**
* Install a drag&drop function for target table viewer.
*
* @param targetViewer the target table viewer for installing drag&drop, it's input value must a <code>List</code>
* type.
* @param installDragListener decide to whether install a drag listener for targetViewer: if true, will install the
* listener; else, will not install.
* @param validateType
* @see ComparisonTableViewerDNDDecorate#NON_VALIDATETYPE
* @see ComparisonTableViewerDNDDecorate#COLUMN_VALIDATETYPE
*/
public void installDND(final TableViewer targetViewer, final boolean installDragListener, final int validateType,
final boolean isLeftPart) {
int operations = DND.DROP_COPY | DND.DROP_MOVE;
if (installDragListener) {
installDragListener(targetViewer, operations);
}
DropTarget dropTarget = new DropTarget(targetViewer.getTable(), operations);
dropTarget.setTransfer(transferTypes);
DropTargetListener dndListener = new AbstractSelectionReceiver(targetViewer.getTable(), null) {
@Override
@SuppressWarnings("unchecked")
public void drop(DropTargetEvent event, LocalSelectionTransfer transfer) {
List inputElements = (List) targetViewer.getInput();
// MOD mzhao bug:12766,Avoid an null pointer exception error.
if (inputElements == null) {
inputElements = new ArrayList();
}
if (dragSelectedElement != null) {
TableItem item = (TableItem) event.item;
TableItem[] items = targetViewer.getTable().getItems();
int index = 0;
for (int i = 0; i < items.length; i++) {
if (items[i] == item) {
index = i;
break;
}
}
inputElements.remove(dragSelectedElement);
inputElements.add(index, dragSelectedElement);
dragSelectedElement = null;
} else {
StructuredSelection selection = (StructuredSelection) transfer.getSelection();
List selectionElements = selection.toList();
inputElements.addAll(selectionElements);
}
targetViewer.setInput(inputElements);
// Update connection widget.
compareTreeViewer.updateBindConnection(masterPage, tableViewerPosStack);
compareTreeViewer.setDirty(true);
// TDQ-11606 msjian: when add a column, will update the datapreview part
compareTreeViewer.computeRefreshDataPreviewPart(isLeftPart, inputElements, targetViewer);
}
@Override
public boolean doDropValidation(DropTargetEvent event, LocalSelectionTransfer transfer) {
StructuredSelection selection = (StructuredSelection) transfer.getSelection();
if (dragSelectedElement != null && selection != null) {
return true;
}
// boolean doDropValidation = super.doDropValidation(event, transfer);
boolean doDropValidation = false;
// if (doDropValidation) {
switch (validateType) {
case COLUMN_VALIDATETYPE:
doDropValidation = validateColumnType(selection, targetViewer);
break;
default:
doDropValidation = true;
}
// }
return doDropValidation;
}
};
dropTarget.addDropListener(dndListener);
}
private void installDragListener(final TableViewer targetViewer, int operations) {
final Table table = targetViewer.getTable();
final DragSource source = new DragSource(table, operations);
source.setTransfer(transferTypes);
final TableItem[] dragSourceItem = new TableItem[1];
source.addDragListener(new DragSourceListener() {
public void dragStart(DragSourceEvent event) {
TableItem[] selection = table.getSelection();
if (selection.length > 0) {
event.doit = true;
dragSourceItem[0] = selection[0];
dragSelectedElement = ((IStructuredSelection) targetViewer.getSelection()).getFirstElement();
} else {
event.doit = false;
}
}
public void dragSetData(DragSourceEvent event) {
dragSelectedElement = ((IStructuredSelection) targetViewer.getSelection()).getFirstElement();
event.data = dragSourceItem[0].getText();
}
public void dragFinished(DragSourceEvent event) {
}
});
}
// MOD mzhao 2009-09-14 Bug 8839.
@SuppressWarnings("unchecked")
private boolean validateColumnType(StructuredSelection selection, TableViewer targetViewer) {
if (selection == null) {
return false;
}
boolean isValidation = true;
List selectionList = selection.toList();
if (!allowDuplication) {
List elements = (List) targetViewer.getInput();
if (elements != null) {
for (Object element : elements) {
if (selectionList.contains(element)) {
isValidation = false;
break;
}
}
}
}
for (Object obj : selectionList) {
if (!(obj instanceof DBColumnRepNode)) {
isValidation = false;
break;
}
}
return isValidation;
}
}