blob: 231f6d2a072f60382751a9b45777af9b9d0cdd2e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Red Hat and others. All rights reserved.
* The contents of this file are made available under the terms
* of the GNU Lesser General Public License (LGPL) Version 2.1 that
* accompanies this distribution (lgpl-v21.txt). The LGPL is also
* available at http://www.gnu.org/licenses/lgpl.html. If the version
* of the LGPL at http://www.gnu.org is different to the version of
* the LGPL accompanying this distribution and there is any conflict
* between the two license versions, the terms of the LGPL accompanying
* this distribution shall govern.
*
* Contributors:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.tests.gtk.snippets;
import org.eclipse.swt.SWT;
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.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/*
* Title: Bug 186038 - [DND] On Linux-gtk, the SWT.Activate event is not fired to the popup shell during a dragging operation
* How to run: launch snippet, drag source button to target.
* Bug description: When the shell appears, clicking outside of it does not dismiss it
* Expected results: The shell should be dismissed.
* GTK Version(s): GTK2.x
*/
public class Bug186038_DNDActivateEvent {
public static void main(String[] args) {
Display display = new Display();
final Shell shell = new Shell(display);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
shell.setLayout(layout);
// create the drop down widget.shell
final Shell dropDownShell = new Shell(shell, SWT.ON_TOP | SWT.DROP_DOWN);
dropDownShell.setLayout(new RowLayout());
dropDownShell.setVisible(false);
dropDownShell.addListener(SWT.Activate, event -> System.out.println("dropDownShell gets Activate event!"));
dropDownShell.addListener(SWT.Deactivate, event -> {
System.out.println(
"dropDownShell entering Deactivate event handler and will hide the dropdown widget.shell");
hideDropDown(dropDownShell);
});
dropDownShell.addListener(SWT.Close, event -> hideDropDown(dropDownShell));
// create the button1 and when it is hovered, display the dropdown
final Button button1 = new Button(shell, SWT.PUSH);
button1.setText("Drop target");
button1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!dropDownShell.isVisible()) {
showDropDown(button1, dropDownShell);
}
}
});
int operations = DND.DROP_COPY | DND.DROP_DEFAULT;
DropTarget target = new DropTarget(button1, operations);
// Provide data in Text format
Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
target.setTransfer(types);
target.addDropListener(new DropTargetListener() {
@Override
public void dragEnter(DropTargetEvent event) {
if (event.detail == DND.DROP_DEFAULT) {
if ((event.operations & DND.DROP_COPY) != 0) {
event.detail = DND.DROP_COPY;
} else {
event.detail = DND.DROP_NONE;
}
}
for (int i = 0; i < event.dataTypes.length; i++) {
if (TextTransfer.getInstance().isSupportedType(event.dataTypes[i])) {
event.currentDataType = event.dataTypes[i];
if (event.detail != DND.DROP_COPY) {
event.detail = DND.DROP_NONE;
}
break;
}
}
}
@Override
public void dragOver(DropTargetEvent event) {
event.feedback = DND.FEEDBACK_SELECT;
if (!dropDownShell.isVisible()) {
showDropDown(button1, dropDownShell);
}
}
@Override
public void dragOperationChanged(DropTargetEvent event) {
}
@Override
public void dragLeave(DropTargetEvent event) {
}
@Override
public void dropAccept(DropTargetEvent event) {
}
@Override
public void drop(DropTargetEvent event) {
if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
String text = (String) event.data;
System.out.println(text);
}
}
});
// create the button2 as the drag source
final Button button2 = new Button(shell, SWT.PUSH);
button2.setText("Drag source");
operations = DND.DROP_COPY;
DragSource source = new DragSource(button2, operations);
// Provide data in Text format
source.setTransfer(types);
source.addDragListener(new DragSourceListener() {
@Override
public void dragStart(DragSourceEvent event) {
if (button2.getText().length() == 0) {
event.doit = false;
}
}
@Override
public void dragSetData(DragSourceEvent event) {
// Provide the data of the requested type.
if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = button2.getText();
}
}
@Override
public void dragFinished(DragSourceEvent event) {
}
});
shell.setSize(300, 300);
shell.addDisposeListener(e -> {
if (dropDownShell != null && !dropDownShell.isDisposed()) {
dropDownShell.dispose();
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
private static void showDropDown(final Button button1, final Shell dropDownShell) {
if (dropDownShell != null && !dropDownShell.isDisposed()) {
dropDownShell.setText("This is a drop down widget.shell");
dropDownShell.setSize(100, 200);
Rectangle buttonRect = button1.getBounds();
Point p = button1.getParent().toDisplay(new Point(buttonRect.x, buttonRect.y + buttonRect.height));
dropDownShell.setLocation(p.x, p.y);
dropDownShell.setVisible(true);
dropDownShell.setFocus();
}
}
private static void hideDropDown(final Shell dropDownShell) {
dropDownShell.setVisible(false);
}
}