2012-05-07 7 views
2

新しいコンソールを作成するeclipse-pluginを作成しています。IOConsoleのキャレットを設定する方法

CliConsoleFactory.javaそれは素晴らしい作品

import org.eclipse.jface.resource.ImageDescriptor; 
import org.eclipse.ui.console.IOConsole; 

public class MyIOConsole extends IOConsole { 

    public MyIOConsole(String name, ImageDescriptor imageDescriptor) { 
     super(name, imageDescriptor); 
    } 

} 

import java.io.IOException; 

import org.eclipse.jface.text.DocumentEvent; 
import org.eclipse.jface.text.IDocument; 
import org.eclipse.jface.text.IDocumentListener; 
import org.eclipse.ui.IWorkbenchPage; 
import org.eclipse.ui.PartInitException; 
import org.eclipse.ui.PlatformUI; 
import org.eclipse.ui.console.ConsolePlugin; 
import org.eclipse.ui.console.IConsole; 
import org.eclipse.ui.console.IConsoleConstants; 
import org.eclipse.ui.console.IConsoleFactory; 
import org.eclipse.ui.console.IConsoleView; 
import org.eclipse.ui.console.IOConsoleOutputStream; 

public class CliConsoleFactory implements IConsoleFactory { 

    private static final String ENTER_KEY = "\r\n"; 
    private static final String CLI_PROMPT = "CLI> "; 
    private IConsoleView m_consoleView = null; 

    @Override 
    public void openConsole() { 

     IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); 
     try { 
      m_consoleView = (IConsoleView) page.showView(IConsoleConstants.ID_CONSOLE_VIEW); 
     } catch (PartInitException e1) { 
      e1.printStackTrace(); 
     } 
     if (m_consoleView == null) { 
      return; 
     } 


     final MyIOConsole myConsole = new MyIOConsole("CLI", null); 

     final IDocument document = myConsole.getDocument(); 
     document.addDocumentListener(new IDocumentListener() { 

      @Override 
      public void documentChanged(DocumentEvent event) { 
       if (ENTER_KEY.equals(event.getText())) { 
        // Print the Prompt 
        writeToConsole(myConsole, CLI_PROMPT); 
       } 
      } 

      @Override 
      public void documentAboutToBeChanged(DocumentEvent event) { 
      } 
     }); 

     ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { myConsole }); 
     m_consoleView.display(myConsole); 
     writeToConsole(myConsole, CLI_PROMPT); 
    } 

    private void writeToConsole(final MyIOConsole myConsole, String msg) { 
     IOConsoleOutputStream stream = myConsole.newOutputStream(); 
     stream.setActivateOnWrite(true); 
     try { 
      stream.write(msg); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (stream != null) { 
       try { 
        stream.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

MyIOConsole.java:私のソースコードを参照してください。新しい行を入力すると、プロンプトは "CLI>"ですが、キャレットの位置はokieではなく、最後の位置ではなく行の最初の位置にあります。私は、キャレットを最後の位置に移動させたい。誰が私を助けてください知っている!

+1

マイナー詳細: 'writeToConsole'のプロンプトごとに新しい出力ストリームを作成しないでください - ストリームを再利用することができます.... –

+0

ありがとうございました。しかし、これは単なるコード例です。主な質問は、キャレットの位置を設定する方法です。私はストリームを再使用する必要があることを知っている:)しかし、これは単なる例です。ありがとう。 – nnhthuan

+0

申し訳ありませんが、今後さらにお手伝いできません。表面上、コードは上手く見える...だから私はあなたに今すぐに時間がない詳細な情報を与えるための例を構築しなければならないだろう... –

答えて

1

キャレット位置にアクセスするには、コンソールビューアを実装する必要があります。

この

は、あなたがオーバーライドしている方法に応じて、スタイルテキストウィジェットを取得する複数の方法があります

public class MyConsole extends IOConsole 
{ 
    .... 
     @Override 
    public IPageBookViewPage createPage(IConsoleView view) { 
     return new MyConsolePage(this, view); 
    } 
} 

public class MyConsolePage extends TextConsolePage 
{ 
    .... 
     @Override 
    protected TextConsoleViewer createViewer(Composite parent) { 
     return new MyConsoleViewer(parent, (MyConsole) this.getConsole()); 
    } 
} 

public class MyConsoleViewer extends TextConsoleViewer 
{ 
    //This class gives you access to setting the caret position 
    //by getting the styled text widget and then using setCaretOffset 
} 

、私は私のカスタムコンソールを持っている設定です。以前に入力したコマンドをナビゲートするために上下の矢印キーを使用する追加の機能が必要だったので、私は自分のコンソール履歴クラスを作成して、キャレットオフセットを追跡しました。

MyConsoleViewerを実装する最良の方法は、完全な例を設定するEclipseの広大なソースコードを使用することです。私は実際にこのクラスのすべてを再利用しましたorg.eclipse.ui.internal.console.IOConsoleViewer。キャレットを設定する例も表示されます。

これはあなたの質問がしばらく前のことだったのを助けてくれることを願っています。

関連する問題