In progress: [Issue 7] ELT does not work with Eclipse 4.2

Removed hard-coded accelerators for "copy" and "paste" actions.
diff --git a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java
index 9d67214..6da42b1 100644
--- a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java
+++ b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java
@@ -12,32 +12,63 @@
 
 import java.util.*;
 
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.swt.SWT;
+import org.eclipse.jface.bindings.TriggerSequence;
+import org.eclipse.jface.bindings.keys.*;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.keys.IBindingService;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
 class EditActionAccelerators {
-  private static final Map<Integer, KeyStroke> ACCELERATORS = new HashMap<Integer, KeyStroke>();
+  private static final String COPY_COMMAND_ID = "com.google.eclipse.terminal.local.copy"; //$NON-NLS-1$
+  private static final String PASTE_COMMAND_ID = "com.google.eclipse.terminal.local.paste"; //$NON-NLS-1$
 
-  static {
-    addActionAccelerator('C');
-    addActionAccelerator('V');
+  private final Map<Integer, String> commandIdsByAccelerator = new HashMap<Integer, String>();
+
+  private void load() {
+    addAccelerator(COPY_COMMAND_ID);
+    addAccelerator(PASTE_COMMAND_ID);
   }
 
-  private static void addActionAccelerator(int naturalKey) {
-    int modifierKeys = (SWT.COMMAND == SWT.MOD1) ? SWT.COMMAND : SWT.CONTROL | SWT.SHIFT;
-    KeyStroke keyStroke = KeyStroke.getInstance(modifierKeys, naturalKey);
-    int accelerator = convertKeyStrokeToAccelerator(keyStroke);
-    ACCELERATORS.put(accelerator, keyStroke);
+  private void addAccelerator(String commandId) {
+    KeySequence keySequence = bindingFor(commandId);
+    if (keySequence == null) {
+      return;
+    }
+    KeyStroke[] keyStrokes = keySequence.getKeyStrokes();
+    if (keyStrokes.length != 0) {
+      int accelerator = convertKeyStrokeToAccelerator(keyStrokes[0]);
+      commandIdsByAccelerator.put(new Integer(accelerator), commandId);
+    }
   }
 
-  static Integer naturalKey(int accelerator) {
-    KeyStroke keyStroke = ACCELERATORS.get(accelerator);
-    if (keyStroke != null) {
-      return keyStroke.getNaturalKey();
+  private static KeySequence bindingFor(String commandId) {
+    IBindingService bindingService = bindingService();
+    TriggerSequence binding = bindingService.getBestActiveBindingFor(commandId);
+    if (binding instanceof KeySequence) {
+      KeySequence keySequence = (KeySequence) binding;
+      return keySequence;
     }
     return null;
   }
+
+  private static IBindingService bindingService() {
+    return (IBindingService) PlatformUI.getWorkbench().getAdapter(IBindingService.class);
+  }
+
+  boolean isCopyAction(int accelerator) {
+    return isMatchingAction(accelerator, COPY_COMMAND_ID);
+  }
+
+  boolean isPasteAction(int accelerator) {
+    return isMatchingAction(accelerator, PASTE_COMMAND_ID);
+  }
+
+  private boolean isMatchingAction(int accelerator, String commandId) {
+    if (commandIdsByAccelerator.isEmpty()) {
+      load();
+    }
+    return commandId.equals(commandIdsByAccelerator.get(new Integer(accelerator)));
+  }
 }
diff --git a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
index 0db064f..ed1039b 100644
--- a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
+++ b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
@@ -111,6 +111,8 @@
 	 */
 	volatile private Job fJob;
 
+	private final EditActionAccelerators editActionAccelerators = new EditActionAccelerators();
+
 	public VT100TerminalControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors) {
 		fConnectors=connectors;
 		fTerminalListener=target;
@@ -162,7 +164,11 @@
 	}
 
 	private void copy(int clipboardType) {
-		Object[] data = new Object[] { getSelection() };
+		String selection = getSelection();
+		if (selection == null || selection.isEmpty()) {
+		  return;
+		}
+    Object[] data = new Object[] { selection };
 		Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
 		fClipboard.setContents(data, types, clipboardType);
 	}
@@ -780,16 +786,13 @@
       }
 
 			int accelerator = convertEventToUnmodifiedAccelerator(event);
-			Integer naturalKey = EditActionAccelerators.naturalKey(accelerator);
-			if (naturalKey != null) {
-			  switch (naturalKey.intValue()) {
-  			  case 'C':
-  			    copy();
-  			    return;
-  			  case 'V':
-  			    paste();
-  			    return;
-			  }
+			if (editActionAccelerators.isCopyAction(accelerator)) {
+			  copy();
+			  return;
+			}
+			if (editActionAccelerators.isPasteAction(accelerator)) {
+			  paste();
+			  return;
 			}
 
 			// We set the event.doit to false to prevent any further processing of this