java - 在多行上应用shift_right或shift_left

标签 java eclipse-plugin swt

我有一个源查看器。在此,我需要在按下选项卡时将多行向右移动,并在按下 Shift+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 {
   ...
 }

}

最佳答案

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;
    }
  }
} );

如果您研究也提供此功能的 Eclipse 文本编辑器的代码,您可能会找到一个不那么“hacky”的解决方案。特别是 ShiftActionTextEditor 之间的交互。

关于java - 在多行上应用shift_right或shift_left,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26991928/

相关文章:

Java lambda 与匿名内部类有不同的变量要求

java - Grails 2.3.8可搜索的插件和Maven

eclipse - 找不到 mvn 命令 mac 终端

deployment - IBM 笔记 : Eclipse Plugin deployment to framework directory

java - 哪个库更适合更快的 Java 应用程序 swt 或 swing?

java - 在android中获取服务内的当前位置

java - 如何使用 JFrame/JComponent 通过一次按键移动由多个对象组成的图形

testing - 在哪里放置测试类?

java - SWT - 显示多个表项

java - 如何将 Swing 小部件插入 SWT 我在使用 SWT_AWT.new_Frame 时在线程 "main"java.lang.IllegalArgumentException 中遇到异常