]>
git.argeo.org Git - gpl/argeo-slc.git/blob - server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/XmlNodeEditor.js
1 qx
.Class
.define("org.argeo.jcr.ria.views.XmlNodeEditor", {
2 extend
: qx
.ui
.container
.Composite
,
3 implement
: [org
.argeo
.ria
.components
.IView
],
7 * The commands definition Map that will be automatically added and wired to the menubar and toolbar.
8 * See {@link org.argeo.ria.event.CommandsManager#definitions} for the keys to use for defining commands.
15 check
:"org.argeo.ria.components.ViewSelection"
19 event
: "changeInstanceId"
23 event
: "changeInstanceLabel"
30 construct : function(){
36 * The implementation should contain the GUI initialisation.
37 * This is the role of the manager to actually add the graphical component to the pane,
38 * so it's not necessary to do it here.
39 * @param viewPane {org.argeo.ria.components.ViewPane} The pane manager
40 * @param data {Mixed} Any object or data passed by the initiator of the view
43 init : function(viewPane
, dataModel
){
44 this.setViewSelection(new org
.argeo
.ria
.components
.ViewSelection(viewPane
.getViewId()));
45 this.setLayout(new qx
.ui
.layout
.VBox());
46 this.setDataModel(dataModel
);
48 this.input
= new qx
.ui
.form
.TextField();
51 this._attachInputToDM();
53 this.htmlPane
= new qx
.ui
.embed
.Html();
54 this.htmlPane
.setOverflow("auto", "auto");
55 this.add(this.htmlPane
, {flex
:1});
59 * The implementation should contain the real data loading (i.o. query...)
63 var dataModel
= this.getDataModel();
64 dataModel
.addListener("changeContextNode", function(event
){
65 var xmlString
= event
.getData().toXmlString(true);
66 var TAG_START_PATTERN
= new RegExp("<([0-9a-zA-Z\.]+)([^>]*)>", "gi");
67 var TAG_END_PATTERN
= new RegExp("</([0-9a-zA-Z\.]+)>", "gi");
68 var TAG_CLOSE_PATTERN
= new RegExp("(/?>)", "gi");
69 var TAG_ATTRIBUTE
= new RegExp("\\s([0-9a-zA-Z:]+)\\=\"([^\"]*)\"", "gi");
70 // Not implemented yet
71 var TAG_COMMENT
= new RegExp("(<!--.*-->)", "gi");
72 var TAG_CDATA_START
= new RegExp("(\\<!\\[CDATA\\[).*", "gi");
73 var TAG_CDATA_END
= new RegExp(".*(]]>)", "gi");
75 xmlString
= xmlString
.replace(TAG_START_PATTERN
, 'xml_div_begin<xml_tagname_begin$1xml_tagname_end$2>');
76 xmlString
= xmlString
.replace(TAG_END_PATTERN
, '</xml_tagname_begin$1xml_tagname_end>xml_div_end');
77 xmlString
= xmlString
.replace(TAG_CLOSE_PATTERN
, '>');
79 xmlString
= xmlString
.replace(TAG_ATTRIBUTE
, ' xml_attname_begin$1xml_attname_end="xml_attvalue_begin$2xml_attvalue_end"');
81 //xmlString = qx.xml.String.escape(xmlString);
82 xmlString
= xmlString
.replace(new RegExp("(xml_div_begin)", "g"), '<div style="padding:1px;line-height:17px;padding-left:15px;">');
83 xmlString
= xmlString
.replace(new RegExp("(xml_div_end)", "g"), '</div>');
84 xmlString
= xmlString
.replace(new RegExp("(xml_tagname_begin)", "g"), '<b style="color:rgb(63,127,127);">');
85 xmlString
= xmlString
.replace(new RegExp("(xml_tagname_end)", "g"), '</b>');
86 xmlString
= xmlString
.replace(new RegExp("(xml_attname_begin)", "g"), '<b>');
87 xmlString
= xmlString
.replace(new RegExp("(xml_attname_end)", "g"), '</b>');
88 xmlString
= xmlString
.replace(new RegExp("(xml_attvalue_begin)", "g"), '<span style="color:rgb(0,0,255)">');
89 xmlString
= xmlString
.replace(new RegExp("(xml_attvalue_end)", "g"), '</span>');
90 xmlString
= '<div style="margin-left:-10px;">' + xmlString
+ '</div>';
91 this.htmlPane
.setHtml(xmlString
);
93 var call = new qx.util.DeferredCall(function(){
94 var htmlDom = this.htmlPane.getContentElement().getDomElement();
95 var spans = qx.bom.Selector.query("span", htmlDom);
96 for(var i=0;i<spans.length;i++){
98 spans[i].onclick = function(){oThis._setAttributesSpanEditable(this)};
104 dataModel
.requireContextChange();
107 _setAttributesSpanEditable : function(span
){
108 var width
= qx
.bom
.element
.Dimension
.getWidth(span
);
109 var value
= span
.innerHTML
;
110 qx
.bom
.element
.Style
.set(span
, "display", "none");
111 var input
= qx
.bom
.Element
.create("input", {value
:value
, style
:'width:'+width
+'px;'});
112 qx
.dom
.Element
.insertAfter(input
, span
);
115 _attachInputToDM : function(){
116 var dm
= this.getDataModel();
117 this.input
.addListener("keypress", function(event
){
118 if(event
.getKeyIdentifier() != "Enter") return;
119 var path
= this.input
.getValue();
120 dm
.requireContextChange(path
);
122 dm
.addListener("changeContextNode", function(event
){
123 var ctxtNode
= event
.getData();
124 this.input
.setValue(ctxtNode
.getPath());
130 * Whether this component is already contained in a scroller (return false) or not (return true).
133 addScroll : function(){
137 * Called at destruction time
138 * Perform all the clean operations (stopping polling queries, etc.)