Création de fenêtres

Adobe AIR 1.0 et les versions ultérieures

AIR crée automatiquement la première fenêtre d’une application, mais vous pouvez créer autant de fenêtres supplémentaires que vous le souhaitez. Pour créer une fenêtre native, utilisez la méthode constructeur NativeWindow.

Pour créer une fenêtre HTML, utilisez la méthode createRootWindow() de l’objet HTMLLoader ou appelez la méthode JavaScript window.open() depuis un document HTML. La fenêtre créée est un objet NativeWindow dont la liste d’affichage contient un objet HTMLLoader. L’objet HTMLLoader interprète et affiche le contenu HTML et JavaScript associé à la fenêtre. Vous pouvez accéder aux propriétés de l’objet NativeWindow sous-jacent à partir de JavaScript par le biais de la propriété window.nativeWindow . (Cette propriété est réservée au code qui s’exécute dans le sandbox d’application AIR.)

Lorsque vous initialisez une fenêtre, y compris la fenêtre d’application initiale, il peut s’avérer utile de la créer dans l’état invisible, de charger un contenu ou d’exécuter toute mise à jour graphique, puis d’activer la visibilité de la fenêtre. Cette séquence permet d’éviter que l’utilisateur visualise toute modification visuelle peu judicieuse. Pour stipuler que la fenêtre initiale de l’application doit être créée dans l’état invisible, spécifiez la balise <visible>false</visible> dans le descripteur d’application (ou omettez complètement la balise, puisque false est la valeur par défaut). Les nouvelles fenêtres NativeWindows sont invisibles par défaut. Lorsque vous créez une fenêtre HTML par le biais de la méthode createRootWindow() de la classe HTMLLoader, vous pouvez définir l’argument visible sur false . Appelez la méthode activate() de NativeWindowmethod ou définissez la propriété visible sur true pour activer la visibilité d’une fenêtre.

Spécification des propriétés d’initialisation d’une fenêtre

Une fois la fenêtre du bureau créée, il est impossible de modifier les propriétés d’initialisation d’une fenêtre native. Ces propriétés immuables et leurs valeurs par défaut sont les suivantes :

Propriété

Valeur par défaut

systemChrome

standard

type

normal

transparent

false

owner

null

maximizable

true

minimizable

true

resizable

true

Définissez les propriétés de la fenêtre initiale créée par AIR dans le fichier descripteur d’application. La fenêtre principale d’une application AIR est toujours de type normale . (Vous pouvez spécifier d’autres propriétés de fenêtre dans le fichier descripteur, telles que visible , width , et height , et les modifier à tout moment.)

Définissez les propriétés des autres fenêtres natives et HTML créées par votre application à l’aide de la classe NativeWindowInitOptions. Lorsque vous créez une fenêtre, vous devez transmettre un objet NativeWindowInitOptions spécifiant les propriétés de la fenêtre à la fonction constructeur NativeWindow ou à la méthode createRootWindow() de l’objet HTMLLoader.

Le code suivant crée un objet NativeWindowInitOptions pour une fenêtre d’utilitaire :

var options:NativeWindowInitOptions = new NativeWindowInitOptions(); 
options.systemChrome = NativeWindowSystemChrome.STANDARD; 
options.type = NativeWindowType.UTILITY 
options.transparent = false; 
options.resizable = false; 
options.maximizable = false; 

Il est impossible de définir systemChrome sur standard lorsque la propriété transparent est définie sur true ou lorsque la propriété type est définie sur lightweight .

Remarque : vous ne pouvez pas définir les propriétés d’initialisation d’une fenêtre créée avec la fonction window.open() de JavaScript. Vous pouvez toutefois passer outre la méthode de création de ces fenêtres en implémentant votre propre classe HTMLHost. Pour plus d’informations, voir la section Traitement des appels JavaScript à window.open() .

