001 /* 002 * Created on Mar 24, 2008 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 005 * in compliance with the License. You may obtain a copy of the License at 006 * 007 * http://www.apache.org/licenses/LICENSE-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, software distributed under the License 010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 011 * or implied. See the License for the specific language governing permissions and limitations under 012 * the License. 013 * 014 * Copyright @2008-2010 the original author or authors. 015 */ 016 package org.fest.swing.util; 017 018 import static java.awt.event.InputEvent.*; 019 import static java.awt.event.KeyEvent.*; 020 import static java.lang.String.valueOf; 021 import static org.fest.util.Strings.concat; 022 023 import java.util.*; 024 025 /** 026 * Understands utility methods related to input modifiers. This class also maps modifier masks to key codes for the 027 * following modifiers: 028 * <ul> 029 * <li>Alt</li> 030 * <li>AltGraph</li> 031 * <li>Control</li> 032 * <li>Meta</li> 033 * <li>Shift</li> 034 * </ul> 035 * 036 * @author Yvonne Wang 037 * @author Alex Ruiz 038 */ 039 public final class Modifiers { 040 041 private static final Map<Integer, Integer> MODIFIER_TO_KEY = new LinkedHashMap<Integer, Integer>(); 042 private static final Map<Integer, Integer> KEY_TO_MODIFIER = new LinkedHashMap<Integer, Integer>(); 043 044 static { 045 MODIFIER_TO_KEY.put(ALT_GRAPH_MASK, VK_ALT_GRAPH); 046 KEY_TO_MODIFIER.put(VK_ALT_GRAPH, ALT_GRAPH_MASK); 047 MODIFIER_TO_KEY.put(ALT_MASK, VK_ALT); 048 KEY_TO_MODIFIER.put(VK_ALT, ALT_MASK); 049 MODIFIER_TO_KEY.put(SHIFT_MASK, VK_SHIFT); 050 KEY_TO_MODIFIER.put(VK_SHIFT, SHIFT_MASK); 051 MODIFIER_TO_KEY.put(CTRL_MASK, VK_CONTROL); 052 KEY_TO_MODIFIER.put(VK_CONTROL, CTRL_MASK); 053 MODIFIER_TO_KEY.put(META_MASK, VK_META); 054 KEY_TO_MODIFIER.put(VK_META, META_MASK); 055 } 056 057 /** 058 * Returns the key codes for the given modifier mask. 059 * @param modifierMask the given modifier mask. 060 * @return the key codes for the given modifier mask. 061 */ 062 public static int[] keysFor(int modifierMask) { 063 List<Integer> keyList = new ArrayList<Integer>(); 064 for (Integer mask : MODIFIER_TO_KEY.keySet()) 065 if ((modifierMask & mask.intValue()) != 0) keyList.add(MODIFIER_TO_KEY.get(mask)); 066 int keyCount = keyList.size(); 067 int[] keys = new int[keyCount]; 068 for (int i = 0; i < keyCount; i++) keys[i] = keyList.get(i); 069 return keys; 070 } 071 072 /** 073 * Indicates whether the given key code is a modifier. 074 * @param keyCode the given key code. 075 * @return <code>true</code> if the given key code is a modifier, <code>false</code> otherwise. 076 */ 077 public static boolean isModifier(int keyCode) { 078 return KEY_TO_MODIFIER.containsKey(keyCode); 079 } 080 081 /** 082 * Returns the modifier mask for the given key code. 083 * @param keyCode the given key code. 084 * @return the modifier mask for the given key code. 085 * @throws IllegalArgumentException if the given key code is not a modifier. 086 */ 087 public static int maskFor(int keyCode) { 088 Integer key = Integer.valueOf(keyCode); 089 if (!KEY_TO_MODIFIER.containsKey(key)) 090 throw new IllegalArgumentException(concat("Keycode '", valueOf(keyCode), "' is not a modifier")); 091 return KEY_TO_MODIFIER.get(key); 092 } 093 094 /** 095 * Updates the given modifier mask with the given key code, only if the given key code belongs to a modifier key. 096 * @param keyCode the given key code. 097 * @param modifierMask the given modifier mask. 098 * @return the updated modifier mask. 099 */ 100 public static int updateModifierWithKeyCode(int keyCode, int modifierMask) { 101 int updatedModifierMask = modifierMask; 102 for (Map.Entry<Integer, Integer> entry : MODIFIER_TO_KEY.entrySet()) { 103 if (entry.getValue().intValue() != keyCode) continue; 104 updatedModifierMask |= entry.getKey().intValue(); 105 break; 106 } 107 return updatedModifierMask; 108 } 109 110 private Modifiers() {} 111 }