Если мы возьмемся скинить стандартный ComboBox (а мы взялись), можно наткнуться на замечательную проблему. Размер кнопки для разворачивания ComboBox не хочет задаваться, т.е. на самом деле он задается, а эффекта - нуль целых, хрен десятых. Если свойство editable выставлено в false, размер кнопки становится равным ширине комбобокса.
Для меня решением стала отрисовка комбобокса с editable = true, но без выставления этого параметра :-)
Итак, в методе updateDisplayList, задаем правильные размеры для кнопки. В методе commitProperties, задаем правильные стили для той же самой кнопки. Стили backgroundBitmap и borderSkin поддерживаются, но почему-то про них документация по Flex умалчивает - открыл и их, чтобы была поддержка автодополнения.
Наверное есть и альтернативный вариант - установка editable в true, с последующей установкой textInput.editable в false.Тем не менее:
[geshi lang=Actionscript ln=n]package visual.gui {
import mx.controls.ComboBox;
import mx.core.mx_internal;
use namespace mx_internal;
[Style(name="backgroundBitmap", type="Class", inherit="no")]
[Style(name="borderSkin", type="Class", inherit="no")]
public final class CoolComboBox extends ComboBox {
override protected function commitProperties():void {
var e:Boolean = editableChanged;
super.commitProperties();
if (e) {
downArrowButton.upSkinName = "editableUpSkin";
downArrowButton.overSkinName = "editableOverSkin";
downArrowButton.downSkinName = "editableDownSkin";
downArrowButton.disabledSkinName = "editableDisabledSkin";
}
}
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
super.updateDisplayList(unscaledWidth, unscaledHeight);
var arrowWidth:Number = getStyle("arrowButtonWidth");
var ww: Number = unscaledWidth - arrowWidth;
downArrowButton.x = ww;
downArrowButton.width = arrowWidth;
downArrowButton.height = unscaledHeight;
}
} // CoolComboBox
} // visual.gui[/geshi]