Dylan Smith : richedit: Implemented paragraph selection.

Alexandre Julliard julliard at winehq.org
Tue Jul 8 06:10:48 CDT 2008


Module: wine
Branch: master
Commit: 7c352b96389112d8947e1196cb25825d2a4a2acd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7c352b96389112d8947e1196cb25825d2a4a2acd

Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date:   Mon Jul  7 11:03:59 2008 -0400

richedit: Implemented paragraph selection.

---

 dlls/riched20/caret.c   |  101 ++++++++++++++++++++++++++++++----------------
 dlls/riched20/editor.h  |    2 +-
 dlls/riched20/editstr.h |    3 +-
 3 files changed, 69 insertions(+), 37 deletions(-)

diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index 2504cdb..0be4cf5 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -744,11 +744,54 @@ ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
 
 
 void
-ME_SelectWord(ME_TextEditor *editor)
+ME_SelectByType(ME_TextEditor *editor, ME_SelectionType selectionType)
 {
-  ME_MoveCursorWords(editor, &editor->pCursors[1], +1);
-  editor->pCursors[0] = editor->pCursors[1];
-  ME_MoveCursorWords(editor, &editor->pCursors[0], -1);
+  /* pCursor[0] will be the start of the selection
+   * pCursor[1] is the other end of the selection range
+   * pCursor[2] and [3] are the selection anchors that are backed up
+   * so they are kept when the selection changes for drag selection.
+   */
+
+  editor->nSelectionType = selectionType;
+  switch(selectionType)
+  {
+    case stPosition:
+      break;
+    case stWord:
+      ME_MoveCursorWords(editor, &editor->pCursors[1], +1);
+      editor->pCursors[0] = editor->pCursors[1];
+      ME_MoveCursorWords(editor, &editor->pCursors[0], -1);
+      break;
+    case stLine:
+    case stParagraph:
+    {
+      ME_DisplayItem *pItem;
+      ME_DIType fwdSearchType, backSearchType;
+      if (selectionType == stParagraph) {
+          backSearchType = diParagraph;
+          fwdSearchType = diParagraphOrEnd;
+      } else {
+          backSearchType = diStartRow;
+          fwdSearchType = diStartRowOrParagraphOrEnd;
+      }
+      pItem = ME_FindItemBack(editor->pCursors[0].pRun, backSearchType);
+      editor->pCursors[0].pRun = ME_FindItemFwd(pItem, diRun);
+      editor->pCursors[0].nOffset = 0;
+
+      pItem = ME_FindItemFwd(editor->pCursors[0].pRun, fwdSearchType);
+      assert(pItem);
+      if (pItem->type == diTextEnd)
+          editor->pCursors[1].pRun = ME_FindItemBack(pItem, diRun);
+      else
+          editor->pCursors[1].pRun = ME_FindItemFwd(pItem, diRun);
+      editor->pCursors[1].nOffset = 0;
+      break;
+    }
+    default: assert(0);
+  }
+  /* Store the anchor positions for extending the selection. */
+  editor->pCursors[2] = editor->pCursors[0];
+  editor->pCursors[3] = editor->pCursors[1];
 }
 
 
@@ -900,8 +943,9 @@ static void ME_ExtendAnchorSelection(ME_TextEditor *editor)
       else
       {
           ME_DisplayItem *pItem;
-          pItem = ME_FindItemBack(editor->pCursors[0].pRun,
-                                  diStartRowOrParagraph);
+          ME_DIType searchType = ((editor->nSelectionType == stLine) ?
+                                  diStartRowOrParagraph:diParagraph);
+          pItem = ME_FindItemBack(editor->pCursors[0].pRun, searchType);
           editor->pCursors[0].pRun = ME_FindItemFwd(pItem, diRun);
           editor->pCursors[0].nOffset = 0;
       }