Lorsque vous créez une fenêtre à l’aide de la classe mx:Window de Flex, définissez les propriétés d’initialisation sur l’objet window en tant que tel, soit dans la déclaration MXML de la fenêtre, soit dans le code qui crée la fenêtre. L’objet NativeWindow sous-jacent n’est pas créé tant que vous n’avez pas appelé la méthode open() . Après avoir ouvert une fenêtre, il est impossible de modifier ces propriétés d’initialisation.

Création de la fenêtre initiale de l’application

AIR crée la fenêtre initiale de l’application en fonction des propriétés spécifiées dans le fichier descripteur d’application et charge le fichier référencé dans l’élément de contenu. L’élément de contenu doit faire référence à un fichier SWF ou HTML.

La fenêtre initiale peut être la fenêtre principale de votre application, ou permettre simplement de lancer une ou plusieurs autres fenêtres. Il n’est absolument pas nécessaire de rendre cette fenêtre visible.

Création de la fenêtre initiale à l’aide d’ActionScript

Lorsque vous créez une application AIR à l’aide d’ActionScript, la classe principale de votre application doit étendre la classe Sprite (ou une sous-classe de cette dernière). Cette classe sert de point d’entrée principal à l’application.

Lorsque votre application s’ouvre, AIR crée une fenêtre, crée une occurrence de la classe principale, puis ajoute l’occurrence à la scène de la fenêtre. Pour accéder à la fenêtre, vous pouvez écouter l’événement addedToStage , puis utiliser la propriété nativeWindow de l’objet Stage pour obtenir une référence à l’objet NativeWindow.

L’exemple suivant illustre le squelette de base de la classe principale d’une application AIR créée avec ActionScript :

package { 
    import flash.display.NativeWindow; 
    import flash.display.Sprite; 
    import flash.events.Event; 
 
    public class MainClass extends Sprite 
    { 
        private var mainWindow:NativeWindow; 
        public function MainClass(){ 
            this.addEventListener(Event.ADDED_TO_STAGE, initialize); 
        } 
         
        private function initialize(event:Event):void{ 
            mainWindow = this.stage.nativeWindow; 
            //perform initialization... 
            mainWindow.activate(); //show the window 
        } 
    } 
}
Remarque : techniquement, vous POUVEZ accéder à la propriété nativeWindow de la fonction constructeur de la classe principale. Il s’agit cependant d’un cas spécial qui ne s’applique qu’à la fenêtre d’application initiale.

Lorsque vous créez une application dans Flash Professional, la classe de document principale est automatiquement générée si vous n’en créez pas une dans un fichier ActionScript distinct. Vous pouvez accéder à l’objet NativeWindow associé à la fenêtre initiale par le biais de la propriété nativeWindow de la scène. A titre d’exemple, le code suivant active la fenêtre principale dans un état d’affichage maximal (à partir du scénario) :

import flash.display.NativeWindow; 
 
var mainWindow:NativeWindow = this.stage.nativeWindow; 
mainWindow.maximize(); 
mainWindow.activate();

Création de la fenêtre initiale à l’aide de Flex

Lorsque vous créez une application AIR à l’aide de la structure d’application Flex, utilisez mx:WindowedApplication comme élément racine de votre fichier MXML principal. (Vous pouvez utiliser le composant mx:Application, mais il ne prend pas en charge toutes les fonctionnalités intégrées à AIR.) Le composant WindowedApplication sert de point d’entrée initial à l’application.

Lorsque vous lancez l’application, AIR crée une fenêtre native, initialise la structure d’application Flex et ajoute l’objet WindowedApplication à la scène de la fenêtre. Une fois la séquence de lancement terminée, l’objet WindowedApplication distribue un événement applicationComplete . Accédez à l’objet de la fenêtre du bureau avec la propriété nativeWindow de l’occurrence de WindowedApplication.

L’exemple suivant crée un composant WindowedApplication simple qui définit ses coordonnées x et y :

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"  
    applicationComplete="placeWindow()"> 
    <mx:Script> 
        <![CDATA[ 
            private function placeWindow():void{ 
                this.nativeWindow.x = 300; 
                this.nativeWindow.y = 300; 
            } 
        ]]> 
    </mx:Script> 
    <mx:Label text="Hello World" horizontalCenter="0" verticalCenter="0"/> 
