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
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();
|
|
}
|