[Users] TR: Enabling drag n drop in the Ext.tree.TreePanel(enableDD)
Francesco D'Alesio
francesco.dalesio at r3-gis.com
Wed Feb 20 12:28:45 CET 2013
Hello Frank,
thank you for sharing the code.
The parents reordering was the next step :)
Francesco
-------"Valiquette,Francois [Montreal]" wrote--------
Subject: RE: [Users] TR: Enabling drag n drop in the
Ext.tree.TreePanel(enableDD)
Date: 19.02.2013 16:27
Hello,
>
> 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.
>
> This code will even let you reorder the parents. ;)
>
> var oldServerIndex, newServerIndex, oldIndex, newIndex,
> indexVariation;
> var recursiveCall = false;
> var reader = new GeoExt.data.WMSCapabilitiesReader();
>
> //Add a WMS server to our LayerTree
> function addWMServerToTree(serverUrl) {
> var serverNode = new Ext.tree.TreeNode({
> id: serverUrl,
> text: serverUrl,
> leaf: false,
> allowDrop: true,
> allowDrag: true,
> draggable: true
> });
>
> //Keeping the old server node position in case the move is illegal
> and we want to revert it
> serverNode.addListener('beforemove', function (tree, thisNode,
> oldParent, newParent, index) {
> oldServerIndex = oldParent.indexOf(thisNode);
> });
>
> serverNode.addListener('move', function (tree, thisNode, oldParent,
> newParent, index) {
> //The move is allowed if the node is moved within the same parent
> if (oldParent == newParent) {
> newServerIndex = thisNode.parentNode.indexOf(thisNode);
> reorderMapLayerAfterServerMove(thisNode, oldServerIndex,
> newServerIndex);
> //Otherwise the move is not allowed and we revert the change
> } else if (recursiveCall == false) {
> //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
> //to avoid an infinite loop
> recursiveCall = true;
>
> //Now we want to revert the change, thus we want to move back the
> node to it's old position.
> //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'
> //event is completed. Thus, we trigger an Ext.MessageBox.alert that
> will not stop the execution flow of This.move.
> //When the user will click on 'OK', the move event should be
> finished.
> Ext.MessageBox.alert('Error', 'This move is not allowed', function
> reverseChange(btn, texte, opt) {
> oldParent.insertBefore(thisNode, oldParent.item(oldServerIndex));
> recursiveCall = false;
> });
> }
> });
>
> var serverLayers = new Array();
> var store = new GeoExt.data.WMSCapabilitiesStore({
> url: OpenLayers.ProxyHost + serverUrl,
> reader: reader
> });
>
> store.load({
> callback: function () {
> store.each(function (record) {
> //Does not work, so we set the newParams manually
> //record.getLayer().mergeNewParams(map_optionsWMS);
> record.getLayer().setVisibility(false);
> record.getLayer().buffer = 0;
> record.getLayer().opacity = 1;
>
> //We add new layers at the begining of the array, this will make the
> layer drawing order on top of the nodes that are
> //under this node in the tree
> serverLayers.unshift(record.getLayer());
>
> node = new GeoExt.tree.LayerNode({
> layer: record.getLayer(),
> nodeType: \"gx_layer\",
> checked: false,
> allowDrag: true,
> allowDrop: true,
> });
> node.addListener('checkChange', function (thisNode) {
>
> if (thisNode.attributes.checked == true) {
> geoExtOpacitySlider.layer = this.layer;
> geoExtOpacitySlider.setValue(this.layer.opacity * 100);
> thisNode.select();
> button_modelPlay.enable();
>
> } else if (layerTree.getChecked().length == 0) {
> button_modelPlay.disable();
> }
> });
>
> node.addListener('click', function (thisNode) {
> geoExtOpacitySlider.layer = this.layer;
> geoExtOpacitySlider.setValue(this.layer.opacity * 100);
> console.log(\"Node.layer.name : \" + this.layer.name);
> console.log(\"Node tree index : \" +
> thisNode.parentNode.indexOf(thisNode));
> console.log(\"map.getLayerIndex : \" + map.getLayerIndex(this.layer));
> });
>
> //Keeping the old layer node position in case the move is illegal and
> we want to revert it
> node.addListener('beforemove', function (tree, thisNode, oldParent,
> newParent, index) {
> oldIndex = oldParent.indexOf(thisNode);
> });
>
> node.addListener('move', function (tree, thisNode, oldParent,
> newParent, index) {
> //Same logic as with the ServerNode...
> if (oldParent == newParent) {
> indexVariation = oldIndex - oldParent.indexOf(thisNode);
> map.raiseLayer(thisNode.layer, indexVariation);
> } else if (recursiveCall == false) {
> recursiveCall = true;
> Ext.MessageBox.alert('Error', 'This move is not allow', function
> reverseChange(btn, texte, opt) {
> oldParent.insertBefore(thisNode, oldParent.item(oldIndex));
> recursiveCall = false;
>
> });
> }
>
> });
>
> serverNode.appendChild(node);
> });
> layerTreeRoot.insertBefore(serverNode, layerTreeRoot.firstChild);
> serverStore = new GeoExt.data.LayerStore({
> map: map,
> layers: serverLayers
> });
> }
> });
> };
> var nbOfNodesBetweenOldAndNewPosition, lowerNode;
> //This function reorder the drawing order after an user chage the
> order of a WMS server in the three.
> //A WMS server node that is above another WMS server should be drawed
> on top of the other WMS server on the map
> function reorderMapLayerAfterServerMove(serverNodeToMove,
> indexOfNodeServerBeforeMove, indexOfNodeServerAfterMove) {
>
> indexOfVariation = indexOfNodeServerBeforeMove -
> indexOfNodeServerAfterMove;
>
> //The node is moved above
> if (indexOfVariation < 0) {
> indexOfVariation = indexOfVariation * -1;
> //Compute the number of layer node between the old and the new
> position
> nbOfNodesBetweenOldAndNewPosition = 0;
> for (i = indexOfNodeServerBeforeMove; i < indexOfNodeServerAfterMove;
> i++) {
> nbOfNodesBetweenOldAndNewPosition +=
> serverNodeToMove.parentNode.item(i).childNodes.length;
> }
> //Le layer du node qui se trouve juste au dessus de la nouvelle
> position du node que l'on déplace
> //The layer that is just above the new position of the node we are
> moving
> lowerNode =
> map.layers.indexOf(serverNodeToMove.parentNode.item(indexOfNodeServerAfterMove
> - 1).lastChild.layer);
> //Moving the layers nodes
> for (i = 0; i < nbOfNodesBetweenOldAndNewPosition; i++) {
> map.raiseLayer(map.layers[lowerNode],
> nbOfNodesBetweenOldAndNewPosition + serverNodeToMove.childNodes.length
> - 1);
> }
> //The node is moved bellow
> } else {
> //Compute the number of layer node bewtween the old and the new
> position
> nbOfNodesBetweenOldAndNewPosition = 0;
> for (i = indexOfNodeServerAfterMove + 1; i <
> indexOfNodeServerBeforeMove + 1; i++) {
> nbOfNodesBetweenOldAndNewPosition +=
> serverNodeToMove.parentNode.item(i).childNodes.length;
> }
> lowerNode =
> map.layers.indexOf(serverNodeToMove.parentNode.item(indexOfNodeServerAfterMove).lastChild.layer);
> //Moving the layers nodes
> for (i = 0; i < serverNodeToMove.childNodes.length; i++) {
> map.raiseLayer(map.layers[lowerNode],
> nbOfNodesBetweenOldAndNewPosition + serverNodeToMove.childNodes.length
> - 1);
> }
> }
> };
>
> Frank
>
> -----Message d'origine-----
> De : Francesco D'Alesio [mailto:francesco.dalesio at r3-gis.com]
> Envoyé : 19 février 2013 06:26
> À : Valiquette,Francois [Montreal]
> Cc : Julien-Samuel Lacroix; users at geoext.org
> Objet : Re: [Users] TR: Enabling drag n drop in the
> Ext.tree.TreePanel(enableDD)
>
> Hello François,
> thank you for sharing this code. It works!
>
> I need now to allow dragging only when the dragged record and the
> target
> record share the same parent (no dragging outside the layer's group).
> It seems that the code you described will solve my problem.
>
> Could you please paste it? :)
>
> Thank you
>
> Regards,
> Francesco
>
> Il 18/02/2013 15:32, Valiquette,Francois [Montreal] ha scritto:
> > Hello,
> >
> > 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
> >
> > var indexVariation;
> >
> > node.addListener('beforemove', function (tree, thisNode, oldParent,
> newParent, index) {
> > oldIndex = oldParent.indexOf(thisNode);
> > });
> >
> > node.addListener('move', function (tree, thisNode, oldParent,
> newParent, index) {
> > indexVariation = oldIndex - oldParent.indexOf(thisNode);
> > map.raiseLayer(thisNode.layer, indexVariation);
> > );
> >
> >
> >
> > 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.
> >
> > If anyone is interested of getting the code, just reply to this
> email and I'll copy/pate it.
> >
> >
> > François
> >
> >
> >
> > -----Message d'origine-----
> > De : Valiquette,Francois [Montreal]
> > Envoyé : 8 février 2013 13:56
> > À : 'Julien-Samuel Lacroix'; users at geoext.org
> > Objet : RE: [Users] TR: Enabling drag n drop in the
> Ext.tree.TreePanel(enableDD)
> >
> > Hello Julien,
> >
> > Thank you for your help, you almost remembered everything :)
> >
> > The function you were talking about is in LayerLoader.js and it is
> onChildMove
> >
> > 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.
> >
> > François
> >
> > -----Message d'origine-----
> > De : users-bounces at geoext.org [mailto:users-bounces at geoext.org] De
> la part de Julien-Samuel Lacroix
> > Envoyé : 5 février 2013 14:36
> > À : users at geoext.org
> > Objet : Re: [Users] TR: Enabling drag n drop in the
> Ext.tree.TreePanel(enableDD)
> >
> > Hello,
> >
> > If I remember correctly, the LayerContainer class contains the code
> to
> > support the drag-drop. If you manually create the node, you have to
> add
> > the code by yourself. This is because the LayerContainer (and
> > sub-classes) know about other layers, but the node itself doesn't.
> >
> > If I continue to remember correctly, there's an event thrown on the
> drop
> > (of the drag-drop), simply check your node order there and change
> your
> > map layer order accordingly.
> >
> > I hope others can correct me if I'm wrong.
> >
> > Julien
> >
> > On 13-02-05 02:02 PM, Valiquette,Francois [Montreal] wrote:
> >> Hello,
> >>
> >> I am the original poster. I succeeded easily to change the drawing
> order
> >> of the layer with the drag and drop feature using a
> >> GeoExt.tree.LayerContainer. But I still cannot change the drawing
> order
> >> when I am manually creating my nodes (GeoExt.tree.LayerNode). By
> this, I
> >> mean, I can drag and drop but nothing happens.
> >>
> >> I will try to play a little bit more with my code....
> >>
> >> Thank you
> >>
> >> *De :*users-bounces at geoext.org [mailto:users-bounces at geoext.org]
> *De la
> >> part de* Valiquette,Francois [Montreal]
> >> *Envoyé :* 5 février 2013 12:31
> >> *À :* users at geoext.org
> >> *Objet :* [Users] Enabling drag n drop in the Ext.tree.TreePanel
> (enableDD)
> >>
> >> Hello,
> >>
> >> As written in
> >>
> http://www.geoext.org/tutorials/layertree-tutorial.html?highlight=drag,
> >> if I set /enableDD / to true of my TreePanel, it will enable
> layers
> >> reordering. Does it mean that the user can reorder layers in the
> >> TreePanel or does it mean that the user can reorder the display
> order in
> >> the the MapPanel to make a specific layer appear on top of another
> one?
> >>
> >> I tried to enableDD but when I drag and drop, the layer drawing
> order
> >> does not change. So I just want to if I missed something J
> >>
> >> Thank you
> >>
> >>
> >>
> >> _______________________________________________
> >> Users mailing list
> >> Users at geoext.org
> >> http://www.geoext.org/cgi-bin/mailman/listinfo/users
> >>
>
> --
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.geoext.org/pipermail/users/attachments/20130220/caff3485/attachment.htm
More information about the Users
mailing list