void CMarkTextService::_ClearCompositionDisplayAttributes(TfEditCookie ec) { ITfRange *pRangeComposition; ITfContext *pContext; ITfProperty *pDisplayAttributeProperty; // we need a range and the context it lives in if (_pComposition->GetRange(&pRangeComposition) != S_OK) return; if (pRangeComposition->GetContext(&pContext) != S_OK) { pContext = NULL; goto Exit; } // get our the display attribute property if (pContext->GetProperty(GUID_PROP_ATTRIBUTE, &pDisplayAttributeProperty) != S_OK) goto Exit; // clear the value over the range pDisplayAttributeProperty->Clear(ec, pRangeComposition); pDisplayAttributeProperty->Release(); Exit: pRangeComposition->Release(); SafeRelease(pContext); }
void TextService::setCompositionString(EditSession* session, const wchar_t* str, int len) { ITfContext* context = session->context(); if(context) { TfEditCookie editCookie = session->editCookie(); TF_SELECTION selection; ULONG selectionNum; // get current selection/insertion point if(context->GetSelection(editCookie, TF_DEFAULT_SELECTION, 1, &selection, &selectionNum) == S_OK) { ComPtr<ITfRange> compositionRange; if(composition_->GetRange(&compositionRange) == S_OK) { bool selPosInComposition = true; // if current insertion point is not covered by composition, we cannot insert text here. if(selPosInComposition) { // replace context of composion area with the new string. compositionRange->SetText(editCookie, TF_ST_CORRECTION, str, len); // move the insertion point to end of the composition string selection.range->Collapse(editCookie, TF_ANCHOR_END); context->SetSelection(editCookie, 1, &selection); } // set display attribute to the composition range ComPtr<ITfProperty> dispAttrProp; if(context->GetProperty(GUID_PROP_ATTRIBUTE, &dispAttrProp) == S_OK) { VARIANT val; val.vt = VT_I4; val.lVal = module_->inputAttrib()->atom(); dispAttrProp->SetValue(editCookie, compositionRange, &val); } } selection.range->Release(); } } }
BOOL CMarkTextService::_SetCompositionDisplayAttributes(TfEditCookie ec) { ITfRange *pRangeComposition; ITfContext *pContext; ITfProperty *pDisplayAttributeProperty; VARIANT var; HRESULT hr; // we need a range and the context it lives in if (_pComposition->GetRange(&pRangeComposition) != S_OK) return FALSE; hr = E_FAIL; if (pRangeComposition->GetContext(&pContext) != S_OK) { pContext = NULL; goto Exit; } // get our the display attribute property if (pContext->GetProperty(GUID_PROP_ATTRIBUTE, &pDisplayAttributeProperty) != S_OK) goto Exit; // set the value over the range // the application will use this guid atom to lookup the acutal rendering information var.vt = VT_I4; // we're going to set a TfGuidAtom var.lVal = _gaDisplayAttribute; // our cached guid atom for c_guidMarkDisplayAttribute hr = pDisplayAttributeProperty->SetValue(ec, pRangeComposition, &var); pDisplayAttributeProperty->Release(); Exit: pRangeComposition->Release(); SafeRelease(pContext); return (hr == S_OK); }