#include #include using namespace osg; ApplicationUsage::ApplicationUsage(const std::string& commandLineUsage): _commandLineUsage(commandLineUsage) { } ApplicationUsage* ApplicationUsage::instance() { static ApplicationUsage s_applicationUsage; return &s_applicationUsage; } void ApplicationUsage::addUsageExplanation(Type type,const std::string& option,const std::string& explanation) { switch(type) { case(COMMAND_LINE_OPTION): addCommandLineOption(option,explanation); break; case(ENVIRONMENTAL_VARIABLE): addEnvironmentalVariable(option,explanation); break; case(KEYBOARD_MOUSE_BINDING): addKeyboardMouseBinding(option,explanation); break; } } void ApplicationUsage::addCommandLineOption(const std::string& option,const std::string& explanation) { _commandLineOptions[option]=explanation; } void ApplicationUsage::addEnvironmentalVariable(const std::string& option,const std::string& explanation) { _environmentalVariables[option]=explanation; } void ApplicationUsage::addKeyboardMouseBinding(const std::string& option,const std::string& explanation) { _keyboardMouse[option]=explanation; } void ApplicationUsage::getFormatedString(std::string& str, const UsageMap& um,unsigned int widthOfOutput) { unsigned int maxNumCharsInOptions = 0; ApplicationUsage::UsageMap::const_iterator citr; for(citr=um.begin(); citr!=um.end(); ++citr) { maxNumCharsInOptions = maximum(maxNumCharsInOptions,(unsigned int)citr->first.length()); } unsigned int fullWidth = widthOfOutput; unsigned int optionPos = 2; unsigned int optionWidth = maxNumCharsInOptions; unsigned int explanationPos = 2+maxNumCharsInOptions+2; unsigned int explanationWidth = fullWidth-explanationPos; std::string line; for(citr=um.begin(); citr!=um.end(); ++citr) { line.assign(fullWidth,' '); line.replace(optionPos,optionWidth,citr->first); const std::string& explanation = citr->second; std::string::size_type pos = 0; std::string::size_type offset = 0; bool firstInLine = true; while (pos0 && explanation[pos+width]!=' ' && explanation[pos+width]!='\n') --width; if (width==0) { // word must be longer than a whole line so will need // to concatinate it. width = explanationWidth-1; concatinated = true; } } line.replace(explanationPos+offset,explanationWidth, explanation, pos, width); if (concatinated) { str += line; str += "-\n"; } else { str += line; str += "\n"; } // move to the next line of output. line.assign(fullWidth,' '); pos += width+extraSkip; } } } void ApplicationUsage::write(std::ostream& output, const ApplicationUsage::UsageMap& um,unsigned int widthOfOutput) { std::string str; getFormatedString(str, um, widthOfOutput); output << str << std::endl; } void ApplicationUsage::write(std::ostream& output,unsigned int widthOfOutput) { output << "Usage: "<