java - Cómo configurar el Caret de la IOConsole
eclipse-plugin eclipse-rcp (1)
Estoy escribiendo un eclipse-plugin que crea una nueva consola. Por favor mira mi código fuente:
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);
}
}
Funciona muy bien. Cuando ingreso a una nueva línea, la Petición es "CLI>", pero la posición Caret no está bien, está en la primera posición de la línea en lugar de la última posición. Quiero hacer que el Caret se mueva a la última posición. ¿Quién sabe, por favor, ayúdame!
Para obtener acceso a la posición de intercalación, deberá implementar un visor de consola.
Esta es la configuración que tengo para mi consola personalizada,
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
}
Hay varias formas de obtener el widget de texto con estilo dependiendo de qué método esté anulando. También creé mi propia clase de historial de consola que hacía un seguimiento de la compensación de intercalación ya que necesitaba una funcionalidad adicional de usar las teclas de flecha hacia arriba y hacia abajo para navegar a través de los comandos ingresados previamente.
La mejor forma de implementar MyConsoleViewer es usar el vasto código fuente de Eclipse que establece un ejemplo perfecto. Prácticamente reutilicé toda esta clase org.eclipse.ui.internal.console.IOConsoleViewer
. Incluso muestra ejemplos de configuración del cursor.
Espero que esto ayude ya que tu pregunta fue hace un tiempo.