EventProducerPtr getEventProducer(const FieldContainerRefPtr TheFC) { EditFieldHandlePtr TheFieldHandle(TheFC->editField("EventProducer")); if(TheFieldHandle == NULL) { return NULL; } SFEventProducerPtr* TheField(static_cast<SFEventProducerPtr*>(TheFieldHandle->getField())); if(TheField == NULL) { return NULL; } else { return TheField->getValue(); } }
void GenericMultiFieldEditor::insertAtIndex(FieldContainer* const fc, UInt32 fieldID, UInt32 index, UIDrawingSurface* const drawingSurface, CommandManager* cmdMgr) { //Is this a pointer field GetFieldHandlePtr TheFieldHandle(fc->getField(fieldID)); if(TheFieldHandle->isPointerField()) { //Create const FieldContainerType* ThePtrType(getFieldContainerTypeFromPtrType(fc->getFieldDescription(fieldID)->getFieldType().getContentType())); if(ThePtrType == NULL) { return; } //If the type is a node, then create a NodeCore instead //and then insert it as the core of a newly created node if(*ThePtrType == Node::getClassType()) { ThePtrType = &NodeCore::getClassType(); } std::vector<std::string> inputValues; UInt32 NumFieldContainersFound(0); const FieldContainerType* FoundType(NULL); for(UInt32 j(0) ; NumFieldContainersFound<FieldContainerFactory::the()->getNumTypes(); ++j) { FoundType = FieldContainerFactory::the()->findType(j); if(FoundType != NULL) { if(FoundType->isDerivedFrom(*ThePtrType) && !FoundType->isAbstract()) { inputValues.push_back(FoundType->getName()); } ++NumFieldContainersFound; } } if(inputValues.size() == 1) { insertAtIndex(fc,fieldID,index,FieldContainerFactory::the()->findType(inputValues[0].c_str()),cmdMgr); } else { DialogWindowRefPtr TheDialog = DialogWindow::createInputDialog("Create " + fc->getFieldDescription(fieldID)->getFieldType().getContentType().getName(), "Choose the type of object to create", DialogWindow::INPUT_COMBO, true, inputValues); TheDialog->connectDialogWindowClosed(boost::bind(&GenericMultiFieldEditor::handleInsertFCPtrDialogClosed, _1, fc, fieldID, index, cmdMgr)); Pnt2f CenteredPosition = calculateAlignment(Pnt2f(0.0f,0.0f), drawingSurface->getSize(), TheDialog->getPreferredSize(), 0.5f, 0.5f); TheDialog->setPosition(CenteredPosition); TheDialog->setAllwaysOnTop(true); TheDialog->setModal(true); TheDialog->setResizable(true); drawingSurface->openWindow(TheDialog); } } else { //Insert the default InsertFieldElementCommandPtr InsertIndexCommand = InsertFieldElementCommand::create(fc, fieldID, "", index); cmdMgr->executeCommand(InsertIndexCommand); } }