mirror of
https://github.com/reactos/reactos.git
synced 2025-01-03 21:09:19 +00:00
[PATCH] user32: DrawText: CJK and Thai line-wrapping
[PATCH] appwiz: check if path is valid Both by Katayama Hirofumi svn path=/trunk/; revision=48077
This commit is contained in:
parent
3421c58c28
commit
d17757a733
2 changed files with 46 additions and 9 deletions
|
@ -324,6 +324,7 @@ ShowCreateShortcutWizard(HWND hwndCPl, LPWSTR szPath)
|
|||
PROPSHEETPAGE psp;
|
||||
UINT nPages = 0;
|
||||
UINT nLength;
|
||||
DWORD attrs;
|
||||
|
||||
PCREATE_LINK_CONTEXT pContext = (PCREATE_LINK_CONTEXT) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CREATE_LINK_CONTEXT));
|
||||
if (!pContext)
|
||||
|
@ -337,10 +338,13 @@ ShowCreateShortcutWizard(HWND hwndCPl, LPWSTR szPath)
|
|||
/* no directory given */
|
||||
return FALSE;
|
||||
}
|
||||
///
|
||||
/// FIXME
|
||||
/// check if path is valid
|
||||
///
|
||||
|
||||
attrs = GetFileAttributesW(szPath);
|
||||
if (attrs == INVALID_FILE_ATTRIBUTES || (attrs & FILE_ATTRIBUTE_DIRECTORY))
|
||||
{
|
||||
/* invalid path */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
wcscpy(pContext->szLinkName, szPath);
|
||||
if (pContext->szLinkName[nLength-1] != L'\\')
|
||||
|
@ -389,7 +393,7 @@ NewLinkHere(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
|
|||
{
|
||||
WCHAR szFile[MAX_PATH];
|
||||
|
||||
if (MultiByteToWideChar(CP_ACP, 0, (char*)lParam1, strlen((char*)lParam1)+1, szFile, MAX_PATH))
|
||||
if (MultiByteToWideChar(CP_ACP, 0, (LPSTR) lParam1, -1, szFile, MAX_PATH))
|
||||
{
|
||||
return ShowCreateShortcutWizard(hwndCPl, szFile);
|
||||
}
|
||||
|
@ -401,7 +405,7 @@ LONG
|
|||
CALLBACK
|
||||
NewLinkHereW(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
|
||||
{
|
||||
return ShowCreateShortcutWizard(hwndCPl, (LPWSTR)lParam1);
|
||||
return ShowCreateShortcutWizard(hwndCPl, (LPWSTR) lParam1);
|
||||
}
|
||||
|
||||
LONG
|
||||
|
@ -410,7 +414,7 @@ NewLinkHereA(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
|
|||
{
|
||||
WCHAR szFile[MAX_PATH];
|
||||
|
||||
if (MultiByteToWideChar(CP_ACP, 0, (char*)lParam1, strlen((char*)lParam1)+1, szFile, MAX_PATH))
|
||||
if (MultiByteToWideChar(CP_ACP, 0, (LPSTR) lParam1, -1, szFile, MAX_PATH))
|
||||
{
|
||||
return ShowCreateShortcutWizard(hwndCPl, szFile);
|
||||
}
|
||||
|
|
|
@ -495,6 +495,38 @@ static void TEXT_PathEllipsify (HDC hdc, WCHAR *str, unsigned int max_len,
|
|||
}
|
||||
}
|
||||
|
||||
/* Check the character is Chinese, Japanese, Korean and/or Thai */
|
||||
inline BOOL IsCJKT(WCHAR wch)
|
||||
{
|
||||
if (0x0E00 <= wch && wch <= 0x0E7F)
|
||||
return TRUE; /* Thai */
|
||||
|
||||
if (0x3000 <= wch && wch <= 0x9FFF)
|
||||
return TRUE; /* CJK */
|
||||
|
||||
if (0xAC00 <= wch && wch <= 0xD7FF)
|
||||
return TRUE; /* Korean */
|
||||
|
||||
if (0xFF00 <= wch && wch <= 0xFFEF)
|
||||
return TRUE; /* CJK */
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* See http://en.wikipedia.org/wiki/Kinsoku_shori */
|
||||
static const WCHAR KinsokuClassA[] =
|
||||
{
|
||||
0x2010, 0x2013, 0x2019, 0x201D, 0x203C, 0x2047, 0x2048, 0x2049, 0x3001,
|
||||
0x3002, 0x3005, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015, 0x3017,
|
||||
0x3019, 0x301C, 0x301F, 0x303B, 0x3041, 0x3043, 0x3045, 0x3047, 0x3049,
|
||||
0x3063, 0x3083, 0x3085, 0x3087, 0x308E, 0x3095, 0x3096, 0x30A0, 0x30A1,
|
||||
0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30C3, 0x30E3, 0x30E5, 0x30E7, 0x30EE,
|
||||
0x30F5, 0x30F6, 0x30FB, 0x30FC, 0x30FD, 0x30FE, 0x31F0, 0x31F1, 0x31F2,
|
||||
0x31F3, 0x31F4, 0x31F5, 0x31F6, 0x31F7, 0x31F8, 0x31F9, 0x31FA, 0x31FB,
|
||||
0x31FC, 0x31FD, 0x31FE, 0x31FF, 0xFF01, 0xFF09, 0xFF0C, 0xFF0E, 0xFF1A,
|
||||
0xFF1B, 0xFF1F, 0xFF3D, 0xFF5D, 0xFF60, 0
|
||||
};
|
||||
|
||||
/*********************************************************************
|
||||
* TEXT_WordBreak (static)
|
||||
*
|
||||
|
@ -576,9 +608,10 @@ static void TEXT_WordBreak (HDC hdc, WCHAR *str, unsigned int max_str,
|
|||
p--; /* the word just fitted */
|
||||
else
|
||||
{
|
||||
while (p > str && *(--p) != SPACE)
|
||||
while (p > str && *(--p) != SPACE && (!IsCJKT(p[1]) ||
|
||||
p[1] == L'\0' || wcschr(KinsokuClassA, p[1]) != NULL))
|
||||
;
|
||||
word_fits = (p != str || *p == SPACE);
|
||||
word_fits = (p != str || *p == SPACE || IsCJKT(p[1]));
|
||||
}
|
||||
/* If there was one or the first character didn't fit then */
|
||||
if (word_fits)
|
||||
|
|
Loading…
Reference in a new issue