/*******************************************************************************
* Copyright (c) 2004, 2010 BREDEX GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.rc.swt.listener;
import java.util.Iterator;
import java.util.SortedSet;
import org.eclipse.jubula.rc.common.AUTServerConfiguration;
import org.eclipse.jubula.rc.swt.utils.SwtKeyCodeConverter;
import org.eclipse.jubula.toolkit.enums.ValueSets.InteractionMode;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
/**
* This class is responsible for accepting a KeyEvent as the (combination of
* the) key(s) for picking a component in the OBJECT_MAPPING mode. <br>
*
* This implementation accepts <Ctrl>+<Alt>+ <a>. (as default, but configurable in preferences)
*
* @author BREDEX GmbH
* @created 19.04.2006
*/
public class KeyAcceptor {
/**
* <code>MAPPING_KEY_COMB</code>
*/
public static final int MAPPING_KEY_COMB = 1;
/**
* <code>CHECKMODE_KEY_COMB</code>
*/
public static final int CHECKMODE_KEY_COMB = 2;
/**
* <code>CHECKCOMP_KEY_COMB</code>
*/
public static final int CHECKCOMP_KEY_COMB = 3;
/**
* The method queried by the <code>MappingListener</code>.
* @param event the occured key event
* @return 1, if the combination Ctrl+Alt+A or Ctrl+Shift+A was pressed<p>
* 2, if Ctrl+Alt+S was pressed <p>
* 0, otherwise
*/
public int accept(Event event) {
int keyMod = event.stateMask;
int eventCode = 0;
switch (event.button) {
case 1:
eventCode = InteractionMode.primary.rcIntValue();
keyMod = keyMod & (~SWT.BUTTON1);
break;
case 2:
eventCode = InteractionMode.tertiary.rcIntValue();
keyMod = keyMod & (~SWT.BUTTON2);
break;
case 3:
eventCode = InteractionMode.secondary.rcIntValue();
keyMod = keyMod & (~SWT.BUTTON3);
break;
default:
eventCode = event.keyCode;
break;
}
if (eventCode == SWT.ALT) {
keyMod = keyMod | 1 << 16;
}
if (eventCode == SWT.SHIFT) {
keyMod = keyMod | 1 << 17;
}
if (eventCode == SWT.CTRL) {
keyMod = keyMod | 1 << 18;
}
// the event gets an "a", but we need an "A" (for the complete alphabet)
if (eventCode >= 97 && eventCode <= 122) {
eventCode = eventCode - 32;
}
if ((eventCode == AUTServerConfiguration.getInstance().getMappingKey()
|| eventCode
== AUTServerConfiguration.getInstance()
.getMappingMouseButton())
&& keyMod == AUTServerConfiguration.getInstance()
.getMappingKeyMod()) {
return MAPPING_KEY_COMB;
}
if (eventCode == AUTServerConfiguration.getInstance().getCheckModeKey()
&& keyMod == AUTServerConfiguration.getInstance()
.getCheckModeKeyMod()) {
return CHECKMODE_KEY_COMB;
}
if (eventCode == AUTServerConfiguration.getInstance().getCheckCompKey()
&& keyMod == AUTServerConfiguration.getInstance()
.getCheckCompKeyMod()) {
return CHECKCOMP_KEY_COMB;
}
return 0;
}
/**
* @param event the occured key event
* @return true if the pressed key combination is a singleLineTrigger, false
* otherwise
*/
public boolean isSingleLineTrigger(Event event) {
boolean isSingleTrigger = false;
int keycode = event.keyCode;
char character = RecordHelperSWT.topKey(event);
int modifier = event.stateMask;
SortedSet singleTrigger = AUTServerConfiguration.getInstance()
.getSingleLineTrigger();
isSingleTrigger = isTrigger(
singleTrigger, keycode, modifier, character);
return isSingleTrigger;
}
/**
* @param event the occured key event
* @return true if the pressed key combination is a multiLineTrigger, false
* otherwise
*/
public boolean isMultiLineTrigger(Event event) {
boolean isMultiTrigger = false;
int keycode = event.keyCode;
char character = RecordHelperSWT.topKey(event);
int modifier = event.stateMask;
SortedSet multiTrigger = AUTServerConfiguration.getInstance()
.getMultiLineTrigger();
isMultiTrigger = isTrigger(multiTrigger, keycode, modifier, character);
return isMultiTrigger;
}
/**
* @param triggerSet set of Triggers
* @param key int
* @param modifier int
* @param character char
* @return true if the pressed key combination is a trigger, false
* otherwise
*/
public boolean isTrigger (SortedSet triggerSet, int key, int modifier,
char character) {
boolean isTrigger = false;
int triggerCode = 0;
char triggerChar = ' ';
int triggerMod = 0;
Iterator it = triggerSet.iterator();
while (it.hasNext()) {
String trigger = it.next().toString().toUpperCase();
if (trigger.indexOf("+") != -1) { //$NON-NLS-1$
String[] keys = trigger.split("\\+"); //$NON-NLS-1$
switch (keys.length) {
case 2:
triggerMod =
SwtKeyCodeConverter.getModifierCode(keys[0]);
triggerCode = SwtKeyCodeConverter.getKeyCode(keys[1]);
triggerChar = keys[1].charAt(0);
break;
case 3:
triggerMod =
SwtKeyCodeConverter.getModifierCode(keys[0])
| SwtKeyCodeConverter.getModifierCode(keys[1]);
triggerCode = SwtKeyCodeConverter.getKeyCode(keys[2]);
triggerChar = keys[2].charAt(0);
break;
case 4:
triggerMod =
SwtKeyCodeConverter.getModifierCode(keys[0])
| SwtKeyCodeConverter.getModifierCode(keys[1])
| SwtKeyCodeConverter.getModifierCode(keys[2]);
triggerCode = SwtKeyCodeConverter.getKeyCode(keys[3]);
triggerChar = keys[3].charAt(0);
break;
default:
}
} else {
triggerMod = 0;
triggerCode = SwtKeyCodeConverter.getKeyCode(trigger);
triggerChar = SwtKeyCodeConverter
.getKeyChar(trigger).charValue();
}
if ((key == triggerCode || character == triggerChar)
&& modifier == triggerMod) {
isTrigger = true;
}
}
return isTrigger;
}
}