</mx:WindowedApplication>

Création d’une classe NativeWindow

Pour créer une classe NativeWindow, transmettez un objet NativeWindowInitOptions au constructeur NativeWindow :

var options:NativeWindowInitOptions = new NativeWindowInitOptions(); 
options.systemChrome = NativeWindowSystemChrome.STANDARD; 
options.transparent = false; 
var newWindow:NativeWindow = new NativeWindow(options); 

La fenêtre ne s’affiche pas tant que vous ne définissez pas la propriété visible sur true ou tant que vous n’appelez pas la méthode activate() .

Une fois la fenêtre créée, vous pouvez initialiser ses propriétés et charger le contenu dans la fenêtre à l’aide de la propriété stage et des techniques de la liste d’affichage de Flash.

Dans la plupart des cas, vous devez définir la propriété scaleMode de la scène d’une nouvelle fenêtre native sur noScale (utilisez la constante StageScaleMode.NO_SCALE ). Les modes d’échelle de Flash sont conçus pour des situations dans lesquelles l’auteur de l’application ne connaît pas à l’avance le format de l’espace d’affichage de l’application. Les modes d’échelle permettent à l’auteur de faire le moins mauvais choix : découper le contenu, l’étirer ou le compresser, ou le remplir d’espace vide. Etant donné que vous contrôlez l’espace d’affichage dans AIR (le cadre de la fenêtre), vous pouvez dimensionner la fenêtre en fonction du contenu ou dimensionner le contenu en fonction de la fenêtre sans aucun compromis.

Le mode d’échelle pour Flex et les fenêtres HTML est automatiquement défini sur noScale .

Remarque : pour déterminer les tailles maximale et minimale des fenêtres disponibles sur le système d’exploitation, utilisez les propriétés NativeWindow statiques suivantes :
var maxOSSize:Point = NativeWindow.systemMaxSize; 
var minOSSize:Point = NativeWindow.systemMinSize; 

Création d’une fenêtre HTML

Pour créer une fenêtre HTML, vous pouvez appeler la méthode Window.open() de JavaScript ou appeler la méthode createRootWindow() de la classe HTMLLoader d’AIR.

Le contenu HTML dans les sandbox de sécurité peuvent utiliser la méthode standard Window.open() de JavaScript. Si le contenu est exécuté hors du sandbox de l’application, la méthode open() ne peut être appelée qu’en réponse à l’interaction de l’utilisateur, notamment lorsque ce dernier clique sur la souris ou appuie sur une touche. Lorsque la méthode open() est appelée, une fenêtre avec un chrome système est créée pour afficher le contenu à l’URL spécifiée. Exemple :

newWindow = window.open("xmpl.html", "logWindow", "height=600, width=400, top=10, left=10");
Remarque : vous pouvez étendre la classe HTMLHost dans ActionScript pour personnaliser la fenêtre créée avec la fonctionnalité window.open() de JavaScript. Voir la section A propos de l’extension de la classe HTMLHost .

Le contenu du sandbox de sécurité de l’application a accès à la méthode de création de fenêtres la plus performante : HTMLLoader.createRootWindow() . Cette méthode vous permet de spécifier toutes les options de création d’une nouvelle fenêtre. Par exemple, le code JavaScript suivant crée un type de fenêtre légère sans chrome système, d’une taille de 300x400 pixels :

var options = new air.NativeWindowInitOptions(); 
options.systemChrome = "none"; 
options.type = "lightweight"; 
 
var windowBounds = new air.Rectangle(200,250,300,400); 
newHTMLLoader = air.HTMLLoader.createRootWindow(true, options, true, windowBounds); 
newHTMLLoader.load(new air.URLRequest("xmpl.html"));
Remarque : si le contenu chargé par la nouvelle fenêtre se trouve hors du sandbox de sécurité de l’application, l’objet window ne possède aucune propriété AIR : runtime , nativeWindow ou htmlLoader .

