次の例では、
ネイティブメニューの構造(AIR)
で説明したメニューを作成します。
メニューは、Windows(ウィンドウメニューのみがサポートされます)および Mac OS X(アプリケーションメニューのみがサポートされます)の両方で機能するように設計されています。それらを区別するために、MenuExample クラスコンストラクターで、NativeWindow クラスおよび NativeApplication クラスの静的プロパティ
supportsMenu
を確認しています。
NativeWindow.supportsMenu
が
true
の場合は、ウィンドウの NativeMenu オブジェクトを作成してから、File サブメニューと Edit サブメニューを作成して追加します。
NativeApplication.supportsMenu
が
true
の場合は、File メニューと Edit メニューを作成して、それらを Mac OS X オペレーティングシステムで提供される既存のメニューに追加します。
次の例では、メニューイベント処理についても示しています。
select
イベントはアイテムレベルで処理され、さらにメニューレベルでも処理されます。選択されたアイテムを格納するメニューからルートメニューまでのチェーンにある各メニューで、
select
イベントに応答しています。
displaying
イベントは、最近使用したファイルを開くメニューで使用されています。メニューが開かれる直前に、メニュー内のアイテムが最新の Documents 配列で更新されます(この例では実際には変更されません)。この例では示していませんが、
displaying
イベントは個々のアイテムでリッスンすることもできます。
<html>
<head>
<script src="AIRAliases.js" type="text/javascript"></script>
<script type="text/javascript">
var application = air.NativeApplication.nativeApplication;
var recentDocuments =
new Array(new air.File("app-storage:/GreatGatsby.pdf"),
new air.File("app-storage:/WarAndPeace.pdf"),
new air.File("app-storage:/Iliad.pdf"));
function MenuExample(){
var fileMenu;
var editMenu;
if (air.NativeWindow.supportsMenu &&
nativeWindow.systemChrome != air.NativeWindowSystemChrome.NONE) {
nativeWindow.menu = new air.NativeMenu();
nativeWindow.menu.addEventListener(air.Event.SELECT, selectCommandMenu);
fileMenu = nativeWindow.menu.addItem(new air.NativeMenuItem("File"));
fileMenu.submenu = createFileMenu();
editMenu = nativeWindow.menu.addItem(new air.NativeMenuItem("Edit"));
editMenu.submenu = createEditMenu();
}
if (air.NativeApplication.supportsMenu) {
application.menu.addEventListener(air.Event.SELECT, selectCommandMenu);
fileMenu = application.menu.addItem(new air.NativeMenuItem("File"));
fileMenu.submenu = createFileMenu();
editMenu = application.menu.addItem(new air.NativeMenuItem("Edit"));
editMenu.submenu = createEditMenu();
}
}
function createFileMenu() {
var fileMenu = new air.NativeMenu();
fileMenu.addEventListener(air.Event.SELECT,selectCommandMenu);
var newCommand = fileMenu.addItem(new air.NativeMenuItem("New"));
newCommand.addEventListener(air.Event.SELECT, selectCommand);
var saveCommand = fileMenu.addItem(new air.NativeMenuItem("Save"));
saveCommand.addEventListener(air.Event.SELECT, selectCommand);
var openFile = fileMenu.addItem(new air.NativeMenuItem("Open Recent"));
openFile.submenu = new air.NativeMenu();
openFile.submenu.addEventListener(air.Event.DISPLAYING, updateRecentDocumentMenu);
openFile.submenu.addEventListener(air.Event.SELECT, selectCommandMenu);
return fileMenu;
}
function createEditMenu() {
var editMenu = new air.NativeMenu();
editMenu.addEventListener(air.Event.SELECT,selectCommandMenu);
var copyCommand = editMenu.addItem(new air.NativeMenuItem("Copy"));
copyCommand.addEventListener(air.Event.SELECT,selectCommand);
copyCommand.keyEquivalent = "c";
var pasteCommand = editMenu.addItem(new air.NativeMenuItem("Paste"));
pasteCommand.addEventListener(air.Event.SELECT, selectCommand);
pasteCommand.keyEquivalent = "v";
editMenu.addItem(new air.NativeMenuItem("", true));
var preferencesCommand = editMenu.addItem(new air.NativeMenuItem("Preferences"));
preferencesCommand.addEventListener(air.Event.SELECT,selectCommand);
return editMenu;
}
function updateRecentDocumentMenu(event) {
air.trace("Updating recent document menu.");
var docMenu = air.NativeMenu(event.target);
for (var i = docMenu.numItems - 1; i >= 0; i--) {
docMenu.removeItemAt(i);
}
for (var file in recentDocuments) {
var menuItem =
docMenu.addItem(new air.NativeMenuItem(recentDocuments[file].name));
menuItem.data = recentDocuments[file];
menuItem.addEventListener(air.Event.SELECT, selectRecentDocument);
}
}
function selectRecentDocument(event) {
air.trace("Selected recent document: " + event.target.data.name);
}
function selectCommand(event) {
air.trace("Selected command: " + event.target.label);
}
function selectCommandMenu(event) {
if (event.currentTarget.parent != null) {
var menuItem = findItemForMenu(event.currentTarget);
if(menuItem != null){
air.trace("Select event for \"" + event.target.label +
"\" command handled by menu: " + menuItem.label);
}
} else {
air.trace("Select event for \"" + event.target.label +
"\" command handled by root menu.");
}
}
function findItemForMenu(menu){
for (var item in menu.parent.items) {
if (item != null) {
if (item.submenu == menu) {
return item;
}
}
}
return null;
}
</script>
<title>AIR menus</title>
</head>
<body onload="MenuExample()"></body>
</html>