gui: allow listbox to be used as menu and as read-only list

Also enable string insertion for list items.

Example how to make a menu item:
<listitem name="Lights on!">
	<action>
		<action function="setbrightness">255</action>
	</action>
</listitem>

If no <data> element and no actions on any items exist, the list is
read only and no item selection is possible.

Change-Id: Ib2668a982df2514484d44faa0396dd17550f39f3
diff --git a/gui/listbox.cpp b/gui/listbox.cpp
index a607699..4c9a68a 100644
--- a/gui/listbox.cpp
+++ b/gui/listbox.cpp
@@ -58,6 +58,8 @@
 		// Get the currently selected value for the list
 		DataManager::GetValue(mVariable, currentValue);
 	}
+	else
+		allowSelection = false;		// allows using listbox as a read-only list
 
 	// Get the data for the list
 	child = FindNode(node, "listitem");
@@ -66,15 +68,21 @@
 		ListData data;
 
 		attr = child->first_attribute("name");
-		if (!attr) return;
-		data.displayName = attr->value();
-
-		data.variableValue = child->value();
+		if (!attr)
+			continue;
+		data.displayName = gui_parse_text(attr->value());
+		data.variableValue = gui_parse_text(child->value());
 		if (child->value() == currentValue) {
 			data.selected = 1;
 		} else {
 			data.selected = 0;
 		}
+		data.action = NULL;
+		xml_node<>* action = child->first_node("action");
+		if (action) {
+			data.action = new GUIAction(action);
+			allowSelection = true;
+		}
 
 		mList.push_back(data);
 
@@ -157,9 +165,12 @@
 		mList.at(i).selected = 0;
 	}
 	if (item_selected < mList.size()) {
-		mList.at(item_selected).selected = 1;
-		string str = mList.at(item_selected).variableValue;
+		ListData& data = mList.at(item_selected);
+		data.selected = 1;
+		string str = data.variableValue;	// [check] should this set currentValue instead?
 		DataManager::SetValue(mVariable, str);
+		if (data.action)
+			data.action->doActions();
 	}
 	mUpdate = 1;
 }
diff --git a/gui/objects.hpp b/gui/objects.hpp
index be1f973..f8569d6 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -634,6 +634,7 @@
 		std::string displayName;
 		std::string variableValue;
 		unsigned int selected;
+		GUIAction* action;
 	};
 
 protected: