トップ » 技術記事 » API で覚える Adobe AIR(4) - Adobe AIRでクリップボードを操る

API で覚える Adobe AIR(4) - Adobe AIRでクリップボードを操る はてなブックマーク数 このエントリーをブックマークに追加

Adobe AIR が話題になっています。Adobe AIR を使えば、これまで使ってきた Web アプリケーションの技術、HTML/JavaScript や Flash/Flex を利用して、デスクトップアプリケーションを作ることができます。今回から、数回にわたって、Adobe AIR の API をテーマにして、AIR の各機能を紹介していきます。4回目の今回は、クリップボードの扱いについて見ていきます。

なぜクリップボードか?

クリップボードはとても便利です。複数のアプリケーションを起動しているときに、別のアプリケーションでもそのデータが利用できます。例えば、Webブラウザで見て気に入ったテキストをコピーしておいて、そのデータを、テキストエディタに貼り付ける(ペースト)ことができます。

クリップボードの処理などはWebアプリケーションでも簡単にできそうなものですが、Webアプリでは操作ができないようになっています。なぜなら、クリップボードが取得できると、Webサイトを訪問しているユーザーのクリップボードを盗んで、サーバーに保存するといったことができてしまうからです。(もし、クレジットカードの番号や、何かのパスワードがコピーされていたとしたら大変です。)

Adobe AIRでは、クリップボードがサポートされています。しかも、テキストデータではなく、ビットマップやファイルリストなど、バイナリやOS固有のフォーマットもサポートしています。では、AIRで扱えるクリップボードの形式を確認してみましょう。

AIR で扱えるクリップボードの形式

AIR では、一般的なテキスト形式のクリップボードの他に、画像形式(BITMAP_FORMAT)のデータや、ファイルの一覧(FILE_LIST_FORMAT)、HTML形式(HTML_FORMAT)などの形式のデータを扱うことができます。これらは、 ClipboardFormats クラスで定義されています。

以下、AIR で扱えるクリップボードの形式の一覧です。

定義されている定数 実際の値 形式の説明
TEXT_FORMAT air:text テキスト形式
BITMAP_FORMAT air:bitmap 画像形式(BitmapData オブジェクト)
FILE_LIST_FORMAT air:file list ファイルの一覧(Fileオブジェクトの配列)
HTML_FORMAT air:html HTML 形式の文字列データ
URL_FORMAT air:url URL文字列

これらの AIR形式のデータは、クリップボードを扱う時に、OSネイティブな形式に自動的に変換がおこなわれるようになっています。このほかに、自分でクリップボードの形式を設定できる仕組みも備えています。

テキスト形式のクリップボードの扱い

はじめに、最も扱いが簡単なテキスト形式のクリップボードについて見ていきましょう。OSが提供するクリップボードを扱う場合には、Clipboard.generalClipboard を介して操作することになっています。

クリップボードにテキストを設定する場合には、setData() メソッドを利用します。

// 書式
Clipboard.generalClipboard.setData(フォーマット, 設定するデータ);

このメソッドの第一引数には、クリップボードの形式を、そして、第二引数に実際のデータを指定します。また、クリップボードに値を設定するときは、以前のデータ形式が混ざらないように、はじめに、clear() メソッドでデータをクリアしておく必要があります。(クリップボードは複数の形式を別データとしてサポートできるようになっているからです。)

では、実際のプログラムを見てみましょう。以下は、テキスト形式でデータを設定する例です。


// Flash/Flex -- ActionScript の場合
Clipboard.generalClipboard.clear(); // 既存形式をクリア
Clipboard.generalClipboard.setData(
    ClipboardFormats.TEXT_FORMAT,
    "こんにちは。クリップボード。");
// HTML -- JavaScript の場合
air.Clipboard.generalClipboard.clear();
air.Clipboard.generalClipboard.setData(
    air.ClipboardFormats.TEXT_FORMAT,
    "こんにちは。クリップボード。");

では、次にテキストデータの取得方法を見ていきましょう。テキストを取得する場合には、まず、現在のクリップボードにテキスト形式が設定されているかを調べ、もし設定されていれば取得するという手順を踏みます。

