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

com.ardor3d.input.swt.SwtMouseManager Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (c) 2008-2012 Ardor Labs, Inc.
 *
 * This file is part of Ardor3D.
 *
 * Ardor3D is free software: you can redistribute it and/or modify it
 * under the terms of its license which may be found in the accompanying
 * LICENSE file or at .
 */

package com.ardor3d.input.swt;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;

import com.ardor3d.image.util.SWTImageUtil;
import com.ardor3d.input.GrabbedState;
import com.ardor3d.input.MouseCursor;
import com.ardor3d.input.MouseManager;

/**
 * Implementation of the {@link com.ardor3d.input.MouseManager} interface for use with SWT. This implementation supports
 * the optional {@link #setGrabbed(com.ardor3d.input.GrabbedState)} and {@link #setPosition(int, int)} methods. The
 * constructor takes an SWT {@link org.eclipse.swt.widgets.Control} instance, for which the cursor is set. In a
 * multi-canvas application, each canvas can have its own SwtMouseManager instance, or it is possible to use a single
 * one for the SWT container that includes the control.
 */
public class SwtMouseManager implements MouseManager {

    private static Cursor _transparentCursor;

    private final Control _control;

    /** our current grabbed state */
    private GrabbedState _grabbedState;

    /** Our cursor prior to a setGrabbed(GRABBED) operation. Stored to be used when cursor is "ungrabbed" */
    private Cursor _pregrabCursor;

    public SwtMouseManager(final Control control) {
        _control = control;
    }

    public void setCursor(final MouseCursor cursor) {
        if (cursor == MouseCursor.SYSTEM_DEFAULT || cursor == null) {
            _control.setCursor(null);
            return;
        }

        final ImageData imageData = SWTImageUtil.convertToSWT(cursor.getImage()).get(0);

        final Cursor swtCursor = new Cursor(_control.getDisplay(), imageData, cursor.getHotspotX(),
                cursor.getHotspotY());

        _control.setCursor(swtCursor);
    }

    public void setPosition(final int x, final int y) {
        final Point p = new Point(x, _control.getSize().y - y);
        _control.getDisplay().setCursorLocation(_control.toDisplay(p));
    }

    public void setGrabbed(final GrabbedState grabbedState) {
        if (!isSetGrabbedSupported()) {
            throw new UnsupportedOperationException();
        }

        // check if we should be here.
        if (_grabbedState == grabbedState) {
            return;
        }

        // remember our grabbed state mode.
        _grabbedState = grabbedState;

        if (grabbedState == GrabbedState.GRABBED) {
            // remember our old cursor
            _pregrabCursor = _control.getCursor();

            // set our cursor to be invisible
            _control.setCursor(getTransparentCursor());
        } else {
            // restore our old cursor
            _control.setCursor(_pregrabCursor);
        }
    }

    private final Cursor getTransparentCursor() {
        if (_transparentCursor == null) {
            final Display display = _control.getDisplay();
            final Color white = display.getSystemColor(SWT.COLOR_WHITE);
            final Color black = display.getSystemColor(SWT.COLOR_BLACK);
            final PaletteData palette = new PaletteData(new RGB[] { white.getRGB(), black.getRGB() });
            final ImageData sourceData = new ImageData(16, 16, 1, palette);
            sourceData.transparentPixel = 0;
            _transparentCursor = new Cursor(display, sourceData, 0, 0);
        }
        return _transparentCursor;
    }

    public boolean isSetPositionSupported() {
        return true;
    }

    public boolean isSetGrabbedSupported() {
        return true;
    }

    public GrabbedState getGrabbed() {
        return _grabbedState;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy