mirror of
https://github.com/reactos/reactos.git
synced 2025-06-20 07:36:05 +00:00
sync riched20 with wine 1.1.7
svn path=/trunk/; revision=37014
This commit is contained in:
parent
9e8da0db2a
commit
bfd33ba526
11 changed files with 346 additions and 204 deletions
|
@ -101,6 +101,7 @@
|
||||||
- EM_SETIMEOPTIONS 1.0asian
|
- EM_SETIMEOPTIONS 1.0asian
|
||||||
- EM_SETLANGOPTIONS 2.0
|
- EM_SETLANGOPTIONS 2.0
|
||||||
- EM_SETLIMITTEXT
|
- EM_SETLIMITTEXT
|
||||||
|
- EM_SETMARGINS
|
||||||
+ EM_SETMODIFY (not sure if implementation is correct)
|
+ EM_SETMODIFY (not sure if implementation is correct)
|
||||||
- EM_SETOLECALLBACK
|
- EM_SETOLECALLBACK
|
||||||
+ EM_SETOPTIONS (partially implemented)
|
+ EM_SETOPTIONS (partially implemented)
|
||||||
|
@ -1937,6 +1938,93 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct tagME_GlobalDestStruct
|
||||||
|
{
|
||||||
|
HGLOBAL hData;
|
||||||
|
int nLength;
|
||||||
|
} ME_GlobalDestStruct;
|
||||||
|
|
||||||
|
static DWORD CALLBACK ME_ReadFromHGLOBALUnicode(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG cb, LONG *pcb)
|
||||||
|
{
|
||||||
|
ME_GlobalDestStruct *pData = (ME_GlobalDestStruct *)dwCookie;
|
||||||
|
int i;
|
||||||
|
WORD *pSrc, *pDest;
|
||||||
|
|
||||||
|
cb = cb >> 1;
|
||||||
|
pDest = (WORD *)lpBuff;
|
||||||
|
pSrc = (WORD *)GlobalLock(pData->hData);
|
||||||
|
for (i = 0; i<cb && pSrc[pData->nLength+i]; i++) {
|
||||||
|
pDest[i] = pSrc[pData->nLength+i];
|
||||||
|
}
|
||||||
|
pData->nLength += i;
|
||||||
|
*pcb = 2*i;
|
||||||
|
GlobalUnlock(pData->hData);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD CALLBACK ME_ReadFromHGLOBALRTF(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG cb, LONG *pcb)
|
||||||
|
{
|
||||||
|
ME_GlobalDestStruct *pData = (ME_GlobalDestStruct *)dwCookie;
|
||||||
|
int i;
|
||||||
|
BYTE *pSrc, *pDest;
|
||||||
|
|
||||||
|
pDest = lpBuff;
|
||||||
|
pSrc = (BYTE *)GlobalLock(pData->hData);
|
||||||
|
for (i = 0; i<cb && pSrc[pData->nLength+i]; i++) {
|
||||||
|
pDest[i] = pSrc[pData->nLength+i];
|
||||||
|
}
|
||||||
|
pData->nLength += i;
|
||||||
|
*pcb = i;
|
||||||
|
GlobalUnlock(pData->hData);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL ME_Paste(ME_TextEditor *editor)
|
||||||
|
{
|
||||||
|
DWORD dwFormat = 0;
|
||||||
|
EDITSTREAM es;
|
||||||
|
ME_GlobalDestStruct gds;
|
||||||
|
UINT nRTFFormat = RegisterClipboardFormatA("Rich Text Format");
|
||||||
|
UINT cf = 0;
|
||||||
|
|
||||||
|
if (IsClipboardFormatAvailable(nRTFFormat))
|
||||||
|
cf = nRTFFormat, dwFormat = SF_RTF;
|
||||||
|
else if (IsClipboardFormatAvailable(CF_UNICODETEXT))
|
||||||
|
cf = CF_UNICODETEXT, dwFormat = SF_TEXT|SF_UNICODE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!OpenClipboard(editor->hWnd))
|
||||||
|
return FALSE;
|
||||||
|
gds.hData = GetClipboardData(cf);
|
||||||
|
gds.nLength = 0;
|
||||||
|
es.dwCookie = (DWORD)&gds;
|
||||||
|
es.pfnCallback = dwFormat == SF_RTF ? ME_ReadFromHGLOBALRTF : ME_ReadFromHGLOBALUnicode;
|
||||||
|
ME_StreamIn(editor, dwFormat|SFF_SELECTION, &es, FALSE);
|
||||||
|
|
||||||
|
CloseClipboard();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL ME_Copy(ME_TextEditor *editor, CHARRANGE *range)
|
||||||
|
{
|
||||||
|
LPDATAOBJECT dataObj = NULL;
|
||||||
|
HRESULT hr = S_OK;
|
||||||
|
|
||||||
|
if (editor->cPasswordMask)
|
||||||
|
return FALSE; /* Copying or Cutting masked text isn't allowed */
|
||||||
|
|
||||||
|
if(editor->lpOleCallback)
|
||||||
|
hr = IRichEditOleCallback_GetClipboardData(editor->lpOleCallback, range, RECO_COPY, &dataObj);
|
||||||
|
if(FAILED(hr) || !dataObj)
|
||||||
|
hr = ME_GetDataObject(editor, range, &dataObj);
|
||||||
|
if(SUCCEEDED(hr)) {
|
||||||
|
hr = OleSetClipboard(dataObj);
|
||||||
|
IDataObject_Release(dataObj);
|
||||||
|
}
|
||||||
|
return SUCCEEDED(hr) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* helper to send a msg filter notification */
|
/* helper to send a msg filter notification */
|
||||||
static BOOL
|
static BOOL
|
||||||
ME_FilterEvent(ME_TextEditor *editor, UINT msg, WPARAM* wParam, LPARAM* lParam)
|
ME_FilterEvent(ME_TextEditor *editor, UINT msg, WPARAM* wParam, LPARAM* lParam)
|
||||||
|
@ -2022,6 +2110,49 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey)
|
||||||
ME_UpdateRepaint(editor);
|
ME_UpdateRepaint(editor);
|
||||||
ME_SendRequestResize(editor, FALSE);
|
ME_SendRequestResize(editor, FALSE);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
case 'A':
|
||||||
|
if (ctrl_is_down)
|
||||||
|
{
|
||||||
|
ME_SetSelection(editor, 0, -1);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
if (ctrl_is_down)
|
||||||
|
return ME_Paste(editor);
|
||||||
|
break;
|
||||||
|
case 'C':
|
||||||
|
case 'X':
|
||||||
|
if (ctrl_is_down)
|
||||||
|
{
|
||||||
|
CHARRANGE range;
|
||||||
|
BOOL result;
|
||||||
|
|
||||||
|
ME_GetSelection(editor, &range.cpMin, &range.cpMax);
|
||||||
|
result = ME_Copy(editor, &range);
|
||||||
|
if (result && nKey == 'X')
|
||||||
|
{
|
||||||
|
ME_InternalDeleteText(editor, range.cpMin, range.cpMax-range.cpMin, FALSE);
|
||||||
|
ME_CommitUndo(editor);
|
||||||
|
ME_UpdateRepaint(editor);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'Z':
|
||||||
|
if (ctrl_is_down)
|
||||||
|
{
|
||||||
|
ME_Undo(editor);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'Y':
|
||||||
|
if (ctrl_is_down)
|
||||||
|
{
|
||||||
|
ME_Redo(editor);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (nKey != VK_SHIFT && nKey != VK_CONTROL && nKey && nKey != VK_MENU)
|
if (nKey != VK_SHIFT && nKey != VK_CONTROL && nKey && nKey != VK_MENU)
|
||||||
|
@ -2103,10 +2234,29 @@ static BOOL ME_SetCursor(ME_TextEditor *editor)
|
||||||
POINT pt;
|
POINT pt;
|
||||||
BOOL isExact;
|
BOOL isExact;
|
||||||
int offset;
|
int offset;
|
||||||
|
SCROLLBARINFO sbi;
|
||||||
DWORD messagePos = GetMessagePos();
|
DWORD messagePos = GetMessagePos();
|
||||||
pt.x = (short)LOWORD(messagePos);
|
pt.x = (short)LOWORD(messagePos);
|
||||||
pt.y = (short)HIWORD(messagePos);
|
pt.y = (short)HIWORD(messagePos);
|
||||||
|
|
||||||
|
sbi.cbSize = sizeof(sbi);
|
||||||
|
GetScrollBarInfo(editor->hWnd, OBJID_HSCROLL, &sbi);
|
||||||
|
if (!(sbi.rgstate[0] & (STATE_SYSTEM_INVISIBLE|STATE_SYSTEM_OFFSCREEN)) &&
|
||||||
|
PtInRect(&sbi.rcScrollBar, pt))
|
||||||
|
{
|
||||||
|
SetCursor(LoadCursorW(NULL, (WCHAR*)IDC_ARROW));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
sbi.cbSize = sizeof(sbi);
|
||||||
|
GetScrollBarInfo(editor->hWnd, OBJID_VSCROLL, &sbi);
|
||||||
|
if (!(sbi.rgstate[0] & (STATE_SYSTEM_INVISIBLE|STATE_SYSTEM_OFFSCREEN)) &&
|
||||||
|
PtInRect(&sbi.rcScrollBar, pt))
|
||||||
|
{
|
||||||
|
SetCursor(LoadCursorW(NULL, (WCHAR*)IDC_ARROW));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
ScreenToClient(editor->hWnd, &pt);
|
ScreenToClient(editor->hWnd, &pt);
|
||||||
|
|
||||||
if ((GetWindowLongW(editor->hWnd, GWL_STYLE) & ES_SELECTIONBAR) &&
|
if ((GetWindowLongW(editor->hWnd, GWL_STYLE) & ES_SELECTIONBAR) &&
|
||||||
(pt.x < editor->selofs ||
|
(pt.x < editor->selofs ||
|
||||||
(editor->nSelectionType == stLine && GetCapture() == editor->hWnd)))
|
(editor->nSelectionType == stLine && GetCapture() == editor->hWnd)))
|
||||||
|
@ -2209,8 +2359,7 @@ ME_TextEditor *ME_MakeEditor(HWND hWnd) {
|
||||||
ed->nParagraphs = 1;
|
ed->nParagraphs = 1;
|
||||||
ed->nLastSelStart = ed->nLastSelEnd = 0;
|
ed->nLastSelStart = ed->nLastSelEnd = 0;
|
||||||
ed->pLastSelStartPara = ed->pLastSelEndPara = ME_FindItemFwd(ed->pBuffer->pFirst, diParagraph);
|
ed->pLastSelStartPara = ed->pLastSelEndPara = ME_FindItemFwd(ed->pBuffer->pFirst, diParagraph);
|
||||||
ed->bRedraw = TRUE;
|
ed->bWordWrap = (GetWindowLongW(hWnd, GWL_STYLE) & (WS_HSCROLL|ES_AUTOHSCROLL)) ? FALSE : TRUE;
|
||||||
ed->bWordWrap = (GetWindowLongW(hWnd, GWL_STYLE) & WS_HSCROLL) ? FALSE : TRUE;
|
|
||||||
ed->bHideSelection = FALSE;
|
ed->bHideSelection = FALSE;
|
||||||
ed->nInvalidOfs = -1;
|
ed->nInvalidOfs = -1;
|
||||||
ed->pfnWordBreak = NULL;
|
ed->pfnWordBreak = NULL;
|
||||||
|
@ -2251,48 +2400,6 @@ ME_TextEditor *ME_MakeEditor(HWND hWnd) {
|
||||||
return ed;
|
return ed;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct tagME_GlobalDestStruct
|
|
||||||
{
|
|
||||||
HGLOBAL hData;
|
|
||||||
int nLength;
|
|
||||||
} ME_GlobalDestStruct;
|
|
||||||
|
|
||||||
static DWORD CALLBACK ME_ReadFromHGLOBALUnicode(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG cb, LONG *pcb)
|
|
||||||
{
|
|
||||||
ME_GlobalDestStruct *pData = (ME_GlobalDestStruct *)dwCookie;
|
|
||||||
int i;
|
|
||||||
WORD *pSrc, *pDest;
|
|
||||||
|
|
||||||
cb = cb >> 1;
|
|
||||||
pDest = (WORD *)lpBuff;
|
|
||||||
pSrc = (WORD *)GlobalLock(pData->hData);
|
|
||||||
for (i = 0; i<cb && pSrc[pData->nLength+i]; i++) {
|
|
||||||
pDest[i] = pSrc[pData->nLength+i];
|
|
||||||
}
|
|
||||||
pData->nLength += i;
|
|
||||||
*pcb = 2*i;
|
|
||||||
GlobalUnlock(pData->hData);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static DWORD CALLBACK ME_ReadFromHGLOBALRTF(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG cb, LONG *pcb)
|
|
||||||
{
|
|
||||||
ME_GlobalDestStruct *pData = (ME_GlobalDestStruct *)dwCookie;
|
|
||||||
int i;
|
|
||||||
BYTE *pSrc, *pDest;
|
|
||||||
|
|
||||||
pDest = lpBuff;
|
|
||||||
pSrc = (BYTE *)GlobalLock(pData->hData);
|
|
||||||
for (i = 0; i<cb && pSrc[pData->nLength+i]; i++) {
|
|
||||||
pDest[i] = pSrc[pData->nLength+i];
|
|
||||||
}
|
|
||||||
pData->nLength += i;
|
|
||||||
*pcb = i;
|
|
||||||
GlobalUnlock(pData->hData);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ME_DestroyEditor(ME_TextEditor *editor)
|
void ME_DestroyEditor(ME_TextEditor *editor)
|
||||||
{
|
{
|
||||||
ME_DisplayItem *pFirst = editor->pBuffer->pFirst;
|
ME_DisplayItem *pFirst = editor->pBuffer->pFirst;
|
||||||
|
@ -2530,6 +2637,7 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
UNSUPPORTED_MSG(EM_SETEDITSTYLE)
|
UNSUPPORTED_MSG(EM_SETEDITSTYLE)
|
||||||
UNSUPPORTED_MSG(EM_SETFONTSIZE)
|
UNSUPPORTED_MSG(EM_SETFONTSIZE)
|
||||||
UNSUPPORTED_MSG(EM_SETLANGOPTIONS)
|
UNSUPPORTED_MSG(EM_SETLANGOPTIONS)
|
||||||
|
UNSUPPORTED_MSG(EM_SETMARGINS)
|
||||||
UNSUPPORTED_MSG(EM_SETPALETTE)
|
UNSUPPORTED_MSG(EM_SETPALETTE)
|
||||||
UNSUPPORTED_MSG(EM_SETTABSTOPS)
|
UNSUPPORTED_MSG(EM_SETTABSTOPS)
|
||||||
UNSUPPORTED_MSG(EM_SETTYPOGRAPHYOPTIONS)
|
UNSUPPORTED_MSG(EM_SETTYPOGRAPHYOPTIONS)
|
||||||
|
@ -2741,7 +2849,8 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
ME_GetSelection(editor, &from, &to);
|
ME_GetSelection(editor, &from, &to);
|
||||||
style = ME_GetSelectionInsertStyle(editor);
|
style = ME_GetSelectionInsertStyle(editor);
|
||||||
ME_InternalDeleteText(editor, from, to - from, FALSE);
|
ME_InternalDeleteText(editor, from, to - from, FALSE);
|
||||||
if (pStruct->codepage != 1200 && lParam && !strncmp((char *)lParam, "{\\rtf", 5))
|
if (pStruct->codepage != 1200 && lParam &&
|
||||||
|
(!strncmp((char *)lParam, "{\\rtf", 5) || !strncmp((char *)lParam, "{\\urtf}", 6)))
|
||||||
ME_StreamInRTFString(editor, 1, (char *)lParam);
|
ME_StreamInRTFString(editor, 1, (char *)lParam);
|
||||||
else ME_InsertTextFromCursor(editor, 0, wszText, len, style);
|
else ME_InsertTextFromCursor(editor, 0, wszText, len, style);
|
||||||
ME_ReleaseStyle(style);
|
ME_ReleaseStyle(style);
|
||||||
|
@ -2750,7 +2859,8 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor), FALSE);
|
ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor), FALSE);
|
||||||
if (pStruct->codepage != 1200 && lParam && !strncmp((char *)lParam, "{\\rtf", 5))
|
if (pStruct->codepage != 1200 && lParam &&
|
||||||
|
(!strncmp((char *)lParam, "{\\rtf", 5) || !strncmp((char *)lParam, "{\\urtf}", 6)))
|
||||||
ME_StreamInRTFString(editor, 0, (char *)lParam);
|
ME_StreamInRTFString(editor, 0, (char *)lParam);
|
||||||
else ME_InsertTextFromCursor(editor, 0, wszText, len, editor->pBuffer->pDefaultStyle);
|
else ME_InsertTextFromCursor(editor, 0, wszText, len, editor->pBuffer->pDefaultStyle);
|
||||||
len = 1;
|
len = 1;
|
||||||
|
@ -2785,11 +2895,8 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
editor->rgbBackColor = lParam;
|
editor->rgbBackColor = lParam;
|
||||||
editor->hbrBackground = CreateSolidBrush(editor->rgbBackColor);
|
editor->hbrBackground = CreateSolidBrush(editor->rgbBackColor);
|
||||||
}
|
}
|
||||||
if (editor->bRedraw)
|
|
||||||
{
|
|
||||||
InvalidateRect(hWnd, NULL, TRUE);
|
InvalidateRect(hWnd, NULL, TRUE);
|
||||||
UpdateWindow(hWnd);
|
UpdateWindow(hWnd);
|
||||||
}
|
|
||||||
return lColor;
|
return lColor;
|
||||||
}
|
}
|
||||||
case EM_GETMODIFY:
|
case EM_GETMODIFY:
|
||||||
|
@ -3047,51 +3154,15 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
case WM_PASTE:
|
case WM_PASTE:
|
||||||
{
|
ME_Paste(editor);
|
||||||
DWORD dwFormat = 0;
|
|
||||||
EDITSTREAM es;
|
|
||||||
ME_GlobalDestStruct gds;
|
|
||||||
UINT nRTFFormat = RegisterClipboardFormatA("Rich Text Format");
|
|
||||||
UINT cf = 0;
|
|
||||||
|
|
||||||
if (IsClipboardFormatAvailable(nRTFFormat))
|
|
||||||
cf = nRTFFormat, dwFormat = SF_RTF;
|
|
||||||
else if (IsClipboardFormatAvailable(CF_UNICODETEXT))
|
|
||||||
cf = CF_UNICODETEXT, dwFormat = SF_TEXT|SF_UNICODE;
|
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!OpenClipboard(hWnd))
|
|
||||||
return 0;
|
|
||||||
gds.hData = GetClipboardData(cf);
|
|
||||||
gds.nLength = 0;
|
|
||||||
es.dwCookie = (DWORD)&gds;
|
|
||||||
es.pfnCallback = dwFormat == SF_RTF ? ME_ReadFromHGLOBALRTF : ME_ReadFromHGLOBALUnicode;
|
|
||||||
ME_StreamIn(editor, dwFormat|SFF_SELECTION, &es, FALSE);
|
|
||||||
|
|
||||||
CloseClipboard();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
case WM_CUT:
|
case WM_CUT:
|
||||||
case WM_COPY:
|
case WM_COPY:
|
||||||
{
|
{
|
||||||
LPDATAOBJECT dataObj = NULL;
|
|
||||||
CHARRANGE range;
|
CHARRANGE range;
|
||||||
HRESULT hr = S_OK;
|
|
||||||
|
|
||||||
if (editor->cPasswordMask)
|
|
||||||
return 0; /* Copying or Cutting masked text isn't allowed */
|
|
||||||
|
|
||||||
ME_GetSelection(editor, &range.cpMin, &range.cpMax);
|
ME_GetSelection(editor, &range.cpMin, &range.cpMax);
|
||||||
if(editor->lpOleCallback)
|
|
||||||
hr = IRichEditOleCallback_GetClipboardData(editor->lpOleCallback, &range, RECO_COPY, &dataObj);
|
if (ME_Copy(editor, &range) && msg == WM_CUT)
|
||||||
if(FAILED(hr) || !dataObj)
|
|
||||||
hr = ME_GetDataObject(editor, &range, &dataObj);
|
|
||||||
if(SUCCEEDED(hr)) {
|
|
||||||
hr = OleSetClipboard(dataObj);
|
|
||||||
IDataObject_Release(dataObj);
|
|
||||||
}
|
|
||||||
if (SUCCEEDED(hr) && msg == WM_CUT)
|
|
||||||
{
|
{
|
||||||
ME_InternalDeleteText(editor, range.cpMin, range.cpMax-range.cpMin, FALSE);
|
ME_InternalDeleteText(editor, range.cpMin, range.cpMax-range.cpMin, FALSE);
|
||||||
ME_CommitUndo(editor);
|
ME_CommitUndo(editor);
|
||||||
|
@ -3472,18 +3543,15 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
if (wParam >= 0x40000)
|
if (wParam >= 0x40000)
|
||||||
nCharOfs = lParam;
|
nCharOfs = lParam;
|
||||||
nLength = ME_GetTextLength(editor);
|
nLength = ME_GetTextLength(editor);
|
||||||
|
nCharOfs = min(nCharOfs, nLength);
|
||||||
|
|
||||||
if (nCharOfs < nLength) {
|
|
||||||
ME_RunOfsFromCharOfs(editor, nCharOfs, &pRun, &nOffset);
|
ME_RunOfsFromCharOfs(editor, nCharOfs, &pRun, &nOffset);
|
||||||
assert(pRun->type == diRun);
|
assert(pRun->type == diRun);
|
||||||
pt.y = pRun->member.run.pt.y;
|
pt.y = pRun->member.run.pt.y;
|
||||||
pt.x = pRun->member.run.pt.x + ME_PointFromChar(editor, &pRun->member.run, nOffset);
|
pt.x = pRun->member.run.pt.x + ME_PointFromChar(editor, &pRun->member.run, nOffset);
|
||||||
pt.y += ME_GetParagraph(pRun)->member.para.pt.y;
|
pt.y += ME_GetParagraph(pRun)->member.para.pt.y;
|
||||||
} else {
|
|
||||||
pt.x = 0;
|
|
||||||
pt.y = editor->pBuffer->pLast->member.para.pt.y;
|
|
||||||
}
|
|
||||||
pt.x += editor->selofs;
|
pt.x += editor->selofs;
|
||||||
|
pt.x++; /* for some reason native offsets x by one */
|
||||||
|
|
||||||
si.cbSize = sizeof(si);
|
si.cbSize = sizeof(si);
|
||||||
si.fMask = SIF_POS;
|
si.fMask = SIF_POS;
|
||||||
|
@ -3581,7 +3649,6 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
goto do_default;
|
goto do_default;
|
||||||
break;
|
break;
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
if (editor->bRedraw)
|
|
||||||
{
|
{
|
||||||
HDC hDC;
|
HDC hDC;
|
||||||
PAINTSTRUCT ps;
|
PAINTSTRUCT ps;
|
||||||
|
@ -3603,8 +3670,6 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
ME_SendOldNotify(editor, EN_KILLFOCUS);
|
ME_SendOldNotify(editor, EN_KILLFOCUS);
|
||||||
return 0;
|
return 0;
|
||||||
case WM_ERASEBKGND:
|
case WM_ERASEBKGND:
|
||||||
{
|
|
||||||
if (editor->bRedraw)
|
|
||||||
{
|
{
|
||||||
HDC hDC = (HDC)wParam;
|
HDC hDC = (HDC)wParam;
|
||||||
RECT rc;
|
RECT rc;
|
||||||
|
@ -3612,7 +3677,6 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
{
|
{
|
||||||
FillRect(hDC, &rc, editor->hbrBackground);
|
FillRect(hDC, &rc, editor->hbrBackground);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
|
@ -3642,36 +3706,11 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
MultiByteToWideChar(CP_ACP, 0, &charA, 1, &wstr, 1);
|
MultiByteToWideChar(CP_ACP, 0, &charA, 1, &wstr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (wstr)
|
|
||||||
{
|
|
||||||
case 1: /* Ctrl-A */
|
|
||||||
ME_SetSelection(editor, 0, -1);
|
|
||||||
return 0;
|
|
||||||
case 3: /* Ctrl-C */
|
|
||||||
SendMessageW(editor->hWnd, WM_COPY, 0, 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetWindowLongW(editor->hWnd, GWL_STYLE) & ES_READONLY) {
|
if (GetWindowLongW(editor->hWnd, GWL_STYLE) & ES_READONLY) {
|
||||||
MessageBeep(MB_ICONERROR);
|
MessageBeep(MB_ICONERROR);
|
||||||
return 0; /* FIXME really 0 ? */
|
return 0; /* FIXME really 0 ? */
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (wstr)
|
|
||||||
{
|
|
||||||
case 22: /* Ctrl-V */
|
|
||||||
SendMessageW(editor->hWnd, WM_PASTE, 0, 0);
|
|
||||||
return 0;
|
|
||||||
case 24: /* Ctrl-X */
|
|
||||||
SendMessageW(editor->hWnd, WM_CUT, 0, 0);
|
|
||||||
return 0;
|
|
||||||
case 25: /* Ctrl-Y */
|
|
||||||
SendMessageW(editor->hWnd, EM_REDO, 0, 0);
|
|
||||||
return 0;
|
|
||||||
case 26: /* Ctrl-Z */
|
|
||||||
SendMessageW(editor->hWnd, EM_UNDO, 0, 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (((unsigned)wstr)>=' '
|
if (((unsigned)wstr)>=' '
|
||||||
|| (wstr=='\r' && (GetWindowLongW(hWnd, GWL_STYLE) & ES_MULTILINE))
|
|| (wstr=='\r' && (GetWindowLongW(hWnd, GWL_STYLE) & ES_MULTILINE))
|
||||||
|| wstr=='\t') {
|
|| wstr=='\t') {
|
||||||
|
@ -3930,9 +3969,7 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
ME_SendRequestResize(editor, TRUE);
|
ME_SendRequestResize(editor, TRUE);
|
||||||
return 0;
|
return 0;
|
||||||
case WM_SETREDRAW:
|
case WM_SETREDRAW:
|
||||||
if ((editor->bRedraw = wParam))
|
return DefWindowProcW(hWnd, msg, wParam, lParam);
|
||||||
ME_RewrapRepaint(editor);
|
|
||||||
return 0;
|
|
||||||
case WM_SIZE:
|
case WM_SIZE:
|
||||||
{
|
{
|
||||||
GetClientRect(hWnd, &editor->rcFormat);
|
GetClientRect(hWnd, &editor->rcFormat);
|
||||||
|
|
|
@ -351,7 +351,6 @@ typedef struct tagME_TextEditor
|
||||||
ME_FontCacheItem pFontCache[HFONT_CACHE_SIZE];
|
ME_FontCacheItem pFontCache[HFONT_CACHE_SIZE];
|
||||||
int nZoomNumerator, nZoomDenominator;
|
int nZoomNumerator, nZoomDenominator;
|
||||||
RECT rcFormat;
|
RECT rcFormat;
|
||||||
BOOL bRedraw;
|
|
||||||
BOOL bWordWrap;
|
BOOL bWordWrap;
|
||||||
int nInvalidOfs;
|
int nInvalidOfs;
|
||||||
int nTextLimit;
|
int nTextLimit;
|
||||||
|
@ -401,7 +400,7 @@ typedef struct tagME_WrapContext
|
||||||
int nAvailWidth;
|
int nAvailWidth;
|
||||||
int nRow;
|
int nRow;
|
||||||
POINT pt;
|
POINT pt;
|
||||||
BOOL bOverflown;
|
BOOL bOverflown, bWordWrap;
|
||||||
ME_DisplayItem *pRowStart;
|
ME_DisplayItem *pRowStart;
|
||||||
|
|
||||||
ME_DisplayItem *pLastSplittableRun;
|
ME_DisplayItem *pLastSplittableRun;
|
||||||
|
|
|
@ -147,6 +147,8 @@ void ME_Repaint(ME_TextEditor *editor)
|
||||||
ME_UpdateScrollBar(editor);
|
ME_UpdateScrollBar(editor);
|
||||||
FIXME("ME_Repaint had to call ME_WrapMarkedParagraphs\n");
|
FIXME("ME_Repaint had to call ME_WrapMarkedParagraphs\n");
|
||||||
}
|
}
|
||||||
|
if (!IsWindowVisible(editor->hWnd))
|
||||||
|
return;
|
||||||
if (!editor->bEmulateVersion10 || (editor->nEventMask & ENM_UPDATE))
|
if (!editor->bEmulateVersion10 || (editor->nEventMask & ENM_UPDATE))
|
||||||
ME_SendOldNotify(editor, EN_UPDATE);
|
ME_SendOldNotify(editor, EN_UPDATE);
|
||||||
UpdateWindow(editor->hWnd);
|
UpdateWindow(editor->hWnd);
|
||||||
|
@ -159,7 +161,6 @@ void ME_UpdateRepaint(ME_TextEditor *editor)
|
||||||
BOOL wrappedParagraphs;
|
BOOL wrappedParagraphs;
|
||||||
|
|
||||||
wrappedParagraphs = ME_WrapMarkedParagraphs(editor);
|
wrappedParagraphs = ME_WrapMarkedParagraphs(editor);
|
||||||
if (!editor->bRedraw) return;
|
|
||||||
if (wrappedParagraphs)
|
if (wrappedParagraphs)
|
||||||
ME_UpdateScrollBar(editor);
|
ME_UpdateScrollBar(editor);
|
||||||
|
|
||||||
|
@ -185,13 +186,10 @@ ME_RewrapRepaint(ME_TextEditor *editor)
|
||||||
* looks, but not content. Like resizing. */
|
* looks, but not content. Like resizing. */
|
||||||
|
|
||||||
ME_MarkAllForWrapping(editor);
|
ME_MarkAllForWrapping(editor);
|
||||||
if (editor->bRedraw)
|
|
||||||
{
|
|
||||||
ME_WrapMarkedParagraphs(editor);
|
ME_WrapMarkedParagraphs(editor);
|
||||||
ME_UpdateScrollBar(editor);
|
ME_UpdateScrollBar(editor);
|
||||||
ME_Repaint(editor);
|
ME_Repaint(editor);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
int ME_twips2pointsX(ME_Context *c, int x)
|
int ME_twips2pointsX(ME_Context *c, int x)
|
||||||
{
|
{
|
||||||
|
@ -1074,17 +1072,14 @@ void ME_Scroll(ME_TextEditor *editor, int value, int type)
|
||||||
si.nPos = 0;
|
si.nPos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
nNewPos = SetScrollInfo(editor->hWnd, SB_VERT, &si, editor->bRedraw);
|
nNewPos = SetScrollInfo(editor->hWnd, SB_VERT, &si, TRUE);
|
||||||
editor->vert_si.nPos = nNewPos;
|
editor->vert_si.nPos = nNewPos;
|
||||||
nActualScroll = nOrigPos - nNewPos;
|
nActualScroll = nOrigPos - nNewPos;
|
||||||
if (editor->bRedraw)
|
|
||||||
{
|
|
||||||
if (abs(nActualScroll) > editor->sizeWindow.cy)
|
if (abs(nActualScroll) > editor->sizeWindow.cy)
|
||||||
InvalidateRect(editor->hWnd, NULL, TRUE);
|
InvalidateRect(editor->hWnd, NULL, TRUE);
|
||||||
else
|
else
|
||||||
ScrollWindowEx(editor->hWnd, 0, nActualScroll, NULL, NULL, NULL, NULL, SW_INVALIDATE);
|
ScrollWindowEx(editor->hWnd, 0, nActualScroll, NULL, NULL, NULL, NULL, SW_INVALIDATE);
|
||||||
ME_Repaint(editor);
|
ME_Repaint(editor);
|
||||||
}
|
|
||||||
|
|
||||||
hWnd = editor->hWnd;
|
hWnd = editor->hWnd;
|
||||||
winStyle = GetWindowLongW(hWnd, GWL_STYLE);
|
winStyle = GetWindowLongW(hWnd, GWL_STYLE);
|
||||||
|
|
|
@ -287,6 +287,7 @@ ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp,
|
||||||
{
|
{
|
||||||
ME_AddUndoItem(editor, diUndoSetParagraphFormat, tp);
|
ME_AddUndoItem(editor, diUndoSetParagraphFormat, tp);
|
||||||
*tp->member.para.pFmt = *pNext->member.para.pFmt;
|
*tp->member.para.pFmt = *pNext->member.para.pFmt;
|
||||||
|
tp->member.para.border = pNext->member.para.border;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!editor->bEmulateVersion10) { /* v4.1 */
|
if (!editor->bEmulateVersion10) { /* v4.1 */
|
||||||
|
|
|
@ -109,7 +109,7 @@ int _RTFGetChar(RTF_Info *info)
|
||||||
if (stream->dwSize == 0)
|
if (stream->dwSize == 0)
|
||||||
return EOF;
|
return EOF;
|
||||||
}
|
}
|
||||||
ch = stream->buffer[stream->dwUsed++];
|
ch = (unsigned char)stream->buffer[stream->dwUsed++];
|
||||||
if (!ch)
|
if (!ch)
|
||||||
return EOF;
|
return EOF;
|
||||||
return ch;
|
return ch;
|
||||||
|
|
|
@ -304,6 +304,8 @@ ME_WordBreakProc(LPWSTR s, INT start, INT len, INT code)
|
||||||
/* FIXME: Native also knows about punctuation */
|
/* FIXME: Native also knows about punctuation */
|
||||||
TRACE("s==%s, start==%d, len==%d, code==%d\n",
|
TRACE("s==%s, start==%d, len==%d, code==%d\n",
|
||||||
debugstr_wn(s, len), start, len, code);
|
debugstr_wn(s, len), start, len, code);
|
||||||
|
/* convert number of bytes to number of characters. */
|
||||||
|
len /= sizeof(WCHAR);
|
||||||
switch (code)
|
switch (code)
|
||||||
{
|
{
|
||||||
case WB_ISDELIMITER:
|
case WB_ISDELIMITER:
|
||||||
|
@ -330,11 +332,23 @@ ME_WordBreakProc(LPWSTR s, INT start, INT len, INT code)
|
||||||
int
|
int
|
||||||
ME_CallWordBreakProc(ME_TextEditor *editor, ME_String *str, INT start, INT code)
|
ME_CallWordBreakProc(ME_TextEditor *editor, ME_String *str, INT start, INT code)
|
||||||
{
|
{
|
||||||
/* FIXME: ANSIfy the string when bEmulateVersion10 is TRUE */
|
if (!editor->pfnWordBreak) {
|
||||||
if (!editor->pfnWordBreak)
|
return ME_WordBreakProc(str->szData, start, str->nLen*sizeof(WCHAR), code);
|
||||||
return ME_WordBreakProc(str->szData, start, str->nLen, code);
|
} else if (!editor->bEmulateVersion10) {
|
||||||
else
|
/* MSDN lied about the third parameter for EditWordBreakProc being the number
|
||||||
return editor->pfnWordBreak(str->szData, start, str->nLen, code);
|
* of characters, it is actually the number of bytes of the string. */
|
||||||
|
return editor->pfnWordBreak(str->szData, start, str->nLen*sizeof(WCHAR), code);
|
||||||
|
} else {
|
||||||
|
int result;
|
||||||
|
int buffer_size = WideCharToMultiByte(CP_ACP, 0, str->szData, str->nLen,
|
||||||
|
NULL, 0, NULL, NULL);
|
||||||
|
char *buffer = (char*)heap_alloc(buffer_size);
|
||||||
|
WideCharToMultiByte(CP_ACP, 0, str->szData, str->nLen,
|
||||||
|
buffer, buffer_size, NULL, NULL);
|
||||||
|
result = editor->pfnWordBreak(str->szData, start, str->nLen, code);
|
||||||
|
heap_free(buffer);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LPWSTR ME_ToUnicode(BOOL unicode, LPVOID psz)
|
LPWSTR ME_ToUnicode(BOOL unicode, LPVOID psz)
|
||||||
|
|
|
@ -392,9 +392,10 @@ ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor,
|
||||||
assert(table_row);
|
assert(table_row);
|
||||||
assert(table_row->type == diParagraph);
|
assert(table_row->type == diParagraph);
|
||||||
if (!editor->bEmulateVersion10) { /* v4.1 */
|
if (!editor->bEmulateVersion10) { /* v4.1 */
|
||||||
ME_DisplayItem *insertedCell, *para, *cell;
|
ME_DisplayItem *insertedCell, *para, *cell, *prevTableEnd;
|
||||||
cell = ME_FindItemFwd(ME_GetTableRowStart(table_row), diCell);
|
cell = ME_FindItemFwd(ME_GetTableRowStart(table_row), diCell);
|
||||||
run = ME_GetTableRowEnd(table_row)->member.para.next_para;
|
prevTableEnd = ME_GetTableRowEnd(table_row);
|
||||||
|
run = prevTableEnd->member.para.next_para;
|
||||||
run = ME_FindItemFwd(run, diRun);
|
run = ME_FindItemFwd(run, diRun);
|
||||||
editor->pCursors[0].pRun = run;
|
editor->pCursors[0].pRun = run;
|
||||||
editor->pCursors[0].nOffset = 0;
|
editor->pCursors[0].nOffset = 0;
|
||||||
|
@ -412,7 +413,8 @@ ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor,
|
||||||
insertedCell->member.cell.nRightBoundary = cell->member.cell.nRightBoundary;
|
insertedCell->member.cell.nRightBoundary = cell->member.cell.nRightBoundary;
|
||||||
insertedCell->member.cell.border = cell->member.cell.border;
|
insertedCell->member.cell.border = cell->member.cell.border;
|
||||||
};
|
};
|
||||||
ME_InsertTableRowEndFromCursor(editor);
|
para = ME_InsertTableRowEndFromCursor(editor);
|
||||||
|
*para->member.para.pFmt = *prevTableEnd->member.para.pFmt;
|
||||||
/* return the table row start for the inserted paragraph */
|
/* return the table row start for the inserted paragraph */
|
||||||
return ME_FindItemFwd(cell, diParagraph)->member.para.next_para;
|
return ME_FindItemFwd(cell, diParagraph)->member.para.next_para;
|
||||||
} else { /* v1.0 - 3.0 */
|
} else { /* v1.0 - 3.0 */
|
||||||
|
|
|
@ -57,6 +57,7 @@ typedef struct ITextServicesImpl {
|
||||||
ITextHost *pMyHost;
|
ITextHost *pMyHost;
|
||||||
LONG ref;
|
LONG ref;
|
||||||
CRITICAL_SECTION csTxtSrv;
|
CRITICAL_SECTION csTxtSrv;
|
||||||
|
char spare[256];
|
||||||
} ITextServicesImpl;
|
} ITextServicesImpl;
|
||||||
|
|
||||||
static const ITextServicesVtbl textservices_Vtbl;
|
static const ITextServicesVtbl textservices_Vtbl;
|
||||||
|
|
|
@ -96,6 +96,7 @@ ME_UndoItem *ME_AddUndoItem(ME_TextEditor *editor, ME_DIType type, const ME_Disp
|
||||||
pItem->member.para.pFmt->cbSize = sizeof(PARAFORMAT2);
|
pItem->member.para.pFmt->cbSize = sizeof(PARAFORMAT2);
|
||||||
pItem->member.para.pFmt->dwMask = 0;
|
pItem->member.para.pFmt->dwMask = 0;
|
||||||
*pItem->member.para.pFmt = *pdi->member.para.pFmt;
|
*pItem->member.para.pFmt = *pdi->member.para.pFmt;
|
||||||
|
pItem->member.para.border = pdi->member.para.border;
|
||||||
pItem->member.para.nFlags = prev_para->member.para.nFlags & ~MEPF_CELL;
|
pItem->member.para.nFlags = prev_para->member.para.nFlags & ~MEPF_CELL;
|
||||||
pItem->member.para.pCell = NULL;
|
pItem->member.para.pCell = NULL;
|
||||||
break;
|
break;
|
||||||
|
@ -293,6 +294,7 @@ static void ME_PlayUndoItem(ME_TextEditor *editor, ME_DisplayItem *pItem)
|
||||||
para = ME_FindItemBack(tmp.pRun, diParagraph);
|
para = ME_FindItemBack(tmp.pRun, diParagraph);
|
||||||
ME_AddUndoItem(editor, diUndoSetParagraphFormat, para);
|
ME_AddUndoItem(editor, diUndoSetParagraphFormat, para);
|
||||||
*para->member.para.pFmt = *pItem->member.para.pFmt;
|
*para->member.para.pFmt = *pItem->member.para.pFmt;
|
||||||
|
para->member.para.border = pItem->member.para.border;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case diUndoSetCharFormat:
|
case diUndoSetCharFormat:
|
||||||
|
@ -343,12 +345,14 @@ static void ME_PlayUndoItem(ME_TextEditor *editor, ME_DisplayItem *pItem)
|
||||||
new_para->member.para.nFlags |= MEPF_ROWSTART;
|
new_para->member.para.nFlags |= MEPF_ROWSTART;
|
||||||
assert(pItem->member.para.pFmt->cbSize == sizeof(PARAFORMAT2));
|
assert(pItem->member.para.pFmt->cbSize == sizeof(PARAFORMAT2));
|
||||||
*new_para->member.para.pFmt = *pItem->member.para.pFmt;
|
*new_para->member.para.pFmt = *pItem->member.para.pFmt;
|
||||||
|
new_para->member.para.border = pItem->member.para.border;
|
||||||
if (pItem->member.para.pCell)
|
if (pItem->member.para.pCell)
|
||||||
{
|
{
|
||||||
ME_DisplayItem *pItemCell, *pCell;
|
ME_DisplayItem *pItemCell, *pCell;
|
||||||
pItemCell = pItem->member.para.pCell;
|
pItemCell = pItem->member.para.pCell;
|
||||||
pCell = new_para->member.para.pCell;
|
pCell = new_para->member.para.pCell;
|
||||||
pCell->member.cell.nRightBoundary = pItemCell->member.cell.nRightBoundary;
|
pCell->member.cell.nRightBoundary = pItemCell->member.cell.nRightBoundary;
|
||||||
|
pCell->member.cell.border = pItemCell->member.cell.border;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,8 +50,10 @@ static void ME_BeginRow(ME_WrapContext *wc, ME_DisplayItem *para)
|
||||||
wc->pRowStart = NULL;
|
wc->pRowStart = NULL;
|
||||||
wc->bOverflown = FALSE;
|
wc->bOverflown = FALSE;
|
||||||
wc->pLastSplittableRun = NULL;
|
wc->pLastSplittableRun = NULL;
|
||||||
|
wc->bWordWrap = wc->context->editor->bWordWrap;
|
||||||
if (para->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND)) {
|
if (para->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND)) {
|
||||||
wc->nAvailWidth = 0;
|
wc->nAvailWidth = 0;
|
||||||
|
wc->bWordWrap = FALSE;
|
||||||
if (para->member.para.nFlags & MEPF_ROWEND)
|
if (para->member.para.nFlags & MEPF_ROWEND)
|
||||||
{
|
{
|
||||||
ME_Cell *cell = &ME_FindItemBack(para, diCell)->member.cell;
|
ME_Cell *cell = &ME_FindItemBack(para, diCell)->member.cell;
|
||||||
|
@ -73,11 +75,11 @@ static void ME_BeginRow(ME_WrapContext *wc, ME_DisplayItem *para)
|
||||||
|
|
||||||
wc->nAvailWidth = cell->nWidth
|
wc->nAvailWidth = cell->nWidth
|
||||||
- (wc->nRow ? wc->nLeftMargin : wc->nFirstMargin) - wc->nRightMargin;
|
- (wc->nRow ? wc->nLeftMargin : wc->nFirstMargin) - wc->nRightMargin;
|
||||||
} else if (wc->context->editor->bWordWrap) {
|
wc->bWordWrap = TRUE;
|
||||||
wc->nAvailWidth = wc->context->rcView.right - wc->context->rcView.left
|
|
||||||
- (wc->nRow ? wc->nLeftMargin : wc->nFirstMargin) - wc->nRightMargin;
|
|
||||||
} else {
|
} else {
|
||||||
wc->nAvailWidth = ~0u >> 1;
|
wc->nAvailWidth = wc->context->rcView.right - wc->context->rcView.left
|
||||||
|
- (wc->nRow ? wc->nLeftMargin : wc->nFirstMargin) - wc->nRightMargin
|
||||||
|
- wc->context->editor->selofs;
|
||||||
}
|
}
|
||||||
wc->pt.x = wc->context->pt.x;
|
wc->pt.x = wc->context->pt.x;
|
||||||
if (wc->context->editor->bEmulateVersion10 && /* v1.0 - 3.0 */
|
if (wc->context->editor->bEmulateVersion10 && /* v1.0 - 3.0 */
|
||||||
|
@ -148,9 +150,9 @@ static void ME_InsertRowStart(ME_WrapContext *wc, const ME_DisplayItem *pEnd)
|
||||||
assert(para->member.para.pFmt->dwMask & PFM_ALIGNMENT);
|
assert(para->member.para.pFmt->dwMask & PFM_ALIGNMENT);
|
||||||
align = para->member.para.pFmt->wAlignment;
|
align = para->member.para.pFmt->wAlignment;
|
||||||
if (align == PFA_CENTER)
|
if (align == PFA_CENTER)
|
||||||
shift = (wc->nAvailWidth-width)/2;
|
shift = max((wc->nAvailWidth-width)/2, 0);
|
||||||
if (align == PFA_RIGHT)
|
if (align == PFA_RIGHT)
|
||||||
shift = wc->nAvailWidth-width;
|
shift = max(wc->nAvailWidth-width, 0);
|
||||||
for (p = wc->pRowStart; p!=pEnd; p = p->next)
|
for (p = wc->pRowStart; p!=pEnd; p = p->next)
|
||||||
{
|
{
|
||||||
if (p->type==diRun) { /* FIXME add more run types */
|
if (p->type==diRun) { /* FIXME add more run types */
|
||||||
|
@ -377,7 +379,8 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* will current run fit? */
|
/* will current run fit? */
|
||||||
if (wc->pt.x + run->nWidth - wc->context->pt.x > wc->nAvailWidth)
|
if (wc->bWordWrap &&
|
||||||
|
wc->pt.x + run->nWidth - wc->context->pt.x > wc->nAvailWidth)
|
||||||
{
|
{
|
||||||
int loc = wc->context->pt.x + wc->nAvailWidth - wc->pt.x;
|
int loc = wc->context->pt.x + wc->nAvailWidth - wc->pt.x;
|
||||||
/* total white run ? */
|
/* total white run ? */
|
||||||
|
@ -416,9 +419,11 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p)
|
||||||
{
|
{
|
||||||
if (run->nFlags & MERF_STARTWHITE)
|
if (run->nFlags & MERF_STARTWHITE)
|
||||||
{
|
{
|
||||||
/* we had only spaces so far, so we must be on the first line of the
|
/* We had only spaces so far, so we must be on the first line of the
|
||||||
* paragraph, since no other lines of the paragraph start with spaces. */
|
* paragraph (or the first line after MERF_ENDROW forced the line
|
||||||
assert(!wc->nRow);
|
* break within the paragraph), since no other lines of the paragraph
|
||||||
|
* start with spaces. */
|
||||||
|
|
||||||
/* The lines will only contain spaces, and the rest of the run will
|
/* The lines will only contain spaces, and the rest of the run will
|
||||||
* overflow onto the next line. */
|
* overflow onto the next line. */
|
||||||
wc->bOverflown = TRUE;
|
wc->bOverflown = TRUE;
|
||||||
|
@ -730,16 +735,18 @@ BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor) {
|
||||||
return bModified;
|
return bModified;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ME_InvalidateMarkedParagraphs(ME_TextEditor *editor) {
|
void ME_InvalidateMarkedParagraphs(ME_TextEditor *editor)
|
||||||
|
{
|
||||||
ME_Context c;
|
ME_Context c;
|
||||||
|
RECT rc;
|
||||||
|
int ofs;
|
||||||
|
ME_DisplayItem *item;
|
||||||
|
|
||||||
ME_InitContext(&c, editor, GetDC(editor->hWnd));
|
ME_InitContext(&c, editor, GetDC(editor->hWnd));
|
||||||
if (editor->bRedraw)
|
rc = c.rcView;
|
||||||
{
|
ofs = ME_GetYScrollPos(editor);
|
||||||
RECT rc = c.rcView;
|
|
||||||
int ofs = ME_GetYScrollPos(editor);
|
|
||||||
|
|
||||||
ME_DisplayItem *item = editor->pBuffer->pFirst;
|
item = editor->pBuffer->pFirst;
|
||||||
while(item != editor->pBuffer->pLast) {
|
while(item != editor->pBuffer->pLast) {
|
||||||
if (item->member.para.nFlags & MEPF_REPAINT) {
|
if (item->member.para.nFlags & MEPF_REPAINT) {
|
||||||
rc.top = item->member.para.pt.y - ofs;
|
rc.top = item->member.para.pt.y - ofs;
|
||||||
|
@ -754,7 +761,6 @@ void ME_InvalidateMarkedParagraphs(ME_TextEditor *editor) {
|
||||||
rc.bottom = editor->nLastTotalLength - ofs;
|
rc.bottom = editor->nLastTotalLength - ofs;
|
||||||
InvalidateRect(editor->hWnd, &rc, TRUE);
|
InvalidateRect(editor->hWnd, &rc, TRUE);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
ME_DestroyContext(&c, editor->hWnd);
|
ME_DestroyContext(&c, editor->hWnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -196,11 +196,14 @@ ME_StreamOutRTFHeader(ME_OutStream *pStream, int dwFormat)
|
||||||
|
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
ME_StreamOutRTFFontAndColorTbl(ME_OutStream *pStream, ME_DisplayItem *pFirstRun, const ME_DisplayItem *pLastRun)
|
ME_StreamOutRTFFontAndColorTbl(ME_OutStream *pStream, ME_DisplayItem *pFirstRun,
|
||||||
|
ME_DisplayItem *pLastRun)
|
||||||
{
|
{
|
||||||
ME_DisplayItem *item = pFirstRun;
|
ME_DisplayItem *item = pFirstRun;
|
||||||
ME_FontTableItem *table = pStream->fonttbl;
|
ME_FontTableItem *table = pStream->fonttbl;
|
||||||
int i;
|
int i;
|
||||||
|
ME_DisplayItem *pLastPara = ME_GetParagraph(pLastRun);
|
||||||
|
ME_DisplayItem *pCell = NULL;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
CHARFORMAT2W *fmt = &item->member.run.style->fmt;
|
CHARFORMAT2W *fmt = &item->member.run.style->fmt;
|
||||||
|
@ -214,7 +217,7 @@ ME_StreamOutRTFFontAndColorTbl(ME_OutStream *pStream, ME_DisplayItem *pFirstRun,
|
||||||
if (table[i].bCharSet == bCharSet
|
if (table[i].bCharSet == bCharSet
|
||||||
&& (table[i].szFaceName == face || !lstrcmpW(table[i].szFaceName, face)))
|
&& (table[i].szFaceName == face || !lstrcmpW(table[i].szFaceName, face)))
|
||||||
break;
|
break;
|
||||||
if (i == pStream->nFontTblLen) {
|
if (i == pStream->nFontTblLen && i < STREAMOUT_FONTTBL_SIZE) {
|
||||||
table[i].bCharSet = bCharSet;
|
table[i].bCharSet = bCharSet;
|
||||||
table[i].szFaceName = face;
|
table[i].szFaceName = face;
|
||||||
pStream->nFontTblLen++;
|
pStream->nFontTblLen++;
|
||||||
|
@ -226,7 +229,7 @@ ME_StreamOutRTFFontAndColorTbl(ME_OutStream *pStream, ME_DisplayItem *pFirstRun,
|
||||||
for (i = 1; i < pStream->nColorTblLen; i++)
|
for (i = 1; i < pStream->nColorTblLen; i++)
|
||||||
if (pStream->colortbl[i] == crColor)
|
if (pStream->colortbl[i] == crColor)
|
||||||
break;
|
break;
|
||||||
if (i == pStream->nColorTblLen) {
|
if (i == pStream->nColorTblLen && i < STREAMOUT_COLORTBL_SIZE) {
|
||||||
pStream->colortbl[i] = crColor;
|
pStream->colortbl[i] = crColor;
|
||||||
pStream->nColorTblLen++;
|
pStream->nColorTblLen++;
|
||||||
}
|
}
|
||||||
|
@ -236,7 +239,7 @@ ME_StreamOutRTFFontAndColorTbl(ME_OutStream *pStream, ME_DisplayItem *pFirstRun,
|
||||||
for (i = 1; i < pStream->nColorTblLen; i++)
|
for (i = 1; i < pStream->nColorTblLen; i++)
|
||||||
if (pStream->colortbl[i] == crColor)
|
if (pStream->colortbl[i] == crColor)
|
||||||
break;
|
break;
|
||||||
if (i == pStream->nColorTblLen) {
|
if (i == pStream->nColorTblLen && i < STREAMOUT_COLORTBL_SIZE) {
|
||||||
pStream->colortbl[i] = crColor;
|
pStream->colortbl[i] = crColor;
|
||||||
pStream->nColorTblLen++;
|
pStream->nColorTblLen++;
|
||||||
}
|
}
|
||||||
|
@ -246,6 +249,38 @@ ME_StreamOutRTFFontAndColorTbl(ME_OutStream *pStream, ME_DisplayItem *pFirstRun,
|
||||||
break;
|
break;
|
||||||
item = ME_FindItemFwd(item, diRun);
|
item = ME_FindItemFwd(item, diRun);
|
||||||
} while (item);
|
} while (item);
|
||||||
|
item = ME_GetParagraph(pFirstRun);
|
||||||
|
do {
|
||||||
|
if (item->member.para.pCell && item->member.para.pCell)
|
||||||
|
{
|
||||||
|
pCell = item->member.para.pCell;
|
||||||
|
if (pCell)
|
||||||
|
{
|
||||||
|
ME_Border* borders[4] = { &pCell->member.cell.border.top,
|
||||||
|
&pCell->member.cell.border.left,
|
||||||
|
&pCell->member.cell.border.bottom,
|
||||||
|
&pCell->member.cell.border.right };
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if (borders[i]->width > 0)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
COLORREF crColor = borders[i]->colorRef;
|
||||||
|
for (j = 1; j < pStream->nColorTblLen; j++)
|
||||||
|
if (pStream->colortbl[j] == crColor)
|
||||||
|
break;
|
||||||
|
if (j == pStream->nColorTblLen && j < STREAMOUT_COLORTBL_SIZE) {
|
||||||
|
pStream->colortbl[j] = crColor;
|
||||||
|
pStream->nColorTblLen++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (item == pLastPara)
|
||||||
|
break;
|
||||||
|
item = item->member.para.next_para;
|
||||||
|
} while (item);
|
||||||
|
|
||||||
if (!ME_StreamOutPrint(pStream, "{\\fonttbl"))
|
if (!ME_StreamOutPrint(pStream, "{\\fonttbl"))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -286,30 +321,78 @@ ME_StreamOutRTFFontAndColorTbl(ME_OutStream *pStream, ME_DisplayItem *pFirstRun,
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
ME_StreamOutRTFTableProps(ME_TextEditor *editor, ME_OutStream *pStream,
|
ME_StreamOutRTFTableProps(ME_TextEditor *editor, ME_OutStream *pStream,
|
||||||
const ME_DisplayItem *para)
|
ME_DisplayItem *para)
|
||||||
{
|
{
|
||||||
ME_DisplayItem *cell;
|
ME_DisplayItem *cell;
|
||||||
char props[STREAMOUT_BUFFER_SIZE] = "";
|
char props[STREAMOUT_BUFFER_SIZE] = "";
|
||||||
|
int i;
|
||||||
|
const char sideChar[4] = {'t','l','b','r'};
|
||||||
|
|
||||||
if (!ME_StreamOutPrint(pStream, "\\trowd"))
|
if (!ME_StreamOutPrint(pStream, "\\trowd"))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!editor->bEmulateVersion10) { /* v4.1 */
|
if (!editor->bEmulateVersion10) { /* v4.1 */
|
||||||
assert(para->member.para.nFlags & MEPF_ROWSTART);
|
PARAFORMAT2 *pFmt = ME_GetTableRowEnd(para)->member.para.pFmt;
|
||||||
|
para = ME_GetTableRowStart(para);
|
||||||
cell = para->member.para.next_para->member.para.pCell;
|
cell = para->member.para.next_para->member.para.pCell;
|
||||||
assert(cell);
|
assert(cell);
|
||||||
|
if (pFmt->dxOffset)
|
||||||
|
sprintf(props + strlen(props), "\\trgaph%d", pFmt->dxOffset);
|
||||||
|
if (pFmt->dxStartIndent)
|
||||||
|
sprintf(props + strlen(props), "\\trleft%d", pFmt->dxStartIndent);
|
||||||
do {
|
do {
|
||||||
|
ME_Border* borders[4] = { &cell->member.cell.border.top,
|
||||||
|
&cell->member.cell.border.left,
|
||||||
|
&cell->member.cell.border.bottom,
|
||||||
|
&cell->member.cell.border.right };
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if (borders[i]->width)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
COLORREF crColor = borders[i]->colorRef;
|
||||||
|
sprintf(props + strlen(props), "\\clbrdr%c", sideChar[i]);
|
||||||
|
sprintf(props + strlen(props), "\\brdrs");
|
||||||
|
sprintf(props + strlen(props), "\\brdrw%d", borders[i]->width);
|
||||||
|
for (j = 1; j < pStream->nColorTblLen; j++) {
|
||||||
|
if (pStream->colortbl[j] == crColor) {
|
||||||
|
sprintf(props + strlen(props), "\\brdrcf%u", j);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
sprintf(props + strlen(props), "\\cellx%d", cell->member.cell.nRightBoundary);
|
sprintf(props + strlen(props), "\\cellx%d", cell->member.cell.nRightBoundary);
|
||||||
cell = cell->member.cell.next_cell;
|
cell = cell->member.cell.next_cell;
|
||||||
} while (cell->member.cell.next_cell);
|
} while (cell->member.cell.next_cell);
|
||||||
} else { /* v1.0 - 3.0 */
|
} else { /* v1.0 - 3.0 */
|
||||||
|
const ME_Border* borders[4] = { ¶->member.para.border.top,
|
||||||
|
¶->member.para.border.left,
|
||||||
|
¶->member.para.border.bottom,
|
||||||
|
¶->member.para.border.right };
|
||||||
PARAFORMAT2 *pFmt = para->member.para.pFmt;
|
PARAFORMAT2 *pFmt = para->member.para.pFmt;
|
||||||
int i;
|
|
||||||
|
|
||||||
assert(!(para->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND|MEPF_CELL)));
|
assert(!(para->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND|MEPF_CELL)));
|
||||||
if (pFmt->dxOffset)
|
if (pFmt->dxOffset)
|
||||||
sprintf(props + strlen(props), "\\trgaph%d", pFmt->dxOffset);
|
sprintf(props + strlen(props), "\\trgaph%d", pFmt->dxOffset);
|
||||||
if (pFmt->dxStartIndent)
|
if (pFmt->dxStartIndent)
|
||||||
sprintf(props + strlen(props), "\\trleft%d", pFmt->dxStartIndent);
|
sprintf(props + strlen(props), "\\trleft%d", pFmt->dxStartIndent);
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if (borders[i]->width)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
COLORREF crColor = borders[i]->colorRef;
|
||||||
|
sprintf(props + strlen(props), "\\trbrdr%c", sideChar[i]);
|
||||||
|
sprintf(props + strlen(props), "\\brdrs");
|
||||||
|
sprintf(props + strlen(props), "\\brdrw%d", borders[i]->width);
|
||||||
|
for (j = 1; j < pStream->nColorTblLen; j++) {
|
||||||
|
if (pStream->colortbl[j] == crColor) {
|
||||||
|
sprintf(props + strlen(props), "\\brdrcf%u", j);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
for (i = 0; i < pFmt->cTabCount; i++)
|
for (i = 0; i < pFmt->cTabCount; i++)
|
||||||
{
|
{
|
||||||
sprintf(props + strlen(props), "\\cellx%d", pFmt->rgxTabs[i] & 0x00FFFFFF);
|
sprintf(props + strlen(props), "\\cellx%d", pFmt->rgxTabs[i] & 0x00FFFFFF);
|
||||||
|
@ -727,7 +810,7 @@ ME_StreamOutRTF(ME_TextEditor *editor, ME_OutStream *pStream, int nStart, int nC
|
||||||
}
|
}
|
||||||
} else if (p->member.para.nFlags & MEPF_ROWEND) {
|
} else if (p->member.para.nFlags & MEPF_ROWEND) {
|
||||||
pStream->nNestingLevel--;
|
pStream->nNestingLevel--;
|
||||||
if (pStream->nNestingLevel > 1) {
|
if (pStream->nNestingLevel >= 1) {
|
||||||
if (!ME_StreamOutPrint(pStream, "{\\*\\nesttableprops"))
|
if (!ME_StreamOutPrint(pStream, "{\\*\\nesttableprops"))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!ME_StreamOutRTFTableProps(editor, pStream, p))
|
if (!ME_StreamOutRTFTableProps(editor, pStream, p))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue