Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/TextUI/TextWindow.cpp

    r0af7ef rd17f3d  
    2121
    2222#include <boost/bind.hpp>
    23 #include <boost/shared_ptr.hpp>
    2423
    25 #include "Menu/TextMenu/TextMenu.hpp"
    26 #include "Menu/TextMenu/TxMenu.hpp"
    27 #include "Menu/TextMenu/ActionMenuItem.hpp"
    28 #include "Menu/TextMenu/SeperatorItem.hpp"
    29 #include "Menu/TextMenu/DisplayMenuItem.hpp"
    30 #include "Menu/TextMenu/SubMenuItem.hpp"
     24#include "Menu/Menu.hpp"
     25#include "Menu/TextMenu.hpp"
     26#include "Menu/ActionMenuItem.hpp"
     27#include "Menu/SeperatorItem.hpp"
     28#include "Menu/DisplayMenuItem.hpp"
     29#include "Menu/SubMenuItem.hpp"
    3130#include "TextUI/TextStatusIndicator.hpp"
    3231#include "TextUI/TextWindow.hpp"
     32#include "Actions/MapOfActions.hpp"
    3333#include "Actions/MethodAction.hpp"
    3434#include "Actions/ErrorAction.hpp"
    3535#include "Actions/ActionRegistry.hpp"
    36 #include "Actions/ActionTraits.hpp"
    3736#include "Parser/ChangeTracker.hpp"
    3837#include "Views/StreamStringView.hpp"
     
    5655TextWindow::TextWindow()
    5756{
     57  map <std::string, TextMenu *> NametoTextMenuMap;
     58  std::set <char> ShortcutList;
     59  // reserve s for save and q for quite
     60  ShortcutList.insert('s');
     61  ShortcutList.insert('q');
     62
     63  // populate all actions
     64  MapOfActions::getInstance().populateActions();
     65
    5866  // build the main menu
    59   main_menu = new TextMenu<TxMenu>(std::cout, "");
    60   // reserve s for save and q for quite
    61   main_menu->reserveShortcut('s', "output");
    62   main_menu->reserveShortcut('q', "quit");
     67  main_menu = new TextMenu(Log() << Verbose(0), "Main Menu");
    6368
    6469  moleculeView = new StreamStringView(boost::bind(&MoleculeListClass::Enumerate,World::getInstance().getMolecules(),_1));
    65   new DisplayMenuItem(main_menu->getMenuInstance(),moleculeView,"Molecule List");
     70  new DisplayMenuItem(main_menu,moleculeView,"Molecule List");
    6671
    67   new SeperatorItem(main_menu->getMenuInstance());
     72  new SeperatorItem(main_menu);
    6873
    69   main_menu->init();
     74  Action* undoAction = ActionRegistry::getInstance().getActionByName("undo");
     75  new ActionMenuItem(getSuitableShortForm(ShortcutList,"Undo last operation"),"Undo last operation",main_menu,undoAction);
    7076
    71   new SeperatorItem(main_menu->getMenuInstance());
     77  Action* redoAction = ActionRegistry::getInstance().getActionByName("redo");
     78  new ActionMenuItem(getSuitableShortForm(ShortcutList,"Redo last operation"),"Redo last operation",main_menu,redoAction);
     79
     80  new SeperatorItem(main_menu);
     81
     82  for(map<std::string, pair<std::string,std::string> >::iterator iter = MapOfActions::getInstance().MenuDescription.begin(); iter != MapOfActions::getInstance().MenuDescription.end(); ++iter) {
     83    TextMenu *Menu = new TextMenu(Log() << Verbose(0), iter->second.second);
     84    NametoTextMenuMap.insert( pair <std::string, TextMenu *> (iter->first, Menu) );
     85    new SubMenuItem(getSuitableShortForm(ShortcutList,iter->first),iter->second.first.c_str(),main_menu,Menu);
     86  }
     87
     88  new SeperatorItem(main_menu);
    7289
    7390  // save has reserved key 's'
    74 //  Action *saveConfigAction = ActionRegistry::getInstance().getActionByName("output");
    75   new ActionMenuItem('s',"save current setup to config files",main_menu->getMenuInstance(),"output");
     91  Action *saveConfigAction = ActionRegistry::getInstance().getActionByName("output");
     92  new ActionMenuItem('s',"save current setup to config files",main_menu,saveConfigAction);
    7693
    77   // create a specific quit action for this UI and store in registry
    78   ActionTraits quitTrait(OptionTrait("quit", &typeid(void), "quits the program"));
    79   quitAction = new MethodAction(quitTrait,boost::bind(&TxMenu::doQuit,main_menu->getMenuInstance()),true);
    80   new ActionMenuItem('q',"quit",main_menu->getMenuInstance(),"quit");
     94  quitAction = new MethodAction("quitAction",boost::bind(&TextMenu::doQuit,main_menu),false);
     95  new ActionMenuItem('q',"quit",main_menu,quitAction);
     96
     97  // quit has reserved key 'q'
     98  // go through all menus and create them
     99  for (map <std::string, TextMenu *>::iterator MenuRunner = NametoTextMenuMap.begin(); MenuRunner != NametoTextMenuMap.end(); ++MenuRunner)
     100    populateMenu(MenuRunner->second, MenuRunner->first);
    81101
    82102  // Add status indicators etc...
     103
    83104  statusIndicator = new TextStatusIndicator();
    84105}
     
    86107TextWindow::~TextWindow()
    87108{
    88   for (std::list<Action *>::iterator iter = returnFromActions.begin(); !returnFromActions.empty(); ++iter)
    89     delete (*iter);
    90   returnFromActions.clear();
     109  delete quitAction;
    91110  delete moleculeView;
    92111  delete statusIndicator;
     
    98117}
    99118
     119char TextWindow::getSuitableShortForm(std::set <char> &ShortcutList, const std::string name) const
     120{
     121  for (std::string::const_iterator CharRunner = name.begin(); CharRunner != name.end(); ++CharRunner) {
     122    if (ShortcutList.find(*CharRunner) == ShortcutList.end()) {
     123      ShortcutList.insert(*CharRunner);
     124      return *CharRunner;
     125    }
     126  }
     127  // if no letter matches, take digits
     128  int i=0;
     129  for (;i<10;++i) {
     130    if (ShortcutList.find((char)i + '0') == ShortcutList.end())
     131      break;
     132  }
     133  if (i != 10) {
     134    ShortcutList.insert((char)i + '0');
     135    return ((char)i + '0');
     136  } else {
     137    DoeLog(1) && (eLog() << Verbose(1) << "Could not find a suitable shortform for " << name << "." << endl);
     138    return '#';
     139  }
     140}
     141
     142void TextWindow::populateMenu(TextMenu* Menu, const  std::string &MenuName)
     143{
     144  Action *ActionItem = NULL;
     145  set <char> ShortcutList;
     146  // reserve 'q' for quit
     147  ShortcutList.insert('q');
     148  // through all actions for this menu
     149  pair < multimap <std::string, std::string>::iterator, multimap <std::string, std::string>::iterator > MenuActions = MapOfActions::getInstance().MenuContainsActionMap.equal_range(MenuName);
     150  for (multimap <std::string, std::string>::const_iterator MenuRunner = MenuActions.first; MenuRunner != MenuActions.second; ++MenuRunner) {
     151    ActionItem = ActionRegistry::getInstance().getActionByName(MenuRunner->second);
     152    new ActionMenuItem(getSuitableShortForm(ShortcutList, MenuRunner->second),MapOfActions::getInstance().getDescription(MenuRunner->second).c_str(),Menu,ActionItem);
     153  }
     154  // finally add default quit item
     155  Action *returnFromAction = new TextMenu::LeaveAction(Menu);
     156  MenuItem *returnFromItem = new ActionMenuItem('q',"return to Main menu",Menu,returnFromAction);
     157  Menu->addDefault(returnFromItem);
     158}
Note: See TracChangeset for help on using the changeset viewer.