2012-05-10 11 views
4

Я пытаюсь создать консоль, которая будет работать как оболочка для пользовательского языка программирования. Это было бы очень похоже на интерактивную консоль pydev.Eclipse RCP: Пользовательская консоль

В настоящее время мой RCP использует базовую TextConsole и подключается к оболочке через каналы, поэтому он отображает только то, что отображается в оболочке, и если пользователь вводит что-либо в консоль RCP, то же самое записывается в оболочку.

Я хочу, чтобы иметь возможность сделать немного больше, такие как перемещение позиции каретки, добавление событий для клавиш со стрелками вверх и вниз и т. Д. Я считаю, что мне нужно добавить виджет StyledText на консоль, который выполняется через ConsoleViewer.

Итак, мой вопрос в том, что я могу либо переопределить ConsoleViewer TextConsole, либо, если бы я расширил TextConsole и создал свой собственный, то как мне связать его с конфигурацией запуска (той, которая соединяет оболочка через трубы)?

Кроме того, чтобы получить текущую консоль по умолчанию, я использую DebugUITools.getConsole(process).

Прошу прощения, если я не поставил всю необходимую информацию; это немного сложно объяснить. Я рад добавить дополнительную информацию.

Идея ... Из того, что я понимаю, что я могу создать TextConsolePage из TextConsole с помощью createPage(ConsoleView). Как только у меня появится страница, я могу установить зрителя через setViewer(viewer). Здесь я подумал, что если я создаю свой собственный просмотрщик (у которого будет соответствующий стиль), то это может быть лидирующим. Единственная проблема заключается в том, что зрителю нужен Composite, и я не могу понять, откуда это получить.

ответ

2

Так я думал, что ответить на этот вопрос сам, как я, наконец, смог выполнить консоль. Это все еще рабочий прототип, но я думаю, как вы продолжаете добавлять вещи, вы можете очищать код все больше и больше. Для моих текущих целей это так, как это сработало.

Если вы хотите короткую версию, то я в основном имитировал ProcessConsole предоставленный Eclipse, как то, что мне нужно: консоль, в которой я могу подключить процесс, но поскольку ProcessConsole является внутренним, я хотел бы избежать расширения этих классов ,

Ниже приводится схема классов, которые я использовал для взаимодействия с моей консолью. Я не собираюсь давать предлог, где было создано MyConsole. В принципе, вместо использования DebugUITools.getConsole(myProcess), я использовал свой собственный метод myProcess.getConsole(). MyProcess extends RuntimeProcess.

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 {...} 

} 

This код для ProcessConsole. This - код для IOConsoleViewer.

Созданный мной класс ConsoleHistory имеет только двойной список строк, чтобы сохранить все команды, введенные пользователем. Достаточно простой класс для создания.

Как только вы посмотрите на классы Eclipse (ProcessConsole и IOConsoleViewer), это на самом деле все вполне объяснительно. Я не добавил сюда много кода, потому что есть совсем немного. Но, надеюсь, это дает некоторое направление, поскольку я был полностью потерян, когда начал.

Я с удовольствием отвечаю на вопросы и добавляю более конкретный код, если кто-либо спрашивает.

+0

Вы выяснили, как перейти к определенной строке в окне консоли? – Blub

+0

@Blub Вы имеете в виду перемещение курсора в определенную позицию? – nbz

+0

Да, не обязательно, я просто хочу, чтобы новая позиция была в поле зрения, предположим, что консоль состоит из нескольких страниц с полосой прокрутки. – Blub

2

Почему вы не просто следите за тем, что делает PyDev (если вы можете справиться с лицензией EPL)?

Соответствующий код можно найти по адресу:

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

Yeap, мне пришлось издеваться над множеством вещей, чтобы он работал правильно (к сожалению, это не одна из тех вещей, о которых думали ребята из Eclipse, когда они создали свои абстракции). –

Смежные вопросы