viewsManager.getViewPanesContainer().add(this._tBar);\r
\r
this._splitPane = new qx.ui.splitpane.Pane("horizontal");\r
- var leftPane = new org.argeo.ria.components.ViewPane("treeview", "Tree View");\r
+ var leftPane = new org.argeo.ria.components.TabbedViewPane("treeview", "Tree View");\r
this._splitPane.add(leftPane, 1);\r
- var mainPane = new org.argeo.ria.components.ViewPane("fulltree", "Editor View");\r
+ var mainPane = new org.argeo.ria.components.TabbedViewPane("editor", "Editor View", true);\r
this._splitPane.add(mainPane, 2);\r
viewsManager.registerViewPane(this._tBar);\r
viewsManager.registerViewPane(mainPane); \r
var inputView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.ContextNodeInputView, "toolbar", dataModel);\r
inputView.load();\r
\r
+ /*\r
var testView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.PlainXmlViewer, "fulltree", dataModel);\r
testView.load();\r
+ */\r
+ var listView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.ListView, "editor", dataModel);\r
+ listView.load();\r
\r
var treeView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.TreeView, "treeview", dataModel);\r
treeView.load();\r
+ \r
+ dataModel.requireContextChange();\r
},\r
\r
remove : function(viewsManager){\r
check : "Array",\r
event : "changeSelection",\r
init : []\r
+ },\r
+ selectionSource : {\r
+ check : "Object",\r
+ init : null,\r
+ nullable : true\r
}\r
},\r
\r
this.fireDataEvent("changeContextNode", targetNode);\r
};\r
targetNode.addListener("changeLoadState", observer, this);\r
- targetNode.load();\r
+ targetNode.load(1);\r
+ },\r
+ setSelectionWithSource : function(selection, source){\r
+ this.setSelectionSource(source);\r
+ this.setSelection(selection);\r
}\r
}\r
\r
_children : null,\r
_properties : null,\r
\r
- load : function(){\r
- this.getNodeProvider().loadNode(this);\r
+ load : function(depth, filter){\r
+ if(!depth) depth = 1;\r
+ if(!filter) filter = '';\r
+ this.getNodeProvider().loadNode(this, depth, filter);\r
},\r
\r
remove : function(){\r
qx.Interface.define("org.argeo.jcr.ria.provider.INodeProvider", {\r
members : {\r
initProvider : function(properties){},\r
- loadNode : function(path, nodeCallback, childCallback){}\r
+ loadNode : function(path, depth, filter){}\r
}\r
});
\ No newline at end of file
* @param nodeCallback Function\r
* @param childCallback Function\r
*/\r
- loadNode : function(node, nodeCallback, childCallback){\r
+ loadNode : function(node, depth, filter){\r
if(node.getLoadState() == "loaded") return;\r
\r
if(this.getXmlDocLoaded()){\r
}\r
}else{\r
this.addListenerOnce("changeXmlDocLoaded", function(){\r
- this.loadNode(node, nodeCallback, childCallback);\r
+ this.loadNode(node, depth, filter);\r
}, this);\r
node.setLoadState("loading");\r
- this.loadXmlDoc(node);\r
+ this.loadXmlDoc(node, depth, filter);\r
}\r
},\r
\r
- loadXmlDoc : function(node){\r
+ loadXmlDoc : function(node, depth, filter){\r
var properties = this.getSettings();\r
if(!properties.xmlSrc && !properties.xmlString) return;\r
if(properties.xmlSrc){\r
var request = new org.argeo.ria.remote.Request(properties.xmlSrc, 'GET', 'application/xml');\r
if(properties.dynamic && properties.pathParameter){\r
request.setParameter(properties.pathParameter, (node.getPath()|| "/"));\r
- request.setParameter("depth", 1);\r
+ if(depth && depth != -1){\r
+ request.setParameter("depth", depth);\r
+ }\r
}\r
request.addListener("completed", function(response){\r
this._xmlDoc = response.getContent();\r
this.set({\r
layout : new qx.ui.layout.HBox(),\r
dataModel : dataModel,\r
- padding: 10, \r
+ padding: 5, \r
decorator : 'toolbar'\r
}); \r
\r
\r
this.selectionInput = new qx.ui.form.TextField();\r
this.selectionInput.setWidth(300);\r
+ this.selectionInput.setReadOnly(true);\r
this.add(this.selectionInput);\r
\r
this._attachInputsToDM(); \r
--- /dev/null
+qx.Class.define("org.argeo.jcr.ria.views.ListView", {\r
+ extend : qx.ui.container.Composite, \r
+ implement : [org.argeo.ria.components.IView],\r
+ properties : {\r
+ /**\r
+ * The commands definition Map that will be automatically added and wired to the menubar and toolbar.\r
+ * See {@link org.argeo.ria.event.CommandsManager#definitions} for the keys to use for defining commands.\r
+ */\r
+ commands : {\r
+ init : {}\r
+ },\r
+ viewSelection : {\r
+ nullable:false, \r
+ check:"org.argeo.ria.components.ViewSelection"\r
+ },\r
+ instanceId : {\r
+ init:"listView",\r
+ event : "changeInstanceId"\r
+ },\r
+ instanceLabel : {\r
+ init:"List",\r
+ event : "changeInstanceLabel"\r
+ },\r
+ dataModel : {\r
+ \r
+ }\r
+ },\r
+ \r
+ construct : function(){\r
+ this.base(arguments);\r
+ },\r
+ \r
+ members : {\r
+ /**\r
+ * The implementation should contain the GUI initialisation.\r
+ * This is the role of the manager to actually add the graphical component to the pane, \r
+ * so it's not necessary to do it here. \r
+ * @param viewPane {org.argeo.ria.components.ViewPane} The pane manager\r
+ * @param data {Mixed} Any object or data passed by the initiator of the view\r
+ * @return {Boolean}\r
+ */\r
+ init : function(viewPane, dataModel){\r
+ this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId())); \r
+ this.setLayout(new qx.ui.layout.VBox());\r
+ this.setDataModel(dataModel);\r
+ \r
+ var split = new qx.ui.splitpane.Pane("vertical");\r
+ split.setDecorator(null);\r
+ this.add(split, {flex:1});\r
+ \r
+ this.list = new qx.ui.form.List(); \r
+ split.add(this.list,1);\r
+ \r
+ this.propInput = new qx.ui.form.TextArea();\r
+ split.add(this.propInput,1);\r
+ var call = new qx.util.DeferredCall(function(){\r
+ qx.bom.element.Style.set(this.propInput.getContentElement().getDomElement(), "lineHeight", "1.8");\r
+ }, this);\r
+ call.schedule();\r
+ },\r
+ /**\r
+ * The implementation should contain the real data loading (i.o. query...)\r
+ * @return {Boolean}\r
+ */\r
+ load : function(){\r
+ var dataModel = this.getDataModel();\r
+ dataModel.addListener("changeSelection", function(event){\r
+ if(dataModel.getSelectionSource() == this) return;\r
+ var selection = event.getData();\r
+ this.list.removeAll();\r
+ if(!selection.length) {\r
+ return;\r
+ }\r
+ var contextNode = selection[0];\r
+ this._parseNode(contextNode);\r
+ }, this);\r
+ },\r
+ \r
+ _parseNode : function (jcrNode){\r
+ if(jcrNode.getLoadState() == "loaded"){\r
+ this.list.removeAll();\r
+ if(jcrNode.getParent()){\r
+ this.list.add(this._initListItem(jcrNode.getParent(), ".."));\r
+ }\r
+ var children = jcrNode.getChildren();\r
+ for(var i=0;i<children.length;i++){\r
+ this.list.add(this._initListItem(children[i]));\r
+ }\r
+ if(this.list.hasChildren()){\r
+ this.list.setSelection([this.list.getChildren()[0]]);\r
+ }\r
+ var properties = jcrNode.getProperties();\r
+ var propString = "";\r
+ for(var i=0;i<properties.length;i++){\r
+ propString += properties[i].getName()+"="+properties[i].getValue()+"\n";\r
+ }\r
+ this.propInput.setValue(propString);\r
+ }else{\r
+ var listener = function(event){\r
+ if(event.getData() == "loaded"){\r
+ this._parseNode(jcrNode);\r
+ jcrNode.removeListener("changeLoadState", listener, this);\r
+ }\r
+ };\r
+ jcrNode.addListener("changeLoadState", listener, this);\r
+ if(jcrNode.getLoadState() != "loading"){\r
+ jcrNode.load();\r
+ }\r
+ }\r
+ },\r
+ \r
+ _initListItem : function(jcrNode, label){\r
+ var li = new qx.ui.form.ListItem((label?label:jcrNode.getName()));\r
+ li.setModel(jcrNode);\r
+ li.addListener("dblclick", function(){\r
+ this.getDataModel().setSelectionWithSource([jcrNode], this);\r
+ }, this);\r
+ return li;\r
+ },\r
+ \r
+ /**\r
+ * Whether this component is already contained in a scroller (return false) or not (return true).\r
+ * @return {Boolean}\r
+ */\r
+ addScroll : function(){\r
+ return false;\r
+ },\r
+ /**\r
+ * Called at destruction time\r
+ * Perform all the clean operations (stopping polling queries, etc.) \r
+ */\r
+ close : function(){\r
+ \r
+ } \r
+ \r
+ }\r
+});\r
* See {@link org.argeo.ria.event.CommandsManager#definitions} for the keys to use for defining commands.\r
*/\r
commands : {\r
- init : {}\r
+ init : {\r
+ "close" : {\r
+ label : "Close",\r
+ shared : true,\r
+ icon : "org.argeo.slc.ria/window-close.png",\r
+ shortcut : "Control+w",\r
+ enabled : true,\r
+ menu : "Test",\r
+ toolbar : "result",\r
+ callback : function(e){\r
+ this._viewPane.closeCurrent();\r
+ },\r
+ command : null\r
+ } \r
+ }\r
},\r
viewSelection : {\r
nullable:false, \r
instanceLabel : {\r
init:"Xml Editor",\r
event : "changeInstanceLabel"\r
- },\r
- dataModel : {\r
- \r
}\r
},\r
\r
* @param data {Mixed} Any object or data passed by the initiator of the view\r
* @return {Boolean}\r
*/\r
- init : function(viewPane, dataModel){\r
+ init : function(viewPane, jcrNode){\r
+ this._viewPane = viewPane;\r
this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId())); \r
this.setLayout(new qx.ui.layout.VBox());\r
- this.setDataModel(dataModel);\r
- \r
+ \r
+ this.setInstanceId("edit:" + jcrNode.getPath());\r
+ this.setInstanceLabel("Node '" + jcrNode.getName()+"'");\r
+ \r
this.htmlPane = new qx.ui.embed.Html();\r
this.htmlPane.setOverflow("auto", "auto");\r
this.htmlPane.setDecorator("input");\r
* The implementation should contain the real data loading (i.o. query...)\r
* @return {Boolean}\r
*/\r
- load : function(){\r
- var dataModel = this.getDataModel();\r
- dataModel.addListener("changeSelection", function(event){\r
- var selection = event.getData();\r
- if(!selection.length) {\r
- this.htmlPane.setHtml("");\r
- return;\r
+ load : function(jcrNode){\r
+ // Load full XML (deep) \r
+ //jcrNode.load(-1);\r
+ var fakeNode = new org.argeo.jcr.ria.model.Node(jcrNode.getName(), jcrNode.getNodeProvider(), true);\r
+ fakeNode.setPath(jcrNode.getPath());\r
+ fakeNode.addListener("changeLoadState", function(event){\r
+ if(event.getData() == "loaded"){\r
+ var xmlString = fakeNode.toXmlString(true);\r
+ this._loadXmlString(xmlString);\r
+ }\r
+ }, this);\r
+ fakeNode.load(-1);\r
+ },\r
+ \r
+ _loadXmlString : function(xmlString){\r
+ var TAG_START_PATTERN = new RegExp("<([0-9a-zA-Z\.:]+)([^>]*)>", "gi");\r
+ var TAG_END_PATTERN = new RegExp("</([0-9a-zA-Z\.:]+)>", "gi");\r
+ var TAG_CLOSE_PATTERN = new RegExp("(/?>)", "gi");\r
+ var TAG_ATTRIBUTE = new RegExp("\\s([0-9a-zA-Z:_]+)\\=\"([^\"]*)\"", "gi");\r
+ // Not implemented yet\r
+ var TAG_COMMENT = new RegExp("(<!--.*-->)", "gi");\r
+ var TAG_CDATA_START = new RegExp("(\\<!\\[CDATA\\[).*", "gi");\r
+ var TAG_CDATA_END = new RegExp(".*(]]>)", "gi");\r
+ \r
+ xmlString = xmlString.replace(TAG_START_PATTERN, 'xml_div_begin<xml_tagname_begin$1xml_tagname_end$2>');\r
+ xmlString = xmlString.replace(TAG_END_PATTERN, '</xml_tagname_begin$1xml_tagname_end>xml_div_end');\r
+ xmlString = xmlString.replace(TAG_CLOSE_PATTERN, '>');\r
+ \r
+ xmlString = xmlString.replace(TAG_ATTRIBUTE, ' xml_attname_begin$1xml_attname_end="xml_attvalue_begin$2xml_attvalue_end"');\r
+ \r
+ //xmlString = qx.xml.String.escape(xmlString);\r
+ xmlString = xmlString.replace(new RegExp("(xml_div_begin)", "g"), '<div style="padding:1px;line-height:17px;padding-left:15px;">');\r
+ xmlString = xmlString.replace(new RegExp("(xml_div_end)", "g"), '</div>');\r
+ xmlString = xmlString.replace(new RegExp("(xml_tagname_begin)", "g"), '<b style="color:rgb(63,127,127);">');\r
+ xmlString = xmlString.replace(new RegExp("(xml_tagname_end)", "g"), '</b>');\r
+ xmlString = xmlString.replace(new RegExp("(xml_attname_begin)", "g"), '<b>');\r
+ xmlString = xmlString.replace(new RegExp("(xml_attname_end)", "g"), '</b>');\r
+ xmlString = xmlString.replace(new RegExp("(xml_attvalue_begin)", "g"), '<span style="color:rgb(0,0,255)">');\r
+ xmlString = xmlString.replace(new RegExp("(xml_attvalue_end)", "g"), '</span>');\r
+ xmlString = '<div style="margin-left:-10px;">' + xmlString + '</div>';\r
+ this.htmlPane.setHtml(xmlString);\r
+ var call = new qx.util.DeferredCall(function(){\r
+ var htmlDom = this.htmlPane.getContentElement().getDomElement();\r
+ var spans = qx.bom.Selector.query("span", htmlDom);\r
+ for(var i=0;i<spans.length;i++){\r
+ var oThis = this;\r
+ spans[i].onclick = function(){oThis._setAttributesSpanEditable(this)};\r
}\r
- var xmlString = selection[0].toXmlString(true);\r
- var TAG_START_PATTERN = new RegExp("<([0-9a-zA-Z\.:]+)([^>]*)>", "gi");\r
- var TAG_END_PATTERN = new RegExp("</([0-9a-zA-Z\.:]+)>", "gi");\r
- var TAG_CLOSE_PATTERN = new RegExp("(/?>)", "gi");\r
- var TAG_ATTRIBUTE = new RegExp("\\s([0-9a-zA-Z:_]+)\\=\"([^\"]*)\"", "gi");\r
- // Not implemented yet\r
- var TAG_COMMENT = new RegExp("(<!--.*-->)", "gi");\r
- var TAG_CDATA_START = new RegExp("(\\<!\\[CDATA\\[).*", "gi");\r
- var TAG_CDATA_END = new RegExp(".*(]]>)", "gi");\r
- \r
- xmlString = xmlString.replace(TAG_START_PATTERN, 'xml_div_begin<xml_tagname_begin$1xml_tagname_end$2>');\r
- xmlString = xmlString.replace(TAG_END_PATTERN, '</xml_tagname_begin$1xml_tagname_end>xml_div_end');\r
- xmlString = xmlString.replace(TAG_CLOSE_PATTERN, '>');\r
- \r
- xmlString = xmlString.replace(TAG_ATTRIBUTE, ' xml_attname_begin$1xml_attname_end="xml_attvalue_begin$2xml_attvalue_end"');\r
- \r
- //xmlString = qx.xml.String.escape(xmlString);\r
- xmlString = xmlString.replace(new RegExp("(xml_div_begin)", "g"), '<div style="padding:1px;line-height:17px;padding-left:15px;">');\r
- xmlString = xmlString.replace(new RegExp("(xml_div_end)", "g"), '</div>');\r
- xmlString = xmlString.replace(new RegExp("(xml_tagname_begin)", "g"), '<b style="color:rgb(63,127,127);">');\r
- xmlString = xmlString.replace(new RegExp("(xml_tagname_end)", "g"), '</b>');\r
- xmlString = xmlString.replace(new RegExp("(xml_attname_begin)", "g"), '<b>');\r
- xmlString = xmlString.replace(new RegExp("(xml_attname_end)", "g"), '</b>');\r
- xmlString = xmlString.replace(new RegExp("(xml_attvalue_begin)", "g"), '<span style="color:rgb(0,0,255)">');\r
- xmlString = xmlString.replace(new RegExp("(xml_attvalue_end)", "g"), '</span>');\r
- xmlString = '<div style="margin-left:-10px;">' + xmlString + '</div>';\r
- this.htmlPane.setHtml(xmlString);\r
- var call = new qx.util.DeferredCall(function(){\r
- var htmlDom = this.htmlPane.getContentElement().getDomElement();\r
- var spans = qx.bom.Selector.query("span", htmlDom);\r
- for(var i=0;i<spans.length;i++){\r
- var oThis = this;\r
- spans[i].onclick = function(){oThis._setAttributesSpanEditable(this)};\r
- }\r
- }, this);\r
- call.schedule();\r
}, this);\r
- dataModel.requireContextChange(); \r
+ call.schedule(); \r
},\r
\r
_setAttributesSpanEditable : function(span){\r
icon : "org.argeo.slc.ria/media-playback-start.png",\r
shortcut : null,\r
enabled : true,\r
- menu : "Context",\r
- toolbar : "context",\r
+ menu : "Zoom",\r
+ toolbar : "zoom",\r
callback : function(e) {\r
var selection = this.tree.getSelection();\r
if(!selection.length) return;\r
icon : "org.argeo.slc.ria/media-playback-start.png",\r
shortcut : null,\r
enabled : true,\r
- menu : "Context",\r
- toolbar : "context",\r
+ menu : "Zoom",\r
+ toolbar : "zoom",\r
submenu : [],\r
callback : function(e) {\r
},\r
}\r
this.setMenu(pathes);\r
}\r
+ },\r
+ "open" : {\r
+ label : "Open",\r
+ icon : "org.argeo.slc.ria/media-playback-start.png",\r
+ shortcut : null,\r
+ enabled : true,\r
+ menu : "Selection",\r
+ toolbar : "selection",\r
+ callback : function(e) {\r
+ var selection = this.tree.getSelection();\r
+ if(!selection.length) return;\r
+ var jcrNode = selection[0].getJcrNode();\r
+ var viewsManager = org.argeo.ria.components.ViewsManager.getInstance(); \r
+ var testView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.PlainXmlViewer, "editor", jcrNode);\r
+ testView.load(jcrNode);\r
+ \r
+ },\r
+ selectionChange : function(viewId, selection){\r
+ \r
+ }\r
} \r
}\r
},\r
event : "changeInstanceId"\r
},\r
instanceLabel : {\r
- init:"Tree View",\r
+ init:"Full Tree",\r
event : "changeInstanceLabel"\r
},\r
dataModel : {\r
var dataModel = this.getDataModel();\r
dataModel.addListener("changeContextNode", function(event){\r
var contextNode = event.getData();\r
- var loader = function(){};\r
var newRoot = new org.argeo.jcr.ria.views.JcrTreeFolder(contextNode);\r
this.tree.setRoot(newRoot);\r
this.tree.setSelection([newRoot]);\r
selection.push(sel[i].getJcrNode());\r
viewSelection.addNode(sel[i]);\r
}\r
- this.getDataModel().setSelection(selection);\r
+ this.getDataModel().setSelectionWithSource(selection, this);\r
+ }, this);\r
+ dataModel.addListener("changeSelection", function(e){\r
+ if(this.getDataModel().getSelectionSource() == this) return;\r
+ var selection = this.getDataModel().getSelection();\r
+ // Arbitrary : for the moment, external select can only apply\r
+ // to children of the current selection\r
+ var crtSel = this.tree.getSelection();\r
+ if(!crtSel.length || !selection.length) return;\r
+ var crtTreeSel = crtSel[0];\r
+ if(selection[0].getParent() && crtTreeSel.getJcrNode().getPath() == selection[0].getParent().getPath()){\r
+ crtTreeSel.setOpen(true);\r
+ var crtChildren =crtTreeSel.getChildren(); \r
+ for(var i=0;i<crtChildren.length;i++){\r
+ if(crtChildren[i].getJcrNode().getPath() == selection[0].getPath()){\r
+ this.tree.setSelection([crtChildren[i]]);\r
+ return;\r
+ }\r
+ }\r
+ }else if(crtTreeSel.getParent() && crtTreeSel.getJcrNode().getParent().getPath() == selection[0].getPath()){\r
+ this.tree.setSelection([crtTreeSel.getParent()]);\r
+ }\r
+ \r
}, this);\r
this.tree.setContextMenu(org.argeo.ria.event.CommandsManager\r
- .getInstance().createMenuFromIds(["zoom_in", "zoom_out"])); \r
+ .getInstance().createMenuFromIds(["open", "zoom_in", "zoom_out"])); \r
},\r
\r
/**\r