package au.com.vaadinutils.fields.contextmenu;
import java.util.ArrayList;
import java.util.List;
import com.vaadin.event.ContextClickEvent;
import com.vaadin.event.ContextClickEvent.ContextClickListener;
import com.vaadin.ui.Grid;
import com.vaadin.ui.Grid.GridContextClickEvent;
public class GridContextMenu<E> extends EntityContextMenu<E>
{
private static final long serialVersionUID = 1L;
private List<ContextMenuEvent> eventsList = new ArrayList<>();
private Grid grid;
/**
* Assigns this as the context menu of given table. Allows context menu to
* appear only on certain parts of the table.
*
* @param table
* @param onRow
* show context menu when row is clicked
* @param onHeader
* show context menu when header is clicked
* @param onFooter
* show context menu when footer is clicked
*/
public void setAsGridContextMenu(final Grid grid, final boolean onRow, final boolean onHeader,
final boolean onFooter)
{
this.grid = grid;
extend(grid);
setOpenAutomatically(false);
grid.addContextClickListener(new ContextClickListener()
{
private static final long serialVersionUID = -2197393292360426242L;
@Override
public void contextClick(ContextClickEvent event)
{
if (!(event instanceof GridContextClickEvent))
{
return;
}
final GridContextClickEvent e = (GridContextClickEvent) event;
switch (e.getSection())
{
case BODY:
if (onRow)
{
openContext(e);
}
break;
case FOOTER:
if (onFooter)
{
openContext(e);
}
break;
case HEADER:
if (onHeader)
{
openContext(e);
}
break;
default:
break;
}
}
});
}
private void openContext(final GridContextClickEvent event)
{
try
{
@SuppressWarnings("unchecked")
final E itemId = (E) event.getItemId();
if (itemId == null)
{
return;
}
targetEntity = itemId;
grid.select(itemId);
for (ContextMenuEvent events : eventsList)
{
events.preContextMenuOpen();
}
open(event.getClientX(), event.getClientY());
}
catch (IllegalArgumentException e)
{
// This usually means we have tried to select something that doesn't
// exist in the grid. This can happen when trying to open a context
// menu on old items while the grid is still refreshing with new
// items.
}
}
public void addEvents(final ContextMenuEvent events)
{
eventsList.add(events);
}
}