2012-05-10 15 views
4

カスタムプログラミング言語のシェルとして動作するコンソールを作成しようとしています。これはpydev対話型コンソールと非常によく似ています。Eclipse RCP:カスタムコンソール

現在のところ、私のRCPは基本的なTextConsoleを使用しており、パイプを介してシェルに接続されているので、シェルが表示する内容が表示され、ユーザーがRCPコンソールに何かを入力すると、

キャレットの位置を移動したり、上下の矢印キーなどのイベントを追加するなど、もう少しやりたいと思っています。これを行うと信じています。コンソールにStyledTextウィジェットを追加する必要がありますコンソールビューア。

TextConsoleのConsoleViewerをオーバーライドする方法があるのですか、TextConsoleを拡張して自分自身を作成する方法があれば、起動設定(リンク先のパイプを介してシェル)?

また、現在のデフォルトコンソールを取得するには、DebugUITools.getConsole(process)を使用してください。

必要な情報をすべて入れていないとすみませます。説明するのは少し難しいです。私はより多くの情報を追加してうれしいです。

アイデア... をcreatePage(ConsoleView)を使用してから作成できます。ページを取得したら、setViewer(viewer)でビューアを設定できます。ここで私は自分自身のビューア(適切なスタイルウィジェットを持つ)を作成すると、それが鉛になる可能性があると考えました。唯一の問題は、視聴者がコンポジットを必要とし、どこから取得するのかわからないことです。

答えて

2

。それはまだ動作するプロトタイプですが、私はあなたが物事を追加し続けると、あなたはコードをますますきれいにすることができると思います。私の現在の目的のために、これはどのように働いたのですか? ProcessConsoleが内部であるので、私はプロセスを接続することができますが、ここでコンソールが、私はこれらのクラスを拡張避けたい:あなたは短いバージョンをしたい場合はそれは私が必要なものであるよう

は、その後、私は基本的にはEclipseので提供ProcessConsoleを模倣しました。

以下は、私のコンソールとのやりとりを達成するために使用したクラスの概要です。私はMyConsoleがどこに作成されたかに関する口実を与えるつもりはありません。基本的にはDebugUITools.getConsole(myProcess)の代わりに私自身のmyProcess.getConsole()メソッドを使用しました。 MyProcessRuntimeProcessです。

class MyConsole extends IOConsole { 
private IOConsoleInputStream fInput; 
private IOConsoleOutputStream fOutput; 
private IStreamsProxy fStreamsProxy; 
private ConsoleHistory history; 
//This is to remember the caret position after the prompt 
private int caretAtPrompt; 
    /* in the console so when you need to replace the command on up and down 
     * arrow keys you have the position. 
     * I just did a caretAtPrompt += String.Length wherever string was 
     * appended to the console. Mainly in the streamlistener and 
     * InputJob unless you specifically output something to the output 
     * stream. 
     */ 
//In the constructor you assign all the above fields. Below are some 
//to point out. 
//fInput = getInputStream(); 
// fStreamsProxy = process.getStreamsProxy(); 
// fOutput = newOutputStream(); 

//We must override the following method to get access to the caret 
@Override 
public IPageBookViewPage createPage(IConsoleView view) { 
    return new MyConsolePage(this, view); 
    } 
//After this I followed the ProcessConsole and added the 
//InputJob and StreamListener 
//defined in there. 
} 

class MyConsolePage extends TextConsolePage { 
//Not much in this class, just override the createViewer 
// to return MyConsoleViewer 
} 

class MyConsoleViewer extends TextConsoleViewer { 
//This is the most important class and most of the work is done here 
//Again I basically copied everything from IOConsoleViewer and then 
//updated whatever I needed 
//I added a VerifyKeyListener for the up and down arrow 
//keys for the console history 

MyConsoleViewer (Composite parent, MyConsole console) { 
    //I have omitted a lot of code as it was too much to put up, 
    //just highlighted a few 
    getTextWidget().addVerifyKeyListener(new MyKeyChecker()); 
    } 

class MyKeyChecker implements VerifyKeyListener {...} 

} 

ThisProcessConsoleためのコードです。 ThisIOConsoleViewerのコードです。

ConsoleHistory私が作成したクラスは、ユーザが入力したすべてのコマンドを保存するために二重にリンクされた文字列リストを持っていました。非常に簡単なクラスを作成する。

Eclipseクラス(ProcessConsoleIOConsoleViewer)を見ると、実際には完全に自明です。私はかなりのビットがあるので、ここに多くのコードを入れていません。しかし、うまくいけば、私が始めたときに私が完全に失われたので、これはある方向を与える。

私は質問にお答えし、誰かが尋ねるともっと具体的なコードを追加して喜んでします。

+0

コンソールウィンドウの特定の行に移動する方法を考えましたか? – Blub

+0

@Blubあなたはカーソルを特定の位置に移動することを意味しますか? – nbz

+0

ええ、必ずしもそうではありません、私はちょうど新しい位置が見えるようにしたい、コンソールが複数のページをスクロールバーで長くしているとします。 – Blub

2

EPDライセンスに対処できるのであれば、PyDevが何をしているのですか?

関連するコードは、次の場所で入手できます。だから私は、私は最終的には、コンソールを達成することができたとして、私はこれを自分自身に答えるだろうと思った

https://github.com/aptana/Pydev/tree/ad4fd3512c899b73264e4ee981be0c4b69ed5b27/plugins/org.python.pydev/src_dltk_console

https://github.com/aptana/Pydev/tree/ad4fd3512c899b73264e4ee981be0c4b69ed5b27/plugins/org.python.pydev.debug/src_console

+0

私は必要なものよりもはるかに詳細なコードを探しています。それらはすべてをオーバーライドしているようで、ゼロからすべてをほぼ完了しました。 – nbz

+2

イェップ、正しく動作させるためには残念ながら、それはEclipseの人が抽象を作成したときに考えたことの一つではありません)。 –