首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多行上应用shift_right或shift_left

在多行上应用shift_right或shift_left
EN

Stack Overflow用户
提问于 2014-11-18 10:24:03
回答 1查看 72关注 0票数 0

我有一个源查看器。在这种情况下,我需要在按下制表符和移除选项卡时,在这些行上,当按下Shift+Tab时,将多行移到右边。下面是我的密码。我不知道如何继续下去。你能建议一下怎么做吗。

代码语言:javascript
复制
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 {
   ...
 }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-18 12:27:19

SourceViewer已经定义了一个向左和向右移动文本的操作。没有必要扩展SourceViewer。可以从遍历侦听器调用这些操作,如下所示:

代码语言:javascript
复制
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可以提供帮助。

代码语言:javascript
复制
textViewer.prependVerifyKeyListener( new VerifyKeyListener() {
  @Override
  public void verifyKey( VerifyEvent verifyEvent ) {
    if( verifyEvent.keyCode == SWT.TAB && sourceViewer.getSelectedRange().y > 0 ) {
      verifyEvent.doit = false;
    }
  }
} );

如果您研究的代码,您可能会发现一个较少的“黑客”解决方案,该编辑器也提供了此功能。尤其是ShiftActionTextEditor之间的相互作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26991928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档