我有一个源查看器。在这种情况下,当按下Shift + Tab时,我需要在按下Tab键时将多行向右移动并删除Tab键。以下是我的代码。我不确定如何继续前进。你能否建议如何做到这一点。
public class MyViewer extends SourceViewer {
public MyViewer(final Composite parent, final int styles) {
super(parent, null, styles);
final Font font = JFaceResources.getFont(MyConstants.EDITOR_TEXT_FONT);
getTextWidget().setFont(font);
getTextWidget().addTraverseListener(new TraverseListener() {
public void keyTraversed(final TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
if (areMultipleLinesSelected()) {
e.doit = true;
final ITextSelection textSelection = (ITextSelection) FastCodeTemplateViewer.this.getSelection();
//what to do after this, to apply, SHIFT_LEFT or SHIFT_RIGHT, on the selected content
}
});
@Override
public void setDocument(final IDocument document) {
...
}
@Override
public void setHyperlinkPresenter(final IHyperlinkPresenter hyperlinkPresenter) throws IllegalStateException {
...
}
}
答案 0 :(得分:1)
SourceViewer
已经定义了左右移动文本的操作。无需扩展SourceViewer。可以从遍历侦听器调用操作,如下所示:
sourceViewer.getTextWidget().addTraverseListener( new TraverseListener() {
@Override
public void keyTraversed( TraverseEvent event ) {
if( event.detail == SWT.TRAVERSE_TAB_NEXT ) {
if( sourceViewer.canDoOperation( ITextOperationTarget.SHIFT_RIGHT ) ) {
sourceViewer.doOperation( ITextOperationTarget.SHIFT_RIGHT );
}
event.doit = false;
} else if( event.detail == SWT.TRAVERSE_TAB_PREVIOUS ) {
if( sourceViewer.canDoOperation( ITextOperationTarget.SHIFT_LEFT ) ) {
sourceViewer.doOperation( ITextOperationTarget.SHIFT_LEFT );
}
event.doit = false;
}
}
} );
将doit
标志设置为false
可防止发生这种情况,即将焦点转移到上一个/下一个控件。
这会产生副作用,即选择在移动后由制表符替换。为了防止这种情况,如果选择了任何内容,VerifyKeyListener
可以帮助它抑制Tab键。
textViewer.prependVerifyKeyListener( new VerifyKeyListener() {
@Override
public void verifyKey( VerifyEvent verifyEvent ) {
if( verifyEvent.keyCode == SWT.TAB && sourceViewer.getSelectedRange().y > 0 ) {
verifyEvent.doit = false;
}
}
} );
你可能会发现一个更少的“hacky”'解决方案,如果您研究Eclipse文本编辑器的代码,它也提供此功能。特别是ShiftAction
和TextEditor
之间的互动。