// // range.cpp // #include "private.h" #include "globals.h" #include "korimx.h" #include "xstring.h" #include "immxutil.h" #include "helpers.h" #include "kes.h" #include "mes.h" #include "editcb.h" #if 0 void CKorIMX::BackupRange(TfEditCookie ec, ITfContext *pic, ITfRange* pRange) { CICPriv *picp = GetICPriv(pic); if (pic && picp && pRange) { ITfRangeBackup* pBackupRange = NULL; // // release previuos // pBackupRange = picp->GetBackupRange(); if (pBackupRange) SafeReleaseClear(pBackupRange); // // create new backup range // pic->CreateRangeBackup(ec, pRange, &pBackupRange); picp->SetBackupRange(pBackupRange); if (pBackupRange == NULL) return; } } VOID CKorIMX::RestoreRange(TfEditCookie ec, ITfContext *pic) { CICPriv *picp = GetICPriv(pic); if (pic && picp) { ITfRangeBackup *pBackupRange = picp->GetBackupRange(); ITfRange *pRange; if (pBackupRange == NULL) return; // no backup is exist pBackupRange->GetRange(&pRange); pBackupRange->Restore(ec, pRange); // restore to original pRange->Release(); } } VOID CKorIMX::SetIPRange(TfEditCookie ec, ITfContext *pic, ITfRange* pRange) { CICPriv *picp = GetInputContextPriv(pic); if (picp) { ITfRange* pClone = NULL; // delete previous IPRange SafeRelease(picp->GetActiveRange()); if (pRange) { Assert(m_ptim != NULL); pRange->Clone(&pClone); pClone->SetGravity(ec, TF_GRAVITY_FORWARD, TF_GRAVITY_BACKWARD); } else { // delete property store // ResetDiscard(); } picp->SetActiveRange(pClone); } } ITfRange* CKorIMX::GetIPRange(TfEditCookie ec, ITfContext *pic) { CICPriv *picp = GetInputContextPriv(pic); if (picp) { ITfRange* pRange; ITfRange* pClone = NULL; pRange = picp->GetActiveRange(); if (pRange) { pRange->Clone(&pClone); pClone->SetGravity(ec, TF_GRAVITY_BACKWARD, TF_GRAVITY_FORWARD); } return pClone; } return NULL; } ITfRange* CKorIMX::CreateIPRange(TfEditCookie ec, ITfContext *pic, ITfRange* pRangeOrg) { ITfRange* pRangeIP; if (pRangeOrg == NULL) return NULL; Assert(m_ptim != NULL); pRangeOrg->Clone(&pRangeIP); SetIPRange(ec, pic, pRangeIP); // register pRangeIP->SetGravity(ec, TF_GRAVITY_BACKWARD, TF_GRAVITY_FORWARD); return pRangeIP; } BOOL CKorIMX::FlushIPRange(TfEditCookie ec, ITfContext *pic) { // reset range SetIPRange(ec, pic, NULL); // reset // clear attribute range // ClearAttr(ec, pic, pIPRange); return FALSE; } #endif //+--------------------------------------------------------------------------- // // OnCompositionTerminated // // Cicero calls this method when one of our compositions is terminated. //---------------------------------------------------------------------------- STDAPI CKorIMX::OnCompositionTerminated(TfEditCookie ec, ITfComposition *pComposition) { ITfRange *pRange; ITfContext *pic; CEditSession2 *pes; ESSTRUCT ess; HRESULT hr; // finalize the covered text. // nb: there are no rules about what a tip has to do when it recevies this // callback. We will clear out the display attributes arbirarily and because // it provides visual feedback for testing. pComposition->GetRange(&pRange); pRange->GetContext(&pic); hr = E_OUTOFMEMORY; ESStructInit(&ess, ESCB_COMPLETE); ess.pRange = pRange; if (pes = new CEditSession2(pic, this, &ess, CKorIMX::_EditSessionCallback2)) { // Word will not allow synchronous lock at this point. pes->Invoke(ES2_READWRITE | ES2_SYNC, &hr); pes->Release(); } pRange->Release(); pic->Release(); return S_OK; } ITfComposition * CKorIMX::GetIPComposition(ITfContext *pic) { CICPriv *picp = GetInputContextPriv(pic); if (picp) return picp->GetActiveComposition(); return NULL; } ITfComposition * CKorIMX::CreateIPComposition(TfEditCookie ec, ITfContext *pic, ITfRange* pRangeComp) { ITfContextComposition *picc; ITfComposition *pComposition; CICPriv *pICPriv; HRESULT hr; if (pRangeComp == NULL) return NULL; hr = pic->QueryInterface(IID_ITfContextComposition, (void **)&picc); Assert(hr == S_OK); if (picc->StartComposition(ec, pRangeComp, this, &pComposition) == S_OK) { if (pComposition != NULL) // NULL if the app rejects the composition { CICPriv *picp = GetInputContextPriv(pic); if (picp) SetIPComposition(pic, pComposition); else { pComposition->Release(); pComposition = NULL; } } } picc->Release(); // Create Mouse sink only for AIMM if (GetAIMM(pic) && (pICPriv = GetInputContextPriv(pic)) != NULL) { CMouseSink *pMouseSink; // Create Mouse sink if ((pMouseSink = pICPriv->GetMouseSink()) != NULL) { pMouseSink->_Unadvise(); pMouseSink->Release(); pICPriv->SetMouseSink(NULL); } if (pMouseSink = new CMouseSink(CICPriv::_MouseCallback, pICPriv)) { pICPriv->SetMouseSink(pMouseSink); // set inward gravity to hug the text pRangeComp->SetGravity(ec, TF_GRAVITY_FORWARD, TF_GRAVITY_BACKWARD); pMouseSink->_Advise(pRangeComp, pic); } } return pComposition; } void CKorIMX::SetIPComposition(ITfContext *pic, ITfComposition *pComposition) { CICPriv *picp = GetInputContextPriv(pic); if (picp) picp->SetActiveComposition(pComposition); } BOOL CKorIMX::EndIPComposition(TfEditCookie ec, ITfContext *pic) { ITfComposition *pComposition; pComposition = GetIPComposition(pic); if (pComposition) { CICPriv *pICPriv; SetIPComposition(pic, NULL); pComposition->EndComposition(ec); pComposition->Release(); // kill any mouse sinks if (GetAIMM(pic) && (pICPriv = GetInputContextPriv(pic)) != NULL) { CMouseSink *pMouseSink; if ((pMouseSink = pICPriv->GetMouseSink()) != NULL) { pMouseSink->_Unadvise(); pMouseSink->Release(); pICPriv->SetMouseSink(NULL); } } return TRUE; } return FALSE; } #if 0 VOID CKorIMX::RestoreRangeRequest(ITfContext* pic) { CEditSession *pes; HRESULT hr; if (pic == NULL) return; if (pes = new CEditSession(_EditSessionCallback)) { pes->_state.u = ESCB_RESTORERANGE; pes->_state.pv = (VOID*)this; pes->_state.wParam = (WPARAM)0; pes->_state.pRange = NULL; pes->_state.pic = pic; pic->EditSession( m_tid, pes, TF_ES_READWRITE | TF_ES_SYNC, &hr); SafeRelease(pes); } } #endif