forked from: forked from: forked from: flash on 2013-11-9
forked from forked from: forked from: flash on 2013-11-9 (diff: 556)
private var yp:TubePlayer; t2.height = 20; t2.width = 120; loadMylist(); t.text = ""; t.border=true; t.text+=loader.idList[i].toString()+"\n"; t.height; t.text+="\n"; t.scrollV = t.maxScrollV; t.text += loader._xml; var yp2:YoutubePlayer = new YoutubePlayer(); yp2.resize(e.currentTarget.width,e.currentTarget.height); e.currentTarget.addChild(yp2); save.add(id); ブックマーク登録 id title author time 動画ID取得 投稿者取得 動画タイトル取得 再生時間取得 キーワード検索 投稿者検索 前回の検索ワード リクエスト回数 var str:String = "http://gdata.youtube.com/feeds/api/videos/-/"; gdata.youtube.com/feeds/api/videos?" 検索ワード str += escapeMultiByte(_words)+"?";//検索ワード 件数 インデックス var loader:URLLoader = new URLLoader(); const req:String = "http://www.ozworks.dip.jp/img/01/1426006.png"; i.ytimg.com/vi/"; youtubeプレイヤー読み込み var str:String = ""; タイトル抽出 str += list3[j].text()+"\n"; ID抽出 var n:int = str3.indexOf("videos/")+7; str += id+"\n"; 投稿者名 再生時間 str += list3.elements("id").toXMLString()+"\n\n"; str += i.toString()+" "+list[i].localName()+"\n"; str += list[i]
ActionScript3 source code
/**
* Copyright tepe ( http://wonderfl.net/user/tepe )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/pzz9
*/
// forked from tepe's forked from: forked from: flash on 2013-11-9
// forked from tepe's forked from: flash on 2013-11-9
// forked from tepe's flash on 2013-11-9
package {
import flash.text.*;
import flash.display.*;
import flash.net.*;
import flash.events.*;
import flash.utils.*;
import flash.system.*;
public class FlashTest extends Sprite {
private var loader:TubeLoader;
private var t3:TextField = new TextField();
private var t2:TextField = new TextField();
//private var yp:TubePlayer;
private var scrY:int=0;
private var s1:Sprite =new Sprite();
private var roomID:String = "aaa.chatroom";
private var chat:MiniChat = new MiniChat(roomID);
private var save:TubeMylist = new TubeMylist();
public function FlashTest(){
loader = new TubeLoader();
loader.addEventListener(Event.COMPLETE,onComplete);
addChild(t3);
t3.height=300;
t3.width = 400;
t3.y =30;
t3.x = 350;
t2.border = true;
t2.type ="input";
t2.text = "初音ミク";
//t2.height = 20;
//t2.width = 120;
t2.x = 350;
t2.y = 20;
t2.height = t2.textHeight+5;
addChild(t2);
addChild(s1);
t2.addEventListener(KeyboardEvent.KEY_UP,onKey);
stage.addEventListener(KeyboardEvent.KEY_DOWN,onKey2);
stage.addEventListener(MouseEvent.MOUSE_WHEEL,onWheel);
//loadMylist();
chat.x = (465 - chat.width) / 2;
chat.y = (465 - chat.height) / 2;
addChild(chat);
}
private function onWheel(e:MouseEvent):void{
var scr:int = e.delta*5;
s1.y += scr;
scrY += scr;
if(scrY<200){
loader.requestWords(t2.text);
}
}
private function onKey(e:KeyboardEvent):void{
if(e.keyCode == 13){
loader.requestWords(t2.text);
}
}
private function onKey2(e:KeyboardEvent):void{
if(e.keyCode==40){
s1.y-=20;
scrY-=20;
if(scrY<200){
loader.requestWords(t2.text);
}
}
if(e.keyCode==38){
s1.y+=20;
scrY+=20;
}
t3.text = scrY.toString();
}
private var lastY:int=0;
private var listCnt:int=0;
private function onComplete(e:Event):void{
//t.text = "";
if(loader.idList.length<listCnt){
while(0<s1.numChildren)s1.removeChildAt(0);
lastY=0;
listCnt=0;
scrY=0;
s1.y=300;
}
for(var i:int=listCnt;i<loader.idList.length;i++){
var id:String = loader.idList[i].toString();
var s:Sprite = loader.getImage(id);
s1.addChild(s);
s.y = lastY;
var t:TextField = new TextField();
//t.border=true;
t.text+=loader.titleList[i]+"\n";
t.text+= "投稿者:"+loader.authorList[i]+"\n";
var n:int = loader.durationList[i];
var h:int = n/3600;
var min:int = (n/60)%60;
var sec:int = n%60;
if(0<h)t.text+=h.toString()+":";
t.text+= min.toString()+":"+sec.toString()+"\n";
//t.text+=loader.idList[i].toString()+"\n";
t.width=t.textWidth+5;
t.height=t.textHeight+5;
t.selectable=false;
t.y=lastY;
t.x=130;
s1.addChild(t);
lastY+=100;//t.height;
s.addEventListener(MouseEvent.CLICK,onClick);
s.name = id;
s.buttonMode = true;
var t2:TextField = new TextField();
}
t = new TextField();
t.text = loader.idList.length.toString();
t.height = 20;
t.y = lastY;
s1.addChild(t);
lastY+=20;
scrY = lastY+s1.y-400;
listCnt = loader.idList.length;
//t.text+="\n";
//t.scrollV = t.maxScrollV;
//t.text += loader._xml;
}
private function loadMylist():void{
var list:Array = save.mylist();
for(var i:int=0;i<list.length;i++){
var t:TextField = new TextField();
t.border=true;
t.text = list[i].toString();
t.width=t.textWidth+5;
t.height=t.textHeight+5;
t.selectable=false;
t.y=lastY;
s1.addChild(t);
lastY+=t.height;
t.addEventListener(MouseEvent.CLICK,onClick);
t.name = list[i].toString();
}
listCnt = s1.numChildren;
}
private function onClick(e:MouseEvent):void{
var id:String = e.currentTarget.name;
//var yp2:YoutubePlayer = new YoutubePlayer();
//yp2.resize(e.currentTarget.width,e.currentTarget.height);
//e.currentTarget.addChild(yp2);
chat.player.play(id);
//save.add(id);
}
}
}
//ブックマーク登録
//id title author time
class TubeMylist{
private var so:SharedObject;
public function TubeMylist():void{
so = SharedObject.getLocal("tubeMylist");
}
public function mylist():Array{
var list:Array = new Array();
if(so){
var obj:Object = so.data;
for(var str:String in obj){
list.push(str);
}
}
return list;
}
public function add(id:String,title:String=""):void{
var obj:Object = so.data;
var n:String="";
if(obj.hasOwnProperty(id) == false) obj[id] = n;
}
public function remove(id:String):void{
var obj:Object = so.data;
if(obj.hasOwnProperty(id) == true) obj[id] = null;
}
}
import flash.text.*;
import flash.display.*;
import flash.net.*;
import flash.events.*;
import flash.utils.*;
import flash.system.*;
class TubeLoader extends Sprite{
//動画ID取得
//投稿者取得
//動画タイトル取得
//再生時間取得
//キーワード検索
//投稿者検索
private var loader:URLLoader;
public var idList:Array;
public var titleList:Array;
public var authorList:Array;
public var durationList:Array;
private var _words:String = "";//前回の検索ワード
private var cnt:int=0;//リクエスト回数
private var _results:int = 20;
public function TubeLoader() {
idList = new Array();
titleList = new Array();
authorList = new Array();
durationList = new Array();
}
public function clear():void{
idList = new Array();
titleList = new Array();
authorList = new Array();
durationList = new Array();
cnt=0;
}
public function set results(n:int):void{
_results = n;
clear();
}
public function requestWords(key:String):void{
//var str:String = "http://gdata.youtube.com/feeds/api/videos/-/";
var str:String = "http://gdata.youtube.com/feeds/api/videos?"
if(_words != key){
_words = key;
clear();
}
str += "q="+escapeMultiByte(_words);//検索ワード
//str += escapeMultiByte(_words)+"?";//検索ワード
str += "&max-results="+_results.toString();//件数
str += "&start-index="+(cnt*_results+1).toString();//インデックス
str += "&v=2";
//var loader:URLLoader = new URLLoader();
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE,onComplete);
var url:URLRequest = new URLRequest(str);
loader.load(url);
cnt++;
}
public function getImage(id:String,num:int=1):Sprite{
var loader:Loader;
loader = new Loader();
//const req:String = "http://www.ozworks.dip.jp/img/01/1426006.png";
const str1:String = "http://i.ytimg.com/vi/";
const str3:String = "/default.jpg";
const str4:String = "/0.jpg";
var req2:String;
switch(num){
case 0:
req2 = str1+id+str4;
break;
case 1:
req2 = str1+id+"/default.jpg";
break;
}
loader.load(new URLRequest(req2));//youtubeプレイヤー読み込み
var s:Sprite = new Sprite();
s.addChild(loader);
return s;
}
public var _xml:String;
private function onComplete(e:Event):void{
loader.removeEventListener(Event.COMPLETE,onComplete);
var res:XML = new XML(e.target.data);
var list:XMLList = res.children();
//var str:String = "";
var cnt:int=0;
for(var i:int=0;i<list.length();i++){
if(list[i].localName()!="entry")continue;
var list3:XMLList = list[i].elements();
for(var j:int=0;j<list3.length();j++){
if(list3[j].localName()=="title"){ //タイトル抽出
//str += list3[j].text()+"\n";
var title:String = new String();
title += list3[j].text();
titleList.push(title);
}
else if(list3[j].localName()=="id"){ //ID抽出
var str3:String = list3[j].text();
var n:int = str3.indexOf("video:")+6;
//var n:int = str3.indexOf("videos/")+7;
var id:String = str3.substring(n);
//str += id+"\n";
idList.push(id);
}
else if(list3[j].localName()=="author"){//投稿者名
var str4:String;
var list2:XMLList = list3[j].elements();
str4 = list2[0].text();
authorList.push(str4);
}
else if(list3[j].localName()=="group"){//再生時間
var str5:String = list3[j].toXMLString();
var n2:int = str5.indexOf('duration="')+10;
var n3:int = str5.indexOf('"',n2);
var n4:int = parseInt(str5.substring(n2,n3));
durationList.push(n4);
}//*/
}
//str += list3.elements("id").toXMLString()+"\n\n";
//str += i.toString()+" "+list[i].localName()+"\n";
//str += list[i].toXMLString()+"\n\n";
//str += "\n";
_xml = res.toXMLString();
}
//コンプリートイベント発行
var event:Event = new Event(Event.COMPLETE);
this.dispatchEvent(event);
}
}
//}
import flash.display.*;
import flash.net.*;
import flash.system.*;
import flash.events.*;
import flash.text.*;
class TubePlayer extends Sprite{
private var WIDTH:int = 320;
private var HEIGHT:int= 240;
private var player:Object;
//private var players:Array;
private var _state:int = -1;//プレイヤー状態
private var txt:TextField;
public function TubePlayer():void{
var loader:Loader;
loader = new Loader();
Security.loadPolicyFile('http://www.youtube.com/crossdomain.xml');
loader.contentLoaderInfo.addEventListener(Event.INIT, onLoaderInit);
const req:String = "http://www.youtube.com/apiplayer?enablejsapi=1&version=3";
loader.load(new URLRequest(req));//youtubeプレイヤー読み込み
txt = new TextField();
txt.textColor = 0x00ff00;
}
public function resize(w:int,h:int):void{
WIDTH = w;
HEIGHT = h;
if(player != null){
player.setSize(WIDTH, HEIGHT);//サイズ
}
}
//ローダー初期化
private function onLoaderInit(e:Event):void{
var loader:Loader = e.currentTarget.loader;
loader.content.addEventListener("onReady", onPlayerReady);
loader.content.addEventListener("onStateChange",onChangeState);
addChild(loader);
//addChild(txt);
}
public function load(id:String):void{
player.clearVideo();
player.cueVideoById(id);//動画ID
txt.appendText(id);
}
public function play(id:String=null):void{
if(id!=null)load(id);
player.playVideo();//再生
}
public function pause():void{
player.pauseVideo();
}
public function stop():void{
player.clearVideo();
}
public function get seek():Number{
return player.getDuration();
}
public function set seek(time:Number):void{
player.seekTo(time);
}
public function get length():Number{
return player.getDuration();
}
public function get state():int{
return _state;
}
//プレイヤー設定
private function onPlayerReady(e:Event):void{
player = e.currentTarget;
player.setSize(WIDTH, HEIGHT);//サイズ
graphics.beginFill(0x000000);
graphics.drawRect(0,0,WIDTH,HEIGHT);
graphics.endFill();
}
//動画ステータス変化
private function onChangeState(e:Event):void{
_state = player.getPlayerState()
txt.appendText(_state.toString()+":");
//動画終了
if(state == 0){
txt.appendText("stop");
}
else if(_state == 1){
txt.appendText("play");
}
else if(_state == 2){
txt.appendText("pause");
}
//バッファリング中
else if(_state == 3){
txt.appendText("loading.....");
}
else if(_state == 5){//頭出し済み
txt.appendText("loading.....");
}
txt.appendText("\n");
txt.scrollV = txt.maxScrollV;
}
}//class
//}//package
/* ------------------------------------------------------------------------------------------------
* MiniChat
* ------------------------------------------------------------------------------------------------
*/
//package {
import com.bit101.components.PushButton;
import com.bit101.components.Style;
import flash.display.*;
import flash.events.*;
import flash.filters.*;
import flash.net.*;
import flash.media.*;
import flash.text.*;
import flash.ui.Keyboard;
import net.user1.logger.Logger;
import net.user1.reactor.IClient;
import net.user1.reactor.Reactor;
import net.user1.reactor.ReactorEvent;
import net.user1.reactor.Room;
import net.user1.reactor.RoomEvent;
import net.user1.reactor.UpdateLevels;
//public
class MiniChat extends Sprite {
private var _so:SharedObject;
private var _isReactorShared:Boolean;
private var _reactor:Reactor;
private var _roomID:String;
private var _room:Room;
private var _messageLogSize:int;
private var _messages:Vector.<String>;
// ステータスバー
private var _title:String;
private var _statusBar:TextField;
private var _minimizeButton:PushButton;
// ウインドウ
private var _window:Sprite;
private var _messageDisplay:TextField;
private var _nameInput:TextField;
private var _messageInput:TextField;
private var _bar:ScrollBar;
private var color1:uint = 0x00aaff;
public var player:TubePlayer;
public function MiniChat(roomID:String, args:Object = null) {
var now:Date = new Date();
updateTime = now.getTime();
_so = SharedObject.getLocal("MiniChat");
if (!_so.data.name) { _so.data.name = "名無し"; }
if (!args) { args = { }; }
var logSize:int = ("logSize" in args) ? args["logSize"] : 10;
var textColor:uint = ("textColor" in args) ? args["textColor"] : 0xFFFFFF;
var backgroundColor:uint = ("backgroundColor" in args) ? args["backgroundColor"] : 0x404040;
var defaultUserName:String = ("defaultUserName" in args) ? args["defaultUserName"] : _so.data.name;
var initiallyMinimized:Boolean = ("initiallyMinimized" in args) ? args["initiallyMinimized"] : false;
var draggable:Boolean = ("draggable" in args) ? args["draggable"] : true;
var minimizable:Boolean = ("minimizable" in args) ? args["minimizable"] : true;
var renamable:Boolean = ("renamable" in args) ? args["renamable"] : true;
_isReactorShared = ("reactor" in args) ? true : false;
_reactor = (_isReactorShared) ? args["reactor"] : new Reactor();
_roomID = roomID;
_messageLogSize = Math.max(1, logSize);
_messages = new Vector.<String>();
_title = ("title" in args) ? args["title"] : "現在の閲覧者数";
// MinimalcompsのStyleを一時保存してから変更する
var tempEmbedFonts:Boolean = Style.embedFonts;
var tempFontName:String = Style.fontName;
var tempFontSize:Number = Style.fontSize;
Style.embedFonts = false;
Style.fontName = "_sans";
Style.fontSize = 12;
// UIの作成
_messageDisplay = createMessageDisplay(logSize);
_window = createWindow(_messageDisplay.height);
player = new TubePlayer();
_window.addChild(player);
player.y = -20;
addChild(_window);
_window.addChild(_messageDisplay);
addChild(_statusBar = createStatusBar(draggable, textColor, backgroundColor));
_nameInput = createInputText(0, _window.height - 40, 60, 8, defaultUserName);
if (renamable) {
_window.addChild(_nameInput);
_window.addChild(_messageInput = createInputText(60, _nameInput.y, 170, 50, ""));
}else {
_window.addChild(createSayLabel(_window.height - 19));
_window.addChild(_messageInput = createInputText(31, _window.height - 19, 200, 50, ""));
}
player.resize(_window.width,_window.height);
_messageInput.addEventListener(KeyboardEvent.KEY_DOWN, sendMessage);
// MinimalcompsのStyleを元に戻す
Style.embedFonts = tempEmbedFonts;
Style.fontName = tempFontName;
Style.fontSize = tempFontSize;
if (minimizable) { addChild(_minimizeButton = createMinimizeButton()); }
if (initiallyMinimized) { minimize(); }
addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
addEventListener(Event.REMOVED_FROM_STAGE, removedFromStageHandler);
_bar = new ScrollBar();
_bar.setTF(_messageDisplay);
//_window.addChild(_bar);
}
//ステータスバー
private function createStatusBar(draggable:Boolean, textColor:uint, backgroundColor:uint):TextField {
var result:TextField = new TextField();
result.width = 232; result.height = 20;
var format:TextFormat = new TextFormat("_sans", 10, color1);
format.align = TextFormatAlign.CENTER;
result.defaultTextFormat = format;
//result.background = true; result.backgroundColor = backgroundColor;
result.filters = [new BevelFilter(1, 45, 0xFFFFFF, 0.8, 0x000000, 0.8, 1, 1)];
result.mouseEnabled = result.selectable = false;
if (draggable) {
result.mouseEnabled = true;
result.addEventListener(MouseEvent.MOUSE_DOWN, startDragHandler);
result.addEventListener(MouseEvent.MOUSE_UP, stopDragHandler);
}
return result;
}
private function startDragHandler(e:MouseEvent):void { startDrag(); }
private function stopDragHandler(e:MouseEvent):void { stopDrag(); }
//最小化ボタン
private function createMinimizeButton():PushButton {
var result:PushButton = new PushButton(null, 215, 3, "-", minimize);
result.width = result.height = 14; result.draw();
return result;
}
//ウィンドウ
private function createWindow(messageDisplayHeight:int):Sprite {
var result:Sprite = new Sprite();
result.y = 20;
result.graphics.beginFill(0x000080, 0.1);
result.graphics.drawRect(0, 0, 232-20, messageDisplayHeight + 20);
result.graphics.endFill();
var glow:Shape = new Shape();
glow.graphics.beginFill(0x0);
glow.graphics.drawRect(0,-20,232,messageDisplayHeight + 40);
glow.graphics.endFill();
glow.filters = [new GlowFilter(color1, 0.5, 2, 1, 5, 8, false, true)];
result.addChild(glow);
result.mouseEnabled = true;
//result.addEventListener(MouseEvent.MOUSE_DOWN, startDragHandler);
//result.addEventListener(MouseEvent.MOUSE_UP, stopDragHandler);
return result;
}
private var mesBase:Sprite;
//メッセージ欄
private function createMessageDisplay(logSize:int):TextField {
var result:TextField = new TextField();
result.width = 232;
result.defaultTextFormat = new TextFormat("_sans", 12, color1);
result.filters = [new DropShadowFilter(0, 0, 0x000055, 3,3,2,2)];
result.mouseEnabled = result.selectable = false;
result.wordWrap = true;
for (var i:int = 0; i < logSize; i++) {
result.appendText(i + "\n");
}
result.height = result.textHeight + 4; result.text = "";
mesBase = new Sprite();
mesBase.graphics.beginFill(0x000000);
mesBase.graphics.drawRect(0,0,result.width,result.height);
mesBase.graphics.endFill();
return result;
}
//入力ボックス
private function createInputText(x:int, y:int, width:int, maxChars:int, text:String):TextField {
var result:TextField = new TextField();
result.x = x; result.y = y;
result.width = width; result.height = 18;
result.defaultTextFormat = new TextFormat("_sans", 10, 0x00aaff);
//result.background = true; result.backgroundColor = 0x0033aa;
result.border = true;result.borderColor=0x00aaff;
result.filters = [new BevelFilter(1, 225, 0xC0C0C0, 1, 0x404040, 1, 1, 1)];
result.maxChars = maxChars;
result.selectable = true;
result.type = TextFieldType.INPUT;
result.text = text;
return result;
}
private function createSayLabel(y:int):TextField {
var result:TextField = new TextField();
result.x = 1; result.y = y;
result.width = 30; result.height = 18;
result.defaultTextFormat = new TextFormat("_sans", 10, 0xFFFFFF, null, null, null, null, null, TextFormatAlign.CENTER);
result.filters = [new GlowFilter(0x000000, 1, 2, 2)];
result.mouseEnabled = result.selectable = false;
result.text = "発言:";
return result;
}
private function addedToStageHandler(event:Event):void {
_reactor.addEventListener(ReactorEvent.READY, joinRoom);
_reactor.addEventListener(ReactorEvent.CLOSE, leaveRoom);
leaveRoom();
if (_isReactorShared) {
if (_reactor.isReady()) { joinRoom(); }
} else {
_reactor.getConnectionMonitor().setAutoReconnectFrequency(5000);
_reactor.getLog().setLevel(Logger.FATAL);
_reactor.connect("ozworks.dip.jp", 9100);
}
}
private function removedFromStageHandler(event:Event):void {
_reactor.removeEventListener(ReactorEvent.READY, joinRoom);
_reactor.removeEventListener(ReactorEvent.CLOSE, leaveRoom);
leaveRoom();
if (!_isReactorShared) { _reactor.disconnect(); }
}
private function joinRoom(event:ReactorEvent = null):void {
var updateLevels:UpdateLevels = new UpdateLevels();
updateLevels.clearAll();
updateLevels.occupantCount = updateLevels.roomMessages = true;
_room = _reactor.getRoomManager().createRoom(_roomID);
roomOccupantCountHandler();
_room.addEventListener(RoomEvent.OCCUPANT_COUNT, roomOccupantCountHandler);
_room.addMessageListener("CHAT_MESSAGE", receiveMessage);
_room.join(null, updateLevels);
}
private function roomOccupantCountHandler(event:RoomEvent = null):void {
_statusBar.text = _title + " " + _room.getNumOccupants() + "人";
alart1();
}
private function leaveRoom(event:ReactorEvent = null):void {
if (_room) {
_room.removeEventListener(RoomEvent.OCCUPANT_COUNT, roomOccupantCountHandler);
_room.removeMessageListener("CHAT_MESSAGE", receiveMessage);
_room.leave();
}
_statusBar.text = "サーバーに接続中...";
}
//メッセージ送信
private function sendMessage(event:KeyboardEvent):void {
var now:Date = new Date();
updateTime = now.getTime();
if (!_reactor.isReady() || event.keyCode != Keyboard.ENTER || _messageInput.text == "") { return; }
_room.sendMessage("CHAT_MESSAGE", true, null, _nameInput.text, _messageInput.text);
_so.data.name = _nameInput.text;
_messageInput.text = "";
}
//メッセージ受信
private function receiveMessage(from:IClient, senderName:String, messageText:String):void {
_messages.push(senderName + ": " + messageText);
if (_messages.length > _messageLogSize) { _messages.shift(); }
_messageDisplay.appendText(senderName + ": " + messageText + "\n");
_messageDisplay.scrollV = _messageDisplay.maxScrollV;
//_messageDisplay.text = "";
/*var messagesLength:int = _messages.length;
for (var i:int = 0; i < messagesLength; i++) {
_messageDisplay.appendText(_messages[i] + "\n");
}*/
_bar.onKey();
alart1();
}
private function minimize(event:MouseEvent = null):void {
_window.visible = !_window.visible;
if (_minimizeButton) { _minimizeButton.label = (_window.visible) ? "-" : "+"; }
}
private function alart1():void{
var now:Date = new Date();
if(updateTime+1000*120 < now.getTime()){
playSnd("http://ozworks.dip.jp/sound/l.mp3");
updateTime = now.getTime();
}
}
private var updateTime:Number;
private var sndList:Array = new Array();
private function playSnd(url:String):void{
if(sndList[url]==null){
var req:URLRequest = new URLRequest(url)
var sound:Sound = new Sound(req);
sndList[url]=sound;
}
sndList[url].play();
}
}
//}
////////////////////////////////////////////////////////////////////////////////
// ScrollBarクラス
////////////////////////////////////////////////////////////////////////////////
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.text.*;
class ScrollBar extends Sprite {
public var id:uint;
private static var _width:uint = 16;
private var _height:uint;
private var track:Sprite;
private var thumb:Sprite;
private var base:Shape;
private var handle:Shape;
private static var bColor:uint = 0x333333;
private static var tColor:uint = 0x000000;
private static var hColor:uint = 0x999999;
private static var upColor:uint = 0x333333;
private static var overColor:uint = 0x444444;
private static var offColor:uint = 0xCCCCCC;
private static var upColorTrans:ColorTransform;
private static var overColorTrans:ColorTransform;
private static var offColorTrans:ColorTransform;
private static var minHeight:uint = 20;
private var maxHeight:uint;
private var thumbHeight:uint = minHeight;
private var target:DisplayObject;
private var rect:DisplayObject;
private var clickPos:Number;
private var basePos:int;
private var _enabled:Boolean = true;
private var txt:TextField;
public function ScrollBar() {
init();
}
public function setTF(tf:TextField):void{
txt = tf;
txt.addEventListener(Event.CHANGE,onChange);
txt.addEventListener(KeyboardEvent.KEY_DOWN,onKey);
txt.addEventListener(KeyboardEvent.KEY_UP,onKey);
tf.parent.addChild(this);
onChange();
}
public function onKey(e:KeyboardEvent=null):void{
onChange();
var pos:Number = maxHeight*(txt.scrollV / txt.maxScrollV);
if (txt.scrollV == 1) pos = 0;
if (txt.maxScrollV == txt.scrollV) pos = maxHeight;
thumb.y = pos;
e.updateAfterEvent();
}
public function onChange(e:Event = null):void{
this.x = txt.x+txt.width -_width;
this.y = txt.y;
_height = txt.height;
var n:Number;
if(txt.height<txt.textHeight){
n = txt.height/txt.textHeight;
txt.parent.addChild(this);
}
else{
n = 1;
txt.parent.removeChild(this);
}
thumbHeight = Math.max(minHeight,_height*n);
maxHeight = _height - thumbHeight;
if (thumb.y < 0) thumb.y = 0;
if (thumb.y > maxHeight) thumb.y = maxHeight;
createTrack(_width,_height);
createThumb(_width,thumbHeight);
}
private function init():void {
upColorTrans = new ColorTransform();
upColorTrans.color = upColor;
overColorTrans = new ColorTransform();
overColorTrans.color = overColor;
offColorTrans = new ColorTransform();
offColorTrans.color = offColor;
//*/
track = new Sprite();
thumb = new Sprite();
base = new Shape();
handle = new Shape();
addChild(track);
addChild(thumb);
enabled = true;
thumb.mouseChildren = false;
}
private function rollOver(evt:MouseEvent):void {
_over();
}
private function rollOut(evt:MouseEvent):void {
_up();
}
private function press(evt:MouseEvent):void {
_down();
thumb.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
stage.addEventListener(MouseEvent.MOUSE_UP, releaseOutside, false, 0, true);
stage.addEventListener(Event.MOUSE_LEAVE, leave, false, 0, true);
clickPos = thumb.mouseY;
stage.addEventListener(MouseEvent.MOUSE_MOVE, drag, false, 0, true);
}
private function release(evt:MouseEvent):void {
_up();
thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
stage.removeEventListener(Event.MOUSE_LEAVE, leave);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
}
private function releaseOutside(evt:MouseEvent):void {
_up();
thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
stage.removeEventListener(Event.MOUSE_LEAVE, leave);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
}
private function leave(evt:MouseEvent):void {
_up();
thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
stage.removeEventListener(Event.MOUSE_LEAVE, leave);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
}
private function drag(evt:MouseEvent):void {
var position:Number = mouseY - clickPos;
if (position < 0) position = 0;
if (position > maxHeight) position = maxHeight;
thumb.y = position;
txt.scrollV = Math.round(txt.maxScrollV*(position/maxHeight));
evt.updateAfterEvent();
}
private function click(evt:MouseEvent):void {}
private function _up():void {
base.transform.colorTransform = upColorTrans;
}
private function _over():void {
base.transform.colorTransform = overColorTrans;
}
private function _down():void {
base.transform.colorTransform = overColorTrans;
}
private function _off():void {
base.transform.colorTransform = offColorTrans;
}
public function get enabled():Boolean {
return _enabled;
}
public function set enabled(param:Boolean):void {
_enabled = param;
thumb.buttonMode = _enabled;
thumb.mouseEnabled = _enabled;
thumb.useHandCursor = _enabled;
track.mouseEnabled = _enabled;
if (_enabled) {
_up();
thumb.addEventListener(MouseEvent.MOUSE_OVER, rollOver, false, 0, true);
thumb.addEventListener(MouseEvent.MOUSE_OUT, rollOut, false, 0, true);
thumb.addEventListener(MouseEvent.MOUSE_DOWN, press, false, 0, true);
track.addEventListener(MouseEvent.CLICK, click, false, 0, true);
} else {
_off();
thumb.removeEventListener(MouseEvent.MOUSE_OVER, rollOver);
thumb.removeEventListener(MouseEvent.MOUSE_OUT, rollOut);
thumb.removeEventListener(MouseEvent.MOUSE_DOWN, press);
track.removeEventListener(MouseEvent.CLICK, click);
}
}
private function createThumb(w:uint, h:uint):void {
thumb.addChild(base);
thumb.addChild(handle);
handle.y = uint(h/2);
base.graphics.clear();
base.graphics.beginFill(tColor);
base.graphics.drawRect(0, 0, w, h);
base.graphics.endFill();
handle.graphics.clear();
handle.graphics.beginFill(hColor);
handle.graphics.drawRect(w/4, -4, w/2, 1);
handle.graphics.endFill();
handle.graphics.beginFill(hColor);
handle.graphics.drawRect(w/4, -2, w/2, 1);
handle.graphics.endFill();
handle.graphics.beginFill(hColor);
handle.graphics.drawRect(w/4, 0, w/2, 1);
handle.graphics.endFill();
handle.graphics.beginFill(hColor);
handle.graphics.drawRect(w/4, 2, w/2, 1);
handle.graphics.endFill();
}
private function createTrack(w:uint, h:uint):void {
track.graphics.clear();
track.graphics.beginFill(bColor,0.5);
track.graphics.drawRect(0, 0, w, h);
track.graphics.endFill();
}
}