Si vous créez une fenêtre transparente, le contenu SWF intégré au code HTML chargé dans cette fenêtre ne s’affiche pas systématiquement. Vous devez définir le paramètre wmode de l’objet ou de la balise embed qui fait référence au fichier SWF sur opaque ou transparent . Etant donné que la valeur par défaut de wmode est window , le contenu SWF ne s’affiche par défaut pas dans une fenêtre transparente. Un contenu PDF ne s’affiche pas dans une fenêtre transparente, quelle que soit la valeur définie de wmode . (Dans les versions d’AIR antérieures à 1.5.2, il était également d’impossible d’afficher un contenu SWF dans une fenêtre transparente.)

Les fenêtres créées avec la méthode createRootWindow() restent indépendantes de la fenêtre d’ouverture. Les propriétés parent et opener de l’objet Window de JavaScript sont définies sur null . La fenêtre d’ouverture peut accéder à l’objet Window de la nouvelle fenêtre à l’aide de la référence HTMLLoader renvoyée par la fonctionnalité createRootWindow() . Dans le cadre de l’exemple précédent, l’instruction newHTMLLoader.window référencerait l’objet Window de JavaScript de la fenêtre créée.

Remarque : la fonctionnalité createRootWindow() peut être appelée depuis JavaScript et ActionScript.

Création d’un composant mx:Window

Pour créer un composant mx:Window, vous pouvez créer un fichier MXML à l’aide de mx:Window comme balise racine ou appeler directement le constructeur de la classe Window.

L’exemple suivant crée et affiche un composant mx:Window en appelant le constructeur Window :

var newWindow:Window = new Window(); 
newWindow.systemChrome = NativeWindowSystemChrome.NONE; 
newWindow.transparent = true; 
newWindow.title = "New Window"; 
newWindow.width = 200; 
newWindow.height = 200; 
newWindow.open(true);

Ajout de contenu à une fenêtre

La méthode d’ajout de contenu à une fenêtre AIR dépend du type de fenêtre. Ainsi, MXML et HTML vous permettent de définir d’une manière déclarative le contenu de base de la fenêtre. Vous pouvez intégrer des ressources dans les fichiers SWF de l’application ou les charger à partir de fichiers d’application distincts. Le contenu Flex, Flash et HTML peut être créé au moment opportun et ajouté à la fenêtre de façon dynamique.

Lorsque vous chargez du contenu SWF ou du contenu HTML contenant JavaScript, vous devez tenir compte du modèle de sécurité d’AIR. Le contenu dans le sandbox de sécurité de l’application, c’est-à-dire le contenu installé avec votre application et pouvant être chargé avec le modèle d’URL app:, dispose de privilèges complets pour accéder à toutes les API d’AIR. Le contenu chargé hors de ce sandbox ne peut pas accéder aux API d’AIR. Le contenu JavaScript hors du sandbox de l’application ne peut pas utiliser les propriétés runtime , nativeWindow et htmlLoader de l’objet Window de JavaScript.

Pour sécuriser la programmation croisée, vous pouvez utiliser un pont de sandbox afin de fournir une interface limitée entre le contenu applicatif et le contenu hors application. Dans le contenu HTML, vous pouvez également mapper les pages de votre application sur un sandbox hors application afin que le code sur cette page puisse intercoder le contenu externe. Voir le chapitre Sécurité AIR .

Chargement d’une image ou d’un fichier SWF

Vous pouvez charger des images ou des fichiers Flash SWF dans la liste d’affichage d’une fenêtre native à l’aide de la classe flash.display.Loader :

