documentor: Fix for double clicking on a word's last character's right half
[sdk] / documentor / src / Documentor.ec
index 4a088c8..ba8fbb8 100644 (file)
@@ -2324,7 +2324,7 @@ class HelpView : HTMLView
          // Update overLink
          if(textBlock && overLink == textBlock.parent)
          {
-            selPosition = curPosition = TextPosFromPoint(x, y, &textBlock);
+            selPosition = curPosition = TextPosFromPoint(x, y, &textBlock, true);
             selBlock = textBlock;
             PositionCaret(true);
             selecting = true;
@@ -2341,12 +2341,14 @@ class HelpView : HTMLView
          HTMLView::OnLeftButtonUp(x, y, mods);
          if(edit)
          {
-            selPosition = curPosition = TextPosFromPoint(x, y, &textBlock);
+            selPosition = curPosition = TextPosFromPoint(x, y, &textBlock, true);
             selBlock = textBlock;
             PositionCaret(true);
             Update(null);
          }
       }
+      else
+         ReleaseCapture();
       selecting = false;
       return true;
    }
@@ -2356,7 +2358,7 @@ class HelpView : HTMLView
    {
       if(edit && selecting)
       {
-         curPosition = TextPosFromPoint(x, y, &textBlock);
+         curPosition = TextPosFromPoint(x, y, &textBlock, true);
          PositionCaret(true);
          Update(null);
       }
@@ -2365,32 +2367,38 @@ class HelpView : HTMLView
 
    bool OnLeftDoubleClick(int mx, int my, Modifiers mods)
    {
-      int c;
-      int start = -1;
-      int numBytes;
-      for(c = curPosition; c >= 0; c--)
-      {
-         unichar ch;
-         while(c > 0 && !UTF8_IS_FIRST(textBlock.text[c])) c--;
-         ch = UTF8GetChar(textBlock.text + c, &numBytes);
-         if(!CharMatchCategories(ch, letters|numbers|marks|connector))
-            break;
-         start = c;
-      }
-      if(start != -1)
+      if(edit && textBlock)
       {
-         for(c = start; c < textBlock.textLen; c += numBytes)
+         int c;
+         int start = -1;
+         int numBytes;
+
+         selPosition = curPosition = TextPosFromPoint(mx, my, &textBlock, false);
+         selBlock = textBlock;
+         for(c = curPosition; c >= 0; c--)
          {
-            unichar ch = UTF8GetChar(textBlock.text + c, &numBytes);
+            unichar ch;
+            while(c > 0 && !UTF8_IS_FIRST(textBlock.text[c])) c--;
+            ch = UTF8GetChar(textBlock.text + c, &numBytes);
             if(!CharMatchCategories(ch, letters|numbers|marks|connector))
                break;
+            start = c;
          }
-         selPosition = start;
-         curPosition = c;
+         if(start != -1)
+         {
+            for(c = start; c < textBlock.textLen; c += numBytes)
+            {
+               unichar ch = UTF8GetChar(textBlock.text + c, &numBytes);
+               if(!CharMatchCategories(ch, letters|numbers|marks|connector))
+                  break;
+            }
+            selPosition = start;
+            curPosition = c;
 
-         PositionCaret(true);
-         Update(null);
-         return false;
+            PositionCaret(true);
+            Update(null);
+            return false;
+         }
       }
       return true;
    }
@@ -3440,7 +3448,7 @@ class HelpView : HTMLView
    }
 
    // Returns a character offset into the TextBlock from a window coordinate
-   int TextPosFromPoint(int px, int py, Block * block)
+   int TextPosFromPoint(int px, int py, Block * block, bool half)
    {
       Block parentBlock = this.textBlock.parent;
       Block textBlock;
@@ -3509,7 +3517,7 @@ class HelpView : HTMLView
                   {
                      numBytes = UTF8_NUM_BYTES(ch);
                      display.FontExtent(textBlock.font.font, text + c, numBytes, &w, &th);
-                     if(/*py >= sy && */py < sy + th && /*px >= sx-w/2-space && */px < sx + w -w/2-space)
+                     if(/*py >= sy && */py < sy + th && /*px >= sx-w/2-space && */px < sx + (half ? w/2 : w) -space)
                         break;
                      sx += w;
                   }