Let's define a simple JavaScript function to serve as a callback in our PDF document. This callback function can be triggered in JavaScript actions we'll later assign to individual fields:
In this snippet, we're simply reading our JavaScript function into a C++ stream and calling A3DPDFDocumentAddJavaScriptFromString() to embed it in our PDF document.
{
A3DUns32 iNbCols = (iNbRows > 0) ? (
int)aRows[0].size() : 0;
for (
A3DUns32 ir = 0; ir < iNbRows; ir++)
{
for (
A3DUns32 ic = 0; ic < iNbCols; ic++)
mallocAndSetString(
}
stFreeTable(sTableData);
return iRet;
}
{
int indexpage = 0;
std::string sSuffixFields;
sInformationData.
m_pcTitle = (
char*)
"HOOPS Publish Functionalities";
sInformationData.
m_pcCreator = (
char*)
"HOOPS Publish Sample Application";
sInformationData.
m_pcSubject = (
char*)
"This sample demoes the data model functionality of HOOPS Publish";
sInformationData.
m_pcAuthor = (
char*)
"Tech Soft 3D";
const int iPageWidth = 792, iPageHeight = 612;
if (pPage != NULL)
{
std::string sIconId;
std::vector<int> aiWidthCols;
aiWidthCols.push_back(30);
aiWidthCols.push_back(170);
aiWidthCols.push_back(30);
aiWidthCols.push_back(60);
aiWidthCols.push_back(50);
std::vector<std::string> aRowHeader;
aRowHeader.push_back("No");
aRowHeader.push_back("NAME PART");
aRowHeader.push_back("QTY");
aRowHeader.push_back("MATERIAL");
aRowHeader.push_back("SNAPSHOT");
std::vector<A3DPDFEColumnType> aeTypes;
CHECK_RET(stAddScrollTable(pDoc, pPage,
20, 500,
15,
3,
20,
40,
aiWidthCols,
aRowHeader,
aeTypes,
&pScrollTableBom));
std::basic_ostringstream<char> osJsOnDoc;
osJsOnDoc << "\n\
\n\
function scrolltable_callback_withuserdata(i, j, userdata)\n\
{\n\
app.alert( { cMsg:\" JavaScript action on cell [\"+i+\" - \"+j+\"]\\n model name \"+userdata.modelname+\" ; owner \"+userdata.modelowner+\" \" } );\n\
console.println(\"in scrolltable_callback ; i=\"+i+\" - j=\"+j);\n\
console.println(\"in scrolltable_callback userdata=\"+userdata);\n\
console.println(\"in scrolltable_callback userdata.modelname=\"+userdata.modelname);\n\
\n\
}\n\
";
CHECK_RET(A3DPDFDocumentAddJavaScriptFromString(pDoc, "STCallbacks", osJsOnDoc.str().c_str()));
std::vector<std::vector<std::string> > aRows;
std::vector<std::string> aOneRow;
aRows.clear();
aOneRow.clear();
aOneRow.push_back("{ caption:\"1\" }");
aOneRow.push_back("{ caption:\"crank damper\", actionjscallback:\"scrolltable_callback_withuserdata\", actionjscallbackdata: { modelname:\"crank_damper\" , modelowner:\"Joe\" } }");
aOneRow.push_back("{ caption:\"2\"}");
aOneRow.push_back("{ caption:\"iron\"}");
sIconId = stStoreIcon(pDoc, std::string(ICONS_PATH) + "crank_damper.jpg");
aOneRow.push_back(std::string("{ icon:\"") + sIconId + std::string("\", actionurl:\"http://localhost:11180/hoops_web_viewer.html?scs=crank_damper.scs\" }"));
aRows.push_back(aOneRow);
aOneRow.clear();
aOneRow.push_back("{ caption:\"2\" }");
aOneRow.push_back("{ caption:\"crank crankshaft\", actionjscallback:\"scrolltable_callback_withuserdata\", actionjscallbackdata: { modelname:\"crank_crankshaft\" , modelowner:\"James\" } }");
aOneRow.push_back("{ caption:\"1\"}");
aOneRow.push_back("{ caption:\"steel\" }");
sIconId = stStoreIcon(pDoc, std::string(ICONS_PATH) + "crank_crankshaft.jpg");
aOneRow.push_back(std::string("{ icon:\"") + sIconId + std::string("\", actionurl:\"http://localhost:11180/hoops_web_viewer.html?scs=crank_crankshaft.scs\" }"));
aRows.push_back(aOneRow);
aOneRow.clear();
aOneRow.push_back("{ caption:\"3\" }");
aOneRow.push_back("{ caption:\"crank valve\", actionjscallback:\"scrolltable_callback_withuserdata\", actionjscallbackdata: { modelname:\"crank_valve\" , modelowner:\"Bill\" } }");
aOneRow.push_back("{ caption:\"1\"}");
aOneRow.push_back("{ caption:\"steel\", action:\"_rowdatamodel_\"}");
sIconId = stStoreIcon(pDoc, std::string(ICONS_PATH) + "crank_valve.jpg");
aOneRow.push_back(std::string("{ icon:\"") + sIconId + std::string("\", actionurl:\"http://localhost:11180/hoops_web_viewer.html?scs=crank_valve.scs\" }"));
aRows.push_back(aOneRow);
aOneRow.clear();
aOneRow.push_back("{ caption:\"4\" }");
aOneRow.push_back("{ caption:\"crank connectingrod boltnut\", actionjscallback:\"scrolltable_callback_withuserdata\", actionjscallbackdata: { modelname:\"crank_connectingrod_boltnut\" , modelowner:\"Neal\" } }");
aOneRow.push_back("{ caption:\"1\"}");
aOneRow.push_back("{ caption:\"steel\" }");
sIconId = stStoreIcon(pDoc, std::string(ICONS_PATH) + "crank_connectingrod_boltnut.jpg");
aOneRow.push_back(std::string("{ icon:\"") + sIconId + std::string("\", actionurl:\"http://localhost:11180/hoops_web_viewer.html?scs=crank_connectingrod_boltnut.scs\" }"));
aRows.push_back(aOneRow);
aOneRow.clear();
aOneRow.push_back("{ caption:\"5\" }");
aOneRow.push_back("{ caption:\"crank pistonpin\", actionjscallback:\"scrolltable_callback_withuserdata\", actionjscallbackdata: { modelname:\"crank_pistonpin\" , modelowner:\"Henry\" } }");
aOneRow.push_back("{ caption:\"2\"}");
aOneRow.push_back("{ caption:\"steel2\" }");
sIconId = stStoreIcon(pDoc, std::string(ICONS_PATH) + "crank_pistonpin.jpg");
aOneRow.push_back(std::string("{ icon:\"") + sIconId + std::string("\", actionurl:\"http://localhost:11180/hoops_web_viewer.html?scs=crank_pistonpin.scs\" }"));
aRows.push_back(aOneRow);
aOneRow.clear();
aOneRow.push_back("{ caption:\"6\" }");
aOneRow.push_back("{ caption:\"crank connectingrod bushing\", actionjscallback:\"scrolltable_callback_withuserdata\", actionjscallbackdata: { modelname:\"crank_connectingrod_bushing\" , modelowner:\"Jack\" } }");
aOneRow.push_back("{ caption:\"3\"}");
aOneRow.push_back("{ caption:\"steel3\" }");
sIconId = stStoreIcon(pDoc, std::string(ICONS_PATH) + "crank_connectingrod_bushing.jpg");
aOneRow.push_back(std::string("{ icon:\"") + sIconId + std::string("\", actionurl:\"http://localhost:11180/hoops_web_viewer.html?scs=crank_connectingrod_bushing.scs\" }"));
aRows.push_back(aOneRow);
stCreateObjectTable(pDoc, aRows, pDataTable_Bom);
const A3DInt32 piMapColumns_Bom[] = { 0, 1, 2, 3, 4, 5 };
indexpage++;
}
return iRet;
}