@@ -915,8 +959,9 @@ static void ME_ExtendAnchorSelection(ME_TextEditor *editor)
       else
       {
           ME_DisplayItem *pItem;
-          pItem = ME_FindItemFwd(editor->pCursors[1].pRun,
-                                 diStartRowOrParagraphOrEnd);
+          ME_DIType searchType = ((editor->nSelectionType == stLine) ?
+                                  diStartRowOrParagraphOrEnd:diParagraphOrEnd);
+          pItem = ME_FindItemFwd(editor->pCursors[1].pRun, searchType);
           if (pItem->type == diTextEnd)
               editor->pCursors[1].pRun = ME_FindItemBack(pItem, diRun);
           else
@@ -930,6 +975,7 @@ void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum)
 {
   ME_Cursor tmp_cursor;
   int is_selection = 0;
+  BOOL is_shift;
   
   editor->nUDArrowX = -1;
   
@@ -937,23 +983,22 @@ void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum)
 
   tmp_cursor = editor->pCursors[0];
   is_selection = ME_IsSelection(editor);
+  is_shift = GetKeyState(VK_SHIFT) < 0;
 
   ME_FindPixelPos(editor, x, y, &editor->pCursors[0], &editor->bCaretAtEnd);
 
-  if (x >= editor->selofs || GetKeyState(VK_SHIFT) < 0)
+  if (x >= editor->selofs || is_shift)
   {
     if (clickNum > 1)
     {
-      editor->nSelectionType = stWord;
       editor->pCursors[1] = editor->pCursors[0];
-      ME_SelectWord(editor);
-      /* Store the anchor positions for extending the selection. */
-      editor->pCursors[2] = editor->pCursors[0];
-      editor->pCursors[3] = editor->pCursors[1];
+      if (x >= editor->selofs)
+          ME_SelectByType(editor, stWord);
+      else
+          ME_SelectByType(editor, stParagraph);
     }
-    else if (GetKeyState(VK_SHIFT)>=0)
+    else if (!is_shift)
     {
-      /* Shift is not down */
       editor->nSelectionType = stPosition;
       editor->pCursors[1] = editor->pCursors[0];
     }
@@ -969,25 +1014,11 @@ void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum)
   }
   else
   {
-    ME_DisplayItem *pItem;
-
-    editor->nSelectionType = stLine;
-    /* Set pCursors[0] to beginning of line */
-    /* Set pCursors[1] to end of line */
-    pItem = ME_FindItemFwd(editor->pCursors[0].pRun, diStartRowOrParagraphOrEnd);
-    assert(pItem);
-    if (pItem->type == diTextEnd)
-        editor->pCursors[1].pRun = ME_FindItemBack(pItem, diRun);
-    else
-        editor->pCursors[1].pRun = ME_FindItemFwd(pItem, diRun);
-    editor->pCursors[1].nOffset = 0;
-    /* 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 the selection anchors that are backed up
-     * so they are kept when the selection changes for drag line selection.
-     */
-    editor->pCursors[2] = editor->pCursors[0];
-    editor->pCursors[3] = editor->pCursors[1];
+    if (clickNum < 2) {
+        ME_SelectByType(editor, stLine);
+    } else {
+        ME_SelectByType(editor, stParagraph);
+    }
   }
   ME_InvalidateSelection(editor);
   HideCaret(editor->hWnd);
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index a23fb8b..76f61a2 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -176,7 +176,7 @@ void ME_SetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *mod);
 
 /* caret.c */
 int ME_SetSelection(ME_TextEditor *editor, int from, int to);
-void ME_SelectWord(ME_TextEditor *editor);
+void ME_SelectByType(ME_TextEditor *editor, ME_SelectionType selectionType);
 void ME_HideCaret(ME_TextEditor *ed);
 void ME_ShowCaret(ME_TextEditor *ed);
 void ME_MoveCaret(ME_TextEditor *ed);
diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h
index 5668b04..40e1b70 100644
--- a/dlls/riched20/editstr.h
+++ b/dlls/riched20/editstr.h
@@ -247,7 +247,8 @@ typedef enum {
 typedef enum {
   stPosition = 0,
   stWord,
-  stLine
+  stLine,
+  stParagraph
 } ME_SelectionType;
 
 typedef struct tagME_FontTableItem {




More information about the wine-cvs mailing list