/*---------------------------------------------------------------------------------------------- Check whether the content of this edit field has changed. ----------------------------------------------------------------------------------------------*/ bool AfDeFeSt::IsDirty() { if (!m_fDirty) { if (!SuperClass::IsDirty() && m_qvcdMissing) { ComBool fDirty; ISilDataAccessPtr qsda; CheckHr(m_qvcdMissing->QueryInterface(IID_ISilDataAccess, (void **)&qsda)); qsda->IsDirty(&fDirty); if (fDirty) m_fDirty = true; } } return m_fDirty; }
/*---------------------------------------------------------------------------------------------- Close the current editor, saving changes that were made. hwnd is the editor hwnd. @param fForce True if we want to force the editor closed without making any validity checks or saving any changes. ----------------------------------------------------------------------------------------------*/ void AfDeFeSt::EndEdit(bool fForce) { if (m_qvcdMissing && !fForce) { ComBool fDirty; ISilDataAccessPtr qsdaTemp; CheckHr(m_qvcdMissing->QueryInterface(IID_ISilDataAccess, (void **)&qsdaTemp)); qsdaTemp->IsDirty(&fDirty); if (fDirty) { // The text got edited. So, make a real text and copy the relevant info. // First get the paragraph list HvoVec vhvoParas; int chvoParas; // If we already had a text, we will notify it of new paragraphs. bool fNotifyText = m_hvoText > 0; CheckHr(qsdaTemp->get_VecSize(m_hvoText, kflidStText_Paragraphs, &chvoParas)); int ihvo; // used twice for (ihvo = 0; ihvo < chvoParas; ihvo++) { HVO hvoPara; CheckHr(qsdaTemp->get_VecItem(m_hvoText, kflidStText_Paragraphs, ihvo, &hvoPara)); vhvoParas.Push(hvoPara); } // Actually, we may have had a real text...if so, skip this step if (m_hvoText < 0) { m_qcvd->MakeNewObject(kclidStText, m_hvoObj, m_flid, -2, &m_hvoText); } else { // Check if the record has been edited by someone else since we first loaded // the data. HRESULT hrTemp; if ((hrTemp = m_qcvd->CheckTimeStamp(m_hvoText)) != S_OK) { // If it was changed and the user does not want to overwrite it, perform a // refresh so the displayed field will revert to it's original value. SuperClass::EndEdit(fForce); // REVIEW KenZ (PaulP): There may need to be a refresh call made here. // It's difficult to know, however, since I haven't tracked down when // this method actually gets called. m_fDirty = false; return; } } // Now make real paragraph objects and set their properties. for (ihvo = 0; ihvo < chvoParas; ihvo++) { HVO hvoPara = vhvoParas[ihvo]; ITsStringPtr qtss; ITsTextPropsPtr qttp; IUnknownPtr qunkTtp; CheckHr(qsdaTemp->get_UnknownProp(hvoPara, kflidStStyle_Rules, &qunkTtp)); CheckHr(qunkTtp->QueryInterface(IID_ITsTextProps, (void **) &qttp)); CheckHr(qsdaTemp->get_StringProp(hvoPara, kflidStTxtPara_Contents, &qtss)); CheckHr(m_qcvd->MakeNewObject(kclidStTxtPara, m_hvoText, kflidStText_Paragraphs, ihvo, &hvoPara)); if (qttp) CheckHr(m_qcvd->SetUnknown(hvoPara, kflidStPara_StyleRules, qttp)); CheckHr(m_qcvd->SetString(hvoPara, kflidStTxtPara_Contents, qtss)); } m_qvcdMissing.Clear(); // Update the root object to point at the real text we just made. int frag = kfrText; IVwViewConstructor * pvvc = m_qstvc; CheckHr(m_qrootb->putref_DataAccess(m_qcvd)); CheckHr(m_qrootb->SetRootObjects(&m_hvoText, &pvvc, &frag, GetLpInfo()->GetAfStylesheet(), 1)); m_qadsc->UpdateAllDEWindows(m_hvoObj, m_flid); if (fNotifyText) { CheckHr(m_qcvd->PropChanged(m_qrootb, kpctNotifyAllButMe, m_hvoText, kflidStText_Paragraphs, 0, chvoParas, chvoParas)); } else { CheckHr(m_qcvd->PropChanged(m_qrootb, kpctNotifyAllButMe, m_hvoObj, m_flid, 0, 1, 1)); } } } // Do this after the changes above, otherwise, our hwnd is no longer the child of a main // window, and we can't find the style sheet for the SetRootObjects call. SuperClass::EndEdit(fForce); m_fDirty = false; }