Вложений: 1
да.. Видимо рановато про CS4 ещё спрашивать что либо :bb:
Пробывал выделять текст в text.engine. Больше времени потратил на подсветку выделения!
Код:
package {
import flash.display.Sprite;
import flash.text.engine.*;
import flash.events.MouseEvent;
import flash.events.EventDispatcher;
import flash.ui.Mouse;
import flash.geom.Rectangle;
import flash.geom.Point;
import LoaderExample;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
public class TextLineMirrorRegionExample extends Sprite {
var myEvent:EventDispatcher=new EventDispatcher ;
var fontDescription:FontDescription=new FontDescription ;
var textBlock:TextBlock=new TextBlock ;
var aD:Number;
var aM:Number;
var aU:Number;
var aDline:Number;
var aMline:Number;
var aUline:Number;
var beginLine:TextLine;
var endLine:TextLine;
var lineWidth:Number=250;
var xPos:Number=55;
var yPos:Number=80;
var select:Sprite;
var label:TextField;
var textLabel:String="Выделенный текст=";
public function TextLineMirrorRegionExample():void {
fontDescription.fontWeight="bold";
var blackFormat:ElementFormat=new ElementFormat ;
blackFormat.fontSize=18;
blackFormat.color=0x000000;
blackFormat.fontDescription=fontDescription;
var textElement1=new TextElement("aD- atom in TextBlok (mouseDown)!!!!!!!!!!!!",blackFormat);
var textElement2=new TextElement("aM- atom in TextBlok (mouseMove)!!!!!!!!!!!!",blackFormat);
var textElement3=new TextElement("aU- atom in TextBlok (mouseUp)!!!!!!!!!!!!!!",blackFormat);
var textElement4=new TextElement("aDline, aMline, aUline- позиция атомов относительно их линии (D-нажатие, M-наведение, U-отпускание)",blackFormat);
var textElement5=new TextElement("select- спрайт с выделением линии. PS немного касячет подсветка при выделение снизу",blackFormat);
label=createLabel();
label.y=10;
label.x=330;
label.autoSize=TextFieldAutoSize.LEFT;
label.wordWrap=true;
addChild(label);
var box=new LoaderExample ;
box.load('1.swf');
var graphicElement:GraphicElement=new GraphicElement(box,20,20,blackFormat);
myEvent.addEventListener("mouseOut",mouseOutHandler);
myEvent.addEventListener("mouseOver",mouseOverHandler);
myEvent.addEventListener("mouseUp",mouseUpHandler);
myEvent.addEventListener("mouseDown",mouseDownHandler);
myEvent.addEventListener("mouseMove",mouseMoveHandler);
var groupVector:Vector.<ContentElement>=new Vector.<ContentElement> ;
groupVector.push(textElement1,textElement2,textElement3,graphicElement,textElement4,textElement5);
var groupElement:GroupElement=new GroupElement(groupVector);
groupElement.eventMirror=myEvent;
textBlock.content=groupElement;
createLines(textBlock);
}
private function createLabel():TextField {
var txtField:TextField=new TextField ;
txtField.text=textLabel;
return txtField;
}
private function mouseOverHandler(event:MouseEvent):void {
Mouse.cursor="ibeam";
}
private function mouseOutHandler(event:MouseEvent):void {
Mouse.cursor="arrow";
}
private function mouseUpHandler(event:MouseEvent):void {
var line:TextLine=event.target as TextLine;
var AL:Number=line.getAtomIndexAtPoint(event.stageX,event.stageY);
var AB:Number=line.getAtomTextBlockBeginIndex(0)+AL;
aUline=AL;
aMline=AL;
aU=AB;
if (aD<aU) {//достаём выделенный текст, а всё остальное лишь подсветка выделения
label.text=textLabel+line.textBlock.content.rawText.substr(aD,aU-aD);
} else {
label.text=textLabel+line.textBlock.content.rawText.substr(aU,aD-aU);
}
showAtoms(line,AL);
endLine=line;
if (aD==aU) {
removeAtoms();
} else {
showAtoms2(beginLine,line);
}
}
private function mouseDownHandler(event:MouseEvent):void {
removeAtoms();
var line:TextLine=event.target as TextLine;
var AL:Number=line.getAtomIndexAtPoint(event.stageX,event.stageY);
var AB:Number=line.getAtomTextBlockBeginIndex(0)+AL;
aDline=AL;
aD=AB;
showAtoms(line,AL);
beginLine=line;
}
private function mouseMoveHandler(event:MouseEvent):void {
if (event.buttonDown) {
var line:TextLine=event.target as TextLine;
var AL:Number=line.getAtomIndexAtPoint(event.stageX,event.stageY);
var AB:Number=line.getAtomTextBlockBeginIndex(0)+AL;
aMline=AL;
aM=AB;
endLine=line;
showAtoms(line,AL);
showAtoms2(beginLine,line);
}
}
private function showAtoms(textLine,begin):void {
var bounds:Rectangle=textLine.getAtomBounds(begin);
drawLineShadow(textLine,bounds.left,bounds.top,bounds.width,bounds.height);
}
private function showAtoms2(begin,end):void {
removeAtoms();
var beginR:Rectangle=begin.getAtomBounds(aDline);
var endR:Rectangle=end.getAtomBounds(aMline);
if (aD>aU) {//если атом на который нажали дальше, то меняем местами
var tTemp:TextLine=begin;
begin=end;
end=tTemp;
trace(aDline);
beginR=end.getAtomBounds(aMline);
endR=begin.getAtomBounds(aDline);
}
var tLine:TextLine=begin;
var tR:Rectangle=tLine.getAtomBounds(0);
if (end!=begin) {//первая линия
drawLineShadow(tLine,beginR.left,tR.top,tLine.textWidth-beginR.left,tLine.textHeight);
tLine=tLine.nextLine;
} else {
drawLineShadow(tLine,beginR.left,tR.top,endR.left-beginR.left,tLine.textHeight);
}
while (tLine!=end) {//промежуточные линии
tR=tLine.getAtomBounds(0);
drawLineShadow(tLine,tR.left,tR.top,tLine.textWidth,tLine.textHeight);
tLine=tLine.nextLine;
}
if (end!=begin) {//если выделили больше одной линии
if (tLine==end) {//последняя линия
tR=tLine.getAtomBounds(0);
drawLineShadow(tLine,tR.left,tR.top,endR.left,tLine.textHeight);
}
}
}
private function drawLineShadow(tLine,l,t,w,h):void {
var box:Sprite=new Sprite ;
var mcGraphics=box.graphics;
mcGraphics.beginFill(0x00FF00,0.3);
mcGraphics.drawRect(l,t,w,h);
mcGraphics.endFill();
//добавляем зелёного ребёнка чтобы узнать положение линии
// может кто другой вариант предложит?
tLine.addChild(box);
var cPoint:Point=box.localToGlobal(new Point(box.x,box.y));
box.x=cPoint.x-xPos;
box.y=cPoint.y-yPos;
tLine.removeChildAt(tLine.numChildren-1);
select.addChild(box);
}
private function removeAtoms():void {
while (select.numChildren) {
select.removeChildAt(0);
}
}
private function createLines(textBlock:TextBlock):void {
select=new Sprite ;
select.x=xPos;
select.y=yPos;
addChild(select);
var purgeLine:TextLine=textBlock.firstLine;
while (purgeLine) {
removeChild(purgeLine);
purgeLine=purgeLine.nextLine;
}
var yP:Number=yPos;
var textLine:TextLine=textBlock.createTextLine(null,lineWidth);
while (textLine) {
textLine.x=xPos;
textLine.y=yP;
yP+=textLine.height+2;
addChild(textLine);
textLine=textBlock.createTextLine(textLine,lineWidth);
}
}
}
}
Думаю, я тут перемудрил с позициями линий :away:
Завтра попробую другим методом подсветить выделение.
|