mercredi 17 juin 2009
[Frame]
Par liguorien, mercredi 17 juin 2009 à 12:39 :: Flex
Tout les singletons de Flex implémentent une certaine interface (DragManager -> IDragManager -> DragManagerImpl) sont enregistrés globalement dans la classe non-documenté mx.core.Singleton.
Le problème avec la fameuse classe Singleton, c'est qu'elle ne permet pas de redéfinir une classe.
public static function registerClass(interfaceName:String, clazz:Class):void
{.
var c:Class = classMap[interfaceName];.
if (!c).
classMap[interfaceName] = clazz;.
}.
Donc le seul moyen de spécifier ma propre classe, c'est de redéfinir le SystemManager. La majorité des managers sont défini dans la méthode SystemManager.docFrameHandler() (à la ligne 2261 pour être exact).Heureusement, la méthode utilise le namespace mx_internal donc il est tout à fait possible de polymorpher la méthode. (à vos risques et périls, cependant)
Mais...
Hmmm.
Où est défini l'implémentation du SystemManager? Qu'est-ce que le SystemManager?
Il y a le metadata [Frame] défini dans la classe Application. Ce metatag permet d'indiquer au compilateur la classe qui sera instancié sur un frame du swf.
Dans le cadre de mx.core.Application :
[Frame(factoryClass="mx.managers.SystemManager")]C'est en modifiant ce metadata que j'ai pu avoir ma propre implémentation du SystemManager ainsi que du DragManager. Et au final, après avoir implémenté mon DragManager custom, j'ai trouvé une solution à mon problème d'origine sans avoir à modifier le DragManager de Flex. Il suffisait d'envoyer une implémentation spécial de MouseEvent, mais ça, c'est le but d'un autre billet! :D

