jnmousehandler.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 137 行

JAVA
137
字号
/*
 * $Id: JNMouseHandler.java,v 1.10 2004/02/28 09:20:53 epr Exp $
 */
package org.jnode.wt.server;

import java.awt.Dimension;

import javax.naming.NameNotFoundException;

import org.apache.log4j.Logger;
import org.jnode.driver.ApiNotFoundException;
import org.jnode.driver.Device;
import org.jnode.driver.input.PointerEvent;
import org.jnode.driver.input.PointerListener;
import org.jnode.driver.video.HardwareCursorAPI;
import org.jnode.wt.desktop.JNDesktop;
import org.jnode.wt.desktop.JNDesktopManager;
import org.jnode.wt.events.JNodeMouseEvent;

/**
 * @author Ewout Prangsma (epr@users.sourceforge.net)
 */
public class JNMouseHandler implements PointerListener {

    /** My logger */
    private final Logger log = Logger.getLogger(getClass());

    private int x;

    private int y;

    private final HardwareCursorAPI hwCursor;

    private final Dimension screenSize;

    private boolean[] buttonState = new boolean[ 3];

    private static final int[] BUTTON_MASK = { PointerEvent.BUTTON_LEFT,
            PointerEvent.BUTTON_RIGHT, PointerEvent.BUTTON_MIDDLE};

    private static final int[] BUTTON_NUMBER = { 1, 2, 3};

    private final JNDesktopManager mgr = JNDesktopManager.getDesktopManager();

    private final JNServer server;

    /**
     * Create a new instance
     * 
     * @param fbDevice
     * @param screenSize
     */
    public JNMouseHandler(JNServer server, Device fbDevice, Dimension screenSize)
            throws NameNotFoundException {
        HardwareCursorAPI hwCursor = null;
        this.server = server;
        try {
            hwCursor = (HardwareCursorAPI) fbDevice
                    .getAPI(HardwareCursorAPI.class);
        } catch (ApiNotFoundException ex) {
            log.info("No hardware-cursor found on device " + fbDevice.getId());
        }
        server.getConsole().addPointerListener(this);
        this.hwCursor = hwCursor;
        this.screenSize = screenSize;
        hwCursor.setCursorImage(JNCursors.ARROW);
        hwCursor.setCursorVisible(true);
        hwCursor.setCursorPosition(x, y);
        mgr.setHardwareCursor(true);
    }

    /**
     * Close this handler
     */
    public void close() {
        server.getConsole().removePointerListener(this);
    }

    /**
     * @param event
     * @see org.jnode.driver.input.PointerListener#pointerStateChanged(org.jnode.driver.input.PointerEvent)
     */
    public void pointerStateChanged(PointerEvent event) {
        x = Math.min(screenSize.width - 1, Math.max(0, x + event.getX()));
        y = Math.min(screenSize.height - 1, Math.max(0, y + event.getY()));
        hwCursor.setCursorPosition(x, y);

        final int buttons = event.getButtons();
        boolean eventFired = false;
        for (int i = 0; i < 3; i++) {
            final int mask = BUTTON_MASK[ i];
            final int nr = BUTTON_NUMBER[ i];
            if ((buttons & mask) != 0) {
                if (!buttonState[ i]) {
                    postEvent(JNodeMouseEvent.MOUSE_PRESSED, nr);
                    buttonState[ i] = true;
                    eventFired = true;
                }
            } else if (buttonState[ i]) {
                postEvent(JNodeMouseEvent.MOUSE_RELEASED, nr);
                postEvent(JNodeMouseEvent.MOUSE_CLICKED, nr);
                buttonState[ i] = false;
                eventFired = true;
            } else {
            }
        }
        /* Must have been a drag or move. */
        if (!eventFired) {
            if (buttonState[ 0] == true) {
                postEvent(JNodeMouseEvent.MOUSE_DRAGGED,
                        JNodeMouseEvent.BUTTON1);
            } else if (buttonState[ 1] == true) {
                postEvent(JNodeMouseEvent.MOUSE_DRAGGED,
                        JNodeMouseEvent.BUTTON2);
            } else if (buttonState[ 2] == true) {
                postEvent(JNodeMouseEvent.MOUSE_DRAGGED,
                        JNodeMouseEvent.BUTTON3);
            } else {
                postEvent(JNodeMouseEvent.MOUSE_MOVED, JNodeMouseEvent.NOBUTTON);
            }
        }
    }

    /**
     * Post a mouse event to the current desktop.
     * 
     * @param eventId
     * @param button
     */
    private final void postEvent(int eventId, int button) {
        final JNDesktop desktop = mgr.getCurrentDesktop();
        if (desktop != null) {
            mgr.postEvent(new JNodeMouseEvent(desktop, eventId, x, y, button));
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?