package rocks.inspectit.ui.rcp.menu;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.handlers.IHandlerService;
import rocks.inspectit.ui.rcp.InspectIT;
import rocks.inspectit.ui.rcp.InspectITImages;
import rocks.inspectit.ui.rcp.handlers.ShowHideColumnsHandler;
/**
* Menu manager for displaying the show/hide columns group.
*
* @author Ivan Senic
*
*/
public class ShowHideMenuManager extends MenuManager implements IMenuListener {
/**
* Viewer to display menu for.
*/
private ColumnViewer columnViewer;
/**
* Input controller class.
*/
private Class<?> inputControllerClass;
/**
* Default constructor.
*
* @param columnViewer
* Viewer to display menu for.
* @param inputControllerClass
* Input controller class.
*/
public ShowHideMenuManager(ColumnViewer columnViewer, Class<?> inputControllerClass) {
Assert.isNotNull(columnViewer);
Assert.isNotNull(inputControllerClass);
this.columnViewer = columnViewer;
this.inputControllerClass = inputControllerClass;
this.addMenuListener(this);
for (IAction actionItem : getActionItems()) {
this.add(actionItem);
}
}
/**
* {@inheritDoc}
*/
@Override
public void menuAboutToShow(IMenuManager manager) {
this.removeAll();
for (IAction actionItem : getActionItems()) {
this.add(actionItem);
}
}
/**
* Returns all contribution items.
*
* @return Returns all contribution items.
*/
private IAction[] getActionItems() {
List<IAction> items = new ArrayList<>();
if (columnViewer instanceof TableViewer) {
TableColumn[] columns = ((TableViewer) columnViewer).getTable().getColumns();
for (TableColumn column : columns) {
items.add(new ShowHideColumnAction(column));
}
} else if (columnViewer instanceof TreeViewer) {
TreeColumn[] columns = ((TreeViewer) columnViewer).getTree().getColumns();
for (TreeColumn column : columns) {
items.add(new ShowHideColumnAction(column));
}
}
return items.toArray(new IAction[items.size()]);
}
/**
* Action for showing ot hiding one column.
*
* @author Ivan Senic
*
*/
private class ShowHideColumnAction extends Action {
/**
* Column for the action.
*/
private Item column;
/**
* Should the column be visible after action execution.
*/
private boolean visible;
/**
* Default constructor.
*
* @param column
* Column for the action.
*/
public ShowHideColumnAction(Item column) {
Assert.isNotNull(column);
this.column = column;
String tooltip;
ImageDescriptor icon = null;
int width = 0;
if (column instanceof TableColumn) {
width = ((TableColumn) column).getWidth();
} else if (column instanceof TreeColumn) {
width = ((TreeColumn) column).getWidth();
} else {
RuntimeException exception = new RuntimeException("Unsupported item provided during dynamic columns menu creation. Item class is " + column.getClass().getName() + ".");
InspectIT.getDefault().createErrorDialog("Error creating dynamic column menu", exception, -1);
throw exception;
}
if (width > 0) {
visible = false;
tooltip = "Hide column";
icon = InspectIT.getDefault().getImageDescriptor(InspectITImages.IMG_CHECKMARK);
} else {
visible = true;
tooltip = "Show column";
}
this.setText(column.getText());
this.setImageDescriptor(icon);
this.setToolTipText(tooltip);
}
/**
* {@inheritDoc}
*/
@Override
public void run() {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IHandlerService handlerService = (IHandlerService) window.getService(IHandlerService.class);
ICommandService commandService = (ICommandService) window.getService(ICommandService.class);
Command command = commandService.getCommand(ShowHideColumnsHandler.COMMAND_ID);
ExecutionEvent executionEvent = handlerService.createExecutionEvent(command, new Event());
IEvaluationContext context = (IEvaluationContext) executionEvent.getApplicationContext();
context.addVariable(ShowHideColumnsHandler.COLUMN_PARAM, column);
context.addVariable(ShowHideColumnsHandler.VISIBLE_PARAM, visible);
context.addVariable(ShowHideColumnsHandler.CONTROLLER_CLASS_PARAM, inputControllerClass);
try {
command.executeWithChecks(executionEvent);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}