株式会社ライブキャストロゴ 株式会社ライブキャスト

flashcast:フリーで働くITエンジニア集団のブログ: google翻訳APIを使ったAIRアプリを作る!(常駐アプリ編)の続きです。

前回は、ただ常駐するだけのアプリを作りました。それに機能を追加していきたいと思います。

翻訳したいケースは、ホームページを見ている場合、PDFの資料を見ている場合など、いろいろあります。状況に応じて汎用的に使えるように、クリップボードを監視して文字がコピーされた時に自動的に翻訳するようにしたいと思います。

AIRではOSのクリップボードを操作することが出来ますが、変更があった時のイベントは取得できないため、Timerクラスを使って定期的にクリップボードの中身を監視するようにします。クリップボードの中身が、テキストで、かつ、変更があった時にのみ翻訳しにいきます。

package
{
	import flash.desktop.Clipboard;
	import flash.desktop.ClipboardFormats;
	import flash.events.EventDispatcher;
	import flash.events.TimerEvent;
	import flash.utils.Timer;

	public class ClipboardManager extends EventDispatcher
	{
		private var timer:Timer;
		private var temp:String;

		public function ClipboardManager()
		{
		}

		public function initClipboardManager():void {
			timer = new Timer(1000);
			timer.addEventListener(TimerEvent.TIMER, onTimerHandler);

			if (Clipboard.generalClipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)) {
				temp = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) as String;
			}

			timer.start();
		}

		private function onTimerHandler(event:TimerEvent):void {
			if (Clipboard.generalClipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)) {
				var clipboard:String = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) as String;

				if (clipboard != temp) {
					temp = clipboard;
					dispatchEvent(new TranslatorSampleEvent(TranslatorSampleEvent.CLIPBOARD_CHANGE));
				}
			}
		}

	}
}

クリップボードの中身が変わったら、イベントを発生させます。
オリジナルのイベントクラスを作成しました。

package
{
	import flash.events.Event;

	public class TranslatorSampleEvent extends Event
	{
		public static const CLIPBOARD_CHANGE:String = "clipboard_change";

		public function TranslatorSampleEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
		{
			super(type, bubbles, cancelable);
		}

	}
}

Eventクラスを継承して、イベントタイプを定数で定義すればいいだけです。

メインのロジックについては、以下のようにしました。クリップボードに変化があった時に発生させたイベントを、ハンドリングして翻訳処理を実行します。

package
{
	import mx.core.Application;

	public class TranslatorSample3Base extends Application
	{
		private var imanager:IconManager;
		private var cmanager:ClipboardManager;

		public function TranslatorSample3Base():void {
		}

		public function initApp():void {
			imanager = new IconManager();
			cmanager = new ClipboardManager();

			imanager.initIconManager();
			cmanager.initClipboardManager();

			cmanager.addEventListener(TranslatorSampleEvent.CLIPBOARD_CHANGE, onClipboardChangeHandler);
		}

		private function onClipboardChangeHandler(event:TranslatorSampleEvent):void {
			trace("このタイミングで翻訳APIをコールする!");
		}
	}
}

翻訳する部分はまだ実装していません。実行するとデバッグトレース出力されます。

sample3
こんな感じです。わかりにくいですね。。。

サンプルソース

サンプルソースをダウンロードできるようにしておきます。