package org.ovirt.engine.ui.webadmin.widget.table.cell;
import java.util.HashSet;
import java.util.Set;
import org.ovirt.engine.ui.common.widget.action.ActionButtonDefinition;
import org.ovirt.engine.ui.common.widget.action.MenuPanelPopup;
import org.ovirt.engine.ui.common.widget.table.cell.AbstractCell;
import org.ovirt.engine.ui.webadmin.ApplicationResources;
import org.ovirt.engine.ui.webadmin.ApplicationTemplates;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.dom.client.BrowserEvents;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.MenuItem;
public class MenuCell<T> extends AbstractCell<T> {
private static final ApplicationTemplates templates = AssetProvider.getTemplates();
private static final ApplicationResources resources = AssetProvider.getResources();
private MenuPanelPopup menuPanelPopup;
public MenuCell() {
super();
this.menuPanelPopup = new MenuPanelPopup(true);
}
@Override
public Set<String> getConsumedEvents() {
Set<String> set = new HashSet<>(super.getConsumedEvents());
set.add(BrowserEvents.CLICK);
return set;
}
@Override
public void render(Context context, T value, SafeHtmlBuilder sb, String id) {
if (!isVisible(value)) {
return;
}
ImageResource image = resources.expanderDownImage();
SafeHtml imageHtml = SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(image).getHTML());
sb.append(templates.volumeActivityMenu(imageHtml, id));
}
protected boolean isVisible(T value) {
return true;
}
@Override
public void onBrowserEvent(Context context,
Element parent,
T value,
NativeEvent event,
ValueUpdater<T> valueUpdater) {
super.onBrowserEvent(context, parent, value, event, valueUpdater);
int eventX = event.getClientX();
int eventY = event.getClientY();
// Handle the click event.
if (BrowserEvents.CLICK.equals(event.getType())) {
// Ignore clicks that occur outside of the outermost element.
EventTarget eventTarget = event.getEventTarget();
if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
menuPanelPopup.asPopupPanel().showAndFitToScreen(eventX, eventY);
}
}
else if(BrowserEvents.MOUSEOVER.equals(event.getType())) {
if (isVisible(value)) {
parent.getFirstChildElement().getStyle().setBorderColor("#96B7D6"); //$NON-NLS-1$
}
}
else {
parent.getFirstChildElement().getStyle().setBorderColor("transparent"); //$NON-NLS-1$
}
}
public void addMenuItem(final ActionButtonDefinition<T> buttonDef) {
final MenuItem menuItem = new MenuItem(buttonDef.getText(), () -> {
menuPanelPopup.asPopupPanel().hide();
buttonDef.onClick(null);
});
menuItem.setEnabled(buttonDef.isEnabled(null));
// Update button whenever its definition gets re-initialized
buttonDef.addInitializeHandler(event -> menuItem.setEnabled(buttonDef.isEnabled(null)));
menuPanelPopup.getMenuBar().addItem(menuItem);
}
}