Używanie ACE z WT

AKTUALIZACJA 3 Końcowy kod roboczy poniżej. POTRZEBUJESZ ace.js Z FOLDERU src! Nie będzie działać z bibliotek, potrzebujesz wstępnie spakowanej wersji z ich strony.

WText *editor = new WText(root());
editor->setText("function(){\n hello.abc();\n}\n");
editor->setInline(false);

Powyższy kod może ustawić zawartość okna ACE.

MyClass::MyClass(const WEnvironment& env)
: WApplication(env)
{
wApp->require("ace-builds/src/ace.js");
// A WContainerWidget is rendered as a div
WContainerWidget *editor = new WContainerWidget(root());
editor->resize(500, 500);

std::string editor_ref = editor->jsRef(); // is a text string that will be the element when executed in JS

std::string command = 
  editor_ref + ".editor = ace.edit(" + editor_ref + ");" +
  editor_ref + ".editor.setTheme(\"ace/theme/monokai\");" +
  editor_ref + ".editor.getSession().setMode(\"ace/mode/javascript\");";

editor->doJavaScript(command);


JSignal <std::string> *jsignal = new JSignal<std::string>(editor, "textChanged");
jsignal->connect(this, &MyClass::textChanged);

WPushButton *b = new WPushButton("Save", root());

command = "function(object, event) {" +
  jsignal->createCall(editor_ref + ".editor.getValue()") +
  ";}";

b->clicked().connect(command);
}

void MyClass::textChanged(std::string incoming)
{

}

AKTUALIZACJA 2 Oto jak wygląda mój projekt atm, wciąż otrzymuję biały ekran z czerwonym komunikatem „Ładowanie ...” z WT w prawym górnym rogu. Więcej uwag poniżej.

MyClass::MyClass(const WEnvironment& env)
: WApplication(env)
{
wApp->require("lib/ace/ace.js");
// A WContainerWidget is rendered as a div
WContainerWidget *editor = new WContainerWidget(root());
editor->resize(500, 500);

std::string editor_ref = editor->jsRef(); // is a text string that will be the element when executed in JS

std::string command = 
  editor_ref + ".editor = ace.edit(" + editor_ref + ");" +
  editor_ref + ".editor.setTheme(\"ace/theme/monokai\");" +
  editor_ref + ".editor.getSession().setMode(\"ace/mode/javascript\");";

editor->doJavaScript(command);


JSignal <std::string> *jsignal = new JSignal<std::string>(editor, "textChanged");
jsignal->connect(this, &MyClass::textChanged);

WPushButton *b = new WPushButton("Save", root());

command = "function(object, event) {" +
  jsignal->createCall(editor_ref + ".editor.getValue()") +
  ";}";

b->clicked().connect(command);
}

void MyClass::textChanged(std::string incoming)
{

}

Zmienna „polecenie” jest równa następującej, gdy jest używana w edytorze-> doJavaScript (polecenie)

"Wt3_3_0.$('oy4ycjy').editor = ace.edit(Wt3_3_0.$('oy4ycjy'));Wt3_3_0.$('oy4ycjy').editor.setTheme('ace/theme/monokai');Wt3_3_0.$('oy4ycjy').editor.getSession().setMode('ace/mode/javascript');"

Zmienna „polecenie” jest równa następującej wartości, gdy jest używana dla b-> kliknięcie (). connect (polecenie);

"function(object, event) {Wt.emit('oy4ycjy','textChanged',Wt3_3_0.$('oy4ycjy').editor.getValue());;}"

AKTUALIZACJA 1

Dodano sugerowany kod do mojego konstruktora, jednak strona nie zmienia się z białego ekranu. W tym projekcie WT nic nie robię, działa tylko ten kod.

wApp->require("lib/ace/ace.js");
// A WContainerWidget is rendered as a div
WContainerWidget *editor = new WContainerWidget(root());
std::string editor_ref = editor->jsRef(); // is a text string that will be the element when executed in JS
editor->doJavaScript(
  editor_ref + ".editor = ace.edit('" + editor_ref + "');" +
  editor_ref + ".editor.setTheme('ace/theme/monokai');" +
  editor_ref + ".editor.getSession().setMode('ace/mode/javascript');"
  );

Wartość editor_ref to „Wt3_3_0. $ („ Oumvrgm ”)” minus cytaty.

Próbowałem również dodać poniższy kod, a strona nadal jest wygaszona.

JSignal <std::string> *jsignal = new JSignal<std::string>(editor, "textChanged");
jsignal->connect(this, &MyClass::textChanged);

WPushButton *b = new WPushButton("Save", root());
b->clicked().connect("function(object, event) {" +
  jsignal->createCall(editor->jsRef() + ".editor.getValue()") +
  ";}");

Odkryłem również, że komentuję

editor_ref + ".editor = ace.edit('" + editor_ref + "');" +

powoduje wyświetlenie przycisku, ale w prawym górnym rogu ekranu znajduje się czerwony napis „Ładowanie ...”, więc WT czeka na coś.

Mam teraz textChanged jako funkcję „nic nie rób”.

ORYGINALNY POST

Więc moim problemem jest to. Jak mogę dostać ACEhttp://ace.ajax.org/#nav=about w WThttp://www.webtoolkit.eu/wt. Dokładniej, ACE w WT Wt :: WTextArea lub Wt :: WTabWidget, obszar tekstowy byłby preferowany. Próbowałem to zrobić już od kilku dni i nie odniosłem wiele sukcesów.

Nie mogłem bez problemu osadzić ACE na stronie HTML, ponieważ ich strona mówi „po prostu skopiuj i wklej na swoją stronę” i to naprawdę takie proste. Muszę jednak załadować go lokalnie przez WT i do kontenera. Pobrałem ich repozytoria z GIT do mojego komputera i próbowałem użyć

require("lib/ace/ace.js");

i

doJavaScript(...);

z różnymi poleceniami bez powodzenia ... Nie jestem prawie tak silny w Javie i HTML jak C ++, więc zapytam o jak najwięcej szczegółów, jeśli dotyczy to dużo Java / HTML. Z góry dziękuję!

questionAnswers(1)

yourAnswerToTheQuestion