001 package nl.cwi.sen1.util;
002
003 import java.awt.event.InputEvent;
004 import java.awt.event.MouseEvent;
005
006 import javax.swing.event.MouseInputAdapter;
007
008 import nl.cwi.sen1.configapi.Factory;
009 import nl.cwi.sen1.configapi.types.Event;
010 import nl.cwi.sen1.configapi.types.KeyModifierList;
011 import nl.cwi.sen1.configapi.types.VirtualButton;
012 import toolbus.AbstractTool;
013 import aterm.ATerm;
014 import aterm.pure.PureFactory;
015
016 /**
017 * This is a generic MouseAdapter useful for any MetaStudio component that needs
018 * to send mouse events to the ToolBus. It has some magic: if the component is a
019 * subclass of JTextComponent it also stores the correct caret position, next to
020 * the other details of a MouseEvent (x,y) pos. These can be used for later
021 * inspection when the ToolBus scripts might ask for further details.
022 *
023 * @author jurgenv
024 *
025 */
026 public class MouseAdapter extends MouseInputAdapter {
027 private Factory factory;
028
029 private AbstractTool bridge;
030
031 private ATerm id;
032
033 private Event event;
034
035 static private MouseEvent popupEvent;
036
037 public void setId(ATerm id) {
038 this.id = id;
039 }
040
041 public MouseAdapter(ATerm id, AbstractTool bridge, Event event) {
042 this.factory = Factory.getInstance((PureFactory) id.getFactory());
043 this.bridge = bridge;
044 this.id = id;
045 this.event = event;
046 }
047
048 public void mousePressed(MouseEvent e) {
049 if (event.isEqual(convert(e))) {
050 ATerm msg = factory.getPureFactory().make(
051 "mouse-event(<term>,<term>)",
052 this.id, this.event.toTerm());
053 bridge.postEvent(msg);
054 }
055 }
056
057 public void mouseReleased(MouseEvent e) {
058 if (e.isPopupTrigger()) {
059 mousePressed(e);
060 }
061 }
062
063 static public MouseEvent getPreviousPopupEvent() {
064 return popupEvent;
065 }
066
067 private Event convert(MouseEvent e) {
068 if (e.isPopupTrigger()) {
069 popupEvent = e;
070 return factory.makeEvent_Popup();
071 }
072 int mask = e.getModifiers();
073 return factory.makeEvent_Click(modifiers(mask), button(mask));
074 }
075
076 private KeyModifierList modifiers(int modifiers) {
077 KeyModifierList mods = factory.makeKeyModifierList();
078
079 if ((modifiers & InputEvent.CTRL_DOWN_MASK) != 0) {
080 mods.insert(factory.makeKeyModifier_M_CTRL());
081 }
082 if ((modifiers & InputEvent.ALT_DOWN_MASK) != 0) {
083 mods.insert(factory.makeKeyModifier_M_CTRL());
084 }
085 if ((modifiers & InputEvent.SHIFT_DOWN_MASK) != 0) {
086 mods.insert(factory.makeKeyModifier_M_CTRL());
087 }
088
089 return mods;
090 }
091
092 private VirtualButton button(int modifiers) {
093 if ((modifiers & InputEvent.BUTTON1_DOWN_MASK) != 0) {
094 return factory.makeVirtualButton_BUTTON1();
095 }
096 if ((modifiers & InputEvent.BUTTON2_DOWN_MASK) != 0) {
097 return factory.makeVirtualButton_BUTTON2();
098 }
099 if ((modifiers & InputEvent.BUTTON3_DOWN_MASK) != 0) {
100 return factory.makeVirtualButton_BUTTON3();
101 }
102 return factory.makeVirtualButton_NOBUTTON();
103 }
104 }