Flex 2 - DragManager
En testant le DragManager de Flex 2, j'ai trouvé ça plutot bien fait. Mais dans le cadre d'un projet top secret qui peut détruire la planète, je suis tombé dans le cas où je chargeais un SWF qui chargeait un autre SWF.
Et là c'est le drame, le DragManager marche moins bien.
Illustration du problème
Pour illustrer le problème, essayez de glisser/déposer le carré de couleur vers le carré blanc :
On voit qu'il y a un problème avec le mx.managers.DragManager.
Explication
D'après ce que j'ai compris de la documentation, chaque SWF généré par MXML a un SystemManager pour lui. Quand on charge des SWF, il y en a donc plusieurs.
Pour faire simple, le SystemManager est le plus haut niveau d'une application, c'est grace à lui qu'on peut ajouter des popUp, des toolTip ou des Alert devant tout le reste de l'application. Le DragManager utilise aussi un SystemManager pour afficher les objets pendant le glisser/déposer.
Sauf qu'en regardant la source, j'ai l'impression qu'il ne prend pas le bon SystemManager. Il devrait prendre le tout premier, c'est à dire celui qui est créé par le SWF principal et non l'un de SWF que le principal charge.
Mes modifications
J'ai donc repris le code fourni de Flex 2 et j'ai modifié quelques petites choses pour que ça marche. J'ai essentiellement remplacé les occurences de :
dragInitiator.systemManager.topLevelSystemManager
par
SystemManager.mx_internal::topLevelSystemManagers[0]
On voit qu'à l'origine, on utilise le SystemManager de l'objet qu'on déplace (dragInitiator). Par chance, j'ai vu que tous les SystemManager sont listés, et on peut accéder à cette liste par une propriété static. J'ai donc pris le premier de cette liste, qui est à priori celui du SWF principal.
Conclusion
Le problème, c'est les conséquences que ça peut avoir sur d'autres glisser/déposer.
Il y a peut-être une option que j'ai loupée. Mais je suis bien content qu'il y ait la source de Flex 2 :) .
Hop, voilà la source de mes tests : flex2_test004.zip