1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-26 10:25:32 +02:00

Terminal: Added support for Copy/Paste shortcuts

Signed-off-by: Max Weninger <max.weninger@windriver.com>
This commit is contained in:
Max Weninger 2013-08-01 16:44:04 +02:00 committed by Uwe Stieber
parent 947e2e2b10
commit 092531d62d
6 changed files with 132 additions and 9 deletions

View file

@ -27,6 +27,7 @@ terminal.context.description=Override ALT+x menu access keys
terminal.insertion.description=Terminal view insertion terminal.insertion.description=Terminal view insertion
terminal.insertion.name=Terminal view insert terminal.insertion.name=Terminal view insert
terminal.insertion.category.name=Terminal view commands terminal.insertion.category.name=Terminal view commands
terminal.view.insertion.description = Terminal view commands
terminal.preferences.name = Terminal terminal.preferences.name = Terminal
terminal.font.description = The font for the terminal console. terminal.font.description = The font for the terminal console.

View file

@ -21,10 +21,16 @@
description="%terminal.context.description" description="%terminal.context.description"
id="org.eclipse.tm.terminal.TerminalContext" id="org.eclipse.tm.terminal.TerminalContext"
/> />
<context
name="%terminal.context.name"
description="%terminal.context.description"
parentId="org.eclipse.ui.contexts.window"
id="org.eclipse.tm.terminal.EditContext" />
</extension>
<extension point="org.eclipse.help.contexts">
<contexts file="HelpContexts.xml"/>
</extension> </extension>
<extension point="org.eclipse.help.contexts">
<contexts file="HelpContexts.xml"/>
</extension>
<extension <extension
point="org.eclipse.ui.commands"> point="org.eclipse.ui.commands">
<!-- Dummy commands for bindings, see below --> <!-- Dummy commands for bindings, see below -->
@ -32,11 +38,24 @@
categoryId="org.eclipse.tm.terminal.category1" categoryId="org.eclipse.tm.terminal.category1"
id="org.eclipse.tm.terminal.command1" id="org.eclipse.tm.terminal.command1"
name="%terminal.insertion.name"/> name="%terminal.insertion.name"/>
<command
categoryId="org.eclipse.tm.terminal.category1"
id="org.eclipse.tm.terminal.copy"
name="Copy"/>
<command
categoryId="org.eclipse.tm.terminal.category1"
id="org.eclipse.tm.terminal.paste"
name="Paste"/>
<category <category
description="%terminal.view.insertion.description" description="%terminal.view.insertion.description"
id="org.eclipse.tm.terminal.category1" id="org.eclipse.tm.terminal.category1"
name="%terminal.insertion.category.name"/> name="%terminal.insertion.category.name"/>
</extension> </extension>
<extension point="org.eclipse.help.contexts">
<contexts file="HelpContexts.xml"/>
</extension>
<extension <extension
point="org.eclipse.ui.bindings"> point="org.eclipse.ui.bindings">
<!-- <!--
@ -106,6 +125,16 @@
contextId="org.eclipse.tm.terminal.TerminalContext" contextId="org.eclipse.tm.terminal.TerminalContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="Alt+W"/> <!-- Window --> sequence="Alt+W"/> <!-- Window -->
<key
commandId="org.eclipse.tm.terminal.copy"
contextId="org.eclipse.tm.terminal.EditContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="CTRL+SHIFT+C"/>
<key
commandId="org.eclipse.tm.terminal.paste"
contextId="org.eclipse.tm.terminal.EditContext"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="CTRL+SHIFT+V"/>
</extension> </extension>
<extension <extension

View file