クリップボードの形式を確認するのが、hasFormat() メソッドです。テキスト形式かを調べるには、この引数に TEXT_FORMAT を指定して、true が戻ってくれば、テキスト形式での取得ができるということなので、getData() メソッドでデータを取得します。この getData() メソッドの戻り値は、Object 型なので、String 型でキャストすることで、正しく文字列として代入することができます。

// ActionScript の場合
var g:Clipboard = Clipboard.generalClipboard;
var s:String;
if (g.hasFormat(ClipboardFormats.TEXT_FORMAT)) {
	s = String(g.getData(ClipboardFormats.TEXT_FORMAT));
	trace(s);
}

// JavaScript の場合
var g = air.Clipboard.generalClipboard;
if (g.hasFormat(air.ClipboardFormats.TEXT_FORMAT)) {
    var s = g.getData(air.ClipboardFormats.TEXT_FORMAT);
    alert(s);
}

クリップボードの中身を直接書き換えるアプリ

それでは、クリップボードの操作例として、簡単なプログラムを作ってみます。ここでは、ボタンをクリックしたら、クリップボードの中にある文字列を取り出して、各行に返信マーク「>」をつけるというものを作ってみます。

クリップボードのデータを読み取って返信マークをつけます
クリップボードのデータを読み取って返信マークをつけます

ここでは、HTML(JavaScript)で作ってみます。(Flex(ActionScript) でもほとんど同じプログラムになるでしょう。)

<body>
<!-- ui -->
次のボタンをクリックするとクリップボードに返信マークをつけます。<br/>

<input type="button" value="実行" onclick="addResmark()"/></br>
<textarea id="log" rows=10 cols=80></textarea>

<!-- script -->
<script src="AIRAliases.js"></script>
<script>
function $(name) { return document.getElementById(name); }
var g = air.Clipboard.generalClipboard;
function addResmark() {
    // クリップボードの形式をチェック
    if (!g.hasFormat(air.ClipboardFormats.TEXT_FORMAT)) return;
    var str = g.getData(air.ClipboardFormats.TEXT_FORMAT);
    str = str.replace(/(\r\n|\n)/g, "\r");
    var ary = str.split("\r");
    var res = "";
    for (var i = 0; i < ary.length; i++) {
        res += ">" + ary[i] + "\n";
    }
    $("log").value = res; // 成功したか確認
    // 新しい値を設定
    g.clear();
    g.setData(air.ClipboardFormats.TEXT_FORMAT, res);
}

</script>
</body>

テキストのコピー&貼り付けを便利関数にまとめてみる

このように、AIR のクリップボードの扱いは難しくありませんが、汎用的な作りになっているため、使い方を覚えるのは若干面倒です。

しかし、テキストのコピーと貼り付けは、良く使う処理です。そこで、次のような簡単な関数としてまとめておくと便利だと思います。

// テキスト形式でクリップボードを得る (取得できないときは null を返す)
function getClipboardText() {
    var g = air.Clipboard.generalClipboard;
    if (!g.hasFormat(air.ClipboardFormats.TEXT_FORMAT)) return null;
    return g.getData(air.ClipboardFormats.TEXT_FORMAT);
}
// テキストをクリップボードに設定する
function setClipboardText(text) {
    var g = air.Clipboard.generalClipboard;
    g.clear();
    g.setData(ClipboardFormats.TEXT_FORMAT,text);
}

クリップボードまとめ

以上、今回は、クリップボードの取り扱いについて見てみました。このように、Adobe AIR では、クリップボードにさまざまなデータを設定できることが分かったと思います。実は、ドラッグ&ドロップの処理を行うのにも、この Clipboard クラスが大きな役割を果たします。次回、ドラッグ&ドロップの処理を紹介しますので、クリップボードの扱いについて慣れておきましょう。

Series Navigation«データベースAPI(SQLite)を使ってみようAdobe AIR ドラッグ&ドロップ API について»

このサイトについて

八角研究所
株式会社八角研究所のWEBサイトですよー。 いろんなものを創り出すことのできる環境をコツコツ構築中。 いったい、いつになったらできるのか。 この技術情報サイトもそのための活動の一環のつもり。

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :