/*******************************************************************************
* Copyright 2017 Capital One Services, LLC and Bitwise, Inc.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package hydrograph.ui.propertywindow.widgets.utility;
import java.util.regex.Pattern;
import org.eclipse.jface.viewers.CellEditor;
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.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
public class DragDropUtility {
TableViewer viewer;
public static DragDropUtility INSTANCE = new DragDropUtility();
private DragDropUtility(){
}
public void applyDrop(final TableViewer tableViewerOpOuter,DragDropOperation dragDropOperation) {
Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
DropTarget target = new DropTarget(tableViewerOpOuter.getTable(), operations);
target.setTransfer(types);
target.addDropListener(new DradDropUtilityListener(dragDropOperation));
}
public void applyDragFromTableViewer(Control sourceControl){
Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
final Table table =(Table)sourceControl;
DragSource source = new DragSource(table, operations);
source.setTransfer(types);
final String[] columnData = new String[1];
source.addDragListener(new DragSourceListener() {
public void dragStart(DragSourceEvent event) {
TableItem[] selection = table.getSelection();
if (selection[0].getText().length()>0) {
event.doit = true;
columnData[0] = selection[0].getText();
} else {
event.doit = false;
}
};
public void dragSetData(DragSourceEvent event) {
event.data = addDelimeter(table.getSelection());
}
public void dragFinished(DragSourceEvent event) {
if (event.detail == DND.DROP_COPY){
columnData[0]=null;
}
}
});
}
private String addDelimeter(TableItem[] selectedTableItems) {
StringBuffer buffer = new StringBuffer();
for (TableItem tableItem : selectedTableItems) {
buffer.append(tableItem.getText() + "#");
}
return buffer.toString();
}
public void applyDragFromTableViewerOuter(final TableViewer tableViewer){
Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
// final Table table =(Table)sourceControl;
DragSource source = new DragSource(tableViewer.getTable(), operations);
source.setTransfer(types);
final String[] columnData = new String[1];
source.addDragListener(new DragSourceListener() {
public void dragStart(DragSourceEvent event) {
// int[] selection = table.getSelectionIndices();
CellEditor[] cellEditors = tableViewer.getCellEditors();
cellEditors[1].getValue();
if (((String) cellEditors[1].getValue()).length()>0) {
event.doit = true;
columnData[0] = (String) cellEditors[1].getValue();
} else {
event.doit = false;
}
};
public void dragSetData(DragSourceEvent event) {
event.data = columnData[0];
}
public void dragFinished(DragSourceEvent event) {
if (event.detail == DND.DROP_COPY){
columnData[0]=null;
}
}
});
}
}
class DradDropUtilityListener extends DropTargetAdapter{
private DragDropOperation dragDropOperation;
public DradDropUtilityListener(DragDropOperation dragDropOperation) {
this.dragDropOperation=dragDropOperation;
}
public void dragOver(DropTargetEvent event) {
event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
}
public void drop(DropTargetEvent event) {
if (event.data == null) {
event.detail = DND.DROP_NONE;
return;
}
String[] dropData = ((String) event.data).split(Pattern.quote("#"));
for(String result:dropData)
{
dragDropOperation.saveResult(result);
}
}
}