flash on 2014-5-19
スクロール画面追加
♥0 |
Line 194 |
Modified 2014-05-27 18:29:07 |
MIT License
archived:2017-03-20 03:16:17
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/u7b7
*/
//スクロール画面追加
package{
import flash.display.*;
import flash.ui.*;
public class Main extends Sprite{
public function Main(){
var ui:TreeUI = new TreeUI();
addChild(ui);
ui.x = 100;
var node:TreeNode = new TreeNode();
node.name="test";
node.add("test2\naaaaa");
node.add("test3\nggg\nhhh");
node.add("test3\nggg\nhhh");
var node2:TreeNode = new TreeNode();
node2.name ="a";
node2.addChild(node);
ui.node = node2;
ui.render();
graphics.clear();
graphics.beginFill(0xff0000);
graphics.drawRect(0,0,455,455);
graphics.endFill();
// コンテキストメニューオブジェクトを作成
var context_menu:ContextMenu = new ContextMenu();
// メニューアイテムを作成
var menu_item1:ContextMenuItem = new ContextMenuItem("表示テスト1");
var menu_item2:ContextMenuItem = new ContextMenuItem("表示テスト2");
// メニューアイテムを登録
context_menu.customItems = [menu_item1 , menu_item2];
ui.contextMenu = context_menu;
}
}
}
import flash.events.*;
import flash.text.*;
import flash.display.*;
import flash.geom.*;
import flash.ui.*;
class TreeUI extends Sprite{
private var rootTree:TreeNode = new TreeNode();
private var treeUI:Sprite = new Sprite();
private var pen:Pen = new Pen(treeUI.graphics);
public function TreeUI(){
rootTree.name="/";
addChild(treeUI);
rootTree.closed = false;
render();
this.addEventListener(MouseEvent.MOUSE_MOVE,onMove);
this.addEventListener(MouseEvent.MOUSE_OUT,onOut);
this.addEventListener(MouseEvent.MOUSE_DOWN,onDrag);
this.addEventListener(MouseEvent.MOUSE_UP,onDrop);
}
private function onOut(e:MouseEvent):void{
Mouse.cursor = MouseCursor.AUTO;
}
private function onMove(e:MouseEvent):void{
if(e.target == this)Mouse.cursor = MouseCursor.HAND;
else Mouse.cursor = MouseCursor.AUTO;
}
private function onDrag(e:MouseEvent):void{
if(e.target == this){
this.startDrag();
}
//this.startDrag();
}
private function onDrop(e:MouseEvent):void{
this.stopDrag();
}
public function set node(tree:TreeNode):void{
rootTree = tree;
render();
}
//描画処理
public function render():void {
treeUI.graphics.clear();
while (treeUI.numChildren > 0) treeUI.removeChildAt(0);
renderCell(rootTree, 0, 0);//ノード描画
this.graphics.clear();
this.graphics.lineStyle(0,0x0,0.5);
this.graphics.beginFill(0xffffff,0.8);
this.graphics.drawRect(-20,-5,this.width+40,this.height+10);
this.graphics.endFill();
}
private function renderCell(tree:TreeNode, x:Number, y:Number):Number {
var sy:Number = y;
var tui:TreeNodeUI = new TreeNodeUI(tree, x, y,this);
var h:Number = tui.height;
treeUI.addChild(tui);
y += h+5;
if (!tree.closed) {//子リストの描画
var n:Number = 10;
var vx:Number = x + 7;
var vy:Number = y;
for each(var child:TreeNode in tree.children) {
//pen.moveTo(vx, y+10);
pen.moveTo(vx, y+n);
pen.lineTo(vx + 10, y + n);//横線
//vy = y+10;
vy = y+n;
y = renderCell(child, x + 20, y);//子リスト
}
if(0<tree.children.length){
pen.moveTo(vx, sy+15);
pen.lineTo(vx, vy);//縦線
}
}
return y;
}
}
import com.bit101.components.PushButton;
class TreeNodeUI extends Sprite{
public var node:TreeNode;
public var treeUI:TreeUI;
private var _minBtn:PushButton;
private var tf:TextField;
public function TreeNodeUI(node:TreeNode,x:Number,y:Number,main:TreeUI) {
this.node = node;
this.treeUI = main;
tf = new TextField();
tf.autoSize = "left";
tf.text = node.name;
tf.backgroundColor = 0xffffff;
//tf.background =true;
tf.border=true;
addChild(tf);
if(0<node.length){
_minBtn = createMinBtn();
addChild(_minBtn);
tf.x = _minBtn.width+2;
}
this.x = x;
this.y = y;
}
//最小化ボタン
private function createMinBtn():PushButton {
var result:PushButton = new PushButton(null, 0, 3, "+", minimize);
result.width = result.height = 14; result.draw();
result.addEventListener(MouseEvent.CLICK,minimize);
result.label = (node.closed) ? "+" : "-";
return result;
}
private function minimize(event:MouseEvent = null):void {
node.closed = !node.closed;
treeUI.render();
if (_minBtn) {
_minBtn.label = (node.closed) ? "-" : "+";
}
}
}
class TreeNode {
public static var ID:int = 0;
public var parent:TreeNode;//親
public var closed:Boolean = true;//展開状態
public var name:String = "node" + (ID++);//表示名
private var _children:Vector.<TreeNode>;//子リスト
public function TreeNode(str:String=null){
if(str!=null)name=str;
_children= new Vector.<TreeNode>;
}
public function get length():int{
return _children.length;
}
public function get children():Vector.<TreeNode>{
//createChild();
return _children;
}
public function createChild():void{
if(_children==null){//ノードがなければ自動生成
var c:int = 2 + 5 * Math.random();
_children = new Vector.<TreeNode>;
while (c-- > 0) {
_children.push(new TreeNode);
}
}
}
public function addChild(t:TreeNode):void{
_children.push(t);
}
public function add(str:String):void{
var node:TreeNode = new TreeNode(str);
_children.push(node);
}
}
class Pen{
private var g:Graphics;
private var sx:Number;
private var sy:Number;
private var color:uint;
public function Pen(g:Graphics,c:uint=0x000000){
this.g = g;
this.color = c;
}
public function moveTo(x:Number, y:Number):void {
g.moveTo(x, y);
sx = x;
sy = y;
}
public function lineTo(x:Number, y:Number):void {
g.lineStyle(0,color);
g.lineTo(x, y);
sx = x;
sy = y;
}
}