/* * Bibliothek - DockingFrames * Library built on Java/Swing, allows the user to "drag and drop" * panels containing any Swing-Component the developer likes to add. * * Copyright (C) 2007 Benjamin Sigg * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Benjamin Sigg * benjamin_sigg@gmx.ch * CH - Switzerland */ package bibliothek.gui.dock.control; import java.awt.event.InputEvent; /** * A {@link ModifierMask} represents a pattern that tells what modifier keys * are currently pressed. Modifier keys are keys like ctrl, shift or alt.<br> * This class will be used to check the result of {@link InputEvent#getModifiersEx()}.<br> * @author Benjamin Sigg */ public class ModifierMask { /** all the masks for which a {@link ModifierMask} looks out */ public static int KEY_MASK = InputEvent.ALT_DOWN_MASK | InputEvent.ALT_GRAPH_DOWN_MASK | InputEvent.CTRL_DOWN_MASK | InputEvent.META_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK; private int onmask; private int offmask; /** * Creates a new mask which allows only modifiers that match exactly * <code>mask</code>. * @param mask the mask to match */ public ModifierMask( int mask ){ this( mask, ~mask ); } /** * Creates a new mask. * @param on the keys that must be pressed * @param off the keys that must not be pressed */ public ModifierMask( int on, int off ){ this.onmask = on & KEY_MASK; this.offmask = off & KEY_MASK; } /** * Creates a string that represents the on-mask. * @return the string */ public String onMaskToString(){ StringBuilder builder = new StringBuilder(); put( builder, InputEvent.ALT_DOWN_MASK, "alt" ); put( builder, InputEvent.ALT_GRAPH_DOWN_MASK, "alt graph" ); put( builder, InputEvent.CTRL_DOWN_MASK, "ctrl" ); put( builder, InputEvent.META_DOWN_MASK, "meta" ); put( builder, InputEvent.SHIFT_DOWN_MASK, "shift" ); return builder.toString(); } private void put( StringBuilder builder, int mask, String text ){ if( (onmask & mask) == mask ){ if( builder.length() > 0 ) builder.append( " + " ); builder.append( text ); } } /** * Tells whether this {@link ModifierMask} relates to <code>modifiers</code> * or not. The <code>modifiers</code> have the same form as * {@link InputEvent#getModifiersEx()} would have. * @param modifiers the modifiers from an <code>InputEvent</code> * @return <code>true</code> if this mask matches the modifiers */ public boolean matches( int modifiers ){ return (modifiers & (onmask | offmask)) == onmask; } /** * Sets the mask of the modifiers which must be pressed in order to * activate this mask. * @param onmask the modifiers that must be pressed */ public void setOnmask(int onmask) { this.onmask = onmask & KEY_MASK; } /** * Gets the mask of modifiers which must be pressed in order to * activate this. * @return the mask of active modifiers */ public int getOnmask() { return onmask; } /** * Sets the mask of the modifiers which must not be pressed in order to * activate this mask. * @param offmask the modifiers that must not be pressed */ public void setOffmask(int offmask) { this.offmask = offmask & KEY_MASK; } /** * Gets the mask of the modifiers which must not be pressed. * @return the mask of inactive modifiers */ public int getOffmask() { return offmask; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + offmask; result = prime * result + onmask; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final ModifierMask other = (ModifierMask) obj; if (offmask != other.offmask) return false; if (onmask != other.onmask) return false; return true; } }