Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

97 lines
2.7 KiB

//
// 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; i<cch; i++)
{
achText[i] = ToggleChar(achText[i]);
}
// shift pRangeToggle so it covers just the text we read
if (pRangeToggle->ShiftEndToRange(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();
}