Flash ボタンの利用

SyntaxHighlighter 用に作成したボタンですが、良く考えるとクリップボードにデータをコピー
する以外にも色々使えそうなので汎用化しました。

まず、デフォルトのボタンは埋め込んだ画像を用い、初期化で呼び出される
JavaScript(orgCodeInit) が URL を return した場合のみその画像を使うようにしています。
呼び出す JavaScript の関数名は固定で、3つあり、以下のようになります

※ 画像サイズは指定する必要があります
wmode="transparent" を使用すると、背景を透過した画像を使用できます
( Firefox では、Flash10 で確認しました )

IE6 で、フルカラーで単に背景を透過した画像を使用したい場合にも利用可能です
// *********************************************************
// ボタン画像変更用
// id は、Object の id または Embed の name
// return "" で、デフォルトの埋め込みボタンを使用
// *********************************************************
function orgCodeInit(id) {

	if ( id == 'flashButton' ) {
		return "";
	}
	if ( id == 'flashButton2' ) {
		return( "button.png" ); 
	}

	return "";

}

var codeWorkString = "";
// *********************************************************
// クリップボードにコピーさせたい時のみ
// id は、Object の id または Embed の name
// return で文字列を返す
// それ以外ならば処理をして return "" すればよい
// shiftFlg ctrlFlg は、押されておれば "1" となる
// 通常は "0"
// *********************************************************
function orgCodeGetForClipcopy(id,shiftFlg,ctrlFlg) {

	codeWorkString = document.getElementById(id+"_src").innerHTML;
	codeWorkString = codeWorkString.replace(/&lt;/g,'<')
			.replace(/&gt;/g,'>')
			.replace(/&amp;/g,'&');

	if (window.navigator.userAgent.toLowerCase().indexOf("msie") > -1) {
		if ( shiftFlg == "1" ) {
			window.clipboardData.setData('text', codeWorkString);
			alert("【IE】 クリップボードにコピーされました   ");
			return "";
		}
	}

	return( codeWorkString );

}
// *********************************************************
// orgCodeGetForClipcopy で retunr "" 以外を実行すると
// 呼び出される
// *********************************************************
function orgCodeClipcopyEnd() {
	alert("クリップボードにコピーされました   ");
}

ブラウザでダウンロード




flashButton.as
// *********************************************************
// 汎用型 クリップボードコピー用 Flash ボタン
// *********************************************************

package {

import flash.display.*;
import flash.events.*;
import flash.external.*;
import flash.system.*;
import flash.net.*;

// 表示用クラス 【Sprite】を継承
public class flashButton extends Sprite {

	[Bindable]
	[Embed("button.gif")]
	private var imgButton:Class;
	private var strid:String;

	// *********************************************************
	// コンストラクタ
	// *********************************************************
	public function flashButton():void {

		// IE:Object の id,それ以外 Embed の name
		strid = ExternalInterface.objectID;

		// stage の設定
		stage.scaleMode = StageScaleMode.NO_SCALE;
		stage.align = StageAlign.TOP_LEFT;

		// マウスイベント取得用
		var eventArea:Sprite = new Sprite();
		eventArea.x = 0;
		eventArea.y = 0;
		eventArea.buttonMode = true;	// ハンドカーソル
		addChild(eventArea);

		var imgPath:String = ExternalInterface.call( "orgCodeInit", strid );

		if ( imgPath == null || imgPath == "" ) {
			// デフォルトのボタン画像
			var myImg:Bitmap = new imgButton();
			myImg.x = 0;
			myImg.y = 0;
			eventArea.addChild(myImg);
		}
		else {
			var loader:Loader = new Loader();
			loader.load(new URLRequest(imgPath));
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, 
				function ():void {
					eventArea.addChild( loader );
				}
			);
		}

		eventArea.addEventListener(MouseEvent.CLICK,
			function(ev:flash.events.MouseEvent):void {

				var shift_flg:String;
				var ctrl_flg:String;

				if ( ev.shiftKey ) {
					shift_flg = "1";
				}
				else {
					shift_flg = "0";
				}
				if ( ev.ctrlKey ) {
					ctrl_flg = "1";
				}
				else {
					ctrl_flg = "0";
				}

				var str:String = 
					ExternalInterface.call(
						"orgCodeGetForClipcopy",
						strid,
						shift_flg,
						ctrl_flg
					);

				// 戻された文字列に何か入っていたら
				// クリップボードにコピーして再び呼び出す
				if ( str != null && str != "" ) {
					System.setClipboard(str);
					ExternalInterface.call("orgCodeClipcopyEnd" );
				}

				// Firebug 用
				ExternalInterface.call("console.log", str);

			}
		);

	}

}}