// *************************************************************************** void CDBGroupListSheetTrade::checkCoords () { CDBGroupListSheetText::checkCoords(); STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); bool mustUpdateCoords= false; // test each child to update each frame, if need to update text id for( set< CSheetChildTrade *>::iterator it = VendorNameIdToUpdate.begin(); it != VendorNameIdToUpdate.end(); ) { CSheetChildTrade * cst = (*it); // String result ucstring result; if( pSMC->getString ( cst->LastVendorNameId, result) ) { cst->VendorNameString = CEntityCL::removeShardFromName(result); set< CSheetChildTrade *>::iterator itTmp = it; ++it; VendorNameIdToUpdate.erase(itTmp); cst->NeedUpdateText= true; mustUpdateCoords= true; } else { ++it; } } // invalidate coords if one of the child need it if(mustUpdateCoords) invalidateCoords(); }
// *************************************************************************** void CEncyclopediaManager::rebuildAlbumPage(uint32 albumName) { uint32 i; CEncyMsgAlbum *pAlbum = NULL; // Select the right album for (i = 0; i < _Albums.size(); ++i) { if (_Albums[i].Name == albumName) { _AlbumNameSelected = _Albums[i].Name; pAlbum = &_Albums[i]; break; } } if (pAlbum == NULL) return; // Update the right page CInterfaceManager *pIM = CInterfaceManager::getInstance(); // Hide and show good group CInterfaceElement *pIE = pIM->getElementFromId(PAGE_ENCY_ALBUM); nlassert(pIE != NULL); pIE->setActive(true); pIE = pIM->getElementFromId(PAGE_ENCY_HELP); pIE->setActive(false); pIE = pIM->getElementFromId(PAGE_ENCY_THEMA); pIE->setActive(false); // Setup title CViewTextID *pVT = dynamic_cast<CViewTextID*>(pIM->getElementFromId(PAGE_ENCY_ALBUM ":title")); nlassert(pVT != NULL); pVT->setTextId(pAlbum->Name); // Setup brick reward pIM->getDbProp("UI:VARIABLES:ENCY:ALBUMBRICK:SHEET")->setValue32(pAlbum->RewardBrick); CViewText *pRBVT = dynamic_cast<CViewText*>(pIM->getElementFromId(PAGE_ENCY_ALBUM ":reward:desc")); if (pRBVT != NULL) { STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); const ucstring desc(pSMC->getSBrickLocalizedDescription(CSheetId(pAlbum->RewardBrick))); pRBVT->setText(desc); } }
// *************************************************************************** // For the group tree we have to check the incoming phrase because no view id stored bool CEncyclopediaManager::isStringWaiting() { STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); for (uint32 i = 0; i < _Albums.size(); ++i) { ucstring res; if (!pSMC->getDynString(_Albums[i].Name, res)) return true; for (uint32 j = 0; j < _Albums[i].Themas.size(); ++j) { if (!pSMC->getDynString(_Albums[i].Themas[j].Name, res)) return true; } } return false; }
// *************************************************************************** static DECLARE_INTERFACE_USER_FCT(getSquadDesc) { if(args.size()!=1) { nlwarning("<getSquadDesc> requires 1 arg (int=sheet)"); return false; } // get arg uint32 nSheet = (uint32)args[0].getInteger(); if (nSheet == 0) { result.setUCString(string("")); return true; } // get sheet name STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); const ucstring name(pSMC->getSquadLocalizedDescription(CSheetId(nSheet))); result.setUCString(name); return true; }
// *************************************************************************** static DECLARE_INTERFACE_USER_FCT(getOutpostBuildingDesc) { if(args.size()!=1) { nlwarning("<getOutpostBuildingDesc> requires 1 arg (int=sheet)"); return false; } // get arg uint32 nSheet = (uint32)args[0].getInteger(); if (nSheet == 0) { result.setUCString(string("")); return true; } // get sheet name ucstring name; CEntitySheet *pSheet= SheetMngr.get(CSheetId(nSheet)); COutpostBuildingSheet *pOBS = dynamic_cast<COutpostBuildingSheet*>(pSheet); if (pOBS && pOBS->OBType == COutpostBuildingSheet::OB_Empty) { // Don't display description if the building is an empty slot name = ""; } else { STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); name = pSMC->getOutpostBuildingLocalizedDescription(CSheetId(nSheet)); } result.setUCString(name); return true; }
// *************************************************************************** void CDBGroupListSheetTrade::CSheetChildTrade::updateViewText(CDBGroupListSheetText *pFather) { H_AUTO(CDBGroupListSheetTrade_updateViewText); ucstring text; Ctrl->getContextHelp(text); // Append first the type of the sheet to select switch ( Ctrl->getSheetCategory() ) { case CDBCtrlSheet::Item: break; // none for item. consider useless case CDBCtrlSheet::Pact: text= CI18N::get("uiBotChatPact") + text; break; case CDBCtrlSheet::Skill: text= CI18N::get("uiBotChatSkill") + text; break; case CDBCtrlSheet::GuildFlag: text= CI18N::get("uiBotChatSkill") + text; break; case CDBCtrlSheet::Phrase: text= CI18N::get("uiBotChatPhrase") + text; break; default: break; } // For outpost building get description from string manager if(Ctrl->getType() == CCtrlSheetInfo::SheetType_OutpostBuilding) { const COutpostBuildingSheet *pOBS = Ctrl->asOutpostBuildingSheet(); if (pOBS != NULL) { STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); text += string("\n") + pSMC->getOutpostBuildingLocalizedDescription(CSheetId(Ctrl->getSheetId())); text += "\n" + CI18N::get("uiBotChatPrice") + NLMISC::formatThousands(toString(pOBS->CostDapper)); text += CI18N::get("uiBotChatTime") + toString(pOBS->CostTime/60) + CI18N::get("uiBotChatTimeMinute"); if ((pOBS->CostTime % 60) != 0) text += toString(pOBS->CostTime%60) + CI18N::get("uiBotChatTimeSecond"); } } // For Phrase, if combat, add Weapon compatibility if(Ctrl->getSheetCategory() == CDBCtrlSheet::Phrase) { // For combat action, Append weapon restriction ucstring weaponRestriction; CSPhraseManager *pPM= CSPhraseManager::getInstance(); bool melee,range; pPM->getCombatWeaponRestriction(weaponRestriction, Ctrl->getSheetId(),melee,range); // don't add also if no combat restriction if(!weaponRestriction.empty() && weaponRestriction!=CI18N::get("uiawrSF")) { weaponRestriction= CI18N::get("uiPhraseWRHeader") + weaponRestriction; text+= "\n" + weaponRestriction; } } // Get the Text color ucstring colorTag("@{FFFF}"); if(Ctrl->getType() == CCtrlSheetInfo::SheetType_Item) { if(!Ctrl->checkItemRequirement()) colorTag= CI18N::get("uiItemCannotUseColor"); } // For item, add some information if(Ctrl->getType() == CCtrlSheetInfo::SheetType_Item) { const CItemSheet *pIS = Ctrl->asItemSheet(); if(pIS) { // Add craft info for MP if(pIS->Family==ITEMFAMILY::RAW_MATERIAL) { ucstring ipList; pIS->getItemPartListAsText(ipList); if(ipList.empty()) { if(pIS->isUsedAsCraftRequirement()) text+= "\n" + CI18N::get("uiItemMpCraftRequirement"); else text+= "\n" + CI18N::get("uiItemMpNoCraft"); } else text+= "\n" + CI18N::get("uiItemMpCanCraft") + ipList; } } } // get the price CDBGroupListSheetTrade *zeFather = safe_cast<CDBGroupListSheetTrade*>(pFather); if (zeFather->priceWanted()) { if(Ctrl->getSheetCategory() == CDBCtrlSheet::Phrase) { if (LastPrice != -1) text+= "\n" + CI18N::get("uiBotChatSkillPointCost") + toString(LastPrice); else text+= "\n" + CI18N::get("uiBotChatSkillPointCostNotReceived"); } else { bool guildOption= false; // Special case if its a guild option if (Ctrl->getType() == CCtrlSheetInfo::SheetType_Item) { const CItemSheet *pIS = Ctrl->asItemSheet(); if (pIS && pIS->Family == ITEMFAMILY::GUILD_OPTION) { text+= "\n" + CI18N::get("uiBotChatSkillPointCost") + toString(pIS->GuildOption.XPCost); text+= "\n" + CI18N::get("uiBotChatPrice") + NLMISC::formatThousands(toString(pIS->GuildOption.MoneyCost)); guildOption= true; } } // if not a guild option if(!guildOption) { if (LastPrice != -1) { const CItemSheet *pIS = Ctrl->asItemSheet(); uint factor= 1; if(zeFather->getMultiplyPriceByQuantityFlag()) factor= LastQuantity; // factor on price float priceFactor = 1.0f; // Append std price bool displayMulPrice= pIS && pIS->Stackable>1 && zeFather->getMultiplyPriceByQuantityFlag(); // If seller type wanted, don't mul price if the item comes from a NPC if(zeFather->sellerTypeWanted() && LastSellerType==BOTCHATTYPE::NPC) displayMulPrice= false; // check if we should apply fame factor if( zeFather->applyFamePriceFactor() ) { priceFactor = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:TRADING:FAME_PRICE_FACTOR")->getValue16()/10000.0f; } // display with correct format if (LastPrice > 0) { if(displayMulPrice) text+= "\n" + CI18N::get("uiBotChatPrice") + NLMISC::formatThousands(toString(sint32(LastPrice * priceFactor))) + " (" + NLMISC::formatThousands(toString( sint32(factor) * sint32(LastPrice * priceFactor) )) + ")"; else text+= "\n" + CI18N::get("uiBotChatPrice") + NLMISC::formatThousands(toString( sint32(factor * LastPrice * priceFactor) )); } if ((LastFactionPointPrice != 0) && (LastFactionType >= PVP_CLAN::BeginClans) && (LastFactionType <= PVP_CLAN::EndClans)) { if (LastPrice > 0) text += ". "; else text+= "\n"; text+= CI18N::get("uiBotChatFactionType") + PVP_CLAN::toString((PVP_CLAN::TPVPClan)LastFactionType) + CI18N::get("uiBotChatFactionPointPrice") + NLMISC::formatThousands(toString(LastFactionPointPrice)); } // some additional info for resale if(zeFather->sellerTypeWanted()) { // Append retire price if reseller type OK (only if the item belongs to the player) if(LastSellerType == BOTCHATTYPE::User || LastSellerType == BOTCHATTYPE::ResaleAndUser || LastSellerType == BOTCHATTYPE::UserRetirable || LastSellerType == BOTCHATTYPE::ResaleAndUserRetirable ) { // append price if(pIS && pIS->Stackable>1 && zeFather->getMultiplyPriceByQuantityFlag()) text+= CI18N::get("uiBotChatRetirePrice") + NLMISC::formatThousands(toString(LastPriceRetire)) + " (" + NLMISC::formatThousands(toString(factor * LastPriceRetire)) + ")"; else text+= CI18N::get("uiBotChatRetirePrice") + NLMISC::formatThousands(toString(factor * LastPriceRetire)); // set resale time left ucstring fmt= CI18N::get("uiBotChatResaleTimeLeft"); strFindReplace(fmt, "%d", toString(LastResaleTimeLeft/RYZOM_DAY_IN_HOUR)); strFindReplace(fmt, "%h", toString(LastResaleTimeLeft%RYZOM_DAY_IN_HOUR)); text+= "\n" + fmt; // force special color (according if retirable or not) if(LastSellerType == BOTCHATTYPE::UserRetirable || LastSellerType == BOTCHATTYPE::ResaleAndUserRetirable) colorTag= CI18N::get("uiItemUserSellColor"); else colorTag= CI18N::get("uiItemUserSellColorNotRetirable"); } // Append (NPC) tag if NPC item if(LastSellerType == BOTCHATTYPE::NPC) { text+= "\n" + CI18N::get("uiBotChatNPCTag"); } // else display the name of the vendor (not if this is the player himself, to avoid flood) else if (LastSellerType == BOTCHATTYPE::Resale) { text+= "\n" + CI18N::get("uiBotChatVendorTag") + VendorNameString; } } } else { // If comes from User List, -1 means "Already Sold" if(zeFather->sellerTypeWanted() && (LastSellerType == BOTCHATTYPE::User || LastSellerType == BOTCHATTYPE::UserRetirable) ) { text+= "\n" + CI18N::get("uiItemSold"); // force special color colorTag= CI18N::get("uiItemSoldColor"); } // error case else { text+= "\n" + CI18N::get("uiPriceNotReceived"); } } } } } // setup color and text text= colorTag + text; Text->setTextFormatTaged(text); }
// *************************************************************************** void CEncyclopediaManager::rebuildThemaPage(uint32 themaName) { uint32 i; CEncyMsgThema *pThema = NULL; // Select the right album for (i = 0; i < _Albums.size(); ++i) { pThema = _Albums[i].getThema(themaName); if (pThema != NULL) { _AlbumNameSelected = _Albums[i].Name; break; } } if (pThema == NULL) return; // Update the right page CInterfaceManager *pIM = CInterfaceManager::getInstance(); // Hide and show good group CInterfaceElement *pIE = pIM->getElementFromId(PAGE_ENCY_ALBUM); nlassert(pIE != NULL); pIE->setActive(false); pIE = pIM->getElementFromId(PAGE_ENCY_HELP); pIE->setActive(false); pIE = pIM->getElementFromId(PAGE_ENCY_THEMA); pIE->setActive(true); // Setup title CViewTextID *pVT = dynamic_cast<CViewTextID*>(pIM->getElementFromId(PAGE_ENCY_THEMA ":title")); nlassert(pVT != NULL); pVT->setTextId(pThema->Name); // Setup rewards pVT = dynamic_cast<CViewTextID*>(pIM->getElementFromId(PAGE_ENCY_THEMA ":reward_text:desc")); nlassert(pVT != NULL); pVT->setTextId(pThema->RewardText); // Setup brick reward pIM->getDbProp("UI:VARIABLES:ENCY:REWARDBRICK:SHEET")->setValue32(pThema->RewardSheet); CViewText *pRBVT = dynamic_cast<CViewText*>(pIM->getElementFromId(PAGE_ENCY_THEMA ":reward:desc")); nlassert(pRBVT != NULL); STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); CEntitySheet *pES = SheetMngr.get(CSheetId(pThema->RewardSheet)); if (pES != NULL) { if (pES->type() == CEntitySheet::ITEM) { const ucstring desc(pSMC->getItemLocalizedDescription(CSheetId(pThema->RewardSheet))); pRBVT->setText(desc); } else if (pES->type() == CEntitySheet::SBRICK) { const ucstring desc(pSMC->getSBrickLocalizedDescription(CSheetId(pThema->RewardSheet))); pRBVT->setText(desc); } else if (pES->type() == CEntitySheet::SPHRASE) { const ucstring desc(pSMC->getSPhraseLocalizedDescription(CSheetId(pThema->RewardSheet))); pRBVT->setText(desc); } } // Setup the total number of steps uint32 nNbSteps = pThema->NbTask - 1; // 0th is the rite pIM->getDbProp("UI:VARIABLES:ENCY:STEPS")->setValue32(nNbSteps); // Count number of tasks done uint32 nNbTaskDone = 0; for (i = 0; i < pThema->NbTask; ++i) if (pThema->getTaskState((uint8)i) == 2) // 2 == finished ++nNbTaskDone; pIM->getDbProp("UI:VARIABLES:ENCY:DONE")->setValue32(nNbTaskDone); // setup rite & tasks for (i = 0; i < pThema->NbTask; ++i) { string sTmp; if (i == 0) sTmp = PAGE_ENCY_THEMA ":todo2:rite"; else sTmp = PAGE_ENCY_THEMA ":todo:task" + toString(i); // setup task description CViewTextID *pText = dynamic_cast<CViewTextID*>(pIM->getElementFromId(sTmp+":desc")); nlassert(pText != NULL); pText->setTextId(pThema->TaskName[i]); // setup task NPC name CStringPostProcessNPCRemoveTitle *pSPPRT = new CStringPostProcessNPCRemoveTitle; pIM->addServerID (sTmp+":npc:uc_hardtext", pThema->TaskNPCName[i], pSPPRT); // If the task is not known gray it if (pThema->getTaskState((uint8)i) == 0) pText->setAlpha(80); else pText->setAlpha(160); // If the task is finished toggle it CViewBitmap *pBitmap = dynamic_cast<CViewBitmap*>(pIM->getElementFromId(sTmp+":done")); nlassert(pBitmap != NULL); if (pThema->getTaskState((uint8)i) == 2) pBitmap->setActive(true); else pBitmap->setActive(false); } }
// *************************************************************************** void CEncyclopediaManager::rebuildAlbumList() { CInterfaceManager *pIM = CInterfaceManager::getInstance(); STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); CGroupTree *pTree = dynamic_cast<CGroupTree*>(pIM->getElementFromId(LIST_ENCY_ALBUM)); nlassert(pTree != NULL); CGroupTree::SNode *pRoot = new CGroupTree::SNode; ucstring res; // Add all albums for (uint32 i = 0; i < _Albums.size(); ++i) { CGroupTree::SNode *pAlb = new CGroupTree::SNode; pAlb->Id = "a_" + toString(i); pAlb->AHName = "ency_click_album"; pAlb->AHParams = toString(_Albums[i].Name); if (_Albums[i].Name == _AlbumNameSelected) pAlb->Opened = true; if (pSMC->getDynString(_Albums[i].Name, res)) pAlb->Text = res; else nlwarning("try to construct album without name"); // Add all themas for (uint32 j = 0; j < _Albums[i].Themas.size(); ++j) { CGroupTree::SNode *pThm = new CGroupTree::SNode; pThm->Id = "t_" + toString(i) + "_" + toString(j); pThm->AHName = "ency_click_thema"; pThm->AHParams = toString(_Albums[i].Themas[j].Name); if (pSMC->getDynString(_Albums[i].Themas[j].Name, res)) pThm->Text = res; else nlwarning("try to construct thema without name"); pAlb->addChild(pThm); } pRoot->addChild(pAlb); } pTree->setRootNode(pRoot); // if previously selected album if ((_AlbumNameSelected != 0) && (_ThemaNameSelected == 0)) { for (uint32 i = 0; i < _Albums.size(); ++i) { if (_Albums[i].Name == _AlbumNameSelected) { pTree->selectNodeById("a_" + toString(i)); break; } } } // if previously selected thema if ((_AlbumNameSelected != 0) && (_ThemaNameSelected != 0)) { for (uint32 i = 0; i < _Albums.size(); ++i) { if (_Albums[i].Name == _AlbumNameSelected) { for (uint32 j = 0; j < _Albums[i].Themas.size(); ++j) { if (_Albums[i].Themas[j].Name == _ThemaNameSelected) { pTree->selectNodeById("t_" + toString(i) + "_" + toString(j)); break; } } } } } }
// *************************************************************************** void CGuildManager::update() { CInterfaceManager *pIM = CInterfaceManager::getInstance(); STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); // *** Need to rebuild the guild data? if (_NeedRebuild) { _NeedUpdate = true; _NeedRebuild = false; // Rebuild transfert the database to the local structure // Guild stuff uint32 oldName = _Guild.NameID; _Guild.NameID = pIM->getDbProp("SERVER:GUILD:NAME")->getValue32(); _Guild.Name = ""; _InGuild = (_Guild.NameID != 0); if (!_InGuild) closeAllInterfaces(); _Guild.Icon = pIM->getDbProp("SERVER:GUILD:ICON")->getValue64(); _Guild.QuitGuildAvailable = true; // Guild Members if(_NeedRebuildMembers) { _NeedUpdateMembers = true; _NeedRebuildMembers = false; _GuildMembers.clear(); for (uint32 i = 0; i < MAX_GUILD_MEMBER; ++i) { sint32 name = pIM->getDbProp("SERVER:GUILD:MEMBERS:"+toString(i)+":NAME")->getValue32(); if (name != 0) { SGuildMember gm; gm.NameID = name; gm.Index = i; gm.Grade = (EGSPD::CGuildGrade::TGuildGrade)(pIM->getDbProp("SERVER:GUILD:MEMBERS:"+toString(i)+":GRADE")->getValue32()); gm.Online = (TCharConnectionState)(pIM->getDbProp("SERVER:GUILD:MEMBERS:"+toString(i)+":ONLINE")->getValue32()); gm.EnterDate = pIM->getDbProp("SERVER:GUILD:MEMBERS:"+toString(i)+":ENTER_DATE")->getValue32(); _GuildMembers.push_back(gm); } } } // Does the player are newcomer ? // Boris 01/09/2006 : removed : now the guild interface is open if // is was active before OR if the EGS ask it to the client bool playerNewToTheGuild = _NewToTheGuild &&(oldName != _Guild.NameID) && _InGuild; if (playerNewToTheGuild) { // reset the flag _NewToTheGuild = false; // Don't pop the guild window in ring mode. // NB nico : this test should not be necessary, as the guild infos should be filled during the init of the db // However, there are situation where this db info is filled after init (should only happen at guild creation time ...) // Maybe an EGS bug ? if (R2::getEditor().getMode() == R2::CEditor::NotInitialized) { CInterfaceElement *pElt; // Open the guild info if we are not in the init phase if (!IngameDbMngr.initInProgress()) { pElt = pIM->getElementFromId(WIN_GUILD); if (pElt != NULL) pElt->setActive(true); } // Browse the forum pElt = pIM->getElementFromId(WIN_GUILD_FORUM":content:html"); if (pElt != NULL) { CGroupHTML *html = dynamic_cast<CGroupHTML*>(pElt); if (html) html->browse("home"); } } } } // *** Need to update Names? if (_NeedUpdate) { bool bAllValid = true; // Update wait until all the name of members, name of the guild and description are valid if (!pSMC->getString (_Guild.NameID, _Guild.Name)) bAllValid = false; for (uint i = 0; i < _GuildMembers.size(); ++i) { if (!pSMC->getString (_GuildMembers[i].NameID, _GuildMembers[i].Name)) bAllValid = false; else _GuildMembers[i].Name = CEntityCL::removeTitleAndShardFromName(_GuildMembers[i].Name); } // If all is valid no more need update and if guild is opened update the interface if (bAllValid) { // Search for UserEntity to find our own grade if ((UserEntity != NULL) && (_GuildMembers.size() > 0)) { uint i; _Grade = EGSPD::CGuildGrade::Member; string sUserName = strlwr(UserEntity->getEntityName().toString()); for (i = 0; i < _GuildMembers.size(); ++i) { if (strlwr(_GuildMembers[i].Name.toString()) == sUserName) { _Grade = _GuildMembers[i].Grade; break; } } } // set this value in the database pIM->getDbProp("UI:VARIABLES:USER:GUILD_GRADE")->setValue32(_Grade); // update the guild display CGroupContainer *pGuild = dynamic_cast<CGroupContainer*>(pIM->getElementFromId(WIN_GUILD)); if (pGuild != NULL) { // if the guild window is visible if (pGuild->isOpen() && pGuild->getActive()) { // Close the modal window if the member list will change if(pIM->getModalWindow()!=NULL && _NeedUpdateMembers) { if (pIM->getModalWindow()->getId() == MENU_GUILD_MEMBER ) pIM->disableModalWindow(); } // Rebuild interface. Rebuild members only if needed pIM->runActionHandler("guild_sheet_open", NULL, toString("update_members=%d", (uint)_NeedUpdateMembers) ); } } // guild updated _NeedUpdate = false; _NeedUpdateMembers= false; } } // *** Join proposal handling if (_JoinPropUpdate) { bool bAllValid = true; if (!pSMC->getDynString (_JoinPropPhraseID, _JoinPropPhrase)) bAllValid = false; // If all is valid no more need update and update the interface if (bAllValid) { _JoinPropUpdate = false; CGroupContainer *pJoinProp = dynamic_cast<CGroupContainer*>(pIM->getElementFromId(WIN_JOIN_PROPOSAL)); if (pJoinProp != NULL) { CViewText *pJoinPropPhraseView = dynamic_cast<CViewText*>(pIM->getElementFromId(VIEW_JOIN_PROPOSAL_PHRASE)); if (pJoinPropPhraseView != NULL) pJoinPropPhraseView->setText(_JoinPropPhrase); pJoinProp->setActive(true); pIM->setTopWindow(pJoinProp); pJoinProp->updateCoords(); pJoinProp->center(); pJoinProp->enableBlink(2); } } } }