All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.java.openjdk.cacio.ctc.CTCRobotPeer Maven / Gradle / Ivy

package net.java.openjdk.cacio.ctc;

import java.awt.Rectangle;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.peer.RobotPeer;

import sun.awt.peer.cacio.CacioMouseInfoPeer;
import sun.awt.peer.cacio.managed.EventData;

public class CTCRobotPeer implements RobotPeer {

    /**
     * 
     */
    private static final int BUTTON_MASK_CONVERSION_SHIFT = 6;

    /**
     * 
     */
    private static final int BUTTON_MASKS = InputEvent.BUTTON1_MASK | InputEvent.BUTTON2_MASK | InputEvent.BUTTON3_MASK;

    /**
     * 
     */
    private static final int BUTTON_DOWN_MASKS = InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON2_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK;

    private int currentModifiers = 0;
    
    private int currentX = 0;
    private int currentY = 0;

    private MouseClickSupport mouseClickSupport = new MouseClickSupport();

    private EventData mouseEvent(int id, int currentButton, boolean popup) {
        EventData ev = new EventData();
        ev.setId(id);
        ev.setSource(CTCScreen.getInstance());
        ev.setTime(System.currentTimeMillis());
        ev.setModifiers(currentModifiers);
        ev.setX(currentX);
        ev.setY(currentY);
        ev.setButton(currentButton);
        ev.setPopup(popup);
        ev.setClickCount(mouseClickSupport.getClickCount());
        return ev;
    }

    @Override
    public void mouseMove(int x, int y) {
        currentX = x;
        currentY = y;
        int id = isButtonPressed() ? MouseEvent.MOUSE_MOVED : MouseEvent.MOUSE_DRAGGED;
        EventData ev = mouseEvent(id, MouseEvent.NOBUTTON, false);
        CTCEventSource.getInstance().postEvent(ev);
        CacioMouseInfoPeer.getInstance().setMouseScreenCoordinates(x, y);
    }

    private boolean isButtonPressed() {
        return (currentModifiers & BUTTON_MASKS) == 0;
    }

    @Override
    public void mousePress(int buttons) {
        int buttonMask = buttonDownToButtonMask(buttons);
        int buttonDownMask = buttonToButtonDownMask(buttons);

        if (buttonDownMask != 0 && buttonMask != 0) {
            currentModifiers |= buttonMask;
            EventData ev = mouseEvent(MouseEvent.MOUSE_PRESSED, buttonDownMask, false);
            mouseClickSupport.mouseEvent(ev);
            ev = mouseEvent(MouseEvent.MOUSE_PRESSED, buttonDownMask, false);
            CTCEventSource.getInstance().postEvent(ev);
        }
    }

    @Override
    public void mouseRelease(int buttons) {
        int buttonMask = buttonDownToButtonMask(buttons);
        int buttonDownMask = buttonToButtonDownMask(buttons);

        if (buttonDownMask != 0 && buttonMask != 0) {
            EventData ev = mouseEvent(MouseEvent.MOUSE_RELEASED, buttonDownMask, (buttons & InputEvent.BUTTON3_MASK) != 0);
            CTCEventSource.getInstance().postEvent(ev);
            ev = mouseEvent(MouseEvent.MOUSE_RELEASED, buttonDownMask, false);
            mouseClickSupport.mouseEvent(ev);
            currentModifiers &= ~buttonMask;
        }
    }

    private int buttonToButtonDownMask(int buttons) {
        int buttonDownMask = buttons & BUTTON_DOWN_MASKS;
        buttonDownMask |= (buttons & BUTTON_MASKS) << BUTTON_MASK_CONVERSION_SHIFT;
        return buttonDownMask;
    }

    private int buttonDownToButtonMask(int buttons) {
        int buttonMask = buttons & BUTTON_MASKS;
        buttonMask |= (buttons & BUTTON_DOWN_MASKS) >> BUTTON_MASK_CONVERSION_SHIFT;
        return buttonMask;
    }

    @Override
    public void mouseWheel(int wheelAmt) {
        // TODO Auto-generated method stub

    }

    private void keyEvent(int keycode, int id) {
        EventData ev = new EventData();
        ev.setSource(CTCScreen.getInstance());
        ev.setId(id);
        ev.setTime(System.currentTimeMillis());
        ev.setModifiers(currentModifiers);
        ev.setKeyCode(keycode);
        CTCEventSource.getInstance().postEvent(ev);
    }

    @Override
    public void keyPress(int keycode) {
        if (keycode == KeyEvent.VK_SHIFT) {
          currentModifiers |= KeyEvent.SHIFT_MASK;
        }
        if (keycode == KeyEvent.VK_CONTROL) {
          currentModifiers |= KeyEvent.CTRL_MASK;
        }
        if (keycode == KeyEvent.VK_ALT_GRAPH) {
            currentModifiers |= KeyEvent.ALT_GRAPH_MASK;
        }
        keyEvent(keycode, KeyEvent.KEY_PRESSED);
        
        char keychar = getKeyCharFromCodeAndMods(keycode, currentModifiers);
        if (keychar != KeyEvent.CHAR_UNDEFINED) {
          EventData ev = new EventData();
          ev.setSource(CTCScreen.getInstance());
          ev.setId(KeyEvent.KEY_TYPED);
          ev.setTime(System.currentTimeMillis());
          ev.setModifiers(currentModifiers);
          ev.setKeyChar(keychar);
          CTCEventSource.getInstance().postEvent(ev);
        }
    }

    private char getKeyCharFromCodeAndMods(int keyCode, int modifiers) {
        return KeyStrokeMappingFactory.getInstance().getKeyStrokeMapping().getKeyChar(keyCode, modifiers);
    }

    @Override
    public void keyRelease(int keycode) {
      if (keycode == KeyEvent.VK_SHIFT) {
        currentModifiers &= ~KeyEvent.SHIFT_MASK;
      }
      if (keycode == KeyEvent.VK_CONTROL) {
        currentModifiers &= ~KeyEvent.CTRL_MASK;
      }
      if (keycode == KeyEvent.VK_ALT_GRAPH) {
          currentModifiers &= ~KeyEvent.ALT_GRAPH_MASK;
      }
        keyEvent(keycode, KeyEvent.KEY_RELEASED);
    }
 
    @Override
    public int getRGBPixel(int x, int y) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int[] getRGBPixels(Rectangle bounds) {
        return CTCScreen.getInstance().getRGBPixels(bounds);
    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy