void ListBox::SetSelectedItem(int index) {
    bool bChanged = (index != SelectedElement);

	if(index == -1) {
		SelectedElement = -1;
		UpdateList();
	} else if((index >= 0) && (index < GetNumEntries())) {
		SelectedElement = index;

		int numVisibleElements = ((GetSize().y - 2) / GUIStyle::GetInstance().GetListBoxEntryHeight()) + 1;

		if(SelectedElement >= FirstVisibleElement+numVisibleElements - 1) {
			FirstVisibleElement = SelectedElement-(numVisibleElements-1) + 1;
		} else if(SelectedElement < FirstVisibleElement) {
			FirstVisibleElement = SelectedElement;
		}

		if(FirstVisibleElement > GetNumEntries() - numVisibleElements) {
			FirstVisibleElement = std::max(0,GetNumEntries() - numVisibleElements + 1);
		}

		scrollbar.SetCurrentValue(FirstVisibleElement);

		UpdateList();
	}

	if(bChanged) {
        pOnSelectionChange();
	}
}
bool ListBox::HandleMouseLeft(Sint32 x, Sint32 y, bool pressed) {
	if((x>=0) && (x < GetSize().x - scrollbar.GetSize().x)
		&& (y>=0) && (y < GetSize().y)) {

		if(pressed == true) {
			int index = ((y - 1) / GUIStyle::GetInstance().GetListBoxEntryHeight()) + FirstVisibleElement;
			if((index >= 0) && (index < GetNumEntries())) {
				SelectedElement = index;

				if(SDL_GetTicks() - LastClickTime < 200) {
					pOnDoubleClick();
				} else {
					LastClickTime = SDL_GetTicks();
					UpdateList();
					pOnSelectionChange();
					SetActive();
				}
			}
		}

		scrollbar.HandleMouseLeft(x - GetSize().x + scrollbar.GetSize().x,y,pressed);
		return true;
	} else {
		return scrollbar.HandleMouseLeft(x - GetSize().x + scrollbar.GetSize().x,y,pressed);
	}
}
void ListBox::SetActive() {
	Widget::SetActive();

	if((SelectedElement == -1) && (GetNumEntries() > 0)) {
		SelectedElement = 0;
		UpdateList();
		pOnSelectionChange();
	}
}
void DropDownBox::onSelectionChange(bool bInteractive) {
    invalidateForeground();

	if(bAutocloseListBoxOnSelectionChange) {
		bShowListBox = false;
	}

	if(pOnSelectionChange) {
		pOnSelectionChange(bInteractive);
	}
}