00001 #include "HelpControl.h"
00002
00003 ControlBase * HelpControl::activate(MotionManager::MC_ID disp_id, Socket * gui) {
00004 char * fmt=" * ";
00005 if(config->main.use_VT100) {
00006 fmt="\33[1m * \33[0m";
00007 sout->printf("%s","\33[1m* Global commands\33[0m: type these anytime, interpreted directly by Controller\n");
00008 } else
00009 sout->printf("%s","* Global commands: type these anytime, interpreted directly by Controller\n");
00010 sout->printf("%s%s",fmt,"'!refresh' - redisplays the current control (handy on first connecting, or\n when other output has scrolled it off the screen)\n");
00011 sout->printf("%s%s",fmt,"'!reset' - return to the root control\n");
00012 sout->printf("%s%s",fmt,"'!next' - calls doNextItem() of the current control\n");
00013 sout->printf("%s%s",fmt,"'!prev' - calls doPrevItem() of the current control\n");
00014 sout->printf("%s%s",fmt,"'!select' - calls doSelect() of the current control\n");
00015 sout->printf("%s%s",fmt,"'!cancel' - calls doCancel() of the current control\n");
00016 sout->printf("%s%s",fmt,"'!msg text' - broadcasts text as a TextMsgEvent\n");
00017 sout->printf("%s%s",fmt,"'!hilight [n1 [n2 [...]]]' - hilights zero, one, or more items in the menu\n");
00018 sout->printf("%s%s",fmt,"'!input text' - calls takeInput(text) on the currently hilighted control(s)\n");
00019 sout->printf("%s%s",fmt,"any text not beginning with ! - sent to takeInput() of the current control\n");
00020 report(root,"",maxDepth);
00021 return NullControl::activate(disp_id,gui);
00022 }
00023
00024
00025
00026
00027
00028 void HelpControl::report(ControlBase* r, const std::string& prefix, unsigned int depth_remain) {
00029 if(r==NULL || depth_remain==0)
00030 return;
00031 const std::vector<ControlBase*>& slots=r->getSlots();
00032 const std::string pre=" "+prefix;
00033 unsigned int numlen=1;
00034 if(slots.size()>1)
00035 numlen=(int)(log(slots.size()-1)/log(10))+1;
00036 for(unsigned int i=0; i<slots.size(); i++) {
00037 if(slots[i]==NULL)
00038 continue;
00039 char * fmt;
00040 std::string nm=slots[i]->getName();
00041 std::string desc=slots[i]->getDescription();
00042 unsigned int len=term_width-(prefix.size()+nm.size()+4+numlen);
00043 if((int)len<0)
00044 len=0;
00045 if(len>desc.size())
00046 len=desc.size();
00047 else
00048 while(len>0 && !isspace(desc[len-1])) len--;
00049 if(config->main.use_VT100)
00050 fmt="\33[1m%s%*d. %s\33[0m: %s\n";
00051 else
00052 fmt="%s%*d. %s: %s\n";
00053 sout->printf(fmt,prefix.c_str(),numlen,i,nm.c_str(),desc.substr(0,len).c_str());
00054 while(len<desc.size() && isspace(desc[len])) len++;
00055 desc=desc.substr(len);
00056 while(desc.size()>0) {
00057 len=term_width-prefix.size();
00058 if((int)len<0)
00059 len=0;
00060 if(len>desc.size())
00061 len=desc.size();
00062 else {
00063 while(len>0 && !isspace(desc[len-1])) len--;
00064 if(len==0)
00065 len=term_width-prefix.size();
00066 if(len>desc.size())
00067 len=desc.size();
00068 }
00069 sout->printf("%s%s\n",std::string(prefix.size(),' ').c_str(),desc.substr(0,len).c_str());
00070 while(len<desc.size() && isspace(desc[len])) len++;
00071 desc=desc.substr(len);
00072 }
00073 report(slots[i],pre,depth_remain-1);
00074 }
00075 }
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087