// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "stdpch.h"
// Interface
#include "macrocmd_key.h"
#include "macrocmd_manager.h"
#include "interface_manager.h"
#include "action_handler.h"
#include "ctrl_button.h"
#include "group_editbox.h"
#include "group_list.h"
#include "dbgroup_combo_box.h"
#include "group_container.h"
#include "group_modal_get_key.h"
#include "interface_expr.h"
// tmp
#include "../r2/editor.h"
using namespace std;
using namespace NLMISC;
// ***************************************************************************
// ***************************************************************************
// ***************************************************************************
// KEYS SHORTCUT KEYS SHORTCUT KEYS SHORTCUT KEYS SHORTCUT KEYS SHORTCUT KEYS
// ***************************************************************************
// ***************************************************************************
// ***************************************************************************
// To display all keys
#define WIN_KEYS "ui:interface:keys"
#define WIN_KEYS_GAME "ui:interface:keys_"
#define WIN_KEYS_EDIT "ui:interface:keys_edit"
#define WIN_KEYS_EDIT_CONTENT "ui:interface:keys_edit:content"
#define TEMPLATE_KEYS_GROUP "tk_line"
#define TEMPLATE_KEYS_KEY_NAME "name"
#define TEMPLATE_KEYS_SHORTCUT_NAME "command"
// To edit a key already defined
/*
#define WIN_EDITKEY "ui:interface:editkey"
#define VIEW_EDITKEY_TEXT_CATEGORY "ui:interface:editkey:content:category"
#define VIEW_EDITKEY_TEXT_ACTION "ui:interface:editkey:content:action"
#define VIEW_EDITKEY_TEXT_FIRST_PARAM "ui:interface:editkey:content:param1"
#define VIEW_EDITKEY_TEXT_SECOND_PARAM "ui:interface:editkey:content:param2"
#define VIEW_EDITKEY_TEXT_FIRST_PARAM_NAME "ui:interface:editkey:content:param1_name"
#define VIEW_EDITKEY_TEXT_SECOND_PARAM_NAME "ui:interface:editkey:content:param2_name"
#define VIEW_EDITKEY_TEXT_KEY "ui:interface:editkey:content:txtkey"
*/
// To define a key
#define WIN_MODAL_GET_KEY "ui:interface:assign_key"
// ***************************************************************************
// Display all keys
// ***************************************************************************
// ***************************************************************************
// Add the template key to the parent
void addKeyLine (CGroupList *pParent, const ucstring &keyName, const ucstring &shortcutName, bool grayed)
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
uint lineId= (uint)pMCM->NewKey->AllLines.size();
string templateId = pParent->getId() + ":k" + NLMISC::toString(lineId);
vector< pair > vParams;
vParams.push_back(make_pair(string("id"), templateId));
vParams.push_back(make_pair(string("lineid"), toString(lineId)));
CInterfaceGroup *pKeysLine = NULL;
pKeysLine = pIM->createGroupInstance (TEMPLATE_KEYS_GROUP, pParent->getId(), vParams);
if (pKeysLine == NULL) return;
// Put name
CViewText *pViewKeyName = dynamic_cast(pKeysLine->getView(TEMPLATE_KEYS_KEY_NAME));
if (pViewKeyName != NULL)
{
pViewKeyName->setText (keyName);
pViewKeyName->setColor(grayed?pIM->getSystemOption(CInterfaceManager::OptionCtrlTextGrayColor).getValColor():CRGBA::White);
}
CViewText *pViewShortcutName = dynamic_cast(pKeysLine->getView(TEMPLATE_KEYS_SHORTCUT_NAME));
if (pViewShortcutName != NULL)
{
pViewShortcutName->setText (shortcutName);
pViewShortcutName->setColor(grayed?pIM->getSystemOption(CInterfaceManager::OptionCtrlTextGrayColor).getValColor():CRGBA::White);
}
pKeysLine->setParent (pParent);
pParent->addChild (pKeysLine);
}
// ***************************************************************************
struct CComboActionName
{
CCombo Combo; // KeyCount <=> action name unbound
CAction::CName ActionName;
};
void buildActionToComboMap(uint8 nAM, CGroupList * /* pList */, string catName, map &remaped)
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
CActionsManager *pAM = pMCM->ActionManagers[nAM];
const CActionsManager::TComboActionMap &keyShortcut = pAM->getComboActionMap();
// *** Order Keys by actions
// parse the combo map
CActionsManager::TComboActionMap::const_iterator it = keyShortcut.begin();
while (it != keyShortcut.end())
{
const CAction::CName &rName = it->second;
// if match the current category parsed
const CCategory *pCat = pAM->getCategory(rName);
if (pCat != NULL)
if (pCat->Name == catName)
{
// see if action active in current context
if (pAM->isActionPresentInContext(it->second))
{
pair value;
// Don't take any risk: avoid any bug if the localisation is buggy and give same text for 2 differents CAction::CName
// Use the localized text first, to have correct sort according to language
value.first= pAM->getActionLocalizedText(rName) + rName.Name + rName.Argu;
value.second.Combo= it->first;
value.second.ActionName= it->second;
remaped.insert(value);
}
}
it++;
}
// *** Add unbound "ForceDisplay" actions
const CActionsManager::TActionsForceDisplaySet &actionFD = pAM->getActionsForceDisplaySet();
CActionsManager::TActionsForceDisplaySet::const_iterator itFD= actionFD.begin();
for(;itFD!=actionFD.end();itFD++)
{
const CAction::CName &rName = *itFD;
// const CBaseAction *baseAction = pAM->getBaseAction(rName);
// if match the current category parsed
const CCategory *pCat = pAM->getCategory(rName);
if (pCat != NULL)
if (pCat->Name == catName)
{
// see if action active in current context
if (pAM->isActionPresentInContext(rName))
{
pair value;
// Don't take any risk: avoid any bug if the localisation is buggy and give same text for 2 differents CAction::CName
// Use the localized text first, to have correct sort according to language
value.first= pAM->getActionLocalizedText(rName) + rName.Name + rName.Argu;
// if alredy added (ie combo bound)
if(remaped.find(value.first)!=remaped.end())
continue;
// Add this unbound action
value.second.Combo.Key= KeyCount;
value.second.Combo.KeyButtons= noKeyButton;
value.second.ActionName= rName;
remaped.insert(value);
}
}
}
}
// Get all the couple (combo,action) from the action manager nAM and insert them into pList (with the template)
void getAllComboAction(uint8 nAM, CGroupList *pList, const map &remaped)
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
CActionsManager *pAM = pMCM->ActionManagers[nAM];
// *** Fill Actions
map::const_iterator remapIT = remaped.begin();
while (remapIT != remaped.end())
{
ucstring keyName;
if(remapIT->second.Combo.Key==KeyCount)
keyName= CI18N::get("uiNotAssigned");
else
keyName= remapIT->second.Combo.toUCString();
const CBaseAction *baseAction = pAM->getBaseAction(remapIT->second.ActionName);
if (baseAction)
{
ucstring shortcutName = baseAction->getActionLocalizedText(remapIT->second.ActionName);
addKeyLine(pList, keyName, shortcutName, remapIT->second.Combo.Key==KeyCount);
CModalContainerEditCmd::CLine line;
line.ComboAM= nAM;
line.Combo= remapIT->second.Combo;
line.ActionName= remapIT->second.ActionName;
pMCM->NewKey->AllLines.push_back(line);
}
remapIT++;
}
}
// ***************************************************************************
// Called when we activate the keys container
class CHandlerKeysOpen: public IActionHandler
{
public:
virtual void execute(CCtrlBase * /* pCaller */, const string &/* Params */)
{
// Initialisation of category combo box
CInterfaceManager *pIM = CInterfaceManager::getInstance();
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
for (uint nAM = 0; nAM < pMCM->ActionManagers.size(); ++nAM)
{
CActionsManager *pAM = pMCM->ActionManagers[nAM];
const vector &rCats = pAM->getCategories();
CGroupContainer *pGC;
for (uint i = 0; i < rCats.size(); ++i)
{
string contName = string(WIN_KEYS_GAME)+rCats[i].Name;
pGC = dynamic_cast(pIM->getElementFromId(contName));
if(pGC != NULL)
{
pGC->setX(0);
pGC->setY(0);
}
}
}
// Ensure the Key edit is closed
pMCM->NewKey->deactivate();
pMCM->NewKey->CurAM = NULL;
pMCM->NewKey->AllLines.clear();
// Get the group to add all (keys,shortcut) couple
for (uint nAM = 0; nAM < pMCM->ActionManagers.size(); ++nAM)
{
CActionsManager *pAM = pMCM->ActionManagers[nAM];
const vector &rCats = pAM->getCategories();
for (uint i = 0; i < rCats.size(); ++i)
{
string contName = string(WIN_KEYS_GAME)+rCats[i].Name;
CInterfaceGroup *pCategory = dynamic_cast(pIM->getElementFromId(contName));
CGroupList *pList = dynamic_cast(pIM->getElementFromId(contName + ":content"));
if (pCategory != NULL && pList != NULL)
{
pList->clearGroups();
pList->setDynamicDisplaySize(true);
map remaped;
buildActionToComboMap(nAM, pList, rCats[i].Name, remaped);
if (!remaped.empty())
{
getAllComboAction(nAM, pList, remaped);
pCategory->setActive(true);
}
else
{
pCategory->setActive(false);
}
}
}
}
}
};
REGISTER_ACTION_HANDLER( CHandlerKeysOpen, "keys_open");
// ***************************************************************************
// Called when we push the new button
class CHandlerKeysNew: public IActionHandler
{
public:
virtual void execute(CCtrlBase * /* pCaller */, const string &/* Params */)
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
pMCM->NewKey->CurrentEditCmdNb = -1;
pMCM->NewKey->activate();
}
};
REGISTER_ACTION_HANDLER( CHandlerKeysNew, "keys_new");
// ***************************************************************************
class CHandlerKeysAssign: public IActionHandler
{
public:
virtual void execute(CCtrlBase *pCaller, const string &/* Params */)
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
// Setup the editkey container from line
if (pCaller == NULL) return;
string sId = pCaller->getId();
sId = sId.substr(sId.rfind('k')+1,sId.size());
sint32 nLineNb;
fromString(sId, nLineNb);
if ((nLineNb < 0) || (nLineNb >= (sint32)pMCM->NewKey->AllLines.size())) return;
pMCM->NewKey->CurrentEditCmdLine = pMCM->NewKey->AllLines[nLineNb];
pMCM->NewKey->CurAM = pMCM->ActionManagers[pMCM->NewKey->AllLines[nLineNb].ComboAM];
CGroupModalGetKey*pGetKey = dynamic_cast(pIM->getElementFromId(WIN_MODAL_GET_KEY));
pGetKey->Caller = "editkey";
pIM->enableModalWindow(pCaller, WIN_MODAL_GET_KEY);
}
};
REGISTER_ACTION_HANDLER( CHandlerKeysAssign, "keys_assign");
// ***************************************************************************
// Called when we right click on a shortcut line and choose edit from context menu
class CHandlerKeysEdit: public IActionHandler
{
public:
virtual void execute(CCtrlBase *pCaller, const string &/* Params */)
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
// Setup the editkey container from line
if (pCaller == NULL) return;
string sId = pCaller->getId();
sId = sId.substr(sId.rfind('k')+1,sId.size());
sint32 nLineNb;
fromString(sId, nLineNb);
if ((nLineNb < 0) || (nLineNb >= (sint32)pMCM->NewKey->AllLines.size())) return;
pMCM->NewKey->CurrentEditCmdLine = pMCM->NewKey->AllLines[nLineNb];
pMCM->NewKey->CurAM = pMCM->ActionManagers[pMCM->NewKey->AllLines[nLineNb].ComboAM];
// The key must exist, else cannot edit the action
CActionsManager::TComboActionMap::const_iterator it = pMCM->NewKey->CurAM->getComboActionMap().find(pMCM->NewKey->CurrentEditCmdLine.Combo);
if (it != pMCM->NewKey->CurAM->getComboActionMap().end())
{
pMCM->NewKey->activateFrom (it->second.Name, it->second.Argu, nLineNb);
}
}
};
REGISTER_ACTION_HANDLER( CHandlerKeysEdit, "keys_edit");
// ***************************************************************************
class CHandlerKeysDelete: public IActionHandler
{
public:
virtual void execute(CCtrlBase *pCaller, const string &/* Params */)
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
if (pCaller == NULL) return;
string sId = pCaller->getId();
sId = sId.substr(sId.rfind('k')+1,sId.size());
sint32 nLineNb;
fromString(sId, nLineNb);
if ((nLineNb < 0) || (nLineNb >= (sint32)pMCM->NewKey->AllLines.size())) return;
CActionsManager *pCurAM = pMCM->ActionManagers[pMCM->NewKey->AllLines[nLineNb].ComboAM];
// if key not bound, skip (ie: this is a N/A action that is "ForceDisplay")
if(pMCM->NewKey->AllLines[nLineNb].Combo.Key==NLMISC::KeyCount)
return;
// remove the combo
pCurAM->removeCombo(pMCM->NewKey->AllLines[nLineNb].Combo);
// reset display
pMCM->refreshAllKeyDisplays();
}
};
REGISTER_ACTION_HANDLER( CHandlerKeysDelete, "keys_delete");
// ***************************************************************************
// Edit Command (can be binded to a key)
// ***************************************************************************
// ***************************************************************************
CModalContainerEditCmd::CModalContainerEditCmd()
{
Win = NULL;
CurAM = NULL;
_AllowAllActions= true;
}
// ***************************************************************************
void CModalContainerEditCmd::create(const std::string &name, bool bDefKey, bool allowAllActions)
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
string prefix = name;
CanDefineKey = bDefKey;
_AllowAllActions = allowAllActions;
prefix = strupr(prefix);
prefix = string(DB_EDITCMD_PREFIX) + string(":") + prefix + string(":");
DbComboSelCat = prefix + DB_EDITCMD_COMBO_SELECT_CATEGORY;
DbComboSelAct = prefix + DB_EDITCMD_COMBO_SELECT_ACTION;
DbComboSel1P = prefix + DB_EDITCMD_COMBO_SELECT_FIRST_PARAM;
DbComboSel2P = prefix + DB_EDITCMD_COMBO_SELECT_SECOND_PARAM;
DbComboDisp1P = prefix + DB_EDITCMD_COMBO_DISPLAY_FIRST_PARAM;
DbComboDisp2P = prefix + DB_EDITCMD_COMBO_DISPLAY_SECOND_PARAM;
// Create DB entry
pIM->getDbProp(DbComboSelCat);
pIM->getDbProp(DbComboSelAct);
pIM->getDbProp(DbComboSel1P);
pIM->getDbProp(DbComboSel2P);
pIM->getDbProp(DbComboDisp1P);
pIM->getDbProp(DbComboDisp2P);
vector< pair > vArgs;
vArgs.push_back(pair("id",name));
vArgs.push_back(pair("db_sel_cat",DbComboSelCat));
vArgs.push_back(pair("db_sel_act",DbComboSelAct));
vArgs.push_back(pair("db_sel_1p",DbComboSel1P));
vArgs.push_back(pair("db_sel_2p",DbComboSel2P));
vArgs.push_back(pair("db_disp_1p",DbComboDisp1P));
vArgs.push_back(pair("db_disp_2p",DbComboDisp2P));
Win = dynamic_cast(pIM->createGroupInstance(TEMPLATE_EDITCMD, "ui:interface", vArgs));
if (Win == NULL)
{
nlwarning ("cannot create %s", name.c_str());
return;
}
WinName = "ui:interface:" + name;
pIM->addWindowToMasterGroup("ui:interface", Win);
CInterfaceGroup *pRoot = dynamic_cast(pIM->getElementFromId("ui:interface"));
Win->setParent(pRoot);
pRoot->addGroup(Win);
CInterfaceGroup *pIG = dynamic_cast(pIM->getElementFromId(WinName+CTRL_EDITCMD_KEY_GROUP));
if (pIG != NULL) pIG->setActive (CanDefineKey);
}
// ***************************************************************************
void CModalContainerEditCmd::setTitle(const std::string &uistr)
{
Win->setTitle(uistr);
}
// ***************************************************************************
void CModalContainerEditCmd::activate()
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
CurrentEditCmdLine.ActionName.Name = "";
CurrentEditCmdLine.ActionName.Argu = "";
CurrentEditCmdNb = -1;
Win->setActive(true);
Win->launch();
// Initialisation of category combo box
CInterfaceManager *pIM = CInterfaceManager::getInstance();
CDBGroupComboBox *pCB= dynamic_cast(pIM->getElementFromId( WinName+WIN_EDITCMD_COMBO_CATEGORY ));
if (pCB != NULL)
{
CurrentEditCmdCategories.clear();
pCB->resetTexts();
for (uint am=0; am < pMCM->ActionManagers.size(); am++)
{
const vector &rVCat = pMCM->ActionManagers[am]->getCategories();
for (uint i=0; i < rVCat.size();i++)
{
const CCategory &cat = rVCat[i];
// only macroisable categories (or if allow all)
if(_AllowAllActions || cat.Macroisable)
{
// category should have at least one action that is possible in currenyt
// context
bool found = false;
for (uint k = 0; k < cat.BaseActions.size(); ++k)
{
if (cat.BaseActions[k].isUsableInCurrentContext())
{
found = true;
break;
}
}
if (found)
{
pCB->addText( CI18N::get(rVCat[i].LocalizedName) );
CurrentEditCmdCategories.push_back(rVCat[i].Name);
}
}
}
}
}
// Clean up all actions
pCB= dynamic_cast(pIM->getElementFromId( WinName+WIN_EDITCMD_COMBO_ACTION ));
if (pCB != NULL) pCB->resetTexts();
// Clean up
CurAM = NULL;
pIM->getDbProp( DbComboSelCat )->setValue32(-1);
pIM->getDbProp( DbComboSelAct )->setValue32(-1);
pIM->getDbProp( DbComboSel1P )->setValue32(-1);
pIM->getDbProp( DbComboSel2P )->setValue32(-1);
pIM->getDbProp( DbComboDisp1P )->setValue32(-1);
pIM->getDbProp( DbComboDisp2P )->setValue32(-1);
// reset name of params
CViewText *pViewParamName = dynamic_cast(pIM->getElementFromId(WinName+VIEW_EDITCMD_FIRST_PARAM_NAME));
if (pViewParamName != NULL) pViewParamName->setText (string(""));
pViewParamName = dynamic_cast(pIM->getElementFromId(WinName+VIEW_EDITCMD_SECOND_PARAM_NAME));
if (pViewParamName != NULL) pViewParamName->setText (string(""));
invalidCurrentCommand();
}
// ***************************************************************************
void CModalContainerEditCmd::deactivate()
{
if(Win) Win->setActive(false);
}
// ***************************************************************************
void CModalContainerEditCmd::activateFrom (const std::string &cmdName, const std::string &cmdParams, sint nRef)
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
CurrentEditCmdNb = nRef;
Win->setActive(true);
Win->launch();
activate();
CurrentEditCmdLine.ActionName.Name = cmdName;
CurrentEditCmdLine.ActionName.Argu = cmdParams;
CurrentEditCmdNb = nRef;
// Get current action manager and interface category index from cmdName
uint i, j, k;
bool bFound = false;
const CBaseAction *pBA = NULL;
CActionsManager *pAM = NULL;
uint catCBIndex = 0;
uint actCBIndex = 0;
for (i=0; i < pMCM->ActionManagers.size(); ++i)
{
pAM = pMCM->ActionManagers[i];
const vector &rVCat = pAM->getCategories();
for (j=0; j < rVCat.size(); ++j)
{
// only macroisable category (or if allow all)
if(_AllowAllActions || rVCat[j].Macroisable)
{
const vector &rVBA = rVCat[j].BaseActions;
actCBIndex = 0;
for (k=0; k < rVBA.size(); ++k)
{
// only macrosiable actions (or if allow all)
if (_AllowAllActions || rVBA[k].Macroisable)
{
if(rVBA[k].Name == cmdName)
{
bFound = true;
CurAM = pMCM->ActionManagers[i];
pBA = &rVBA[k];
break;
}
// actCBIndex is index in combo box here
actCBIndex++;
}
}
if (bFound) break;
// catIndex is index in combo box here
catCBIndex++;
}
}
if (bFound) break;
}
if (!bFound) return;
// Here pAM and catIndex are valid
// Set category : Search the right category
CDBGroupComboBox *pCB;
pCB = dynamic_cast(pIM->getElementFromId(WinName+WIN_EDITCMD_COMBO_CATEGORY));
pCB->setSelection(catCBIndex);
onChangeCategory();
CCDBNodeBranch::flushObserversCalls();
//pIM->runActionHandler("editcmd_change_category",NULL);
pCB = dynamic_cast(pIM->getElementFromId(WinName+WIN_EDITCMD_COMBO_ACTION));
pCB->setSelection(actCBIndex);
onChangeAction();
CCDBNodeBranch::flushObserversCalls();
//pIM->runActionHandler("editcmd_change_action",NULL);
// Count number of displayed param
uint nbRealParam = 0;
for (i = 0; i < pBA->Parameters.size(); ++i)
{
const CBaseAction::CParameter &rP = pBA->Parameters[i];
if (rP.Type != CBaseAction::CParameter::Hidden)
nbRealParam++;
}
// Set params
uint noParam = 0;
string curStr = CurrentEditCmdLine.ActionName.Argu.substr();
for (i = 0; i < pBA->Parameters.size(); ++i)
{
const CBaseAction::CParameter &rP = pBA->Parameters[i];
string sTmp;
// Get ith param (params are nameOfParam=argumentOfAction strings separated by |)
// except for the last real param (which can then contains | chars) if it is the last param
string::size_type pos = curStr.find('|');
if ((pos == string::npos) ||
(((noParam == nbRealParam-1) && (rP.Type != CBaseAction::CParameter::Hidden)) && (i == (pBA->Parameters.size()-1))))
{
sTmp = curStr;
curStr = "";
}
else
{
sTmp = curStr.substr(0, pos);
curStr = curStr.substr(pos+1, curStr.size());
}
// Remove 'name='
if (sTmp.find('=') != string::npos)
sTmp = sTmp.substr(sTmp.find('=')+1,sTmp.size());
if (noParam >= 2) break; // NO MORE THAN 2 REAL PARAMS !
if (rP.Type == CBaseAction::CParameter::Hidden)
{
// Skip it
}
else if (rP.Type == CBaseAction::CParameter::Constant)
{
if (noParam == 0) pIM->getDbProp( DbComboDisp1P )->setValue32(0);
else pIM->getDbProp( DbComboDisp2P )->setValue32(0);
// Search the param value to get the position in combo box
bool bValFound = false;
uint nPinCB;
for(nPinCB = 0; nPinCB < rP.Values.size(); ++nPinCB)
{
if (rP.Values[nPinCB].Value == sTmp)
{
bValFound = true;
break;
}
}
if (bValFound)
{
string sCombo;
if (noParam == 0) sCombo = WinName+WIN_EDITCMD_COMBO_FIRST_PARAM_LIST;
else sCombo = WinName+WIN_EDITCMD_COMBO_SECOND_PARAM_LIST;
pCB = dynamic_cast(pIM->getElementFromId(sCombo));
pCB->setSelection(nPinCB);
}
}
else if ((rP.Type == CBaseAction::CParameter::User) || (rP.Type == CBaseAction::CParameter::UserName))
{
if (noParam == 0) pIM->getDbProp( DbComboDisp1P )->setValue32(1);
else pIM->getDbProp( DbComboDisp2P )->setValue32(1);
string sEditBox;
if (noParam == 0) sEditBox = WinName+WIN_EDITCMD_COMBO_FIRST_PARAM_EDITBOX;
else sEditBox = WinName+WIN_EDITCMD_COMBO_SECOND_PARAM_EDITBOX;
CGroupEditBox *pEB = dynamic_cast(pIM->getElementFromId(sEditBox));
// sTmp is utf8
pEB->setInputStringAsUtf8(sTmp);
}
// Setup the param name if any
if (rP.Type != CBaseAction::CParameter::Hidden)
{
string sText;
if (noParam == 0) sText = WinName+VIEW_EDITCMD_FIRST_PARAM_NAME;
else sText = WinName+VIEW_EDITCMD_SECOND_PARAM_NAME;
CViewText *pVT = dynamic_cast(pIM->getElementFromId(sText));
if (pVT != NULL) pVT->setText(CI18N::get(pBA->Parameters[i].LocalizedName));
noParam++;
}
}
validCurrentCommand();
// Update the key name
const CActionsManager::TActionComboMap &actionCombo = pAM->getActionComboMap();
CActionsManager::TActionComboMap::const_iterator it = actionCombo.find(CurrentEditCmdLine.ActionName);
// Deactive the key definition (we are in edit key mode)
CCtrlBaseButton *pBut = dynamic_cast(pIM->getElementFromId(WinName+CTRL_EDITCMD_BUTTON_KEY));
if (pBut != NULL) pBut->setActive(false);
if (it != actionCombo.end())
{
CurrentEditCmdLine.Combo = it->second;
// Activate the key definer text
CViewText *pVT = dynamic_cast(pIM->getElementFromId(WinName+VIEW_EDITCMD_TEXT_KEY));
if (pVT != NULL) pVT->setActive(true);
// setup the text of the key
pVT->setText(it->second.toUCString());
// There is already a shortcut so we can display ok button
pBut = dynamic_cast(pIM->getElementFromId(WinName+CTRL_EDITCMD_BUTTON_OK));
if (pBut != NULL) pBut->setFrozen (false);
}
}
// ***************************************************************************
// Given the cat index in comboBox, find action manager and the real cat index depending on the AM / macrosiable categories
bool CModalContainerEditCmd::getCatIndexAndAM (sint32 nInCatIndex, sint32 &nOutCatIndex, CActionsManager*&nOutAM)
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
if (nInCatIndex >= (sint32)CurrentEditCmdCategories.size())
return false;
string catName = CurrentEditCmdCategories[nInCatIndex];
for (uint i=0; i < pMCM->ActionManagers.size(); ++i)
{
CActionsManager *pAM = pMCM->ActionManagers[i];
const vector &rVCat = pAM->getCategories();
for (uint j=0; j < rVCat.size(); ++j)
{
if (rVCat[j].Name == catName)
{
nOutCatIndex = j;
nOutAM = pAM;
return true;
}
}
}
return false;
}
// ***************************************************************************
// Give the action index in Combo box, find the action index in the category (skip not macroisable actions)
bool CModalContainerEditCmd::getBaseActionIndex(const CCategory &cat, sint32 nInActIndex, sint32 &nOutActIndex)
{
if(nInActIndex<0)
return false;
for(nOutActIndex=0; nOutActIndex<(sint32)cat.BaseActions.size();nOutActIndex++)
{
// only macroisable (or if allow all)
if(_AllowAllActions || cat.BaseActions[nOutActIndex].Macroisable)
{
// must be valid in current context
if (cat.BaseActions[nOutActIndex].isUsableInCurrentContext())
{
// ok, found?
if(nInActIndex==0) return true;
else nInActIndex--;
}
}
}
return false;
}
// ***************************************************************************
// The current command is not valid (so we cant drag it into a macro nor define a key for it)
void CModalContainerEditCmd::invalidCurrentCommand()
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
CViewText *pVT;
if (CurrentEditCmdNb == -1)
{
// Dont display key shortcut if we are in creation mode
pVT= dynamic_cast(pIM->getElementFromId( WinName+VIEW_EDITCMD_TEXT_KEY ));
if (pVT != NULL) pVT->setText(CI18N::get(VIEW_EDITCMD_TEXT_KEY_DEFAULT));
// Deactivate the key definer text
pVT = dynamic_cast(pIM->getElementFromId(WinName+VIEW_EDITCMD_TEXT_KEY));
if (pVT != NULL) pVT->setActive(false);
}
// Deactivate the key definer button
CCtrlBaseButton *pCB = dynamic_cast(pIM->getElementFromId(WinName+CTRL_EDITCMD_BUTTON_KEY));
if (pCB != NULL) pCB->setActive(false);
// Deactivate ok button
pCB = dynamic_cast(pIM->getElementFromId(WinName+CTRL_EDITCMD_BUTTON_OK));
if (pCB != NULL) pCB->setFrozen (true);
}
// ***************************************************************************
// The current command becomes valid (display key shortcut if any)
void CModalContainerEditCmd::validCurrentCommand()
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
sint32 catIndex= pIM->getDbProp( DbComboSelCat )->getValue32();
if(catIndex < 0) return;
sint32 actIndex= pIM->getDbProp( DbComboSelAct )->getValue32();
if(actIndex < 0) return;
CActionsManager *pAM;
// From ComboBox to index in category/action
if (!getCatIndexAndAM(catIndex,catIndex,pAM)) return;
if (!getBaseActionIndex(pAM->getCategories()[catIndex], actIndex,actIndex)) return;
// get the action
const CBaseAction &rBA = pAM->getCategories()[catIndex].BaseActions[actIndex];
// Build couple (name,param) that define a command
CurrentEditCmdLine.ActionName.Name = rBA.Name;
CurrentEditCmdLine.ActionName.Argu = "";
uint noParam = 0;
for (uint i = 0; i < rBA.Parameters.size(); ++i)
{
const CBaseAction::CParameter &rP = rBA.Parameters[i];
if (noParam >= 2) break; // NO MORE THAN 2 REAL PARAMS !
if ((i >= 1) && (!CurrentEditCmdLine.ActionName.Argu.empty())) CurrentEditCmdLine.ActionName.Argu+= "|";
if (!rP.Name.empty())
CurrentEditCmdLine.ActionName.Argu += rP.Name + "=";
if (rP.Type == CBaseAction::CParameter::Hidden)
{
CurrentEditCmdLine.ActionName.Argu += rP.DefaultValue;
}
else if (rP.Type == CBaseAction::CParameter::Constant)
{
// If the param is constant get the string from the list
// cannot use index directly because some options may be disabled in current context
sint32 paramIndex;
const std::vector &rVVal = rP.Values;
if (noParam == 0) paramIndex = pIM->getDbProp(DbComboSel1P)->getValue32();
else paramIndex = pIM->getDbProp(DbComboSel2P)->getValue32();
uint currIndex = 0;
for (uint k = 0; k < rVVal.size(); ++k)
{
const CBaseAction::CParameter::CValue &rVal = rVVal[k];
if (ActionsContext.matchContext(rVal.Contexts))
{
if (currIndex == (uint) paramIndex)
{
CurrentEditCmdLine.ActionName.Argu += rVal.Value;
noParam++;
}
currIndex ++;
}
}
}
else if ((rP.Type == CBaseAction::CParameter::User) || (rP.Type == CBaseAction::CParameter::UserName))
{
// If the param is user or username get the string from the edit box
string sWin;
if (noParam == 0) sWin = WinName+WIN_EDITCMD_COMBO_FIRST_PARAM_EDITBOX;
else sWin = WinName+WIN_EDITCMD_COMBO_SECOND_PARAM_EDITBOX;
CGroupEditBox *pEB= dynamic_cast(pIM->getElementFromId( sWin ));
// convert to utf8
if (pEB != NULL)
CurrentEditCmdLine.ActionName.Argu += pEB->getInputStringAsUtf8();
noParam++;
}
}
// End of build
// If we are in mode new shortcut display the button to setup a key
if (WinName == "ui:interface:newkey")
{
if (CurrentEditCmdNb == -1)
{
// Activate the key definer button
CCtrlBaseButton *pCB = dynamic_cast(pIM->getElementFromId(WinName+CTRL_EDITCMD_BUTTON_KEY));
if (pCB != NULL) pCB->setActive(true);
// Activate the key definer text
CViewText *pVT = dynamic_cast(pIM->getElementFromId(WinName+VIEW_EDITCMD_TEXT_KEY));
if (pVT != NULL) pVT->setActive(true);
// Does the command already exists ?
const CActionsManager::TActionComboMap &actionCombo = pAM->getActionComboMap();
CActionsManager::TActionComboMap::const_iterator it = actionCombo.find(CurrentEditCmdLine.ActionName);
if (it != actionCombo.end())
{
CurrentEditCmdLine.Combo = it->second;
// Yes ok let setup the text of the key
pVT->setText(it->second.toUCString());
// There is already a shortcut so we can display ok button
CCtrlBaseButton *pCB = dynamic_cast(pIM->getElementFromId(WinName+CTRL_EDITCMD_BUTTON_OK));
if (pCB != NULL) pCB->setFrozen (false);
}
else
{
CurrentEditCmdLine.Combo.Key = KeyCount;
CurrentEditCmdLine.Combo.KeyButtons = noKeyButton;
// Display not assigned text
pVT->setText(CI18N::get(VIEW_EDITCMD_TEXT_KEY_DEFAULT));
// Do not display the ok button
CCtrlBaseButton *pCB = dynamic_cast(pIM->getElementFromId(WinName+CTRL_EDITCMD_BUTTON_OK));
if (pCB != NULL) pCB->setFrozen (true);
}
}
else
{
CCtrlBaseButton *pCB = dynamic_cast(pIM->getElementFromId(WinName+CTRL_EDITCMD_BUTTON_OK));
if (pCB != NULL) pCB->setFrozen (false);
}
}
// If we are in mode new command (from macro) just turn on the ok button
if (WinName == "ui:interface:editcmd")
{
CCtrlBaseButton *pCB = dynamic_cast(pIM->getElementFromId(WinName+CTRL_EDITCMD_BUTTON_OK));
if (pCB != NULL) pCB->setFrozen(false);
}
}
// ***************************************************************************
// Check if the param is valid depending on the type of the param
bool CModalContainerEditCmd::isParamValid (sint32 nParamIndex)
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
sint32 paramType;
if (nParamIndex == 0) paramType = pIM->getDbProp(DbComboDisp1P)->getValue32();
else paramType = pIM->getDbProp(DbComboDisp2P)->getValue32();
if (paramType == 0) // combo box list
{
sint32 paramListIndex;
if (nParamIndex == 0) paramListIndex = pIM->getDbProp( DbComboSel1P )->getValue32();
else paramListIndex = pIM->getDbProp( DbComboSel2P )->getValue32();
if (paramListIndex < 0) return false;
else return true;
}
else if (paramType == 1)
{
CGroupEditBox *pEB;
if (nParamIndex == 0) pEB = dynamic_cast(pIM->getElementFromId( WinName+WIN_EDITCMD_COMBO_FIRST_PARAM_EDITBOX ));
else pEB = dynamic_cast(pIM->getElementFromId( WinName+WIN_EDITCMD_COMBO_SECOND_PARAM_EDITBOX ));
if (pEB == NULL) return false;
// no need to translate utf8 or not here
if (pEB->getInputStringRef().empty()) return false;
else return true;
}
return false;
}
// ***************************************************************************
void CModalContainerEditCmd::checkCurrentCommandValidity()
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
// Get the category selected
sint32 catIndex= pIM->getDbProp( DbComboSelCat )->getValue32();
if(catIndex < 0) return;
// Get the action index selected
sint32 actIndex= pIM->getDbProp( DbComboSelAct )->getValue32();
if(actIndex < 0) return;
CActionsManager *pAM;
// From ComboBox to index in category/action
if (!getCatIndexAndAM(catIndex,catIndex,pAM)) return;
if (!getBaseActionIndex(pAM->getCategories()[catIndex], actIndex,actIndex)) return;
// get action
const vector &rVBA = pAM->getCategories()[catIndex].BaseActions;
const vector &rVParams = rVBA[actIndex].Parameters;
// Count nb real param
uint nbparam = 0;
for (uint i = 0; i < rVParams.size(); ++i)
if (rVParams[i].Type != CBaseAction::CParameter::Hidden)
nbparam ++;
if (nbparam == 0)
{
validCurrentCommand();
return;
}
// Check parameters
if (!isParamValid(0))
{
invalidCurrentCommand();
return;
}
// First param is valid
if (nbparam == 1) // If there is only one param requested so validate
{
validCurrentCommand();
}
else
{ // 2 params
nlassert(nbparam == 2);
if (isParamValid(1))
validCurrentCommand();
else
invalidCurrentCommand();
}
}
// ***************************************************************************
void CModalContainerEditCmd::onChangeCategory()
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
// Get the category selected
sint32 catIndex= pIM->getDbProp( DbComboSelCat )->getValue32();
if(catIndex < 0)
return;
// Update the combo box of actions
CDBGroupComboBox *pCB= dynamic_cast(pIM->getElementFromId( WinName+WIN_EDITCMD_COMBO_ACTION ));
if( pCB )
{
pCB->resetTexts();
// From combo box index to real category index
if (!getCatIndexAndAM(catIndex,catIndex,CurAM)) return;
const vector &rVBA = CurAM->getCategories()[catIndex].BaseActions;
// add only macroisable actions (or if allow all)
for (uint i = 0; i < rVBA.size(); i++)
{
const CBaseAction &rBA = rVBA[i];
if(_AllowAllActions || rBA.Macroisable)
{
if (rBA.isUsableInCurrentContext())
{
pCB->addText( CI18N::get(rBA.LocalizedName) );
}
}
}
}
// reset the action and dont display params
pIM->getDbProp( DbComboSelAct )->setValue32(-1);
pIM->getDbProp( DbComboSel1P )->setValue32(-1);
pIM->getDbProp( DbComboSel2P )->setValue32(-1);
pIM->getDbProp( DbComboDisp1P )->setValue32(-1);
pIM->getDbProp( DbComboDisp2P )->setValue32(-1);
// reset name of params
CViewText *pViewParamName;
pViewParamName = dynamic_cast(pIM->getElementFromId(WinName+VIEW_EDITCMD_FIRST_PARAM_NAME));
if (pViewParamName != NULL) pViewParamName->setText (string(""));
pViewParamName = dynamic_cast(pIM->getElementFromId(WinName+VIEW_EDITCMD_SECOND_PARAM_NAME));
if (pViewParamName != NULL) pViewParamName->setText (string(""));
// Reset key
invalidCurrentCommand();
}
// ***************************************************************************
void CModalContainerEditCmd::onChangeAction()
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
// Get the category selected
sint32 catIndex= pIM->getDbProp( DbComboSelCat )->getValue32();
if(catIndex < 0)
return;
// Get the action index selected
sint32 actIndex= pIM->getDbProp( DbComboSelAct )->getValue32();
if(actIndex < 0)
return;
// From combo box index to cat/action index
if (!getCatIndexAndAM(catIndex,catIndex,CurAM)) return;
if (!getBaseActionIndex(CurAM->getCategories()[catIndex], actIndex,actIndex)) return;
// Check parameters
const vector &rVBA = CurAM->getCategories()[catIndex].BaseActions;
const vector &rVParams = rVBA[actIndex].Parameters;
pIM->getDbProp( DbComboDisp1P )->setValue32(-1);
pIM->getDbProp( DbComboDisp2P )->setValue32(-1);
pIM->getDbProp( DbComboSel1P )->setValue32(-1);
pIM->getDbProp( DbComboSel2P )->setValue32(-1);
// reset name of params
CViewText *pViewParamName;
pViewParamName = dynamic_cast(pIM->getElementFromId(WinName+VIEW_EDITCMD_FIRST_PARAM_NAME));
if (pViewParamName != NULL) pViewParamName->setText (string(""));
pViewParamName = dynamic_cast(pIM->getElementFromId(WinName+VIEW_EDITCMD_SECOND_PARAM_NAME));
if (pViewParamName != NULL) pViewParamName->setText (string(""));
uint noParam = 0;
for (uint i = 0; i < rVParams.size(); ++i)
{
const CBaseAction::CParameter &rP = rVParams[i];
if (rP.Type == CBaseAction::CParameter::Hidden)
continue;
string sDB;
if (noParam >= 2) break; // NO MORE THAN 2 PARAMS !
if (noParam == 0)
sDB = DbComboDisp1P;
else
sDB = DbComboDisp2P;
// Set the parameter name
{
string sViewText;
if (noParam == 0) sViewText = WinName+VIEW_EDITCMD_FIRST_PARAM_NAME;
else sViewText = WinName+VIEW_EDITCMD_SECOND_PARAM_NAME;
pViewParamName = dynamic_cast(pIM->getElementFromId(sViewText));
if (pViewParamName != NULL)
pViewParamName->setText (CI18N::get(rP.LocalizedName));
}
if (rP.Type == CBaseAction::CParameter::Constant)
{
string sWin;
if (noParam == 0) sWin = WinName+WIN_EDITCMD_COMBO_FIRST_PARAM_LIST;
else sWin = WinName+WIN_EDITCMD_COMBO_SECOND_PARAM_LIST;
CDBGroupComboBox *pCB= dynamic_cast(pIM->getElementFromId( sWin ));
if( pCB )
{
pCB->resetTexts();
const std::vector &rVVal = rP.Values;
for (uint j = 0; j < rVVal.size(); j++)
{
const CBaseAction::CParameter::CValue &rVal = rVVal[j];
if (ActionsContext.matchContext(rVal.Contexts))
{
if ((rVal.LocalizedValue.size() >= 2) &&
(rVal.LocalizedValue[0] == 'u') && (rVal.LocalizedValue[1] == 'i'))
pCB->addText(CI18N::get(rVal.LocalizedValue));
else
pCB->addText(ucstring(rVal.LocalizedValue));
}
}
}
pIM->getDbProp( sDB )->setValue32(0);
}
else if ((rP.Type == CBaseAction::CParameter::User) || (rP.Type == CBaseAction::CParameter::UserName))
{
string sWin;
if (noParam == 0) sWin = WinName+WIN_EDITCMD_COMBO_FIRST_PARAM_EDITBOX;
else sWin = WinName+WIN_EDITCMD_COMBO_SECOND_PARAM_EDITBOX;
CGroupEditBox *pEB= dynamic_cast(pIM->getElementFromId( sWin ));
if( pEB )
{
pEB->setInputString(ucstring(""));
}
pIM->getDbProp( sDB )->setValue32(1);
}
noParam++;
}
// If action do not need any params validate the command
if (noParam == 0)
validCurrentCommand();
else
invalidCurrentCommand();
}
// ***************************************************************************
// Action handlers associated to the editcmd container
// ***************************************************************************
// ***************************************************************************
// Called at activate of macros container
class CHandlerEditCmdOpen: public IActionHandler
{
public:
virtual void execute(CCtrlBase * /* pCaller */, const string &Params)
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
// If we are in key shortcut mode
if (Params == "newkey")
{
CGroupContainer *pGC = pMCM->NewKey->Win;
//pMCM->NewKey->activate();
if (pGC != NULL) pGC->setModalParentList(WIN_KEYS);
if (pMCM->NewKey->CurrentEditCmdNb == -1)
pMCM->NewKey->setTitle(WIN_EDITCMD_TITLE_NEW_KEY);
else
pMCM->NewKey->setTitle(WIN_EDITCMD_TITLE_EDIT_KEY);
}
// If we are in macro mode
if (Params == "editcmd")
{
CGroupContainer *pGC = pMCM->EditCmd->Win;
//pMCM->EditCmd->activate();
if (pGC != NULL) pGC->setModalParentList(WIN_NEWMACRO);
// Set right title depending if we are in new command
if (pMCM->EditCmd->CurrentEditCmdNb == -1)
pGC->setTitle (WIN_EDITCMD_TITLE_NEW_CMD);
else // or not (edit cmd)
pGC->setTitle (WIN_EDITCMD_TITLE_EDIT_CMD);
}
}
};
REGISTER_ACTION_HANDLER( CHandlerEditCmdOpen, "editcmd_open");
// ***************************************************************************
// Called when we change category
class CHandlerEditCmdChangeCategory : public IActionHandler
{
public:
virtual void execute(CCtrlBase * /* pCaller */, const string &Params)
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
if (Params == "editcmd")
pMCM->EditCmd->onChangeCategory();
if (Params == "newkey")
pMCM->NewKey->onChangeCategory();
}
};
REGISTER_ACTION_HANDLER( CHandlerEditCmdChangeCategory, "editcmd_change_category");
// ***************************************************************************
// Called when we change action
class CHandlerEditCmdChangeAction : public IActionHandler
{
public:
virtual void execute(CCtrlBase * /* pCaller */, const string &Params)
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
if (Params == "editcmd")
pMCM->EditCmd->onChangeAction();
if (Params == "newkey")
pMCM->NewKey->onChangeAction();
}
};
REGISTER_ACTION_HANDLER( CHandlerEditCmdChangeAction, "editcmd_change_action");
// ***************************************************************************
// Called when we change the first param
class CHandlerEditCmdChangeFirstParam: public IActionHandler
{
public:
virtual void execute(CCtrlBase * /* pCaller */, const string &Params)
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
if (Params == "editcmd")
pMCM->EditCmd->checkCurrentCommandValidity();
if (Params == "newkey")
pMCM->NewKey->checkCurrentCommandValidity();
}
};
REGISTER_ACTION_HANDLER( CHandlerEditCmdChangeFirstParam, "editcmd_change_first_param");
// ***************************************************************************
// Called when we change the second param
class CHandlerEditCmdChangeSecondParam: public IActionHandler
{
public:
virtual void execute(CCtrlBase * /* pCaller */, const string &Params)
{
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
if (Params == "editcmd")
pMCM->EditCmd->checkCurrentCommandValidity();
if (Params == "newkey")
pMCM->NewKey->checkCurrentCommandValidity();
}
};
REGISTER_ACTION_HANDLER( CHandlerEditCmdChangeSecondParam, "editcmd_change_second_param");
// ***************************************************************************
// Called when we want to define a key for that command
class CHandlerEditCmdDefineKey: public IActionHandler
{
public:
virtual void execute(CCtrlBase *pCaller, const string &Params)
{
//checkCurrentCommandValidity();
CInterfaceManager *pIM = CInterfaceManager::getInstance();
CGroupModalGetKey*pGetKey = dynamic_cast(pIM->getElementFromId(WIN_MODAL_GET_KEY));
pGetKey->Caller = Params;
pIM->enableModalWindow(pCaller, WIN_MODAL_GET_KEY);
}
};
REGISTER_ACTION_HANDLER( CHandlerEditCmdDefineKey, "editcmd_cmd_def_key");
// ***************************************************************************
// Called when we validate the command
class CHandlerEditCmdOK: public IActionHandler
{
public:
virtual void execute(CCtrlBase *pCaller, const string &Params)
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
// If we are in key shortcut mode
if (Params == "newkey")
{
// Add the key !
pMCM->NewKey->CurAM->addCombo(pMCM->NewKey->CurrentEditCmdLine.ActionName,
pMCM->NewKey->CurrentEditCmdLine.Combo);
// Refresh key containers
pMCM->refreshAllKeyDisplays();
pMCM->NewKey->deactivate();
}
// If we are in new command from macro mode
if (Params == "editcmd")
{
if (pMCM->EditCmd->CurrentEditCmdNb != -1) // Edit mode ?
{
pMCM->CurrentEditMacro.delCommand(pMCM->EditCmd->CurrentEditCmdNb);
pMCM->CurrentEditMacro.addCommand (pMCM->EditCmd->CurrentEditCmdLine.ActionName.Name.c_str(),pMCM->EditCmd->CurrentEditCmdLine.ActionName.Argu.c_str(),
pMCM->EditCmd->CurrentEditCmdNb);
}
else
{
pMCM->CurrentEditMacro.addCommand(pMCM->EditCmd->CurrentEditCmdLine.ActionName.Name.c_str(),pMCM->EditCmd->CurrentEditCmdLine.ActionName.Argu.c_str());
}
pIM->runActionHandler("new_macro_open", pCaller);
pMCM->EditCmd->deactivate();
}
}
};
REGISTER_ACTION_HANDLER( CHandlerEditCmdOK, "editcmd_ok");
// ***************************************************************************
// Called when the key defined is validated (with ok button on the assign_key modal)
class CHandlerAssignKey: public IActionHandler
{
public:
virtual void execute(CCtrlBase * /* pCaller */, const string &/* Params */)
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
CMacroCmdManager *pMCM = CMacroCmdManager::getInstance();
pIM->disableModalWindow();
CGroupModalGetKey*pGetKey = dynamic_cast(pIM->getElementFromId(WIN_MODAL_GET_KEY));
if (pGetKey == NULL)
return;
// If we are in key shortcut mode
if (pGetKey->Caller=="editkey")
{
pMCM->NewKey->CurrentEditCmdLine.Combo = pGetKey->Combo;
pMCM->NewKey->CurAM->addCombo(pMCM->NewKey->CurrentEditCmdLine.ActionName,
pMCM->NewKey->CurrentEditCmdLine.Combo);
// Refresh all keys
pMCM->refreshAllKeyDisplays();
}
// If we are in newkey mode
if (pGetKey->Caller=="newkey")
{
pMCM->NewKey->CurrentEditCmdLine.Combo = pGetKey->Combo;
CViewText *pVT = dynamic_cast(pIM->getElementFromId(pMCM->NewKey->WinName+VIEW_EDITCMD_TEXT_KEY));
if (pVT != NULL) pVT->setText(pMCM->NewKey->CurrentEditCmdLine.Combo.toUCString());
CCtrlBaseButton *pCB = dynamic_cast(pIM->getElementFromId(pMCM->NewKey->WinName+CTRL_EDITCMD_BUTTON_OK));
if (pCB != NULL) pCB->setFrozen (false);
}
// If we are in mode macro
if (pGetKey->Caller=="editcmd")
{
pMCM->EditCmd->CurrentEditCmdLine.Combo = pGetKey->Combo;
pMCM->CurrentEditMacro.Combo = pMCM->EditCmd->CurrentEditCmdLine.Combo;
CViewText *pVT = dynamic_cast(pIM->getElementFromId(VIEW_NEWMACRO_KEY));
if (pVT != NULL) pVT->setText(pMCM->EditCmd->CurrentEditCmdLine.Combo.toUCString());
}
}
};
REGISTER_ACTION_HANDLER( CHandlerAssignKey, "ah_assign_key");
// ***************************************************************************
static DECLARE_INTERFACE_USER_FCT(canEditKey)
{
if(args.size()!=1)
{
nlwarning(" requires 1 arg");
return false;
}
// cand edit?
sint lineNb= (sint)args[0].getInteger();
CMacroCmdManager *pMCM= CMacroCmdManager::getInstance();
if(lineNb<0 || lineNb>=(sint)pMCM->NewKey->AllLines.size())
result.setBool(false);
else
{
CModalContainerEditCmd::CLine &line= pMCM->NewKey->AllLines[lineNb];
// get the action manager for this line
nlassert(line.ComboAMActionManagers.size());
CActionsManager *pCurAM = pMCM->ActionManagers[line.ComboAM];
nlassert(pCurAM);
// can edit the action only if the action name is not "Force Display"
result.setBool(!pCurAM->isActionDisplayForced(line.ActionName));
}
return true;
}
REGISTER_INTERFACE_USER_FCT("canEditKey", canEditKey)
// ***************************************************************************
static DECLARE_INTERFACE_USER_FCT(canDeleteKey)
{
if(args.size()!=1)
{
nlwarning(" requires 1 arg");
return false;
}
// cand delete?
sint lineNb= (sint)args[0].getInteger();
CMacroCmdManager *pMCM= CMacroCmdManager::getInstance();
if(lineNb<0 || lineNb>=(sint)pMCM->NewKey->AllLines.size())
result.setBool(false);
else
{
CModalContainerEditCmd::CLine &line= pMCM->NewKey->AllLines[lineNb];
// get the action manager for this line
nlassert(line.ComboAMActionManagers.size());
CActionsManager *pCurAM = pMCM->ActionManagers[line.ComboAM];
nlassert(pCurAM);
// cannot delete the action if the action name is "Force Display" AND NotAssigned (since already deleted)
result.setBool( !(pCurAM->isActionDisplayForced(line.ActionName) && line.Combo.Key==KeyCount) );
}
return true;
}
REGISTER_INTERFACE_USER_FCT("canDeleteKey", canDeleteKey)