@ -25,6 +25,7 @@ import org.eclipse.ui.PlatformUI;
public class TerminalActionCopy extends AbstractTerminalAction { public class TerminalActionCopy extends AbstractTerminalAction {
public TerminalActionCopy() { public TerminalActionCopy() {
super(TerminalActionCopy.class.getName()); super(TerminalActionCopy.class.getName());
setActionDefinitionId("org.eclipse.tm.terminal.copy"); //$NON-NLS-1$
ISharedImages si = PlatformUI.getWorkbench().getSharedImages(); ISharedImages si = PlatformUI.getWorkbench().getSharedImages();
setupAction(ActionMessages.COPY, ActionMessages.COPY, si setupAction(ActionMessages.COPY, ActionMessages.COPY, si
.getImageDescriptor(ISharedImages.IMG_TOOL_COPY), si .getImageDescriptor(ISharedImages.IMG_TOOL_COPY), si
@ -34,6 +35,7 @@ public class TerminalActionCopy extends AbstractTerminalAction {
public TerminalActionCopy(ITerminalViewControl target) { public TerminalActionCopy(ITerminalViewControl target) {
super(target, TerminalActionCopy.class.getName()); super(target, TerminalActionCopy.class.getName());
setActionDefinitionId("org.eclipse.tm.terminal.copy"); //$NON-NLS-1$
ISharedImages si = PlatformUI.getWorkbench().getSharedImages(); ISharedImages si = PlatformUI.getWorkbench().getSharedImages();
setupAction(ActionMessages.COPY, ActionMessages.COPY, si setupAction(ActionMessages.COPY, ActionMessages.COPY, si
.getImageDescriptor(ISharedImages.IMG_TOOL_COPY), si .getImageDescriptor(ISharedImages.IMG_TOOL_COPY), si

View file

@ -29,6 +29,7 @@ import org.eclipse.ui.PlatformUI;
public class TerminalActionPaste extends AbstractTerminalAction { public class TerminalActionPaste extends AbstractTerminalAction {
public TerminalActionPaste() { public TerminalActionPaste() {
super(TerminalActionPaste.class.getName()); super(TerminalActionPaste.class.getName());
setActionDefinitionId("org.eclipse.tm.terminal.paste"); //$NON-NLS-1$
ISharedImages si = PlatformUI.getWorkbench().getSharedImages(); ISharedImages si = PlatformUI.getWorkbench().getSharedImages();
setupAction(ActionMessages.PASTE, ActionMessages.PASTE, si setupAction(ActionMessages.PASTE, ActionMessages.PASTE, si
.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE), si .getImageDescriptor(ISharedImages.IMG_TOOL_PASTE), si
@ -38,6 +39,7 @@ public class TerminalActionPaste extends AbstractTerminalAction {
public TerminalActionPaste(ITerminalViewControl target) { public TerminalActionPaste(ITerminalViewControl target) {
super(target, TerminalActionPaste.class.getName()); super(target, TerminalActionPaste.class.getName());
setActionDefinitionId("org.eclipse.tm.terminal.paste"); //$NON-NLS-1$
ISharedImages si = PlatformUI.getWorkbench().getSharedImages(); ISharedImages si = PlatformUI.getWorkbench().getSharedImages();
setupAction(ActionMessages.PASTE, ActionMessages.PASTE, si setupAction(ActionMessages.PASTE, ActionMessages.PASTE, si
.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE), si .getImageDescriptor(ISharedImages.IMG_TOOL_PASTE), si

View file

@ -0,0 +1,72 @@
/*******************************************************************************
* Copyright (c) 2013 Wind River Systems, Inc. and others.
* 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
*******************************************************************************/
package org.eclipse.tm.internal.terminal.emulator;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jface.bindings.TriggerSequence;
import org.eclipse.jface.bindings.keys.KeySequence;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.bindings.keys.SWTKeySupport;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.keys.IBindingService;
class EditActionAccelerators {
private static final String COPY_COMMAND_ID = "org.eclipse.tm.terminal.copy";
private static final String PASTE_COMMAND_ID = "org.eclipse.tm.terminal.paste";
private final Map commandIdsByAccelerator = new HashMap();
private void load() {
addAccelerator(COPY_COMMAND_ID);
addAccelerator(PASTE_COMMAND_ID);
}
private void addAccelerator(String commandId) {
KeySequence keySequence = bindingFor(commandId);
if (keySequence == null) {
return;
}
KeyStroke[] keyStrokes = keySequence.getKeyStrokes();
if (keyStrokes.length != 0) {
int accelerator = SWTKeySupport.convertKeyStrokeToAccelerator(keyStrokes[0]);
commandIdsByAccelerator.put(new Integer(accelerator), commandId);
}
}
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)));
}
}

View file

@ -47,6 +47,7 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.bindings.keys.SWTKeySupport;
import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.util.PropertyChangeEvent;
@ -65,7 +66,6 @@ import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Display;
@ -127,7 +127,7 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
private ITerminalConnector fConnector; private ITerminalConnector fConnector;
private final ITerminalConnector[] fConnectors; private final ITerminalConnector[] fConnectors;
private final boolean fUseCommonPrefs; private final boolean fUseCommonPrefs;
PipedInputStream fInputStream; PipedInputStream fInputStream;
private static final String defaultEncoding = new java.io.InputStreamReader(new java.io.ByteArrayInputStream(new byte[0])).getEncoding(); private static final String defaultEncoding = new java.io.InputStreamReader(new java.io.ByteArrayInputStream(new byte[0])).getEncoding();
private String fEncoding = defaultEncoding; private String fEncoding = defaultEncoding;
@ -139,6 +139,8 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
private final ITerminalTextData fTerminalModel; private final ITerminalTextData fTerminalModel;
private final EditActionAccelerators editActionAccelerators = new EditActionAccelerators();
/** /**
* Listens to changes in the preferences * Listens to changes in the preferences
*/ */
@ -157,7 +159,7 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
} }
} }
}; };
/** /**
* Is protected by synchronize on this * Is protected by synchronize on this
*/ */
@ -166,13 +168,13 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
public VT100TerminalControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors) { public VT100TerminalControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors) {
this(target, wndParent, connectors, false); this(target, wndParent, connectors, false);
} }
/** /**
* Instantiate a Terminal widget. * Instantiate a Terminal widget.
* @param target Callback for notifying the owner of Terminal state changes. * @param target Callback for notifying the owner of Terminal state changes.
* @param wndParent The Window parent to embed the Terminal in. * @param wndParent The Window parent to embed the Terminal in.
* @param connectors Provided connectors. * @param connectors Provided connectors.
* @param useCommonPrefs If <code>true</code>, the Terminal widget will pick up settings * @param useCommonPrefs If <code>true</code>, the Terminal widget will pick up settings
* from the <code>org.eclipse.tm.terminal.TerminalPreferencePage</code> Preference page. * from the <code>org.eclipse.tm.terminal.TerminalPreferencePage</code> Preference page.
* Otherwise, clients need to maintain settings themselves. * Otherwise, clients need to maintain settings themselves.
* @since 3.2 * @since 3.2
@ -620,7 +622,7 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
} }
private void onTerminalFontChanged() { private void onTerminalFontChanged() {
// set the font for all // set the font for all
setFont(ITerminalConstants.FONT_DEFINITION); setFont(ITerminalConstants.FONT_DEFINITION);
} }
@ -790,6 +792,7 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
} }
protected class TerminalFocusListener implements FocusListener { protected class TerminalFocusListener implements FocusListener {
private IContextActivation contextActivation = null; private IContextActivation contextActivation = null;
private IContextActivation contextActivation1 = null;
protected TerminalFocusListener() { protected TerminalFocusListener() {
super(); super();
@ -815,6 +818,9 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
.getWorkbench().getAdapter(IContextService.class); .getWorkbench().getAdapter(IContextService.class);
contextActivation = contextService contextActivation = contextService
.activateContext("org.eclipse.tm.terminal.TerminalContext"); //$NON-NLS-1$ .activateContext("org.eclipse.tm.terminal.TerminalContext"); //$NON-NLS-1$
contextActivation1 = contextService
.activateContext("org.eclipse.tm.terminal.EditContext"); //$NON-NLS-1$
} }
public void focusLost(FocusEvent event) { public void focusLost(FocusEvent event) {
@ -829,6 +835,7 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
IContextService contextService = (IContextService) PlatformUI IContextService contextService = (IContextService) PlatformUI
.getWorkbench().getAdapter(IContextService.class); .getWorkbench().getAdapter(IContextService.class);
contextService.deactivateContext(contextActivation); contextService.deactivateContext(contextActivation);
contextService.deactivateContext(contextActivation1);
} }
} }
@ -837,6 +844,16 @@ public class VT100TerminalControl implements ITerminalControlForText, ITerminalC
if (getState()==TerminalState.CONNECTING) if (getState()==TerminalState.CONNECTING)
return; return;
int accelerator = SWTKeySupport.convertEventToUnmodifiedAccelerator(event);
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 // We set the event.doit to false to prevent any further processing of this
// key event. The only reason this is here is because I was seeing the F10 // key event. The only reason this is here is because I was seeing the F10
// key both send an escape sequence (due to this method) and switch focus // key both send an escape sequence (due to this method) and switch focus