Когда стандартный ComboBox не подходит - хитрый ComboBox

· На чтение уйдёт 1 минута · (210 слов)

Если мы возьмемся скинить стандартный 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]
Полезное