CScriptableObject* CDocument::GetParentObject( CScriptableObject* previousParent, LEOContext * ctx ) { CScriptableObject * frontObj = GetNextFrontScript( ctx ); if( frontObj ) // We're doing frontscripts? return frontObj; // Return next frontscript, not our parent. if( previousParent ) { CStack* stackForwardingToUs = dynamic_cast<CStack*>(previousParent); if( stackForwardingToUs ) { if( stackForwardingToUs->GetShouldForwardToMainStack() ) // Make messages sent from palettes continue to document window. { CStack * currentMainStack = CStack::GetMainStack(); if( currentMainStack && currentMainStack != stackForwardingToUs && currentMainStack->GetScriptContextGroupObject() == GetScriptContextGroupObject() ) { CCard * currentCard = currentMainStack->GetCurrentCard(); if( currentCard ) { return currentCard; } } } } } // Forward message to home stack's document for a last shot: CDocumentRef homeDocument = CDocumentManager::GetSharedDocumentManager()->GetHomeDocument(); if( homeDocument != this && homeDocument != nullptr && homeDocument->GetScriptContextGroupObject() == GetScriptContextGroupObject() ) { std::cout << " -> (" << homeDocument->GetObjectDescriptorString() << ")" << std::endl; return homeDocument; } // Still nothing? We're at end. See if there are any back scripts: if( ctx ) { CScriptContextUserData * ud = (CScriptContextUserData *)ctx->userData; CScriptContextGroupUserData * gud = (CScriptContextGroupUserData *)ctx->group->userData; if( !gud->mBackScripts.empty() ) { assert(ud->GetCurrentBackScript() == nullptr); assert(ud->GetCurrentFrontScript() == nullptr); CScriptableObject * obj = gud->mBackScripts.front(); ud->SetCurrentBackScript(obj); return obj; } } return nullptr; }