2025-04-27 07:49:33 -04:00

377 lines
7.4 KiB
C++

//// TEXTEDIT.C
//
//
//
// Copyright(c) 1997 - 1999. Microsoft Corporation.
//
#include "precomp.hxx"
#include "uspglob.hxx"
void SetLogFont(PLOGFONTA plf, int iHeight, int iWeight, int iItalic, char *pcFaceName) {
plf->lfHeight = iHeight;
plf->lfWeight = iWeight;
plf->lfItalic = (BYTE) iItalic;
lstrcpy(plf->lfFaceName, pcFaceName);
plf->lfOutPrecision = OUT_STROKE_PRECIS;
plf->lfClipPrecision = CLIP_STROKE_PRECIS;
plf->lfQuality = DRAFT_QUALITY;
plf->lfPitchAndFamily = VARIABLE_PITCH;
if (fVertical) {
plf->lfEscapement = 2700;
plf->lfOrientation = 2700;
} else {
plf->lfEscapement = 0;
plf->lfOrientation = 0;
}
}
void initStyle(int iStyle, int iHeight, int iWeight, int iItalic, char *pcFaceName) {
SetLogFont(&ss[iStyle].rs.lf, iHeight, iWeight, iItalic, pcFaceName);
ss[iStyle].rs.hf = CreateFontIndirect(&ss[iStyle].rs.lf);
ss[iStyle].rs.sc = NULL;
ss[iStyle].fInUse = TRUE;
}
void editClear() {
iCurChar = 0;
Click.fNew = FALSE;
// Initialise all styles
initStyle(0, 72, 400, 0, "Times New Roman");
initStyle(1, 72, 400, 1, "Times New Roman");
initStyle(2, 48, 400, 0, "Arial");
initStyle(3, 72, 400, 1, "Arial");
initStyle(4, 72, 400, 0, "Cordia New");
}
void editFreeCaches() {
int i;
for (i=0; i<5; i++) {
if (ss[i].rs.sc) {
ScriptFreeCache(&ss[i].rs.sc);
}
}
}
BOOL NewLine(HWND hWnd) {
if (!textInsert(iCurChar, L"\r\n", 2)) {
return FALSE;
}
dispInvalidate(hWnd, iCurChar);
iCurChar+=2;
return TRUE;
}
BOOL editKeyDown(HWND hWnd, WCHAR wc) {
int iLen;
int iType;
int iVal;
switch(wc) {
case VK_LEFT:
if (iCurChar) {
if (!textParseBackward(iCurChar, &iLen, &iType, &iVal))
return FALSE;
iCurChar -= iLen;
dispInvalidate(hWnd, iCurChar);
}
break;
case VK_RIGHT:
if (iCurChar < textLen()) {
if (!textParseForward(iCurChar, &iLen, &iType, &iVal))
return FALSE;
iCurChar += iLen;
dispInvalidate(hWnd, iCurChar);
}
break;
case VK_HOME:
iCurChar = 0;
dispInvalidate(hWnd, iCurChar);
break;
case VK_END:
iCurChar = textLen();
dispInvalidate(hWnd, iCurChar);
break;
case VK_DELETE:
if (iCurChar < textLen()) {
if (!textParseForward(iCurChar, &iLen, &iType, &iVal))
return FALSE;
if (iLen) {
if (!textDelete(iCurChar, iLen))
return FALSE;
dispInvalidate(hWnd, iCurChar);
}
}
break;
}
return TRUE;
}
//// HexToInt
//
//
int HexToInt(char szHex[]) {
int i;
int h;
//int d;
i = 0;
h = 0;
//d = 0;
while (szHex[i]) {
if (szHex[i] >= '0' && szHex[i] <= '9') {
h = h*16 + szHex[i] - '0';
//d = d*10 + szHex[i] - '0';
} else if (szHex[i] >= 'a' && szHex[i] <= 'f') {
h = h*16 + 10 + szHex[i] - 'a';
} else if (szHex[i] >= 'A' && szHex[i] <= 'F') {
h = h*16 + 10 + szHex[i] - 'A';
} else if (szHex[i] != ' ' && szHex[i] != ',') {
return -1;
}
i++;
}
return h;
}
//// UnicodeDlgProc
//
// Support insertion of Unicode characters
INT_PTR CALLBACK UnicodeDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
char szCodePoint[20];
int iCodePoint;
switch (uMsg) {
case WM_INITDIALOG:
ShowWindow (hDlg, SW_SHOW);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
GetDlgItemTextA(hDlg, IDC_CODEPOINT, szCodePoint, sizeof(szCodePoint));
iCodePoint = (WORD) HexToInt(szCodePoint);
if (iCodePoint >= 0) {
textInsert(iCurChar, (WCHAR*)&iCodePoint, 1);
dispInvalidate(hWnd, iCurChar);
iCurChar++;
}
// FALL THROUGH
case IDCANCEL:
EndDialog(hDlg, TRUE);
return TRUE;
}
break;
}
return FALSE;
UNREFERENCED_PARAMETER(lParam);
}
//// editInsertUnicode
//
// Allow entry of any Unicode character by offering a simple dialog
void editInsertUnicode() {
DialogBox(hInstance, "Unicode", hWnd, UnicodeDlgProc);
}
void TranslateCharToUnicode(PWCH pwc) {
int iCP;
char c;
switch (PRIMARYLANGID(LOWORD(GetKeyboardLayout(NULL)))) {
case LANG_ARABIC: iCP = 1256; break;
case LANG_HEBREW: iCP = 1255; break;
case LANG_THAI: iCP = 874; break;
case LANG_HINDI: return; // Hindi we don't touch
default: iCP = 1252; break;
}
c = (char) *pwc;
MultiByteToWideChar(iCP, 0, &c, 1, pwc, 1);
}
BOOL editChar(HWND hWnd, WCHAR wc) {
int iLen;
int iType;
int iVal;
switch(wc) {
case VK_RETURN:
if (!textInsert(iCurChar, L"\r\n", 2))
return FALSE;
dispInvalidate(hWnd, iCurChar);
iCurChar+=2;
break;
case VK_BACK:
if (iCurChar) {
if (!textParseBackward(iCurChar, &iLen, &iType, &iVal))
return FALSE;
if (iLen) {
iCurChar -= iLen;
if (!textDelete(iCurChar, iLen))
return FALSE;
dispInvalidate(hWnd, iCurChar);
}
}
break;
default:
if(!((wc >= 0x0900 && wc < 0x0d80)
|| wc == 0x200c
|| wc == 0x200d)){
TranslateCharToUnicode(&wc);
}
if (!textInsert(iCurChar, &wc, 1)) {
return FALSE;
}
dispInvalidate(hWnd, iCurChar);
iCurChar++;
break;
}
return TRUE;
}
//// editStyle
//
// Use Choosefont dialog to set style
BOOL editStyle(HWND hWnd, int irs) {
ss[irs].rs.cf.lStructSize = sizeof(ss[irs].rs.cf);
ss[irs].rs.cf.lpLogFont = &ss[irs].rs.lf;
ss[irs].rs.cf.Flags =
CF_EFFECTS |
CF_SCREENFONTS |
CF_INITTOLOGFONTSTRUCT;
if (ChooseFontA(&ss[irs].rs.cf)) {
ss[irs].fInUse = TRUE;
DeleteObject(ss[irs].rs.hf);
if (fVertical) {
ss[irs].rs.lf.lfEscapement = 2700;
ss[irs].rs.lf.lfOrientation = 2700;
}
ss[irs].rs.hf = CreateFontIndirect(&ss[irs].rs.lf);
} else {
ss[irs].fInUse = FALSE;
}
ScriptFreeCache(&ss[irs].rs.sc);
dispInvalidate(hWnd, iCurChar);
return TRUE;
}