How to install Caret IOConsole

I am writing an eclipse plugin that creates a new console. Check out my source code:

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

It works great. When I enter a new line, the prompt is "CLI>", but Caret does not fit, it is in the first position of the line instead of the last position. I want Karet to move to the last position. Who knows, please help me. !!!

+2
source share
1 answer

To access the caret position, you will need to implement a console viewer.

This is the setting that I have for my custom console,

 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 } 

There are several ways to get a stylized text widget, depending on which method you override. I also created my own console history class, which tracked carriage offsets, because I need additional functions for using the up and down arrow keys to navigate through previously entered commands.

The best way to implement MyConsoleViewer is to use Eclipse's extensive source code, which sets a great example. I practically used this whole class org.eclipse.ui.internal.console.IOConsoleViewer . It even shows examples of carriage settings.

Hope this still helps as your question has been a long time.

+1
source

Source: https://habr.com/ru/post/1501408/


All Articles