Ignore:
File:
1 edited

Legend:

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

    rd17f3d r0af7ef  
    2121
    2222#include <boost/bind.hpp>
     23#include <boost/shared_ptr.hpp>
    2324
    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"
     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"
    3031#include "TextUI/TextStatusIndicator.hpp"
    3132#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"
    3637#include "Parser/ChangeTracker.hpp"
    3738#include "Views/StreamStringView.hpp"
     
    5556TextWindow::TextWindow()
    5657{
    57   map <std::string, TextMenu *> NametoTextMenuMap;
    58   std::set <char> ShortcutList;
     58  // build the main menu
     59  main_menu = new TextMenu<TxMenu>(std::cout, "");
    5960  // 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 
    66   // build the main menu
    67   main_menu = new TextMenu(Log() << Verbose(0), "Main Menu");
     61  main_menu->reserveShortcut('s', "output");
     62  main_menu->reserveShortcut('q', "quit");
    6863
    6964  moleculeView = new StreamStringView(boost::bind(&MoleculeListClass::Enumerate,World::getInstance().getMolecules(),_1));
    70   new DisplayMenuItem(main_menu,moleculeView,"Molecule List");
     65  new DisplayMenuItem(main_menu->getMenuInstance(),moleculeView,"Molecule List");
    7166
    72   new SeperatorItem(main_menu);
     67  new SeperatorItem(main_menu->getMenuInstance());
    7368
    74   Action* undoAction = ActionRegistry::getInstance().getActionByName("undo");
    75   new ActionMenuItem(getSuitableShortForm(ShortcutList,"Undo last operation"),"Undo last operation",main_menu,undoAction);
     69  main_menu->init();
    7670
    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);
     71  new SeperatorItem(main_menu->getMenuInstance());
    8972
    9073  // save has reserved key 's'
    91   Action *saveConfigAction = ActionRegistry::getInstance().getActionByName("output");
    92   new ActionMenuItem('s',"save current setup to config files",main_menu,saveConfigAction);
     74//  Action *saveConfigAction = ActionRegistry::getInstance().getActionByName("output");
     75  new ActionMenuItem('s',"save current setup to config files",main_menu->getMenuInstance(),"output");
    9376
    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);
     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");
    10181
    10282  // Add status indicators etc...
    103 
    10483  statusIndicator = new TextStatusIndicator();
    10584}
     
    10786TextWindow::~TextWindow()
    10887{
    109   delete quitAction;
     88  for (std::list<Action *>::iterator iter = returnFromActions.begin(); !returnFromActions.empty(); ++iter)
     89    delete (*iter);
     90  returnFromActions.clear();
    11091  delete moleculeView;
    11192  delete statusIndicator;
     
    11798}
    11899
    119 char 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 
    142 void 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.