Flex: изменение текстовой области
-
10-07-2019 - |
Вопрос
Я делаю текстовый редактор, используя область текста. Какой пользователь может изменить размер шрифта, семью и т. Д.
Это мой код как:
private function ChangeFont(event: Event):void
{
var mySelectedTextRange:TextRange = new TextRange(thistxtarea,true,
thistxtarea.selectionBeginIndex,
thistxtarea.selectionEndIndex);
mySelectedTextRange.fontSize = int(cmbbxFntSze.text);
thistxtarea.setFocus();
}
У меня есть это поле со списком для ввода желаемого размера шрифта:
<mx:ComboBox x="78" y="8" width="114" id="cmbbxFntFam" close="ChangeFont(event)"></mx:ComboBox>
Как изменить свойства шрифта, если текст внутри не выделен? Например, я помещаю указатель мыши на последний индекс текста внутри моей области текста и выбираю в поле со списком желаемый размер шрифта. Следующий размер шрифта буквы, вводимой в область текста, должен быть выбранным размером шрифта в поле со списком. Код, который я публикую, работает, только если я выделю нужный текст.
Решение
Это установить стиль
private function setTextStyles(type:String, value:Object = null):void
{
if(thisindex != -1)
{
var tf:TextFormat;
var beginIndex:int = textArea.getTextField().selectionBeginIndex;
var endIndex:int = textArea.getTextField().selectionEndIndex;
textArea.getTextField().alwaysShowSelection = true;
if (beginIndex == endIndex)
{
tf = previousTextFormat;
}
else
tf = new TextFormat();
if (type == "bold" || type == "italic" || type == "underline")
{
tf[type] = value;
}
else if (type == "align")
{
if (beginIndex == endIndex)
{
tf = new TextFormat();
}
// Apply the paragraph styles to the whole paragraph instead of just
// the selected text
beginIndex = textArea.getTextField().getFirstCharInParagraph(beginIndex) - 1;
beginIndex = Math.max(0, beginIndex);
endIndex = textArea.getTextField().getFirstCharInParagraph(endIndex) +
textArea.getTextField().getParagraphLength(endIndex) - 1;
tf[type] = value;
previousTextFormat[type] = value;
if (!endIndex)
textArea.getTextField().defaultTextFormat = tf;
}
else if (type == "font")
{
tf[type] = cmbbxFntFam.text;
}
else if (type == "size")
{
var fontSize:uint = uint(cmbbxFntSze.text);
if (fontSize > 0)
tf[type] = fontSize;
}
else if (type == "color")
{
tf[type] = uint(clrpckerFontColor.selectedColor);
}
textFormatChanged = true;
if (beginIndex == endIndex)
{
previousTextFormat = tf;
}
else
{
textArea.getTextField().setTextFormat(tf,beginIndex,endIndex);//textArea.setTextFormat(tf,beginIndex,endIndex);
}
dispatchEvent(new Event("change"));
var caretIndex:int = textArea.getTextField().caretIndex;
var lineIndex:int = textArea.getTextField().getLineIndexOfChar(caretIndex);
textArea.invalidateDisplayList();
textArea.validateDisplayList();
textArea.validateNow();
// Scroll to make the line containing the caret under viewable area
while (lineIndex >= textArea.getTextField().bottomScrollV)
{
textArea.verticalScrollPosition++;
}
callLater(textArea.setFocus);
}
}
Этот код используется для получения стиля из textArea
private function getTextStyles():void
{
if (!textArea)
return;
var tf:TextFormat;
var beginIndex:int = textArea.getTextField().selectionBeginIndex;
var endIndex:int = textArea.getTextField().selectionEndIndex;
if (textFormatChanged)
previousTextFormat = null;
if (beginIndex == endIndex)
{
tf = textArea.getTextField().defaultTextFormat;
if (tf.url != "")
{
var carIndex:int = textArea.getTextField().caretIndex;
if (carIndex < textArea.getTextField().length)
{
var tfNext:TextFormat=textArea.getTextField().getTextFormat(carIndex, carIndex + 1);
if (!tfNext.url || tfNext.url == "")
tf.url = tf.target = "";
}
else
tf.url = tf.target = "";
}
}
else
tf = textArea.getTextField().getTextFormat(beginIndex,endIndex);
if (cmbbxFntSze.text != tf.font)
setComboSelection(cmbbxFntFam, tf.font);
if (int(cmbbxFntSze.text) != tf.size)
setComboSelection(cmbbxFntSze,String(tf.size));
if (clrpckerFontColor.selectedColor != tf.color)
clrpckerFontColor.selectedColor = Number(tf.color);
if (btnBold.selected != tf.bold)
btnBold.selected = tf.bold;//Alert.show("bold");
if (btnItalic.selected != tf.italic)
btnItalic.selected = tf.italic;
if (btnUnderline.selected != tf.underline)
btnUnderline.selected = tf.underline;
if (tf.align == "left")
alignButtons.selectedIndex = 0;
else if (tf.align == "center")
alignButtons.selectedIndex = 1;
else if (tf.align == "right")
alignButtons.selectedIndex = 2;
else if (tf.align == "justify")
alignButtons.selectedIndex = 3;
if (textArea.getTextField().defaultTextFormat != tf)
textArea.getTextField().defaultTextFormat = tf;
previousTextFormat = tf;
textFormatChanged = false;
lastCaretIndex = textArea.getTextField().caretIndex;
thishtmltxt = textArea.htmlText;
textArea.validateNow();
}
Пожалуйста, проверьте на наличие мелких ошибок, потому что, когда я кодирую это, у меня есть некоторые закомментированные следы
Другие советы
Возможно, вы ознакомились с тем, как mx.controls.RichTextEditor это делает? Вы можете найти его в ... \ frameworks \ projects \ framework \ src \ mx \ controls
Если вы отсканируете этот код, вы увидите, что RichTextEditor сохраняет текущие настройки стиля текста в поддерживаемой им переменной TextFormat, а затем применяет этот стиль к вновь введенному тексту. Эта переменная обновляется, когда пользователь изменяет шрифты / размеры или когда выбор изменяется, чтобы захватить соседний стиль. Особое внимание уделяется случаю selectionBeginIndex == selectionEndIndex.