riched20: Implement ECO/EM SELECTIONBAR.

This commit is contained in:
Maarten Lankhorst 2007-12-14 21:29:37 +01:00 committed by Alexandre Julliard
parent 964a0303c1
commit b81335501f
7 changed files with 137 additions and 30 deletions

View File

@ -27,7 +27,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(richedit);
static BOOL static BOOL
ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs); ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs);
void ME_GetSelection(ME_TextEditor *editor, int *from, int *to) void ME_GetSelection(ME_TextEditor *editor, int *from, int *to)
{ {
*from = ME_GetCursorOfs(editor, 0); *from = ME_GetCursorOfs(editor, 0);
@ -832,25 +831,64 @@ void ME_LButtonDown(ME_TextEditor *editor, int x, int y)
tmp_cursor = editor->pCursors[0]; tmp_cursor = editor->pCursors[0];
is_selection = ME_IsSelection(editor); is_selection = ME_IsSelection(editor);
ME_FindPixelPos(editor, x, y, &editor->pCursors[0], &editor->bCaretAtEnd); if (x >= editor->selofs)
if (GetKeyState(VK_SHIFT)>=0)
{ {
editor->pCursors[1] = editor->pCursors[0]; ME_FindPixelPos(editor, x, y, &editor->pCursors[0], &editor->bCaretAtEnd);
} if (GetKeyState(VK_SHIFT)>=0)
else {
{ editor->pCursors[1] = editor->pCursors[0];
if (!is_selection) { }
else if (!is_selection) {
editor->pCursors[1] = tmp_cursor; editor->pCursors[1] = tmp_cursor;
is_selection = 1; is_selection = 1;
} }
ME_InvalidateSelection(editor);
HideCaret(editor->hWnd);
ME_MoveCaret(editor);
ShowCaret(editor->hWnd);
ME_ClearTempStyle(editor);
ME_SendSelChange(editor);
}
else
{
ME_DisplayItem *pRow;
editor->linesel = 1;
editor->sely = y;
/* Set pCursors[0] to beginning of line */
ME_FindPixelPos(editor, x, y, &editor->pCursors[1], &editor->bCaretAtEnd);
/* Set pCursors[1] to end of line */
pRow = ME_FindItemFwd(editor->pCursors[1].pRun, diStartRowOrParagraphOrEnd);
assert(pRow);
/* pCursor[0] is the position where the cursor will be drawn,
* pCursor[1] is the other end of the selection range
* pCursor[2] and [3] are backups of [0] and [1] so I
* don't have to look them up again
*/
if (pRow->type == diStartRow) {
/* FIXME WTF was I thinking about here ? */
ME_DisplayItem *pRun = ME_FindItemFwd(pRow, diRun);
assert(pRun);
editor->pCursors[0].pRun = pRun;
editor->pCursors[0].nOffset = 0;
editor->bCaretAtEnd = 1;
} else {
editor->pCursors[0].pRun = ME_FindItemBack(pRow, diRun);
assert(editor->pCursors[0].pRun && editor->pCursors[0].pRun->member.run.nFlags & MERF_ENDPARA);
editor->pCursors[0].nOffset = 0;
editor->bCaretAtEnd = 0;
}
editor->pCursors[2] = editor->pCursors[0];
editor->pCursors[3] = editor->pCursors[1];
ME_InvalidateSelection(editor);
HideCaret(editor->hWnd);
ME_MoveCaret(editor);
ShowCaret(editor->hWnd);
ME_ClearTempStyle(editor);
ME_SendSelChange(editor);
} }
ME_InvalidateSelection(editor);
HideCaret(editor->hWnd);
ME_MoveCaret(editor);
ShowCaret(editor->hWnd);
ME_ClearTempStyle(editor);
ME_SendSelChange(editor);
} }
void ME_MouseMove(ME_TextEditor *editor, int x, int y) void ME_MouseMove(ME_TextEditor *editor, int x, int y)
@ -861,14 +899,33 @@ void ME_MouseMove(ME_TextEditor *editor, int x, int y)
tmp_cursor = editor->pCursors[0]; tmp_cursor = editor->pCursors[0];
/* FIXME: do something with the return value of ME_FindPixelPos */ /* FIXME: do something with the return value of ME_FindPixelPos */
ME_FindPixelPos(editor, x, y, &tmp_cursor, &editor->bCaretAtEnd); if (!editor->linesel)
ME_FindPixelPos(editor, x, y, &tmp_cursor, &editor->bCaretAtEnd);
if (tmp_cursor.pRun == editor->pCursors[0].pRun && else ME_FindPixelPos(editor, (y > editor->sely) * editor->rcFormat.right, y, &tmp_cursor, &editor->bCaretAtEnd);
tmp_cursor.nOffset == editor->pCursors[0].nOffset)
if (!memcmp(&tmp_cursor, editor->pCursors, sizeof(tmp_cursor)))
return; return;
ME_InvalidateSelection(editor); ME_InvalidateSelection(editor);
editor->pCursors[0] = tmp_cursor; if (!editor->linesel)
editor->pCursors[0] = tmp_cursor;
else if (!memcmp(&tmp_cursor, editor->pCursors+2, sizeof(tmp_cursor)) ||
!memcmp(&tmp_cursor, editor->pCursors+3, sizeof(tmp_cursor)))
{
editor->pCursors[0] = editor->pCursors[2];
editor->pCursors[1] = editor->pCursors[3];
}
else if (y < editor->sely)
{
editor->pCursors[0] = tmp_cursor;
editor->pCursors[1] = editor->pCursors[2];
}
else
{
editor->pCursors[0] = tmp_cursor;
editor->pCursors[1] = editor->pCursors[3];
}
HideCaret(editor->hWnd); HideCaret(editor->hWnd);
ME_MoveCaret(editor); ME_MoveCaret(editor);
ME_InvalidateSelection(editor); ME_InvalidateSelection(editor);
@ -1240,7 +1297,6 @@ void ME_SendSelChange(ME_TextEditor *editor)
SendMessageW(GetParent(editor->hWnd), WM_NOTIFY, sc.nmhdr.idFrom, (LPARAM)&sc); SendMessageW(GetParent(editor->hWnd), WM_NOTIFY, sc.nmhdr.idFrom, (LPARAM)&sc);
} }
BOOL BOOL
ME_ArrowKey(ME_TextEditor *editor, int nVKey, BOOL extend, BOOL ctrl) ME_ArrowKey(ME_TextEditor *editor, int nVKey, BOOL extend, BOOL ctrl)
{ {

View File

@ -228,6 +228,7 @@
#include "shlwapi.h" #include "shlwapi.h"
#include "rtf.h" #include "rtf.h"
#include "imm.h" #include "imm.h"
#include "res.h"
#define STACK_SIZE_DEFAULT 100 #define STACK_SIZE_DEFAULT 100
#define STACK_SIZE_MAX 1000 #define STACK_SIZE_MAX 1000
@ -242,6 +243,8 @@ static const WCHAR RichEdit20W[] = {'R', 'i', 'c', 'h', 'E', 'd', 'i', 't', '2',
static const WCHAR RichEdit50W[] = {'R', 'i', 'c', 'h', 'E', 'd', 'i', 't', '5', '0', 'W', 0}; static const WCHAR RichEdit50W[] = {'R', 'i', 'c', 'h', 'E', 'd', 'i', 't', '5', '0', 'W', 0};
static const WCHAR REListBox20W[] = {'R','E','L','i','s','t','B','o','x','2','0','W', 0}; static const WCHAR REListBox20W[] = {'R','E','L','i','s','t','B','o','x','2','0','W', 0};
static const WCHAR REComboBox20W[] = {'R','E','C','o','m','b','o','B','o','x','2','0','W', 0}; static const WCHAR REComboBox20W[] = {'R','E','C','o','m','b','o','B','o','x','2','0','W', 0};
static HCURSOR hLeft;
static HCURSOR hBeam;
int me_debug = 0; int me_debug = 0;
HANDLE me_heap = NULL; HANDLE me_heap = NULL;
@ -1088,6 +1091,14 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey)
return FALSE; return FALSE;
} }
static void ME_SetCursor(ME_TextEditor *editor, int x)
{
if (x < editor->selofs || editor->linesel)
SetCursor(hLeft);
else
SetCursor(hBeam);
}
static BOOL ME_ShowContextMenu(ME_TextEditor *editor, int x, int y) static BOOL ME_ShowContextMenu(ME_TextEditor *editor, int x, int y)
{ {
CHARRANGE selrange; CHARRANGE selrange;
@ -1124,7 +1135,7 @@ ME_TextEditor *ME_MakeEditor(HWND hWnd) {
ME_MakeFirstParagraph(hDC, ed->pBuffer); ME_MakeFirstParagraph(hDC, ed->pBuffer);
ReleaseDC(hWnd, hDC); ReleaseDC(hWnd, hDC);
ed->bCaretShown = FALSE; ed->bCaretShown = FALSE;
ed->nCursors = 2; ed->nCursors = 4;
ed->pCursors = ALLOC_N_OBJ(ME_Cursor, ed->nCursors); ed->pCursors = ALLOC_N_OBJ(ME_Cursor, ed->nCursors);
ed->pCursors[0].pRun = ME_FindItemFwd(ed->pBuffer->pFirst, diRun); ed->pCursors[0].pRun = ME_FindItemFwd(ed->pBuffer->pFirst, diRun);
ed->pCursors[0].nOffset = 0; ed->pCursors[0].nOffset = 0;
@ -1165,7 +1176,12 @@ ME_TextEditor *ME_MakeEditor(HWND hWnd) {
} }
ME_CheckCharOffsets(ed); ME_CheckCharOffsets(ed);
if (GetWindowLongW(hWnd, GWL_STYLE) & ES_SELECTIONBAR)
ed->selofs = 16;
else
ed->selofs = 0;
ed->linesel = 0;
if (GetWindowLongW(hWnd, GWL_STYLE) & ES_PASSWORD) if (GetWindowLongW(hWnd, GWL_STYLE) & ES_PASSWORD)
ed->cPasswordMask = '*'; ed->cPasswordMask = '*';
else else
@ -1254,6 +1270,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
DisableThreadLibraryCalls(hinstDLL); DisableThreadLibraryCalls(hinstDLL);
me_heap = HeapCreate (0, 0x10000, 0); me_heap = HeapCreate (0, 0x10000, 0);
if (!ME_RegisterEditorClass(hinstDLL)) return FALSE; if (!ME_RegisterEditorClass(hinstDLL)) return FALSE;
hLeft = LoadCursorW(hinstDLL, MAKEINTRESOURCEW(OCR_REVERSE));
hBeam = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_IBEAM));
LookupInit(); LookupInit();
break; break;
@ -1574,7 +1592,10 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
if (lParam & ECO_AUTOWORDSELECTION) if (lParam & ECO_AUTOWORDSELECTION)
FIXME("ECO_AUTOWORDSELECTION not implemented yet!\n"); FIXME("ECO_AUTOWORDSELECTION not implemented yet!\n");
if (lParam & ECO_SELECTIONBAR) if (lParam & ECO_SELECTIONBAR)
FIXME("ECO_SELECTIONBAR not implemented yet!\n"); editor->selofs = 16;
else
editor->selofs = 0;
if (lParam & ECO_VERTICAL) if (lParam & ECO_VERTICAL)
FIXME("ECO_VERTICAL not implemented yet!\n"); FIXME("ECO_VERTICAL not implemented yet!\n");
if (lParam & ECO_AUTOHSCROLL) if (lParam & ECO_AUTOHSCROLL)
@ -2356,15 +2377,19 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
ME_LButtonDown(editor, (short)LOWORD(lParam), (short)HIWORD(lParam)); ME_LButtonDown(editor, (short)LOWORD(lParam), (short)HIWORD(lParam));
SetCapture(hWnd); SetCapture(hWnd);
ME_LinkNotify(editor,msg,wParam,lParam); ME_LinkNotify(editor,msg,wParam,lParam);
ME_SetCursor(editor, LOWORD(lParam));
break; break;
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
if (GetCapture() == hWnd) if (GetCapture() == hWnd)
ME_MouseMove(editor, (short)LOWORD(lParam), (short)HIWORD(lParam)); ME_MouseMove(editor, (short)LOWORD(lParam), (short)HIWORD(lParam));
ME_LinkNotify(editor,msg,wParam,lParam); ME_LinkNotify(editor,msg,wParam,lParam);
ME_SetCursor(editor, LOWORD(lParam));
break; break;
case WM_LBUTTONUP: case WM_LBUTTONUP:
if (GetCapture() == hWnd) if (GetCapture() == hWnd)
ReleaseCapture(); ReleaseCapture();
editor->linesel = 0;
ME_SetCursor(editor, LOWORD(lParam));
ME_LinkNotify(editor,msg,wParam,lParam); ME_LinkNotify(editor,msg,wParam,lParam);
break; break;
case WM_LBUTTONDBLCLK: case WM_LBUTTONDBLCLK:
@ -2878,7 +2903,7 @@ static BOOL ME_RegisterEditorClass(HINSTANCE hInstance)
wcW.cbWndExtra = sizeof(ME_TextEditor *); wcW.cbWndExtra = sizeof(ME_TextEditor *);
wcW.hInstance = NULL; /* hInstance would register DLL-local class */ wcW.hInstance = NULL; /* hInstance would register DLL-local class */
wcW.hIcon = NULL; wcW.hIcon = NULL;
wcW.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_IBEAM)); wcW.hCursor = hBeam;
wcW.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH); wcW.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
wcW.lpszMenuName = NULL; wcW.lpszMenuName = NULL;

