blob: 5672c37f28e5fd02144f1ca7c6f9c0d810f8adcb [file] [log] [blame]
package org.eclipse.ui.internal;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.widgets.*;
public class KeyTable {
public interface KeyTableListener {
void keyPressed(int key);
}
private Shell shell;
private int[] keys;
private Menu menu;
private MenuItem menuItem;
public KeyTable(Shell shell) {
this.shell = shell;
initMenu();
}
public void initMenu() {
Menu parent = shell.getMenuBar();
if (parent == null || parent.getItemCount() < 1)
throw new SWTException();
MenuItem parentItem = parent.getItem(parent.getItemCount() - 1);
final Menu child = parentItem.getMenu();
if (child == null)
throw new SWTException();
menuItem = new MenuItem(child, SWT.CASCADE,0);
menuItem.setMenu(menu = new Menu(menuItem));
child.addListener(SWT.Show, new Listener () {
public void handleEvent(Event event) {
if(menuItem == null || menuItem.isDisposed())
return;
menuItem.setMenu(null);
menuItem.dispose();
}
});
child.addListener(SWT.Hide, new Listener () {
public void handleEvent(Event event) {
//It seems that we are getting this event twice
if(menuItem == null || menuItem.isDisposed()) {
menuItem = new MenuItem(child, SWT.CASCADE,0);
menuItem.setMenu(menu);
}
}
});
}
private KeyTableListener keyTableListener;
public void addKeyTableListener(KeyTableListener keyTableListener) {
this.keyTableListener = keyTableListener;
// TBD: add listener to list
}
public void removeKeyTableListener(KeyTableListener keyTableListener) {
// TBD: remove listener from list
}
void handleEvent(Event event) {
MenuItem eventMenuItem = (MenuItem) event.widget;
int key = eventMenuItem.getAccelerator();
// TBD: send key to all listeners
if (keyTableListener != null)
keyTableListener.keyPressed(key);
}
public int[] getKeys() {
if (keys == null)
return null;
else {
int[] keys = new int[this.keys.length];
System.arraycopy(this.keys, 0, keys, 0, this.keys.length);
return keys;
}
}
public void setKeys(final int[] keys) {
if (keys == null)
this.keys = null;
else
System.arraycopy(keys, 0, this.keys = new int[keys.length], 0, keys.length);
if (menu != null) {
menu.dispose();
menu = null;
}
// Arrays.sort(keys);
if(menuItem == null || menuItem.isDisposed()) {
initMenu();
} else {
menu = new Menu(menuItem);
menuItem.setMenu(menu);
}
for (int i = 0; i < keys.length; i++) {
final int key = keys[i];
MenuItem keyMenuItem = new MenuItem(menu, SWT.PUSH);
keyMenuItem.setAccelerator(key);
//keyMenuItem.setText(Action.convertAccelerator(key));
keyMenuItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
KeyTable.this.handleEvent(event);
}
});
}
}
}