/*******************************************************************************
* Copyright (c) 2016 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.browsersim.widgets;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Widget;
public class WidgetHandler {
public static void notify(final int eventType, final Event createEvent,
final Widget widget) {
createEvent.type = eventType;
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if ((widget == null) || widget.isDisposed()) {
return;
}
widget.notifyListeners(eventType, createEvent);
}
});
// Wait for synchronization
Display.getDefault().syncExec(new Runnable() {
public void run() {
// do nothing here
}
});
}
public static void notify(final int eventType, final Widget widget){
notify(eventType, createEvent(widget), widget);
}
private static Event createEvent(Widget widget) {
Event event = new Event();
event.time = (int) System.currentTimeMillis();
event.widget = widget;
event.display = RDDisplay.getDisplay();
return event;
}
public static <T extends Widget> void setFocus(final T w) {
RDDisplay.syncExec(new Runnable() {
@Override
public void run() {
if (w instanceof Control) {
((Control) w).setFocus();
} else {
throw new IllegalArgumentException("Unsupported type");
}
}
});
}
public static void sendHide(final Menu menu, final boolean recur) {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
if (menu != null) {
menu.notifyListeners(SWT.Hide, new Event());
if (recur) {
if (menu.getParentMenu() != null) {
sendHide(menu.getParentMenu(), recur);
} else {
menu.setVisible(false);
}
}
}
}
});
}
public static Menu getMenu(final Control control){
return RDDisplay.syncExec(new ResultRunnable<Menu>() {
@Override
public Menu run() {
return control.getMenu();
}
});
}
public static MenuItem[] getMenuItems(final Menu menu){
return RDDisplay.syncExec(new ResultRunnable<MenuItem[]>() {
@Override
public MenuItem[] run() {
sendHide(menu, true);
menu.notifyListeners(SWT.Show, new Event());
return menu.getItems();
}
});
}
public static boolean isMenuSelected(final MenuItem[] menuItems, final String item){
return RDDisplay.syncExec(new ResultRunnable<Boolean>() {
@Override
public Boolean run() {
for(MenuItem i: menuItems){
String normalized = i.getText().replace("&", "");
if(normalized.equals(item)){
return i.getSelection();
}
}
throw new IllegalArgumentException("Unable to find menu item "+item);
}
});
}
public static MenuItem[] getMenuItemsFromMenuItem(final String menuItem, final MenuItem[] items){
return RDDisplay.syncExec(new ResultRunnable<MenuItem[]>() {
@Override
public MenuItem[] run() {
for(MenuItem i: items){
String normalized = i.getText().replace("&", "");
if(normalized.equals(menuItem)){
Menu menu = i.getMenu();
sendHide(menu, true);
menu.notifyListeners(SWT.Show, new Event());
return menu.getItems();
}
}
return null;
}
});
}
public static List<String> getMenuItemsText(final MenuItem[] items){
return RDDisplay.syncExec(new ResultRunnable<List<String>>() {
@Override
public List<String> run() {
List<String> itemsText = new ArrayList<>();
for(MenuItem i: items){
itemsText.add(i.getText());
}
return itemsText;
}
});
}
public static void menuItemClick(final MenuItem[] menuItems, final String itemText){
final MenuItem i = RDDisplay.syncExec(new ResultRunnable<MenuItem>() {
@Override
public MenuItem run() {
for(MenuItem i: menuItems){
if(i.getText().contains(itemText)){
return i;
}
}
return null;
}
});
RDDisplay.asyncExec(new Runnable() {
@Override
public void run() {
final Event event = new Event();
event.time = (int) System.currentTimeMillis();
event.widget = i;
event.item = i;
event.display = i.getDisplay();
event.type = SWT.Selection;
i.notifyListeners(SWT.Selection, event);
}
});
RDDisplay.syncExec(new Runnable() {
@Override
public void run() {
}
});
}
public static <T extends Widget> String getText(final T widget) {
Object o = ObjectUtil.invokeMethod(widget, "getText");
if (o == null){
return null;
}
if (o instanceof String) {
return (String) o;
}
throw new IllegalArgumentException(
"Return value of method getText() on class " + o.getClass()
+ " should be String, but was " + o.getClass());
}
}