void StackLayout::doRelayout()
{
	const List<DisplayItem *> &items = getItems();
	DisplayItem *inputField = items.getAt(0);
	int bottom;
	if (isItemVisible(inputField)) {
		setItemSize(inputField, getWidth(), font->getLineHeight());
		bottom = getHeight() - inputField->getHeight();
		setItemPosition(inputField, 0, bottom);
	}
	else {
		bottom = getHeight();
	}
	int i = 0;
	upperItemNr = 0;
	while (bottom > 0 && i + firstLevelVisible < stack->getLength()) {
		upperItemNr++;
		DisplayItem *item;
		if (items.getLength() <= upperItemNr) {
			item = stack->getAt(i + firstLevelVisible)->getDisplayItem(*font);
			addItem(item);
		}
		else {
			item = items.getAt(upperItemNr);
			if (item == NULL) {
				item = stack->getAt(i + firstLevelVisible)->getDisplayItem(*font);
				setItemAt(upperItemNr, item);
			}
		}
		if (item) {
			int nw = getNumberWidth(upperItemNr + firstLevelVisible);
			setItemSize(item, getWidth() - nw, -1);
			int h = item->getHeight();
			if (h < font->getLineHeight())
				h = font->getLineHeight();
			bottom -= h;
			int w = item->getWidth();
			if (w < getWidth() - nw)
				setItemPosition(item, getWidth() - w, bottom);
			else
				setItemPosition(item, nw, bottom);
		}
		else {
			bottom -= font->getLineHeight();
		}
		i++;
	}
	while (items.getLength() > upperItemNr + 1) {
		removeItemAt(upperItemNr + 1);
	}
	while (bottom > 0) {
		upperItemNr++;
		bottom -= font->getLineHeight();
	}
	upperItemScanStart = -bottom;
}
void StackLayout::processLine(uint8_t *pixelData, int dataOffset)
{
	if (itemNr < 0)
		return;
	if (itemScanLine >= getItemHeight(itemNr)) {
		itemScanLine = 0;
		if (--itemNr < 0)
			return;
		currentNumberWidth = getNumberWidth(itemNr + firstLevelVisible);
	}
	DisplayItem *item = NULL;
	if (itemNr < getItems().getLength())
		item = getItems().getAt(itemNr);
	if (itemScanLine == 0 && item) {
		if (drawOffsetX <= item->getX())
			item->initLineScanning(0, 0, drawWidth - item->getX());
		else
			item->initLineScanning(0, drawOffsetX - item->getX(), drawWidth);
	}

	if (itemNr > 0)
		drawNumber(pixelData, dataOffset, itemNr + firstLevelVisible);
	if (item != NULL && isItemVisible(item)) {
		if (itemScanLine < item->getHeight()) {
			if (drawOffsetX <= item->getX())
				item->processLine(pixelData, dataOffset + item->getX() - drawOffsetX);
			else
				item->processLine(pixelData, dataOffset);
		}
	}

	itemScanLine++;
}
int StackLayout::getItemHeight(int i)
{
	if (i >= getItems().getLength())
		return font->getLineHeight();
	int h = 0;
	DisplayItem *item = getItems().getAt(i);
	if (item)
		h = item->getHeight();
	if (h < font->getLineHeight())
		h = font->getLineHeight();
	return h;
}