/*---------------------------------------------------------------------------------------------- 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; }
/*---------------------------------------------------------------------------------------------- This is the main interesting method of displaying objects and fragments of them. Here a CmPossibilityList is displayed by displaying its Records. So far we only handle records that are objects of type CmPossibility (or a subclass). A CmPossibility (or derived object) is displayed according to the stored specifications. ----------------------------------------------------------------------------------------------*/ STDMETHODIMP CleCustDocVc::Display(IVwEnv * pvwenv, HVO hvo, int frag) { BEGIN_COM_METHOD; ChkComArgPtr(pvwenv); bool fFlat = m_qcmw->IsFilterActive() || m_qcmw->IsSortMethodActive(); // Constant fragments switch(frag) { case kfrcdSubItem: // Override for special treatment. Assert(false); // sub-items are handled as main items; see below. break; case kfrcdMainItem: // Override for special treatment. { // Get the complete list of the items in the order in which they are displayed. ISilDataAccessPtr qsda; CheckHr(pvwenv->get_DataAccess(&qsda)); RecMainWndPtr qrmw = dynamic_cast<RecMainWnd *>(m_qcmw.Ptr()); HVO hvoMain = qrmw->GetFilterId(); int flidMain = qrmw->GetFilterFlid(); Assert(qrmw); int chvoMain; Vector<HVO> vhvoMain; CheckHr(qsda->get_VecSize(hvoMain, flidMain, &chvoMain)); for (int ihvo = 0; ihvo < chvoMain; ihvo++) { HVO hvoTmp; CheckHr(qsda->get_VecItem(hvoMain, flidMain, ihvo, &hvoTmp)); vhvoMain.Push(hvoTmp); } ITsTextPropsPtr qttp; PossItemInfo * ppii; PossListInfoPtr qpli; m_qlpi->GetPossListAndItem(hvo, m_qlpi->AnalWs(), &ppii, &qpli); int ilevel; ilevel = ppii->GetLevel(qpli); int ipss; for (ipss = 0; ipss < vhvoMain.Size(); ipss++) { if (hvo == vhvoMain[ipss]) break; } Assert(ipss < vhvoMain.Size()); if (fFlat) qttp = m_qttpMainFlat; else if (ilevel > 0) { if (ipss == qpli->GetCount() - 1) qttp = m_qttpSubLast; else qttp = m_qttpSub; // Adjust the indentation to match the current level. ITsPropsBldrPtr qtpb; CheckHr(qttp->GetBldr(&qtpb)); CheckHr(qtpb->SetIntPropValues(ktptPadLeading, ktpvMilliPoint, (ilevel * kdzmpInch / 5))); // indent 1/5" per level CheckHr(qtpb->GetTextProps(&qttp)); } else if (ipss == 0) // first item qttp = m_qttpMainFirst; else if (ipss == qpli->GetCount() - 1) qttp = m_qttpMainLast; else qttp = m_qttpMain; CheckHr(pvwenv->put_Props(qttp)); BodyOfRecord(pvwenv, hvo, qttp); break; } default: return SuperClass::Display(pvwenv, hvo, frag); } return S_OK; END_COM_METHOD(g_fact1, IID_IVwViewConstructor) }