package { 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.net.URLRequest; 
    import flash.display.Loader; 
 
    public class LoadedSWF extends Sprite 
    { 
        public function LoadedSWF(){ 
            var loader:Loader = new Loader(); 
            loader.load(new URLRequest("visual.swf"));                    
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadFlash); 
        } 
 
        private function loadFlash(event:Event):void{ 
            addChild(event.target.loader);  
        } 
    } 
}
Remarque : les anciens fichiers SWF créés à l’aide d’ActionScript 1 ou 2 partagent les états globaux, tels que les définitions de classe, les singletons et les variables globales, si ceux-ci sont chargés dans la même fenêtre. Si ces fichiers SWF dépendent d’états globaux intacts pour fonctionner correctement, ils ne peuvent pas être chargés plus d’une fois dans la même fenêtre ; ils ne peuvent en outre pas être chargés dans la même fenêtre en tant qu’autre fichier SWF utilisant des définitions de classe et des variables qui se chevauchent. Ce contenu peut être chargé dans des fenêtres indépendantes.

Chargement du contenu HTML dans une fenêtre native

Pour charger du contenu HTML dans une fenêtre native, vous pouvez ajouter un objet HTMLLoader à la scène de la fenêtre, puis charger le contenu HTML dans cet objet, ou créer une fenêtre qui contient déjà un objet HTMLLoader à l’aide de la méthode HTMLLoader.createRootWindow() . L’exemple suivant affiche un contenu HTML dans une zone d’affichage de 300x500 pixels sur la scène d’une fenêtre native :

//newWindow is a NativeWindow instance 
var htmlView:HTMLLoader = new HTMLLoader(); 
htmlView.width = 300; 
htmlView.height = 500; 
 
//set the stage so display objects are added to the top-left and not scaled 
newWindow.stage.align = "TL"; 
newWindow.stage.scaleMode = "noScale"; 
newWindow.stage.addChild( htmlView ); 
 
//urlString is the URL of the HTML page to load 
htmlView.load( new URLRequest(urlString) );

Pour charger une page HTML dans une application Flex, vous pouvez utiliser le composant HTML Flex.

Un contenu SWF intégré à un fichier HTML ne s’affiche pas si la fenêtre est transparente (en d’autres termes, si la propriété transparent de la fenêtre est définie sur true ), sauf si le paramètre wmode de l’objet ou de la balise embed qui fait référence au fichier SWF est défini sur opaque ou transparent . Etant donné que la valeur par défaut de wmode est window , un contenu SWF ne s’affiche par défaut pas dans une fenêtre transparente. Un contenu PDF ne s’affiche pas dans une fenêtre transparente, quelle que soit la valeur wmode utilisée.

Par ailleurs, un contenu SWF ou PDF ne s’affiche pas si le contrôle HTMLLoader est mis à l’échelle ou pivoté ou si sa propriété alpha est définie sur une valeur autre que 1.0.

Incrustation du contenu SWF sur une fenêtre HTML

Etant donné que les fenêtres HTML sont contenues dans une occurrence de NativeWindow, vous pouvez ajouter des objets d’affichage Flash au-dessus et en dessous du calque HTML dans la liste d’affichage.

Pour ajouter un objet d’affichage au-dessus du calque HTML, utilisez la méthode addChild() de la propriété window.nativeWindow.stage . La méthode addChild() ajoute le contenu superposé au-dessus du contenu existant dans la fenêtre.

Pour ajouter un objet d’affichage en dessous du calque HTML, utilisez la méthode addChildAt() de la propriété window.nativeWindow.stage , en transmettant une valeur de zéro au paramètre index . Le fait de placer un objet à l’index zéro déplace le contenu existant (notamment l’affichage HTML) au-dessus d’un calque et insère le nouveau contenu en dessous. Afin que le contenu superposé sous la page HTML soit visible, vous devez définir la propriété paintsDefaultBackground de l’objet HTMLlLoader sur false . En outre, tout élément de la page qui définit une couleur d’arrière-plan ne sera pas transparent. Par exemple, si vous définissez une couleur d’arrière-plan pour l’élément de corps de la page, aucune page ne sera transparente.

