2

新しいコンソールを作成するEclipseプラグインを書いています。私のソースコードを見てください:

CliConsoleFactory.java

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

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

}

それはうまくいきます。新しい行に入ると、プロンプトは「CLI>」になりますが、キャレットの位置はOKIEではなく、行の最後の位置ではなく最初の位置にあります。キャレットを最後の位置に移動させたい。誰が私を助けてください.!!!

4

1 に答える 1

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ました。キャレットの設定例も示しています。

あなたの質問は少し前だったので、これがまだ役に立てば幸いです。

于 2013-07-12T11:57:37.230 に答える