package com.arm.cmsis.pack.ui.tree;
import org.eclipse.jface.util.Geometry;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ViewerCell;
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.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
/**
* A cell editor that presents a drop down menu. The cell editor's
* value is the selected menu item.
*/
public class MenuCellEditor extends CellEditor {
Menu menu = null;
Button button;
String selectedItem;
ViewerCell viewerCell;
Composite parent;
public MenuCellEditor(Composite parent) {
super(parent);
this.parent = parent;
}
@Override
protected Control createControl(Composite parent) {
button = new Button(parent, SWT.PUSH|SWT.LEFT);
return button;
}
@Override
public void activate(ColumnViewerEditorActivationEvent activationEvent) {
super.activate(activationEvent);
viewerCell = (ViewerCell)activationEvent.getSource();
button.setText(viewerCell.getText());
button.setImage(viewerCell.getImage());
showMenu();
}
@Override
protected Object doGetValue() {
return selectedItem;
}
/**
* This is the menu item selection listener used to apply the selected menu item.
*/
class MenuItemSelListener implements SelectionListener {
@Override
public void widgetSelected(SelectionEvent e) {
selectedItem = ((MenuItem)e.getSource()).getText();
boolean selected = ((MenuItem)e.getSource()).getSelection();
if (!selected) {
for (int i = 0; i < menu.getItemCount(); ++i) {
if (menu.getItem(i).getSelection()) {
selectedItem = menu.getItem(i).getText();
break;
}
}
}
applyEditorValueAndDeactivate();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
}
@Override
protected void doSetValue(Object value) {
if (!(value instanceof Menu)) {
return;
}
this.menu = (Menu)value;
// Set menu item selection listener
for (int i = 0; i < menu.getItemCount(); ++i) {
menu.getItem(i).addSelectionListener(new MenuItemSelListener());
}
menu.addMenuListener(new MenuListener() {
@Override
public void menuShown(MenuEvent e) {
}
@Override
public void menuHidden(MenuEvent e) {
deactivate();
}
});
}
/**
* Applies the currently selected value and deactivates the cell editor
*/
void applyEditorValueAndDeactivate() {
menu.dispose();
button.dispose();
fireApplyEditorValue();
deactivate();
}
/**
* Show the drop down menu just under the selected cell.
*/
private void showMenu() {
Rectangle rc = viewerCell.getBounds();
Rectangle rc2 = Geometry.toDisplay(parent, rc); // convert to screen coordinates
menu.setLocation(rc2.x, rc2.y + rc2.height); // set menu position
menu.setVisible(true);
button.setVisible(false);
}
@Override
protected void doSetFocus() {
// TODO Auto-generated method stub
}
}