<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<style type="text/css">
/*<![CDATA[*/
p {margin:0;padding:0;}
/*]]>*/
</style>
<title></title>
</head>
<body style="font-family:verdana,geneva,sans-serif;font-size:12px;color:#000;">
<p style="padding:0;margin:0"><span style="font-size: 12px;"><span style="font-family: verdana,geneva,sans-serif;">Hello Frank,</span></span></p>
<p style="padding:0;margin:0"><span style="font-size: 12px;"><span style="font-family: verdana,geneva,sans-serif;">thank you for sharing the code.</span></span></p>
<p style="padding:0;margin:0"><span style="font-size: 12px;"><span style="font-family: verdana,geneva,sans-serif;"><br /></span></span></p>
<p style="padding:0;margin:0"><span style="font-size: 12px;"><span style="font-family: verdana,geneva,sans-serif;">The parents reordering was the next step :)</span></span></p>
<p style="padding:0;margin:0"><span style="font-size: 12px;"><span style="font-family: verdana,geneva,sans-serif;"><br /></span></span></p>
<p style="padding:0;margin:0">&nbsp;</p>
<p style="padding:0;margin:0">Francesco</p>
<p style="padding:0;margin:0"><span style="font-size: 12px;"><span style="font-family: verdana,geneva,sans-serif;"><br /></span></span></p>
<p style="padding:0;margin:0"><span style="font-family: verdana, geneva, sans-serif;">-------"Valiquette,Francois [Montreal]" &lt;Francois.Valiquette@ec.gc.ca&gt; wrote--------</span></p>
<p style="padding:0;margin:0"><span style="font-size: 12px;"><span style="font-family: verdana,geneva,sans-serif;">Subject: RE: [Users] TR: Enabling drag n drop in the Ext.tree.TreePanel(enableDD)</span></span></p>
<p style="padding:0;margin:0"><span style="font-size: 12px;"><span style="font-family: verdana,geneva,sans-serif;">Date: 19.02.2013 16:27</span></span></p>
<p style="padding:0;margin:0"><span style="font-size: 12px;"><span style="font-family: verdana,geneva,sans-serif;"><br /></span></span></p>
<blockquote style="border-left: 2px solid #00F; margin: 0 0 0 10px; padding: 0 0 0 5px;">Hello,<br />
<br />
My code does not use the best OO practices, I hade to deal with a pre coded application. So there is a lot of global variables.<br />
<br />
This code will even let you reorder the parents. ;)<br />
<br />
var oldServerIndex, newServerIndex, oldIndex, newIndex, indexVariation;<br />
var recursiveCall = false;<br />
var reader = new GeoExt.data.WMSCapabilitiesReader();<br />
<br />
//Add a WMS server to our LayerTree<br />
function addWMServerToTree(serverUrl) {<br />
var serverNode = new Ext.tree.TreeNode({<br />
id: serverUrl,<br />
text: serverUrl,<br />
leaf: false,<br />
allowDrop: true,<br />
allowDrag: true,<br />
draggable: true<br />
});<br />
<br />
//Keeping the old server node position in case the move is illegal and we want to revert it<br />
serverNode.addListener('beforemove', function (tree, thisNode, oldParent, newParent, index) {<br />
oldServerIndex = oldParent.indexOf(thisNode);<br />
});<br />
<br />
<br />
serverNode.addListener('move', function (tree, thisNode, oldParent, newParent, index) {<br />
//The move is allowed if the node is moved within the same parent<br />
if (oldParent == newParent) {<br />
newServerIndex = thisNode.parentNode.indexOf(thisNode);<br />
reorderMapLayerAfterServerMove(thisNode, oldServerIndex, newServerIndex);<br />
//Otherwise the move is not allowed and we revert the change<br />
} else if (recursiveCall == false) {<br />
//Moving back the old node to the old position will trigger again the move event, thus we do not whant the event to be called more than one time<br />
//to avoid an infinite loop<br />
recursiveCall = true;<br />
<br />
//Now we want to revert the change, thus we want to move back the node to it's old position.<br />
//If we move it right away it won't work, since the node won't be moved in it's new parent until the 'move'<br />
//event is completed. Thus, we trigger an Ext.MessageBox.alert that will not stop the execution flow of This.move.<br />
//When the user will click on 'OK', the move event should be finished.<br />
Ext.MessageBox.alert('Error', 'This move is not allowed', function reverseChange(btn, texte, opt) {<br />
oldParent.insertBefore(thisNode, oldParent.item(oldServerIndex));<br />
recursiveCall = false;<br />
});<br />
}<br />
});<br />
<br />
var serverLayers = new Array();<br />
var store = new GeoExt.data.WMSCapabilitiesStore({<br />
url: OpenLayers.ProxyHost + serverUrl,<br />
reader: reader<br />
});<br />
<br />
store.load({<br />
callback: function () {<br />
store.each(function (record) {<br />
//Does not work, so we set the newParams manually<br />
//record.getLayer().mergeNewParams(map_optionsWMS);<br />
record.getLayer().setVisibility(false);<br />
record.getLayer().buffer = 0;<br />
record.getLayer().opacity = 1;<br />
<br />
//We add new layers at the begining of the array, this will make the layer drawing order on top of the nodes that are<br />
//under this node in the tree<br />
serverLayers.unshift(record.getLayer());<br />
<br />
node = new GeoExt.tree.LayerNode({<br />
layer: record.getLayer(),<br />
nodeType: "gx_layer",<br />
checked: false,<br />
allowDrag: true,<br />
allowDrop: true,<br />
});<br />
node.addListener('checkChange', function (thisNode) {<br />
<br />
if (thisNode.attributes.checked == true) {<br />
geoExtOpacitySlider.layer = this.layer;<br />
geoExtOpacitySlider.setValue(this.layer.opacity * 100);<br />
thisNode.select();<br />
button_modelPlay.enable();<br />
<br />
<br />
} else if (layerTree.getChecked().length == 0) {<br />
button_modelPlay.disable();<br />
}<br />
});<br />
<br />
node.addListener('click', function (thisNode) {<br />
geoExtOpacitySlider.layer = this.layer;<br />
geoExtOpacitySlider.setValue(this.layer.opacity * 100);<br />
console.log("Node.layer.name : " + this.layer.name);<br />
console.log("Node tree index : " + thisNode.parentNode.indexOf(thisNode));<br />
console.log("map.getLayerIndex : " + map.getLayerIndex(this.layer));<br />
});<br />
<br />
//Keeping the old layer node position in case the move is illegal and we want to revert it<br />
node.addListener('beforemove', function (tree, thisNode, oldParent, newParent, index) {<br />
oldIndex = oldParent.indexOf(thisNode);<br />
});<br />
<br />
node.addListener('move', function (tree, thisNode, oldParent, newParent, index) {<br />
//Same logic as with the ServerNode...<br />
if (oldParent == newParent) {<br />
indexVariation = oldIndex - oldParent.indexOf(thisNode);<br />
map.raiseLayer(thisNode.layer, indexVariation);<br />
} else if (recursiveCall == false) {<br />
recursiveCall = true;<br />
Ext.MessageBox.alert('Error', 'This move is not allow', function reverseChange(btn, texte, opt) {<br />
oldParent.insertBefore(thisNode, oldParent.item(oldIndex));<br />
recursiveCall = false;<br />
<br />
});<br />
}<br />
<br />
});<br />
<br />
serverNode.appendChild(node);<br />
});<br />
layerTreeRoot.insertBefore(serverNode, layerTreeRoot.firstChild);<br />
serverStore = new GeoExt.data.LayerStore({<br />
map: map,<br />
layers: serverLayers<br />
});<br />
}<br />
});<br />
};<br />
var nbOfNodesBetweenOldAndNewPosition, lowerNode;<br />
//This function reorder the drawing order after an user chage the order of a WMS server in the three.<br />
//A WMS server node that is above another WMS server should be drawed on top of the other WMS server on the map<br />
function reorderMapLayerAfterServerMove(serverNodeToMove, indexOfNodeServerBeforeMove, indexOfNodeServerAfterMove) {<br />
<br />
indexOfVariation = indexOfNodeServerBeforeMove - indexOfNodeServerAfterMove;<br />
<br />
//The node is moved above<br />
if (indexOfVariation &lt; 0) {<br />
indexOfVariation = indexOfVariation * -1;<br />
//Compute the number of layer node between the old and the new position<br />
nbOfNodesBetweenOldAndNewPosition = 0;<br />
for (i = indexOfNodeServerBeforeMove; i &lt; indexOfNodeServerAfterMove; i++) {<br />
nbOfNodesBetweenOldAndNewPosition += serverNodeToMove.parentNode.item(i).childNodes.length;<br />
}<br />
//Le layer du node qui se trouve juste au dessus de la nouvelle position du node que l'on d&eacute;place<br />
//The layer that is just above the new position of the node we are moving<br />
lowerNode = map.layers.indexOf(serverNodeToMove.parentNode.item(indexOfNodeServerAfterMove - 1).lastChild.layer);<br />
//Moving the layers nodes<br />
for (i = 0; i &lt; nbOfNodesBetweenOldAndNewPosition; i++) {<br />
map.raiseLayer(map.layers[lowerNode], nbOfNodesBetweenOldAndNewPosition + serverNodeToMove.childNodes.length - 1);<br />
}<br />
//The node is moved bellow<br />
} else {<br />
//Compute the number of layer node bewtween the old and the new position<br />
nbOfNodesBetweenOldAndNewPosition = 0;<br />
for (i = indexOfNodeServerAfterMove + 1; i &lt; indexOfNodeServerBeforeMove + 1; i++) {<br />
nbOfNodesBetweenOldAndNewPosition += serverNodeToMove.parentNode.item(i).childNodes.length;<br />
}<br />
lowerNode = map.layers.indexOf(serverNodeToMove.parentNode.item(indexOfNodeServerAfterMove).lastChild.layer);<br />
//Moving the layers nodes<br />
for (i = 0; i &lt; serverNodeToMove.childNodes.length; i++) {<br />
map.raiseLayer(map.layers[lowerNode], nbOfNodesBetweenOldAndNewPosition + serverNodeToMove.childNodes.length - 1);<br />
}<br />
}<br />
};<br />
<br />
Frank<br />
<br />
-----Message d'origine-----<br />
De&nbsp;: Francesco D'Alesio [mailto:francesco.dalesio@r3-gis.com]<br />
Envoy&eacute;&nbsp;: 19 f&eacute;vrier 2013 06:26<br />
&Agrave;&nbsp;: Valiquette,Francois [Montreal]<br />
Cc&nbsp;: Julien-Samuel Lacroix; users@geoext.org<br />
Objet&nbsp;: Re: [Users] TR: Enabling drag n drop in the Ext.tree.TreePanel(enableDD)<br />
<br />
Hello Fran&ccedil;ois,<br />
thank you for sharing this code. It works!<br />
<br />
I need now to allow dragging only when the dragged record and the target<br />
record share the same parent (no dragging outside the layer's group).<br />
It seems that the code you described will solve my problem.<br />
<br />
Could you please paste it? :)<br />
<br />
Thank you<br />
<br />
<br />
Regards,<br />
Francesco<br />
<br />
<br />
Il 18/02/2013 15:32, Valiquette,Francois [Montreal] ha scritto:<br />
&gt; Hello,<br />
&gt;<br />
&gt; As promised I give you the code I made to make drag and drop change the layer order of the nodes that are not using an GeoExt.tree.LayerContainer<br />
&gt;<br />
&gt; var indexVariation;<br />
&gt;<br />
&gt; node.addListener('beforemove', function (tree, thisNode, oldParent, newParent, index) {<br />
&gt; oldIndex = oldParent.indexOf(thisNode);<br />
&gt; });<br />
&gt;<br />
&gt; node.addListener('move', function (tree, thisNode, oldParent, newParent, index) {<br />
&gt; indexVariation = oldIndex - oldParent.indexOf(thisNode);<br />
&gt; map.raiseLayer(thisNode.layer, indexVariation);<br />
&gt; );<br />
&gt;<br />
&gt;<br />
&gt;<br />
&gt; Furthermore, my code let users add multiple WMS servers. Each WMS server make a new child in the root tree node and then, the newly created tree node contains all the layers of the WMS server. Also, users are allowed to drag and drop layers but only within the same parents. Also, parents can be dragged to change the drawing order of the server, but they cannot be dragged inside another node.<br />
&gt;<br />
&gt; If anyone is interested of getting the code, just reply to this email and I'll copy/pate it.<br />
&gt;<br />
&gt;<br />
&gt; Fran&ccedil;ois<br />
&gt;<br />
&gt;<br />
&gt;<br />
&gt; -----Message d'origine-----<br />
&gt; De : Valiquette,Francois [Montreal]<br />
&gt; Envoy&eacute; : 8 f&eacute;vrier 2013 13:56<br />
&gt; &Agrave; : 'Julien-Samuel Lacroix'; users@geoext.org<br />
&gt; Objet : RE: [Users] TR: Enabling drag n drop in the Ext.tree.TreePanel(enableDD)<br />
&gt;<br />
&gt; Hello Julien,<br />
&gt;<br />
&gt; Thank you for your help, you almost remembered everything :)<br />
&gt;<br />
&gt; The function you were talking about is in LayerLoader.js and it is onChildMove<br />
&gt;<br />
&gt; I wrote up my own code since I manually create my own node. It was really simple. Next week, I will post my final function that will enable layers reordering between multiple WMS servers.<br />
&gt;<br />
&gt; Fran&ccedil;ois<br />
&gt;<br />
&gt; -----Message d'origine-----<br />
&gt; De : users-bounces@geoext.org [mailto:users-bounces@geoext.org] De la part de Julien-Samuel Lacroix<br />
&gt; Envoy&eacute; : 5 f&eacute;vrier 2013 14:36<br />
&gt; &Agrave; : users@geoext.org<br />
&gt; Objet : Re: [Users] TR: Enabling drag n drop in the Ext.tree.TreePanel(enableDD)<br />
&gt;<br />
&gt; Hello,<br />
&gt;<br />
&gt; If I remember correctly, the LayerContainer class contains the code to<br />
&gt; support the drag-drop. If you manually create the node, you have to add<br />
&gt; the code by yourself. This is because the LayerContainer (and<br />
&gt; sub-classes) know about other layers, but the node itself doesn't.<br />
&gt;<br />
&gt; If I continue to remember correctly, there's an event thrown on the drop<br />
&gt; (of the drag-drop), simply check your node order there and change your<br />
&gt; map layer order accordingly.<br />
&gt;<br />
&gt; I hope others can correct me if I'm wrong.<br />
&gt;<br />
&gt; Julien<br />
&gt;<br />
&gt; On 13-02-05 02:02 PM, Valiquette,Francois [Montreal] wrote:<br />
&gt;&gt; Hello,<br />
&gt;&gt;<br />
&gt;&gt; I am the original poster. I succeeded easily to change the drawing order<br />
&gt;&gt; of the layer with the drag and drop feature using a<br />
&gt;&gt; GeoExt.tree.LayerContainer. But I still cannot change the drawing order<br />
&gt;&gt; when I am manually creating my nodes (GeoExt.tree.LayerNode). By this, I<br />
&gt;&gt; mean, I can drag and drop but nothing happens.<br />
&gt;&gt;<br />
&gt;&gt; I will try to play a little bit more with my code....<br />
&gt;&gt;<br />
&gt;&gt; Thank you<br />
&gt;&gt;<br />
&gt;&gt; *De :*users-bounces@geoext.org [mailto:users-bounces@geoext.org] *De la<br />
&gt;&gt; part de* Valiquette,Francois [Montreal]<br />
&gt;&gt; *Envoy&eacute; :* 5 f&eacute;vrier 2013 12:31<br />
&gt;&gt; *&Agrave; :* users@geoext.org<br />
&gt;&gt; *Objet :* [Users] Enabling drag n drop in the Ext.tree.TreePanel (enableDD)<br />
&gt;&gt;<br />
&gt;&gt; Hello,<br />
&gt;&gt;<br />
&gt;&gt; As written in<br />
&gt;&gt; http://www.geoext.org/tutorials/layertree-tutorial.html?highlight=drag,<br />
&gt;&gt; if I set /enableDD / to true of my TreePanel, it will enable layers<br />
&gt;&gt; reordering. Does it mean that the user can reorder layers in the<br />
&gt;&gt; TreePanel or does it mean that the user can reorder the display order in<br />
&gt;&gt; the the MapPanel to make a specific layer appear on top of another one?<br />
&gt;&gt;<br />
&gt;&gt; I tried to enableDD but when I drag and drop, the layer drawing order<br />
&gt;&gt; does not change. So I just want to if I missed something J<br />
&gt;&gt;<br />
&gt;&gt; Thank you<br />
&gt;&gt;<br />
&gt;&gt;<br />
&gt;&gt;<br />
&gt;&gt; _______________________________________________<br />
&gt;&gt; Users mailing list<br />
&gt;&gt; Users@geoext.org<br />
&gt;&gt; http://www.geoext.org/cgi-bin/mailman/listinfo/users<br />
&gt;&gt;<br />
<br />
<br />
--<br /></blockquote>
</body>
</html>