package org.objectstyle.wolips.componenteditor.inspector;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.MenuListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Decorations;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.objectstyle.wolips.bindings.api.IApiBinding;
import org.objectstyle.wolips.bindings.api.Wo;
import org.objectstyle.wolips.bindings.wod.IWodElement;
import org.objectstyle.wolips.bindings.wod.WodProblem;
import org.objectstyle.wolips.componenteditor.ComponenteditorPlugin;
import org.objectstyle.wolips.wodclipse.core.completion.WodParserCache;
import org.objectstyle.wolips.wodclipse.core.refactoring.RefactoringWodElement;
import org.objectstyle.wolips.wodclipse.core.util.WodModelUtils;
public class BindingsPopUpMenu implements MenuListener {
private Menu _menu;
private WodParserCache _cache;
public BindingsPopUpMenu(Decorations parent, WodParserCache cache) {
_menu = new Menu(parent, SWT.POP_UP);
_menu.addMenuListener(this);
_cache = cache;
}
public void menuHidden(MenuEvent e) {
Menu menu = (Menu) e.widget;
BindingsDragHandler dragHandler = (BindingsDragHandler) menu.getData();
if (dragHandler != null) {
dragHandler.bindingDropFinished();
}
}
public void menuShown(MenuEvent e) {
// DO NOTHING
}
public Menu getMenu() {
return _menu;
}
public void dispose() {
_menu.dispose();
}
public boolean showMenuAtLocation(IWodElement wodElement, String droppedKeyPath, Point location, BindingsDragHandler dragHandler) throws Exception {
boolean showMenu = false;
Wo api = wodElement.getApi(_cache.getJavaProject(), WodParserCache.getTypeCache());
if (api != null) {
IApiBinding[] apiBindings = wodElement.getApiBindings(api);
if (apiBindings != null && apiBindings.length > 0) {
Set<IApiBinding> keyBindings = new TreeSet<IApiBinding>();
Set<IApiBinding> actionBindings = new TreeSet<IApiBinding>();
for (IApiBinding binding : apiBindings) {
if (binding.isAction()) {
actionBindings.add(binding);
showMenu = true;
} else {
keyBindings.add(binding);
showMenu = true;
}
}
for (MenuItem item : _menu.getItems()) {
item.dispose();
}
List<WodProblem> wodProblems = WodModelUtils.getProblems(wodElement, _cache);
BindingSelectionListener selectionListener = new BindingSelectionListener(wodElement, droppedKeyPath, _cache);
for (IApiBinding keyBinding : keyBindings) {
MenuItem mi = createMenuItem(wodElement, keyBinding, wodProblems);
mi.addSelectionListener(selectionListener);
}
if (!keyBindings.isEmpty() && !actionBindings.isEmpty()) {
new MenuItem(_menu, SWT.SEPARATOR);
}
for (IApiBinding actionBinding : actionBindings) {
MenuItem mi = createMenuItem(wodElement, actionBinding, wodProblems);
mi.addSelectionListener(selectionListener);
}
if (showMenu) {
_menu.setData(dragHandler);
_menu.setLocation(location.x, location.y);
_menu.setVisible(true);
}
} else {
showMenu = false;
}
}
return showMenu;
}
protected MenuItem createMenuItem(IWodElement element, IApiBinding binding, List<WodProblem> wodProblems) {
MenuItem menuItem = new MenuItem(_menu, SWT.NONE);
menuItem.setData(binding);
menuItem.setText(binding.getName());
if (element.getBindingNamed(binding.getName()) != null) {
menuItem.setImage(ComponenteditorPlugin.getDefault().getImage(ComponenteditorPlugin.CONNECTED_ICON));
} else if (WodModelUtils.hasValidationProblem(binding, wodProblems)) {
menuItem.setImage(ComponenteditorPlugin.getDefault().getImage(ComponenteditorPlugin.UNCONNECTED_PROBLEM_ICON));
} else {
menuItem.setImage(ComponenteditorPlugin.getDefault().getImage(ComponenteditorPlugin.UNCONNECTED_ICON));
}
return menuItem;
}
protected static class BindingSelectionListener implements SelectionListener {
private IWodElement _wodElement;
private String _droppedKeyPath;
private WodParserCache _cache;
public BindingSelectionListener(IWodElement wodElement, String droppedKeyPath, WodParserCache cache) {
_wodElement = wodElement;
_droppedKeyPath = droppedKeyPath;
_cache = cache;
}
public void widgetDefaultSelected(SelectionEvent event) {
widgetSelected(event);
}
public void widgetSelected(SelectionEvent event) {
MenuItem item = (MenuItem) event.widget;
item.setImage(ComponenteditorPlugin.getDefault().getImage(ComponenteditorPlugin.CONNECTED_ICON));
IApiBinding apiBinding = (IApiBinding) item.getData();
RefactoringWodElement refactoringWodElement = new RefactoringWodElement(_wodElement, _cache);
try {
refactoringWodElement.setValueForBinding(_droppedKeyPath, apiBinding.getName());
} catch (Exception e) {
e.printStackTrace();
ComponenteditorPlugin.getDefault().log("Failed to add binding.", e);
}
}
}
}