View File

@ -325,6 +325,7 @@ typedef struct tagME_TextEditor
BOOL bHaveFocus; BOOL bHaveFocus;
/*for IME */ /*for IME */
int imeStartIndex; int imeStartIndex;
DWORD selofs, linesel, sely;
} ME_TextEditor; } ME_TextEditor;
typedef struct tagME_Context typedef struct tagME_Context

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

21
dlls/riched20/res.h Normal file
View File

@ -0,0 +1,21 @@
/*
* Top level resource file for MOUSE driver dll
*
* Copyright 2007 Maarten Lankhorst for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define OCR_REVERSE 32768

View File

@ -24,3 +24,7 @@
#define WINE_PRODUCTVERSION_STR "5,30,23,1215" #define WINE_PRODUCTVERSION_STR "5,30,23,1215"
#include "wine/wine_common_ver.rc" #include "wine/wine_common_ver.rc"
#include "res.h"
OCR_REVERSE CURSOR ocr_reverse.cur

View File

@ -338,7 +338,7 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p)
static void ME_PrepareParagraphForWrapping(ME_Context *c, ME_DisplayItem *tp); static void ME_PrepareParagraphForWrapping(ME_Context *c, ME_DisplayItem *tp);
static void ME_WrapTextParagraph(ME_Context *c, ME_DisplayItem *tp) { static void ME_WrapTextParagraph(ME_Context *c, ME_DisplayItem *tp, DWORD beginofs) {
ME_DisplayItem *p; ME_DisplayItem *p;
ME_WrapContext wc; ME_WrapContext wc;
int dpi = GetDeviceCaps(c->hDC, LOGPIXELSX); int dpi = GetDeviceCaps(c->hDC, LOGPIXELSX);
@ -353,8 +353,8 @@ static void ME_WrapTextParagraph(ME_Context *c, ME_DisplayItem *tp) {
/* wc.para_style = tp->member.para.style; */ /* wc.para_style = tp->member.para.style; */
wc.style = NULL; wc.style = NULL;
tp->member.para.nRightMargin = tp->member.para.pFmt->dxRightIndent*dpi/1440; tp->member.para.nRightMargin = tp->member.para.pFmt->dxRightIndent*dpi/1440;
tp->member.para.nFirstMargin = tp->member.para.pFmt->dxStartIndent*dpi/1440; tp->member.para.nFirstMargin = tp->member.para.pFmt->dxStartIndent*dpi/1440 + beginofs;
tp->member.para.nLeftMargin = (tp->member.para.pFmt->dxStartIndent+tp->member.para.pFmt->dxOffset)*dpi/1440; tp->member.para.nLeftMargin = (tp->member.para.pFmt->dxStartIndent+tp->member.para.pFmt->dxOffset)*dpi/1440 + beginofs;
wc.nFirstMargin = tp->member.para.nFirstMargin; wc.nFirstMargin = tp->member.para.nFirstMargin;
wc.nLeftMargin = tp->member.para.nLeftMargin; wc.nLeftMargin = tp->member.para.nLeftMargin;
wc.nRightMargin = tp->member.para.nRightMargin; wc.nRightMargin = tp->member.para.nRightMargin;
@ -443,7 +443,7 @@ BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor) {
bRedraw = TRUE; bRedraw = TRUE;
item->member.para.nYPos = c.pt.y; item->member.para.nYPos = c.pt.y;
ME_WrapTextParagraph(&c, item); ME_WrapTextParagraph(&c, item, editor->selofs);
if (bRedraw) if (bRedraw)
{ {