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, const SDisplayOptions &Options, CString *retsError) // OnInitList // // Initialize list { DEBUG_TRY // Figure out where to get the data from: either the station // or the player's ship. CSpaceObject *pListSource = EvalListSource(Options.sDataFrom, 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(Options.sItemCriteria, 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) if (!Options.sCode.IsBlank()) { if (!EvalString(Options.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) if (!Options.sInitialItemCode.IsBlank()) { bool bMore = IsCurrentItemValid(); while (bMore) { bool bResult; if (!EvalBool(Options.sInitialItemCode, &bResult, retsError)) return ERR_FAIL; if (bResult) break; bMore = SelectNextItem(); } } // Done return NOERROR; DEBUG_CATCH }
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; }