UPDATE 3 下面的最终工作代码。您需要src文件夹中的ace.js!从库中无法使用,您需要从其站点下载预包装的版本。
WText *editor = new WText(root()); editor->setText("function(){\n hello.abc();\n}\n"); editor->setInline(false);
上面的代码可以设置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) { }
更新2 这是我的项目看起来像atm的样子,仍然在右上角显示了白色的屏幕,并带有来自WT的红色“正在加载…”消息。下面有更多注释。
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) { }
当用于编辑器-> doJavaScript(command)时,“ command”变量等于以下变量
"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');"
当它用于b-> clicked()。connect(command);时,“ command”变量等于以下变量:
"function(object, event) {Wt.emit('oy4ycjy','textChanged',Wt3_3_0.$('oy4ycjy').editor.getValue());;}"
更新1
向我的构造函数添加了建议的代码,但是页面不会从纯白色屏幕更改。在这个WT项目中,我什么也没做,只运行了这段代码。
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');" );
editor_ref的值是“ Wt3_3_0。$(’oumvrgm’)”减去引号。
还尝试在下面添加代码,但该页面仍然空白。
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()") + ";}");
我也发现将其注释掉
editor_ref + ".editor = ace.edit('" + editor_ref + "');" +
使按钮显示出来,但是屏幕右上方有一个红色的“正在加载…”注释,因此WT正在等待某些操作。
我现在将textChanged作为不执行任何操作的功能。
原始帖子
所以,我的问题是这个。如何在WT http://www.webtoolkit.eu/wt中获得ACE http://ace.ajax.org/#nav=about。更具体地说,在WT Wt :: WTextArea或Wt :: WTabWidget中的ACE中,首选文本区域。我已经尝试这样做了几天,但并没有取得太大的成功。
我已经能够将ACE嵌入HTML页面中,因为他们的网站说“只需将其复制并粘贴到您的页面中”就可以了,这真的很简单。但是,我需要通过WT将其本地加载到容器中。我将他们的仓库从GIT下载到我的机器上,并尝试使用
require("lib/ace/ace.js");
和
doJavaScript(...);
使用各种命令无法成功…我在Java和HTML方面不如C ++强大,因此如果涉及到很多Java / HTML,我将要求尽可能多的细节。在此先感谢队友!
也许这使您朝着正确的方向前进:
wApp->require("lib/ace/ace.js") // A WContainerWidget is rendered as a div WContainerWidget *editor = new WContainerWidget(parent); // editor->jsRef() is a text string that will be the element when executed in JS editor->doJavaScript( editor->jsRef() + ".editor = ace.edit(" + editor->jsRef() + ");" + editor->jsRef() + ".editor.setTheme('ace/theme/monokai');" + editor->jsRef() + ".editor.getSession().setMode('ace/mode/javascript');" );
那应该装饰编辑器。Wt不会自动将对div的修改发送到服务器,因此您可以通过JSignal手动执行此操作(发出从JS到C ++的信号):
JSignal <std::string> *jsignal = new JSignal<std::string>(editor, "textChanged"); jsignal->connect(this, MyClass::textChanged); WPushButton *b = new WPushButton("Save", parent); b->clicked().connect("function(object, event) {" + jsignal->createCall(editor->jsRef() + ".editor.getValue()") + ";}");
(上面的代码未经测试,因此您可能需要稍作调整)
我已经将CodeMirror集成在早期的JWt(java)项目中,如下所示:
import eu.webtoolkit.jwt.WApplication; import eu.webtoolkit.jwt.WContainerWidget; import eu.webtoolkit.jwt.WTextArea; public class CodeMirrorTextArea extends WContainerWidget { private WTextArea textArea; public CodeMirrorTextArea(WContainerWidget parent) { super(parent); textArea = new WTextArea(this); WApplication app = WApplication.getInstance(); app.require(app.resolveRelativeUrl("codemirror-2.32/lib/codemirror.js")); app.require(app.resolveRelativeUrl("codemirror-2.32/mode/groovy/groovy.js")); //TODO: //We save the editor state to the text area on each key stroke, //it appears to be not a performance issue, //however it might very well become one when editing larger fragments of code. //A better solution would be to save this state to the text area only when //the form is submitted, currently this is not yet possible in Wt???. String js = "var e = " + textArea.getJsRef() + ";" + "var cm = CodeMirror.fromTextArea(e, {" + " onKeyEvent : function (editor, event) {" + " editor.save();" + " }," + " lineNumbers: true" + " });" + "var self = " + getJsRef() + ";" + "self.cm = cm;"; this.doJavaScript(js); } public CodeMirrorTextArea() { this(null); } public void setText(String text) { textArea.setText(text); } public String getText() { return textArea.getText(); } public void setMarker(int line, String htmlMarker) { String js = "var self = " + getJsRef() + ";" + "self.cm.setMarker(" + line + ", " + jsStringLiteral(htmlMarker + "%N%") + ");"; this.doJavaScript(js); } public void clearMarker(int line) { String js = "var self = " + getJsRef() + ";" + "self.cm.clearMarker(" + line + ");"; this.doJavaScript(js); } }