ALERROR CEventHandler::InitFromXML (SDesignLoadCtx &Ctx, CXMLElement *pDesc) // InitFromXML // // Load all handlers { int i; for (i = 0; i < pDesc->GetContentElementCount(); i++) { CXMLElement *pHandler = pDesc->GetContentElement(i); ICCItem *pCode = g_pUniverse->GetCC().Link(pHandler->GetContentText(0), 0, NULL); if (pCode->IsError()) { Ctx.sError = strPatternSubst("<%s> event: %s", pHandler->GetTag(), pCode->GetStringValue()); return ERR_FAIL; } // If this is an old extension, then make sure the code is not using the // gStation variable, because we no longer support it if (Ctx.pExtension && Ctx.pExtension->dwVersion < 2) { if (g_pUniverse->GetCC().HasIdentifier(pCode, CONSTLIT("gStation"))) { Ctx.sError = CONSTLIT("gStation variable has been deprecated--use gSource instead."); return ERR_FAIL; } } // Done m_Handlers.Insert(pHandler->GetTag(), pCode); } return NOERROR; }
ALERROR CGameSettings::ParseCommandLine (char *pszCmdLine) // ParseCommandLine // // Allow command line to override settings { ALERROR error; int i; char *argv[2]; argv[0] = "Transcendence"; argv[1] = pszCmdLine; CXMLElement *pCmdLine; if (error = CreateXMLElementFromCommandLine(2, argv, &pCmdLine)) return error; // Loop over all command line arguments for (i = 0; i < COMMAND_LINE_DATA_COUNT; i++) { bool bValue; if (pCmdLine->FindAttributeBool(CString(g_CommandLineData[i].pszParam, -1, true), &bValue)) SetValueBoolean(g_CommandLineData[i].iOption, bValue); } // If we have an arg then use it as the save file name if (pCmdLine->GetContentElementCount() > 0) m_sSaveFile = pCmdLine->GetContentText(0); // Done delete pCmdLine; return NOERROR; }
ALERROR CLanguageDataBlock::InitFromXML (SDesignLoadCtx &Ctx, CXMLElement *pDesc) // InitFromXML // // Initializes from an XML block { int i; for (i = 0; i < pDesc->GetContentElementCount(); i++) { CXMLElement *pItem = pDesc->GetContentElement(i); CString sID = pItem->GetAttribute(ID_ATTRIB); if (sID.IsBlank()) { Ctx.sError = strPatternSubst(CONSTLIT("Invalid id in <Language> block")); return ERR_FAIL; } if (strEquals(pItem->GetTag(), TEXT_TAG)) { // Link the code CCodeChainCtx CCCtx; ICCItem *pCode = CCCtx.Link(pItem->GetContentText(0), 0, NULL); if (pCode->IsError()) { Ctx.sError = strPatternSubst(CONSTLIT("Language id: %s : %s"), sID, pCode->GetStringValue()); return ERR_FAIL; } // Add an entry bool bIsNew; SEntry *pEntry = m_Data.SetAt(sID, &bIsNew); if (!bIsNew) { Ctx.sError = strPatternSubst(CONSTLIT("Duplicate <Language> element: %s"), sID); return ERR_FAIL; } // If pCode is a string and not an identifier, then we can just // store it directly. if (pCode->IsIdentifier() && pCode->IsQuoted()) { pEntry->pCode = NULL; pEntry->sText = pCode->GetStringValue(); } // Otherwise we store the code else pEntry->pCode = pCode->Reference(); // Done CCCtx.Discard(pCode); } else if (strEquals(pItem->GetTag(), MESSAGE_TAG)) { // Add an entry bool bIsNew; SEntry *pEntry = m_Data.SetAt(sID, &bIsNew); if (!bIsNew) { Ctx.sError = strPatternSubst(CONSTLIT("Duplicate <Language> element: %s"), sID); return ERR_FAIL; } // Set the text pEntry->pCode = NULL; pEntry->sText = pItem->GetAttribute(TEXT_ATTRIB); } else { Ctx.sError = strPatternSubst(CONSTLIT("Invalid element in <Language> block: <%s>"), pItem->GetTag()); return ERR_FAIL; } } return NOERROR; }
bool IDockScreenDisplay::GetDisplayOptions (SInitCtx &Ctx, SDisplayOptions *retOptions, CString *retsError) // GetDisplayOptions // // Initializes the display options structure, which is used by list and // selector displays. { // Initialize background image options CString sBackgroundID; if (Ctx.pDesc->FindAttribute(BACKGROUND_ID_ATTRIB, &sBackgroundID)) { // If the attribute exists, but is empty (or equals "none") then // we don't have a background if (sBackgroundID.IsBlank() || strEquals(sBackgroundID, CONSTLIT("none"))) retOptions->BackgroundDesc.iType = backgroundNone; else if (strEquals(sBackgroundID, TYPE_HERO)) { retOptions->BackgroundDesc.iType = backgroundObjHeroImage; retOptions->BackgroundDesc.pObj = Ctx.pLocation; } // If the ID is "object" then we should ask the object else if (strEquals(sBackgroundID, TYPE_OBJECT)) { retOptions->BackgroundDesc.pObj = Ctx.pLocation; if (Ctx.pLocation->IsPlayer()) retOptions->BackgroundDesc.iType = backgroundObjSchematicImage; else retOptions->BackgroundDesc.iType = backgroundObjHeroImage; } else if (strEquals(sBackgroundID, TYPE_SCHEMATIC)) { retOptions->BackgroundDesc.iType = backgroundObjSchematicImage; retOptions->BackgroundDesc.pObj = Ctx.pLocation; } // If the ID is "player" then we should ask the player ship else if (strEquals(sBackgroundID, DATA_FROM_PLAYER)) { CSpaceObject *pPlayer = g_pUniverse->GetPlayerShip(); if (pPlayer) { retOptions->BackgroundDesc.iType = backgroundObjSchematicImage; retOptions->BackgroundDesc.pObj = pPlayer; } } // Otherwise, we expect an integer else { retOptions->BackgroundDesc.iType = backgroundImage; retOptions->BackgroundDesc.dwImageID = strToInt(sBackgroundID, 0); } } // Initialize control rect. If we have a background, then initialize to // backwards compatible position. Otherwise, we take up the full range. if (retOptions->BackgroundDesc.iType != backgroundDefault) { retOptions->rcControl.left = 4; retOptions->rcControl.top = 12; retOptions->rcControl.right = 548; retOptions->rcControl.bottom = 396; } else { retOptions->rcControl.left = 0; retOptions->rcControl.top = 23; retOptions->rcControl.right = 600; retOptions->rcControl.bottom = 482; } // There are a couple of different ways to get options (for backwards // compatibility). CXMLElement *pOptions; if ((pOptions = Ctx.pDesc->GetContentElementByTag(LIST_OPTIONS_TAG)) == NULL && (pOptions = Ctx.pDesc->GetContentElementByTag(LIST_TAG)) == NULL) return true; // Read from the element retOptions->sDataFrom = pOptions->GetAttribute(DATA_FROM_ATTRIB); retOptions->sItemCriteria = pOptions->GetAttribute(LIST_ATTRIB); retOptions->sCode = pOptions->GetContentText(0); retOptions->sInitialItemCode = pOptions->GetAttribute(INITIAL_ITEM_ATTRIB); retOptions->sRowHeightCode = pOptions->GetAttribute(ROW_HEIGHT_ATTRIB); // See if we have control position if (pOptions->FindAttributeInteger(POS_X_ATTRIB, (int *)&retOptions->rcControl.left)) { retOptions->rcControl.top = pOptions->GetAttributeIntegerBounded(POS_Y_ATTRIB, 0, -1); retOptions->rcControl.right = retOptions->rcControl.left + pOptions->GetAttributeIntegerBounded(WIDTH_ATTRIB, 0, -1); retOptions->rcControl.bottom = retOptions->rcControl.top + pOptions->GetAttributeIntegerBounded(HEIGHT_ATTRIB, 0, -1); } return true; }
ALERROR CDockPane::InitPane (CDockScreen *pDockScreen, CXMLElement *pPaneDesc, const RECT &rcPaneRect) // InitPane // // Initializes the pane. { // Initialize AGScreen *pScreen = pDockScreen->GetScreen(); CleanUp(pScreen); m_pDockScreen = pDockScreen; m_pPaneDesc = pPaneDesc; m_rcPane = rcPaneRect; ICCItem *pData = m_pDockScreen->GetData(); // Make sure we don't recurse m_bInShowPane = true; // Initialize list of actions. CString sError; if (m_Actions.InitFromXML(m_pDockScreen->GetExtension(), m_pPaneDesc->GetContentElementByTag(ACTIONS_TAG), pData, &sError) != NOERROR) { ReportError(strPatternSubst(CONSTLIT("Pane %s: %s"), pPaneDesc->GetTag(), sError)); return NOERROR; } // Create a new pane m_pContainer = new CGFrameArea; pScreen->AddArea(m_pContainer, m_rcPane, 0); // Create the appropriate set of controls if (CreateControls(&sError) != NOERROR) { ReportError(strPatternSubst(CONSTLIT("Pane %s: %s"), pPaneDesc->GetTag(), sError)); return NOERROR; } // Set the description text CString sDesc; if (!m_pDockScreen->EvalString(m_pPaneDesc->GetAttribute(DESC_ATTRIB), pData, false, eventNone, &sDesc)) ReportError(strPatternSubst(CONSTLIT("Error evaluating desc param: %s"), sDesc)); else SetDescription(sDesc); // Evaluate the initialize element // // This gives the frame a chance to initialize any dynamic // action buttons before we actually create the buttons. CXMLElement *pInit = m_pPaneDesc->GetContentElementByTag(ON_PANE_INIT_TAG); if (pInit == NULL) pInit = m_pPaneDesc->GetContentElementByTag(INITIALIZE_TAG); if (pInit) { CString sCode = pInit->GetContentText(0); CString sError; if (!m_pDockScreen->EvalString(sCode, pData, true, eventNone, &sError)) ReportError(strPatternSubst(CONSTLIT("Error evaluating <OnPaneInit>: %s"), sError)); } // We might have called exit inside OnPaneInit. If so, we exit if (m_pDockScreen->GetScreen() == NULL) return NOERROR; // Allow other design types to override the pane CString sResolvedScreen; CDesignType *pResolvedRoot = m_pDockScreen->GetResolvedRoot(&sResolvedScreen); g_pUniverse->FireOnGlobalPaneInit(m_pDockScreen, pResolvedRoot, sResolvedScreen, m_pPaneDesc->GetTag()); if (m_pDockScreen->GetScreen() == NULL) return NOERROR; // Now that all the controls (and actions) have been initialized, resize them // so that they fit RenderControls(); // Done m_bInShowPane = false; return NOERROR; }
ALERROR CDockScreenCustomList::OnInitList (SInitCtx &Ctx, CString *retsError) // OnInitList // // Initialize list { // Get the list element CXMLElement *pListData = Ctx.pDesc->GetContentElementByTag(LIST_TAG); if (pListData == NULL) return ERR_FAIL; // See if we define a custom row height CString sRowHeight; if (pListData->FindAttribute(ROW_HEIGHT_ATTRIB, &sRowHeight)) { CString sResult; if (!EvalString(sRowHeight, false, eventNone, &sResult)) { *retsError = sResult; return ERR_FAIL; } int cyRow = strToInt(sResult, -1); if (cyRow > 0) m_pItemListControl->SetRowHeight(cyRow); } // Get the list to show CCodeChain &CC = g_pUniverse->GetCC(); ICCItem *pExp = CC.Link(pListData->GetContentText(0), 0, NULL); // Evaluate the function CCodeChainCtx CCCtx; CCCtx.SetScreen(m_pDockScreen); CCCtx.SaveAndDefineSourceVar(m_pLocation); CCCtx.SaveAndDefineDataVar(m_pData); ICCItem *pResult = CCCtx.Run(pExp); // LATER:Event CCCtx.Discard(pExp); if (pResult->IsError()) { *retsError = pResult->GetStringValue(); return ERR_FAIL; } // Set this expression as the list m_pItemListControl->SetList(CC, pResult); CCCtx.Discard(pResult); // Position the cursor on the next relevant item SelectNextItem(); // Give the screen a chance to start at a different item (other // than the first) CString sInitialItemFunc = pListData->GetAttribute(INITIAL_ITEM_ATTRIB); if (!sInitialItemFunc.IsBlank()) { bool bMore = IsCurrentItemValid(); while (bMore) { bool bResult; if (!EvalBool(sInitialItemFunc, &bResult, retsError)) return ERR_FAIL; if (bResult) break; bMore = SelectNextItem(); } } return NOERROR; }
ALERROR CDockScreenItemList::OnInitList (SInitCtx &Ctx, CString *retsError) // OnInitList // // Initialize list { CSpaceObject *pListSource; // Get the list options element CXMLElement *pOptions = Ctx.pDesc->GetContentElementByTag(LIST_OPTIONS_TAG); if (pOptions == NULL) { *retsError = CONSTLIT("<ListOptions> expected."); return ERR_FAIL; } // Figure out where to get the data from: either the station // or the player's ship. pListSource = EvalListSource(pOptions->GetAttribute(DATA_FROM_ATTRIB), retsError); if (pListSource == NULL) return ERR_FAIL; // Set the list control m_pItemListControl->SetList(pListSource); // Initialize flags that control what items we will show CString sCriteria; if (!EvalString(pOptions->GetAttribute(LIST_ATTRIB), false, eventNone, &sCriteria)) { *retsError = sCriteria; return ERR_FAIL; } CItem::ParseCriteria(sCriteria, &m_ItemCriteria); m_pItemListControl->SetFilter(m_ItemCriteria); // If we have content, then eval the function (note that this might // re-enter and set the filter) CString sCode = pOptions->GetContentText(0); if (!sCode.IsBlank()) { if (!EvalString(sCode, true, eventInitDockScreenList, retsError)) return ERR_FAIL; } // Position the cursor on the next relevant item SelectNextItem(); // Give the screen a chance to start at a different item (other // than the first) CString sInitialItemFunc = pOptions->GetAttribute(INITIAL_ITEM_ATTRIB); if (!sInitialItemFunc.IsBlank()) { bool bMore = IsCurrentItemValid(); while (bMore) { bool bResult; if (!EvalBool(sInitialItemFunc, &bResult, retsError)) return ERR_FAIL; if (bResult) break; bMore = SelectNextItem(); } } // Done return NOERROR; }