L’exemple suivant explique comment ajouter des objets d’affichage Flash en tant que sur-couches et sous-couches à une page HTML. L’exemple suivant crée deux objets de formes simples, ajoute le premier en dessous du contenu HTML et l’autre au-dessus. Cet exemple met également à jour la position de la forme en fonction de l’événement enterFrame .

<html> 
<head> 
<title>Bouncers</title> 
<script src="AIRAliases.js" type="text/javascript"></script> 
<script language="JavaScript" type="text/javascript"> 
air.Shape = window.runtime.flash.display.Shape; 
 
function Bouncer(radius, color){ 
    this.radius = radius; 
    this.color = color; 
 
    //velocity  
    this.vX = -1.3; 
    this.vY = -1; 
 
    //Create a Shape object and draw a circle with its graphics property 
    this.shape = new air.Shape();     
    this.shape.graphics.lineStyle(1,0); 
    this.shape.graphics.beginFill(this.color,.9); 
    this.shape.graphics.drawCircle(0,0,this.radius); 
    this.shape.graphics.endFill(); 
     
    //Set the starting position 
    this.shape.x = 100; 
    this.shape.y = 100; 
 
 
    //Moves the sprite by adding (vX,vY) to the current position 
    this.update = function(){ 
        this.shape.x += this.vX; 
        this.shape.y += this.vY; 
         
        //Keep the sprite within the window 
        if( this.shape.x - this.radius < 0){  
            this.vX = -this.vX; 
        } 
        if( this.shape.y - this.radius < 0){ 
            this.vY = -this.vY; 
        } 
        if( this.shape.x  + this.radius > window.nativeWindow.stage.stageWidth){ 
            this.vX = -this.vX; 
        } 
        if( this.shape.y  + this.radius > window.nativeWindow.stage.stageHeight){ 
            this.vY = -this.vY; 
        } 
         
    }; 
} 
 
function init(){ 
    //turn off the default HTML background 
    window.htmlLoader.paintsDefaultBackground = false; 
    var bottom = new Bouncer(60,0xff2233); 
    var top = new Bouncer(30,0x2441ff); 
 
    //listen for the enterFrame event 
    window.htmlLoader.addEventListener("enterFrame",function(evt){ 
        bottom.update(); 
        top.update(); 
    }); 
     
    //add the bouncing shapes to the window stage 
    window.nativeWindow.stage.addChildAt(bottom.shape,0); 
    window.nativeWindow.stage.addChild(top.shape); 
} 
</script> 
<body onload="init();"> 
<h1>de Finibus Bonorum et Malorum</h1> 
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium 
doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis 
et quasi architecto beatae vitae dicta sunt explicabo.</p> 
<p style="background-color:#FFFF00; color:#660000;">This paragraph has a background color.</p> 
<p>At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis 
praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias 
excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui 
officia deserunt mollitia animi, id est laborum et dolorum fuga.</p> 
</body> 
</html>

Cet exemple vous donne des notions rudimentaires sur certaines techniques avancées qui utilisent JavaScript et ActionScript dans AIR. Si vous ne maîtrisez pas l’utilisation des objets d’affichage ActionScript, voir la section Programmation de l’affichage du Guide du développeur d’ActionScript 3.0 .

Exemple : Création d’une fenêtre native

L’exemple suivant illustre la méthode de création d’une fenêtre native :

public function createNativeWindow():void { 
    //create the init options 
    var options:NativeWindowInitOptions = new NativeWindowInitOptions(); 
    options.transparent = false; 
    options.systemChrome = NativeWindowSystemChrome.STANDARD; 
    options.type = NativeWindowType.NORMAL; 
     
    //create the window 
    var newWindow:NativeWindow = new NativeWindow(options); 
    newWindow.title = "A title"; 
    newWindow.width = 600; 
    newWindow.height = 400; 
     
    newWindow.stage.align = StageAlign.TOP_LEFT; 
    newWindow.stage.scaleMode = StageScaleMode.NO_SCALE; 
 
    //activate and show the new window 
    newWindow.activate(); 
}