// // globals.cpp // // Global variables. // #include "globals.h" HINSTANCE g_hInst; LONG g_cRefDll = -1; // -1 /w no refs, for win95 InterlockedIncrement/Decrement compat CRITICAL_SECTION g_cs; /* 6565d455-5030-4c0f-8871-83f6afde514f */ const CLSID c_clsidCaseTextService = { 0x6565d455, 0x5030, 0x4c0f, {0x88, 0x71, 0x83, 0xf6, 0xaf, 0xde, 0x51, 0x4f} }; /* 4d5459db-7543-42c0-9204-9195b91f6fb8 */ const GUID c_guidCaseProfile = { 0x4d5459db, 0x7543, 0x42c0, {0x92, 0x04, 0x91, 0x95, 0xb9, 0x1f, 0x6f, 0xb8} }; /* 01679c88-5141-4ee5-a47f-c8d586ff37e1 */ const GUID c_guidLangBarItemButton = { 0x01679c88, 0x5141, 0x4ee5, {0xa4, 0x7f, 0xc8, 0xd5, 0x86, 0xff, 0x37, 0xe1} }; //+--------------------------------------------------------------------------- // // ToggleChar // // Toggle the case of a single char. //---------------------------------------------------------------------------- WCHAR ToggleChar(WCHAR ch) { // toggle english ascii if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { return ch ^ 32; } // give up for non-ascii return ch; } //+--------------------------------------------------------------------------- // // ToggleCase // // Toggle the case of all text covered by the range. The input range is // collapsed to its end point on exit. // // If fIgnoreRangeEnd == TRUE, all text following the start of range will be // toggled, and the range will be collapsed at the end-of-doc on exit. //---------------------------------------------------------------------------- void ToggleCase(TfEditCookie ec, ITfRange *pRange, BOOL fIgnoreRangeEnd) { ITfRange *pRangeToggle; ULONG cch; ULONG i; DWORD dwFlags; WCHAR achText[64]; // backup the current range if (pRange->Clone(&pRangeToggle) != S_OK) return; dwFlags = TF_TF_MOVESTART | (fIgnoreRangeEnd ? TF_TF_IGNOREEND : 0); while (TRUE) { // grab the next block of chars if (pRange->GetText(ec, dwFlags, achText, ARRAYSIZE(achText), &cch) != S_OK) break; // out of text? if (cch == 0) break; // toggle the case for (i=0; iShiftEndToRange(ec, pRange, TF_ANCHOR_START) != S_OK) break; // replace the text pRangeToggle->SetText(ec, 0, achText, cch); // prepare for next iteration pRangeToggle->Collapse(ec, TF_ANCHOR_END); } pRangeToggle->Release(); }