| Dukobpa3 |
28.11.2010 20:38 |
Насобирал исходники.
Вот это класс окна в котором всё происходит.
Код AS3:
private var barPane:MovieClip;
private var barTable:Vector.<Vector.<Object>>;
private var barHeight:int = 0;
private function initBar(obj:Object):void {
barTable = new Vector.<Vector.<Object>>();
for (var r:int = 0; r < obj.serverInfo.totalCount; r++ ) {
barTable[r] = new Vector.<Object>(7, true);
//image
barTable[r][0] = new Object();
var _request:URLRequest = new URLRequest(SERVER + "Picture/Bar/Beer/" + obj.serverInfo.initialData[r][4]);
var loader:Loader = new Loader();
loader.load(_request);
barTable[r][0].link = new Sprite();
barTable[r][0].loader = loader;
barTable[r][0].img = obj.serverInfo.initialData[r][4];
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, drawImages);
//title/text
var titleText:MovieClip = new MovieClip();
var title:AdvTextField = new AdvTextField();
title.text = obj.serverInfo.initialData[r][0];
title.width = 600;
title.height = 20;
title.setHtmlFormat("HelveticaR", 0x000000, 18);
titleText.addChild(title);
var text:AdvTextField = new AdvTextField();
text.text = obj.serverInfo.initialData[r][1];
text.width = 500;
text.height = 160;
text.setHtmlFormat("HelveticaR", 0x000000, 12, "justify");
text.y = 30;
titleText.addChild(text);
barTable[r][1] = new Object();
barTable[r][1].link = titleText;
//cost
var costTable:MovieClip = new MovieClip();
var tfY:int = 10;
for (var i:int = 0 ; i < 3 ; i ++) {
var tf:AdvTextField = new AdvTextField();
tf.text = obj.serverInfo.initialData[r][5 + i]
tf.y = tfY;
tf.width = 40;
tf.setHtmlFormat("HelveticaR", 0x000000, 14, "right");
costTable.addChild(tf);
var tf1:AdvTextField = new AdvTextField();
tf1.text = obj.serverInfo.initialData[r][8 + i]
tf1.y = tfY;
tf1.x = 60;
tf1.width = 50;
tf1.setHtmlFormat("HelveticaR", 0x000000, 14, "left");
costTable.addChild(tf1);
tfY += 35;
}
var div:Shape = new Shape();
div.graphics.lineStyle(2, 0xffffff, 0.4);
div.graphics.moveTo(50, 15);
div.graphics.lineTo(50, 90);
costTable.addChild(div);
barTable[r][2] = new Object();
barTable[r][2].link = costTable;
}
drawBar();
}
private function drawBar():void {
barPane = new MovieClip();
barPane.scrollRect = new Rectangle(0, 0, 800, 480);
barHeight = -480;
//это скроллинг, функцию не привожу.
this.parent.stage.addEventListener(MouseEvent.MOUSE_WHEEL, scrollWheel);
var currY:int = 0;
for (var r:int = 0; r < barTable.length ; r++ ) {
//var tempRow:MovieClip = new MovieClip();
//tempRow.x = 85;
//tempRow.addChild(new Panel(775, 155, 0xffffff, 0.4));
var tempRow:Panel = new Panel(775, 155, 0xffffff, 0.4);
barTable[r][0].link.x = 10;
barTable[r][0].link.y = 10;
tempRow.addChild(barTable[r][0].link);
barTable[r][1].link.x = 150;
barTable[r][1].link.y = 10;
//barTable[r][1].link.height = 160;
tempRow.addChild(barTable[r][1].link);
barTable[r][2].link.x = 655;
barTable[r][2].link.y = 25;
tempRow.addChild(barTable[r][2].link);
tempRow.updateHeight(155);
tempRow.y = currY;
currY += tempRow.height + 10;
barHeight += tempRow.height + 5;
barPane.addChild(tempRow);
tempRow.addEventListener(MouseEvent.DOUBLE_CLICK, setactiveBeerRow);
tempRow.doubleClickEnabled = true;
var pane:Panel = new Panel(100, 20);
var tf:AdvTextField = new AdvTextField();
tf.text = "Картинка"
tf.height = 15;
tf.width = 100;
tf.x = 5;
//tf.y = 5;
pane.addChild(tf);
var butBrowse:UniversalButton = new UniversalButton(pane, false, false, browseImage);
butBrowse.name = String(r);
tempRow.addChild(butBrowse);
butBrowse.x = 10;
butBrowse.y = 160;
}
barPane.x = 75;
barPane.y = 196;
this.addChild(barPane);
drawButtons();
pane = new Panel(100, 20);
tf = new AdvTextField();
tf.text = "Сохранить"
tf.height = 15;
tf.width = 100;
pane.addChild(tf);
var butApproove:UniversalButton = new UniversalButton(pane, false, false, saveEditBar);
this.addChild(butApproove);
butApproove.x = this.width - 220;
butApproove.y = 173;
butApproove.name = "saveBar";
pane = new Panel(20, 20);
tf = new AdvTextField();
tf.text = "+"
tf.height = 15;
tf.width = 15;
tf.x = 5;
//tf.y = 5;
pane.addChild(tf);
var butAdd:UniversalButton = new UniversalButton(pane, false, false, addRowBar);
this.addChild(butAdd);
butAdd.x = this.width - 110;
butAdd.y = 173;
butAdd.name = "addBar";
//********************
}
private function setactiveBeerRow(e:MouseEvent):void {
trace(e.target);
var pane:Panel = e.target as Panel;
var child:DisplayObject;
for (var i:int = 0; i < pane.numChildren; i++)
{
child = pane.getChildAt(i);
if (!(child is MovieClip)) continue;
for (var c:int = 0; c < (child as MovieClip).numChildren ; c++)
{
var childChild:DisplayObject = (child as MovieClip).getChildAt(c);
if (childChild is AdvTextField) {
if ((childChild as AdvTextField).selectable == true) continue;
(childChild as AdvTextField).selectable = true;
(childChild as AdvTextField).type = TextFieldType.INPUT;
(childChild as AdvTextField).border = true;
(childChild as AdvTextField).background = true;
}
}
}
}
В нем фигурирует класс Panel - Это просто спрайт с заливкой, типа плашка на которой всё рисуется, чисто для визуального отображения.
Есть еще один интересный класс: AdvTextField - он екстендит текстфилд, и делает работу с хтмлТекстом в разы проще. Вот его код.
Код AS3:
package classes.utils.mytext
{
import classes.utils.mytext.*; // это просто просто пакет шрифтов. В этом классе только ряд эмбедов.
import flash.text.*;
/**
* ...
* @author Dukobpa3
*/
public class AdvTextField extends TextField
{
private static const HEX:String = "0123456789ABCDEF";
public var htmlColor:String;
public var htmlFont:String;
public var htmlSize:String;
public var htmlAlign:String;
private var htmlStyle:HtmlStyles = new HtmlStyles();
public function AdvTextField()
{
super();
embedFonts = true;
selectable = false;
wordWrap = true;
multiline = true;
width = 200;
height = 30;
this.antiAliasType = AntiAliasType.ADVANCED;
this.setHtmlFormat("HelveticaR", 0x000000, 12);
}
public function conText(s:String,font:String="HelveticaR",color:uint=0xFFFFFF,size:Number=12, align:String = "left"):void
{
this.text = s;
htmlFont = font;
htmlColor = stringARGB(color);
htmlSize = String(size);
htmlAlign = align;
refresh();
}
private static function getColor(num:Number):Object {
var ob:Object = {};
ob.a = num >> 24 & 0xFF;
ob.r = num >> 16 & 0xFF;
ob.g = num >> 8 & 0xFF;
ob.b = num & 0xFF;
return ob;
}
private static function getHex(n:Number):String {
return HEX.charAt((n >> 4) & 0xf) + HEX.charAt(n & 0xf);
}
private static function stringARGB(num:Number):String {
var col:Object = getColor(num);
var r:String = getHex(col.r);
var g:String = getHex(col.g);
var b:String = getHex(col.b);
return String("#" + r.concat(g, b));
}
override public function set textColor(_color:uint): void {
super.textColor = _color;
htmlColor = stringARGB(_color);
refresh();
}
override public function set text(_text:String): void {
super.text = _text;
refresh();
}
private function refresh():void {
this.htmlText = '<font face="' + htmlFont + '" color="' + htmlColor + '" size="' + htmlSize + '"><p align = "' + htmlAlign + '">' + this.text + '</p></font>';
}
public function setHtmlFormatObj(_format:Object):void {
htmlColor = stringARGB(_format.color);
htmlFont = _format.font;
htmlSize = String(_format.size);
htmlAlign = _format.align;
}
public function setHtmlFormat(font:String="HelveticaR",color:uint=0x000000,size:Number=12, align:String = "left"):void {
htmlColor = stringARGB(color);
htmlFont = font;
htmlSize = String(size);
htmlAlign = align;
refresh();
}
}
}
Поидее это всё что относится к вопросу.
Так вот когда я делаю даблклик по панели отрабатывает функция: setactiveBeerRow(e:MouseEvent):void - и делает все текстовые филды на панели вводимыми. Ну и вводить как было сказано в первом сообщении получается как-то проблематично - если до этого там был какой-то текст, то еще более-менее. Можно поставить курсор на уже введенный текст, а если поле пустое, то крайне геморно. Полагаю это из-за непечатаемого символа конца строки, и если я попадаю курсором на него то ничего не происходит, а если перед ним, то всё ок.
|