📄 jmedesktop.java
字号:
public int hashCode() {
return value;
}
int value;
}
private static class Char {
public Char( char value ) {
this.value = value;
}
char value;
}
/**
* From keyCode (Int) to character (Char)
*/
private Map<Int,Char> characters = new HashMap<Int,Char>();
private static void dontDrawBackground( Container container ) {
if ( container != null ) {
container.setBackground( null );
if ( container instanceof JComponent ) {
final JComponent component = ( (JComponent) container );
component.setOpaque( false );
}
dontDrawBackground( container.getParent() );
}
}
private static int powerOf2SizeIfNeeded( int size, boolean generateMipMaps ) {
if ( generateMipMaps || !TextureState.isNonPowerOfTwoTextureSupported() ) {
int powerOf2Size = 1;
while ( powerOf2Size < size ) {
powerOf2Size <<= 1;
}
return powerOf2Size;
}
return size;
}
private Component lastComponent;
private Component grabbedMouse;
private int grabbedMouseButton;
private int downX = 0;
private int downY = 0;
private long lastClickTime = 0;
private int clickCount = 0;
private static final int MAX_CLICKED_OFFSET = 4;
private Vector2f location = new Vector2f();
private void sendAWTWheelEvent( int wheelDelta, int x, int y ) {
Component comp = lastComponent != null ? lastComponent : componentAt( x, y, desktop, false );
if ( comp == null ) {
comp = desktop;
}
final Point pos = convertPoint( desktop, x, y, comp );
final MouseWheelEvent event = new MouseWheelEvent( comp,
MouseEvent.MOUSE_WHEEL,
System.currentTimeMillis(), getCurrentModifiers( -1 ), pos.x, pos.y, 1, false,
MouseWheelEvent.WHEEL_UNIT_SCROLL,
Math.abs( wheelDelta ), wheelDelta > 0 ? -1 : 1 );
dispatchEvent( comp, event );
}
private boolean useConvertPoint = true;
private Point convertPoint( Component parent, int x, int y, Component comp ) {
if ( useConvertPoint ) {
try {
return SwingUtilities.convertPoint( parent, x, y, comp );
} catch ( InternalError e ) {
useConvertPoint = false;
}
}
if ( comp != null ) {
while ( comp != parent ) {
x -= comp.getX();
y -= comp.getY();
if ( comp.getParent() == null ) {
break;
}
comp = comp.getParent();
}
}
return new Point( x, y );
}
private void sendAWTMouseEvent( int x, int y, boolean pressed, int swingButton ) {
Component comp = componentAt( x, y, desktop, false );
final int eventType;
if ( swingButton > MouseEvent.NOBUTTON ) {
eventType = pressed ? MouseEvent.MOUSE_PRESSED : MouseEvent.MOUSE_RELEASED;
}
else {
eventType = getButtonMask( MouseEvent.NOBUTTON ) == 0 ? MouseEvent.MOUSE_MOVED : MouseEvent.MOUSE_DRAGGED;
}
final long time = System.currentTimeMillis();
if ( lastComponent != comp ) {
//enter/leave events
while ( lastComponent != null && ( comp == null || !SwingUtilities.isDescendingFrom( comp, lastComponent ) ) )
{
final Point pos = convertPoint( desktop, x, y, lastComponent );
sendExitedEvent( lastComponent, getCurrentModifiers( swingButton ), pos );
lastComponent = lastComponent.getParent();
}
final Point pos = convertPoint( desktop, x, y, lastComponent );
if ( lastComponent == null ) {
lastComponent = desktop;
}
sendEnteredEvent( comp, lastComponent, getCurrentModifiers( swingButton ), pos );
lastComponent = comp;
downX = Integer.MIN_VALUE;
downY = Integer.MIN_VALUE;
lastClickTime = 0;
}
if ( comp != null ) {
boolean clicked = false;
if ( swingButton > MouseEvent.NOBUTTON ) {
if ( pressed ) {
grabbedMouse = comp;
grabbedMouseButton = swingButton;
downX = x;
downY = y;
setFocusOwner( componentAt( x, y, desktop, true ) );
}
else if ( grabbedMouseButton == swingButton && grabbedMouse != null ) {
comp = grabbedMouse;
grabbedMouse = null;
if ( Math.abs( downX - x ) <= MAX_CLICKED_OFFSET && Math.abs( downY - y ) < MAX_CLICKED_OFFSET ) {
if ( lastClickTime + DOUBLE_CLICK_TIME > time ) {
clickCount++;
}
else {
clickCount = 1;
}
clicked = true;
lastClickTime = time;
}
downX = Integer.MIN_VALUE;
downY = Integer.MIN_VALUE;
}
}
else if ( grabbedMouse != null ) {
comp = grabbedMouse;
}
final Point pos = convertPoint( desktop, x, y, comp );
final MouseEvent event = new MouseEvent( comp,
eventType,
time, getCurrentModifiers( swingButton ), pos.x, pos.y, clickCount,
swingButton == MouseEvent.BUTTON2 && pressed, // todo: should this be platform dependent? (e.g. mac)
swingButton >= 0 ? swingButton : 0 );
dispatchEvent( comp, event );
if ( clicked ) {
// CLICKED seems to need special glass pane handling o_O
comp = componentAt( x, y, desktop, true );
final Point clickedPos = convertPoint( desktop, x, y, comp );
final MouseEvent clickedEvent = new MouseEvent( comp,
MouseEvent.MOUSE_CLICKED,
time, getCurrentModifiers( swingButton ), clickedPos.x, clickedPos.y, clickCount,
false, swingButton );
dispatchEvent( comp, clickedEvent );
}
}
else if ( pressed ) {
// clicked no component at all
setFocusOwner( null );
}
}
private boolean focusCleared = false;
public void setFocusOwner( Component comp ) {
if ( comp == null || comp.isFocusable() ) {
for ( Component p = comp; p != null; p = p.getParent() ) {
if ( p instanceof JInternalFrame ) {
try {
( (JInternalFrame) p ).setSelected( true );
} catch ( PropertyVetoException e ) {
logger.logp(Level.SEVERE, this.getClass().toString(),
"setFocusOwner(Component comp)", "Exception", e);
}
}
}
awtWindow.setFocusableWindowState( true );
Component oldFocusOwner = getFocusOwner();
if ( comp == desktop ) {
comp = null;
}
if ( oldFocusOwner != comp ) {
if ( oldFocusOwner != null ) {
dispatchEvent( oldFocusOwner, new FocusEvent( oldFocusOwner,
FocusEvent.FOCUS_LOST, false, comp ) );
}
KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
if ( comp != null ) {
dispatchEvent( comp, new FocusEvent( comp,
FocusEvent.FOCUS_GAINED, false, oldFocusOwner ) );
}
}
awtWindow.setFocusableWindowState( false );
}
focusCleared = comp == null;
}
private int getCurrentModifiers( int swingBtton ) {
int modifiers = 0;
if ( isKeyDown( KeyInput.KEY_LMENU ) ) {
modifiers |= InputEvent.ALT_DOWN_MASK;
modifiers |= InputEvent.ALT_MASK;
}
if ( isKeyDown( KeyInput.KEY_RMENU ) ) {
modifiers |= InputEvent.ALT_GRAPH_DOWN_MASK;
modifiers |= InputEvent.ALT_GRAPH_MASK;
}
if ( isKeyDown( KeyInput.KEY_LCONTROL ) || isKeyDown( KeyInput.KEY_RCONTROL ) ) {
modifiers |= InputEvent.CTRL_DOWN_MASK;
modifiers |= InputEvent.CTRL_MASK;
}
if ( isKeyDown( KeyInput.KEY_LSHIFT ) || isKeyDown( KeyInput.KEY_RSHIFT ) ) {
modifiers |= InputEvent.SHIFT_DOWN_MASK;
modifiers |= InputEvent.SHIFT_MASK;
}
return modifiers | getButtonMask( swingBtton );
}
private boolean isKeyDown( int key ) {
return KeyInput.get().isKeyDown( key );
}
private int getButtonMask( int swingButton ) {
int buttonMask = 0;
if ( MouseInput.get().isButtonDown( 0 ) || swingButton == MouseEvent.BUTTON1 ) {
buttonMask |= InputEvent.BUTTON1_MASK;
buttonMask |= InputEvent.BUTTON1_DOWN_MASK;
}
if ( MouseInput.get().isButtonDown( 1 ) || swingButton == MouseEvent.BUTTON2 ) {
buttonMask |= InputEvent.BUTTON2_MASK;
buttonMask |= InputEvent.BUTTON2_DOWN_MASK;
}
if ( MouseInput.get().isButtonDown( 2 ) || swingButton == MouseEvent.BUTTON3 ) {
buttonMask |= InputEvent.BUTTON3_MASK;
buttonMask |= InputEvent.BUTTON3_DOWN_MASK;
}
return buttonMask;
}
private int lastXin = -1;
private int lastXout = -1;
private int lastYin = -1;
private int lastYout = -1;
private Ray pickRay = new Ray();
private Vector3f bottomLeft = new Vector3f();
private Vector3f topLeft = new Vector3f();
private Vector3f topRight = new Vector3f();
private Vector3f bottomRight = new Vector3f();
private Vector3f tuv = new Vector3f();
/**
* Convert mouse coordinates from jME screen to JMEDesktop coordinates (Swing).
* @param x jME x coordinate
* @param y jME y coordinate
* @param store resulting JDesktop coordinates
*/
public void convert( int x, int y, Vector2f store ) {
if ( lastXin == x && lastYin == y ) {
store.x = lastXout;
store.y = lastYout;
}
else {
lastXin = x;
lastYin = y;
if ( getRenderQueueMode() == Renderer.QUEUE_ORTHO ) {
//TODO: occlusion by other quads (JMEFrames)
x = (int) ( x - getWorldTranslation().x + desktopWidth / 2 );
y = (int) ( desktopHeight / 2 - ( y - getWorldTranslation().y ) );
}
else {
store.set( x, y );
DisplaySystem.getDisplaySystem().getWorldCoordinates( store, 0, pickRay.origin );
DisplaySystem.getDisplaySystem().getWorldCoordinates( store, 0.3f, pickRay.direction ).subtractLocal( pickRay.origin ).normalizeLocal();
applyWorld( bottomLeft.set( -width * 0.5f, -height * 0.5f, 0 ) );
applyWorld( topLeft.set( -width * 0.5f, height * 0.5f, 0 ) );
applyWorld( topRight.set( width * 0.5f, height * 0.5f, 0 ) );
applyWorld( bottomRight.set( width * 0.5f, -height * 0.5f, 0 ) );
if ( pickRay.intersectWherePlanarQuad( topLeft, topRight, bottomLeft, tuv ) ) {
x = (int) ( ( tuv.y - 0.5f ) * width ) + desktopWidth / 2;
y = (int) ( ( tuv.z - 0.5f ) * height ) + desktopHeight / 2;
}
else {
x = -1;
y = -1;
}
}
lastYout = y;
lastXout = x;
store.set( x, y );
}
}
private void applyWorld( Vector3f point ) {
getWorldRotation().multLocal( point.multLocal( getWorldScale() ) ).addLocal( getWorldTranslation() );
}
/**
* Find a component at specified desktop position.
*
* @param x x coordinate in Swing coordinate space
* @param y y coordinate in Swing coordinate space
* @return the top most component at specified location, null if no child component is found at that location
*/
public Component componentAt( int x, int y ) {
Component component = componentAt( x, y, desktop, true );
if ( component != desktop ) {
return component;
}
return null;
}
private Component componentAt( int x, int y, Component parent, boolean scanRootPanes ) {
if ( scanRootPanes && parent instanceof JRootPane ) {
JRootPane rootPane = (JRootPane) parent;
parent = rootPane.getContentPane();
}
Component child = parent;
if ( !parent.contains( x, y ) ) {
child = null;
}
else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -