Index: /trunk/FACT++/src/DimState.h
===================================================================
--- /trunk/FACT++/src/DimState.h	(revision 13842)
+++ /trunk/FACT++/src/DimState.h	(revision 13843)
@@ -24,5 +24,5 @@
     string msg;
 
-    void Subscribe(StateMachineImp &imp)
+    virtual void Subscribe(StateMachineImp &imp)
     {
         imp.Subscribe(service.c_str())
@@ -52,5 +52,68 @@
     bool online() const { return info.second>-4; }
 
-    const string &name() const { return server; }
+    virtual State description() const { return State(-5, ""); }
+};
+
+ostream &operator<<(ostream& out, const DimState &s)
+{
+    const State rc = s.description();
+
+    out << s.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
+    out << kBold << s.server;
+
+    if (s.state()==-4)
+        return out << ": Offline";
+
+    if (rc.index==-5)
+        return out;
+
+    out << ": ";
+
+    if (rc.index==-2)
+        out << s.state();
+    else
+        out << rc.name << "[" << rc.index << "]";
+
+    if (!rc.comment.empty())
+        out << " - " << kBlue << rc.comment;
+
+    return out;
+}
+
+
+class DimDescribedState : public DimState
+{
+    vector<State> states;
+
+public:
+    DimDescribedState(const string &n) : DimState(n)
+    {
+    }
+
+    virtual void Subscribe(StateMachineImp &imp)
+    {
+        imp.Subscribe((server+"/STATE_LIST").c_str())
+            (imp.Wrap(bind(&DimDescribedState::HandleDesc, this, placeholders::_1)));
+
+        DimState::Subscribe(imp);
+    }
+
+    void HandleDesc(const EventImp &evt)
+    {
+        if (evt.GetSize()>0)
+        {
+            states = State::SplitStates(evt.GetString());
+            states.push_back(State(-4, "Offline"));
+        }
+    }
+
+    State description() const
+    {
+        for (auto it=states.begin(); it!=states.end(); it++)
+            if (it->index==state())
+                return *it;
+
+        return State(-5, "n/a");
+    }
 };
 
@@ -63,5 +126,6 @@
     {
         DimState::Handler(evt);
-        info.second = evt.GetSize()==4 ? evt.GetInt() : 0;
+
+        info.second = evt.GetSize()==4 ? evt.GetInt() : -4;
     }
 
@@ -74,4 +138,9 @@
         out << "V" << info.second/100 << 'r' << info.second%100;
         return out.str();
+    }
+
+    State description() const
+    {
+        return State(state(), version());
     }
 };
@@ -115,4 +184,10 @@
         func->second(evt);
     }
+
+    State description() const
+    {
+        return State(state(), "Current label");
+    }
+
 };
 
