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:
parent
947e2e2b10
commit
092531d62d
6 changed files with 132 additions and 9 deletions
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue