\r
initViewPanes : function(viewsManager){\r
\r
+ this._tBar = new org.argeo.ria.components.ViewPane("toolbar", "");\r
+ this._tBar.header.setVisibility("excluded");\r
+ viewsManager.getViewPanesContainer().add(this._tBar);\r
+ \r
this._splitPane = new qx.ui.splitpane.Pane("horizontal");\r
- var mainPane = new org.argeo.ria.components.ViewPane("fulltree", "Full Tree");\r
- this._splitPane.add(mainPane, 1);\r
+ var leftPane = new org.argeo.ria.components.ViewPane("treeview", "Tree View");\r
+ this._splitPane.add(leftPane, 1);\r
+ var mainPane = new org.argeo.ria.components.ViewPane("fulltree", "Editor View");\r
+ this._splitPane.add(mainPane, 2);\r
+ viewsManager.registerViewPane(this._tBar);\r
viewsManager.registerViewPane(mainPane); \r
- /*\r
- var uploadPane = new org.argeo.ria.components.ViewPane("upload", "Upload a distribution");\r
- this._splitPane.add(uploadPane, 1);\r
- viewsManager.registerViewPane(uploadPane); \r
- */ \r
+ viewsManager.registerViewPane(leftPane); \r
viewsManager.getViewPanesContainer().add(this._splitPane, {flex:1});\r
\r
},\r
dynamic : true,\r
pathParameter:"path"\r
}); \r
- var rootNode = new org.argeo.jcr.ria.model.Node("Root", true);\r
+ var rootNode = new org.argeo.jcr.ria.model.Node("Root", nodeProvider, true);\r
rootNode.setPath('/slc');\r
- rootNode.setNodeProvider(nodeProvider);\r
var dataModel = new org.argeo.jcr.ria.model.DataModel(rootNode);\r
+ \r
+ var inputView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.ContextNodeInputView, "toolbar", dataModel);\r
+ inputView.load();\r
+ \r
var testView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.PlainXmlViewer, "fulltree", dataModel);\r
testView.load();\r
+ \r
+ var treeView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.TreeView, "treeview", dataModel);\r
+ treeView.load();\r
},\r
\r
remove : function(viewsManager){\r
viewsManager.getViewPanesContainer().remove(this._splitPane); \r
+ viewsManager.getViewPanesContainer().remove(this._tBar);\r
}\r
\r
}\r
check : "org.argeo.jcr.ria.model.Node"\r
},\r
selection : {\r
- check : "org.argeo.jcr.ria.model.Node[]",\r
- event : "changeSelection"\r
+ check : "Array",\r
+ event : "changeSelection",\r
+ init : []\r
}\r
},\r
\r
requireContextChange : function(path){\r
var targetNode;\r
var rootNode = this.getRootNode();\r
+ this.setSelection([]);\r
if(!path){\r
targetNode = rootNode;\r
}else{\r
path = path.substring(0, path.length-1);\r
}\r
var base = path.substring(path.lastIndexOf("/")+1);\r
- targetNode = new org.argeo.jcr.ria.model.Node(base);\r
+ targetNode = new org.argeo.jcr.ria.model.Node(base, rootNode.getNodeProvider());\r
rootNode.addChild(targetNode);\r
- targetNode.setNodeProvider(rootNode.getNodeProvider());\r
targetNode.setPath(path); \r
}\r
var observer = function(event){\r
event : "changeLoadState"\r
},\r
nodeProvider : {\r
- check : "org.argeo.jcr.ria.provider.INodeProvider" \r
+ check : "org.argeo.jcr.ria.provider.INodeProvider",\r
+ nullable : true\r
}\r
},\r
\r
- construct : function(nodeName, isRoot){\r
+ construct : function(nodeName, nodeProvider, isRoot){\r
this.base(arguments);\r
this._children = {};\r
this._properties = {}; \r
this.setName(nodeName);\r
+ if(nodeProvider){\r
+ this.setNodeProvider(nodeProvider); \r
+ }\r
if(isRoot){\r
this.setPath("");\r
this.setRoot(this);\r
for(var i=0;i<domElement.childNodes.length;i++){\r
var child = domElement.childNodes[i];\r
if(child.nodeType != 1) continue;\r
- var jcrChild = new org.argeo.jcr.ria.model.Node(child.nodeName);\r
+ var jcrChild = new org.argeo.jcr.ria.model.Node(child.nodeName, this.getNodeProvider());\r
this.addChild(jcrChild);\r
jcrChild.fromDomElement(child);\r
}\r
- this.setLoadState("loaded");\r
+ //this.setLoadState("loaded");\r
},\r
\r
toXmlString : function(recurse, childrenWriter){\r
if(this.getXmlDocLoaded()){\r
// Parse document and load\r
node.setName(this._xmlDoc.documentElement.nodeName);\r
- var properties = this.getSettings(); \r
+ var properties = this.getSettings(); \r
// STUB : prune sub children, load only level 1\r
- /*\r
var children = this._xmlDoc.documentElement.childNodes;\r
for(var i=0;i<children.length;i++){\r
var subchildren = children[i].childNodes;\r
children[i].removeChild(subchildren[j]);\r
}\r
}\r
- */\r
// END STUB\r
node.fromDomElement(this._xmlDoc.documentElement);\r
+ node.setLoadState("loaded");\r
if(properties.dynamic){\r
this.setXmlDocLoaded(false);\r
}\r
--- /dev/null
+qx.Class.define("org.argeo.jcr.ria.views.ContextNodeInputView", {\r
+ extend : qx.ui.container.Composite,\r
+ implement : [org.argeo.ria.components.IView], \r
+\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:"inputViewer",\r
+ event : "changeInstanceId"\r
+ },\r
+ instanceLabel : {\r
+ init:"Xml Editor",\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.set({\r
+ layout : new qx.ui.layout.HBox(),\r
+ dataModel : dataModel,\r
+ padding: 10, \r
+ decorator : 'toolbar'\r
+ }); \r
+ \r
+ this.contextInput = new qx.ui.form.TextField();\r
+ this.contextInput.setWidth(100);\r
+ this.contextInput.setTextAlign("right");\r
+ this.add(this.contextInput);\r
+\r
+ var sep = new qx.ui.basic.Label(":");\r
+ sep.set({paddingTop:3, paddingLeft:2,paddingRight:2});\r
+ this.add(sep);\r
+ \r
+ this.selectionInput = new qx.ui.form.TextField();\r
+ this.selectionInput.setWidth(300);\r
+ this.add(this.selectionInput);\r
+ \r
+ this._attachInputsToDM(); \r
+ },\r
+ /**\r
+ * The implementation should contain the real data loading (i.o. query...)\r
+ * @return {Boolean}\r
+ */\r
+ load : function(){\r
+ },\r
+ \r
+ _attachInputsToDM : function(){\r
+ var dm = this.getDataModel();\r
+ this.contextInput.addListener("keypress", function(event){\r
+ if(event.getKeyIdentifier() != "Enter") return;\r
+ var path = this.contextInput.getValue();\r
+ dm.requireContextChange(path);\r
+ }, this);\r
+ dm.addListener("changeContextNode", function(event){\r
+ var ctxtNode = event.getData();\r
+ this.contextInput.setValue(ctxtNode.getPath());\r
+ }, this);\r
+ dm.addListener("changeSelection", function(event){\r
+ var sel = event.getData();\r
+ if(!sel.length){\r
+ this.selectionInput.setValue("/");\r
+ }else{\r
+ this.selectionInput.setValue(sel[0].getPath().substring(this.contextInput.getValue().length));\r
+ }\r
+ },this);\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
+});
\ No newline at end of file
--- /dev/null
+qx.Class.define("org.argeo.jcr.ria.views.JcrTreeFolder", {\r
+ extend : org.argeo.ria.components.DynamicTreeFolder,\r
+ properties : {\r
+ jcrNode : {\r
+ \r
+ }\r
+ },\r
+ construct : function(jcrNode){\r
+ this.base(arguments, jcrNode.getName(), org.argeo.jcr.ria.views.JcrTreeFolder.loader);\r
+ this.setJcrNode(jcrNode);\r
+ },\r
+ \r
+ statics : {\r
+ loader : function(treeFolder){\r
+ if(treeFolder.getState() == "loaded") return;\r
+ var jcrNode = treeFolder.getJcrNode();\r
+ jcrNode.addListener("changeLoadState", function(event){\r
+ if(event.getData() == "loaded"){\r
+ org.argeo.jcr.ria.views.JcrTreeFolder.jcrNodeToTreeFolder(jcrNode, treeFolder);\r
+ }\r
+ });\r
+ if(jcrNode.getLoadState()=="loaded"){\r
+ org.argeo.jcr.ria.views.JcrTreeFolder.jcrNodeToTreeFolder(jcrNode, treeFolder);\r
+ }else if(jcrNode.getLoadState() == "empty"){\r
+ //treeFolder.removeAll();\r
+ jcrNode.load();\r
+ }\r
+ },\r
+ \r
+ jcrNodeToTreeFolder : function(loadedNode, parentTreeFolder){\r
+ var children = loadedNode.getChildren();\r
+ for(var i=0;i<children.length;i++){\r
+ var newFolder = new org.argeo.jcr.ria.views.JcrTreeFolder(children[i]);\r
+ parentTreeFolder.add(newFolder);\r
+ }\r
+ parentTreeFolder.setState("loaded");\r
+ } \r
+ },\r
+ members : {\r
+ openListener : function(e){\r
+ } \r
+ }\r
+});
\ No newline at end of file
this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId())); \r
this.setLayout(new qx.ui.layout.VBox());\r
this.setDataModel(dataModel);\r
- \r
- this.input = new qx.ui.form.TextField();\r
- this.add(this.input);\r
- \r
- this._attachInputToDM();\r
- \r
+ \r
this.htmlPane = new qx.ui.embed.Html();\r
this.htmlPane.setOverflow("auto", "auto");\r
+ this.htmlPane.setDecorator("input");\r
this.add(this.htmlPane, {flex:1});\r
\r
},\r
*/\r
load : function(){\r
var dataModel = this.getDataModel();\r
- dataModel.addListener("changeContextNode", function(event){\r
- var xmlString = event.getData().toXmlString(true);\r
+ dataModel.addListener("changeSelection", function(event){\r
+ var selection = event.getData();\r
+ if(!selection.length) {\r
+ this.htmlPane.setHtml("");\r
+ return;\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
+ 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 input = qx.bom.Element.create("input", {value:value, style:'width:'+width+'px;'});\r
qx.dom.Element.insertAfter(input, span); \r
},\r
- \r
- _attachInputToDM : function(){\r
- var dm = this.getDataModel();\r
- this.input.addListener("keypress", function(event){\r
- if(event.getKeyIdentifier() != "Enter") return;\r
- var path = this.input.getValue();\r
- dm.requireContextChange(path);\r
- }, this);\r
- dm.addListener("changeContextNode", function(event){\r
- var ctxtNode = event.getData();\r
- this.input.setValue(ctxtNode.getPath());\r
- }, this);\r
- \r
- },\r
- \r
+ \r
/**\r
* Whether this component is already contained in a scroller (return false) or not (return true).\r
* @return {Boolean}\r
--- /dev/null
+qx.Class.define("org.argeo.jcr.ria.views.TreeView", {\r
+ extend : qx.ui.container.Composite,\r
+ implement : [org.argeo.ria.components.IView], \r
+\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
+ "zoom_in" : {\r
+ label : "Zoom To Node",\r
+ icon : "org.argeo.slc.ria/media-playback-start.png",\r
+ shortcut : null,\r
+ enabled : true,\r
+ menu : "Context",\r
+ toolbar : "context",\r
+ callback : function(e) {\r
+ var selection = this.tree.getSelection();\r
+ if(!selection.length) return;\r
+ var path = selection[0].getJcrNode().getPath();\r
+ this.getDataModel().requireContextChange(path);\r
+ },\r
+ selectionChange : function(viewId, selection){\r
+ if(viewId != "treeview") return;\r
+ if(!selection || !selection.length) return;\r
+ var treeNode = selection[0];\r
+ if(treeNode.getParent()!=null){\r
+ this.setEnabled(true);\r
+ }else{\r
+ this.setEnabled(false);\r
+ }\r
+ }\r
+ },\r
+ "zoom_out" : {\r
+ label : "Zoom Out",\r
+ icon : "org.argeo.slc.ria/media-playback-start.png",\r
+ shortcut : null,\r
+ enabled : true,\r
+ menu : "Context",\r
+ toolbar : "context",\r
+ submenu : [],\r
+ callback : function(e) {\r
+ },\r
+ submenuCallback : function(commandId){\r
+ this.getDataModel().requireContextChange(commandId);\r
+ },\r
+ selectionChange : function(viewId, selection){\r
+ if(viewId != "treeview") return;\r
+ if(!selection || !selection.length) return;\r
+ var treeNode = selection[0];\r
+ if(treeNode.getParent()!=null || treeNode.getJcrNode().itemIsRoot()){\r
+ this.setEnabled(false);\r
+ return;\r
+ }\r
+ this.setEnabled(true);\r
+ var nodePath = treeNode.getJcrNode().getPath();\r
+ var parts = nodePath.split("\/");\r
+ var pathes = [];\r
+ parts.pop();\r
+ if(parts.length > 1){\r
+ for(var i=0;i<parts.length;i++){\r
+ var newPath = parts.join("/");\r
+ pathes.push({label:newPath,icon:'', commandId:newPath});\r
+ parts.pop();\r
+ }\r
+ }\r
+ this.setMenu(pathes);\r
+ }\r
+ } \r
+ }\r
+ },\r
+ viewSelection : {\r
+ nullable:false, \r
+ check:"org.argeo.ria.components.ViewSelection"\r
+ },\r
+ instanceId : {\r
+ init:"treeView",\r
+ event : "changeInstanceId"\r
+ },\r
+ instanceLabel : {\r
+ init:"Tree View",\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
+ this.tree = new qx.ui.tree.Tree(); \r
+ this.add(this.tree, {flex:1});\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("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
+ }, this);\r
+ this.tree.addListener("changeSelection", function(e){\r
+ var sel = this.tree.getSelection();\r
+ var selection = [];\r
+ var viewSelection = this.getViewSelection();\r
+ viewSelection.clear(); \r
+ for(var i=0;i<sel.length;i++){\r
+ selection.push(sel[i].getJcrNode());\r
+ viewSelection.addNode(sel[i]);\r
+ }\r
+ this.getDataModel().setSelection(selection);\r
+ }, this);\r
+ this.tree.setContextMenu(org.argeo.ria.event.CommandsManager\r
+ .getInstance().createMenuFromIds(["zoom_in", "zoom_out"])); \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
+});
\ No newline at end of file