
シニアテクニカルライター
Adobe
このサンプルアプリケーションは、アプリケーションの位置やサイズに関するデータと保存日時を読み取りおよび書き込みます。また、アプリケーションを開くときにそのデータに従ってウィンドウを配置します。具体的には、次の Adobe AIR 機能を示します。

図 1. XML 環境設定の指定が可能なサンプルアプリケーション
注意:このサンプルアプリケーションは、説明のためにそのままの状態で提供されています。
この記事に書かれた操作を行うには、次のソフトウェアとファイルが必要です。
このサンプルアプリケーションには、次のファイルが含まれています。
HTML ベースのアプリケーション構築の経験があることが推奨されます。このクイックスタートの開始方法について詳しくは、「Building the Quick Start sample applications with HTML」を参照してください。
このアプリケーションは、アプリケーションの位置やサイズに関するデータと保存日時を読み取りおよび書き込みます。また、アプリケーションを開くときにそのデータに従ってウィンドウを配置します。環境設定は、XML データを含むテキストファイルに格納されています。アプリケーションは、読み取りの場合はそのデータを XML オブジェクトに変換し、書き込みの場合は XML データをテキストに変換します。このアプリケーションをテストするには、次の手順に従います。
ここでは、ファイルの HTML マークアップすべてを説明するわけではなく、AIR 固有の JavaScript コードのみ説明します。
init() メソッドは、定義済みのパスを参照するように prefsFile File オブジェクトを初期化し、データを読み取る readXML() メソッドを呼び出します。
prefsFile = air.File.applicationStorageDirectory;
prefsFile = prefsFile.resolvePath("preferences.xml");
readXML();
File.applicationStorageDirectory は AIR アプリケーションの格納ディレクトリを指します。これは AIR アプリケーションごとに定義されています。
init() メソッドは、ウィンドウの closing イベントに応答して環境設定データをファイルに保存するようにイベントハンドラも設定します。
window.nativeWindow.addEventListener(Event.CLOSING, windowClosingHandler);
readXML() メソッドは、File オブジェクトと FileStream オブジェクトを設定します。open() メソッドの呼び出しの fileMode パラメータが FileMode.READ に設定されているので、FileStream オブジェクトはファイルからデータを読み取ることができます。
stream = new air.FileStream();
if (prefsFile.exists) {
stream.open(prefsFile, air.FileMode.READ);
processXMLData();
}
stream オブジェクトの open() メソッドは、ファイルを同期的に開き、読み取りバッファへのデータの読み取りを開始します。
processXMLData() メソッドは、XML データを処理してファイルを閉じます。FileStream オブジェクトの bytesAvailable プロパティは、読み取りバッファのバイト数です。つまり、ファイルは同期的に読み取られるので、ファイルのすべてのバイト数です。
prefsXML = stream.readUTFBytes(stream.bytesAvailable); stream.close();
processXMLData() 関数では、JavaScript DOM API を使用して XML データが処理され、ファイルが閉じられます。FileStream オブジェクトの bytesAvailable プロパティは、読み取りバッファのバイト数です。つまり、ファイルは同期的に読み取られるので、ファイルのすべてのバイト数です。
var domParser = new DOMParser();
prefsXML = domParser.parseFromString(prefsXML, "text/xml");
var windowState = prefsXML.getElementsByTagName("windowState")[0];
window.moveTo(windowState.getAttribute("x"), windowState.getAttribute("y"));
document.getElementById("xPositionField").value = windowState.getAttribute("x");
document.getElementById("yPositionField").value = windowState.getAttribute("y");
window.resizeTo(windowState.getAttribute("width"), windowState.getAttribute("height"));
document.getElementById("widthField").value = windowState.getAttribute("width");
document.getElementById("heightField").value = windowState.getAttribute("height");
document.getElementById("dateField").value =
prefsXML.getElementsByTagName("saveDate")[0].firstChild.nodeValue;
アプリケーションのプロパティを定義する application.xml ファイルでは、initialWindow プロパティの visible 属性が false に設定されています。ウィンドウのサイズと位置を変更してからウィンドウを表示可能にします。
readXML() メソッドは、processXMLData() メソッドが戻ったらウィンドウを表示可能にします。
window.nativeWindow.visible = true;
createXMLData() は XML データを文字列に変換し、XML 宣言を文字列の先頭に追加します。さらに、行末の文字をプラットフォーム固有の行末の文字(File.lineEnding 定数で表されます)に置き換えます。
var cr = air.File.lineEnding;
prefsXML = "<?xml version='1.0' encoding='utf-8'?>" + cr
+ "<preferences>" + cr
+ " <windowState" + cr
+ " width = '" + window.outerWidth.toString() + "'" + cr
+ " height = '" + window.outerHeight.toString() + "'" + cr
+ " x = '" + window.screenLeft.toString() + "'" + cr
+ " y = '" + window.screenTop.toString() + "'" + "/>" + cr
+ " <saveDate>"
+ new Date().toString()
+ "</saveDate>" + cr
+ "</preferences>";
document.getElementById("widthField").value = window.outerWidth.toString();
document.getElementById("heightField").value = window.outerWidth.toString();
document.getElementById("xPositionField").value = window.screenLeft.toString();
document.getElementById("yPositionField").value = window.screenTop.toString();
writeXMLData() 関数では、データを書き込むための FileStream オブジェクトを作成して使用します。open() メソッドの fileMode パラメータとして FileMode.WRITE が指定されています。これにより、FileStream オブジェクトはファイルへの書き込みが可能になります。既存のデータは書き込み前に切り詰められます。
stream = new air.FileStream(); stream.open(prefsFile, air.FileMode.WRITE);
次に、文字列に変換された XML データを UTF-8 データとしてファイルに書き込む writeUTFBytes() メソッドが呼び出されます。
stream.writeUTFBytes(prefsXML); stream.close();
ユーザがウィンドウを閉じると、NativeWindow オブジェクトから終了イベントが送出されます。このイベントのイベントハンドラでは、イベントのデフォルトの動作(アプリケーションを閉じて XML データを保存する saveData() メソッドを呼び出す)がキャンセルされます。データが保存されると、NativeApplication.nativeApplication.exit() メソッドが呼び出され、アプリケーションが閉じます。
function windowClosingHandler(event)
{
event.preventDefault();
nativeWindow.removeEventListener("closing", windowClosingHandler)
saveData();
air.NativeApplication.nativeApplication.exit();
}
Jeff Swartzは、1992年にMacromedia(現Adobe Systems)に入社し、現在はAdobe AIR担当のテクニカルライターを務めています。Jeffは、University of Illinois at Urbana-Champaignのコンピュータサイエンス学学士号と、Edinburgh University人工知能学部での就学経験を有しています。サンフランシスコベイエリアのファンは、Jeffのトロンボーン演奏を寛大に許容しています。また、Vienna Beef Ltd.のダンシングホットドッグ、Big Frankとして活躍した経験もあります。