// 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;
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;
}
{
if(edit && selecting)
{
- curPosition = TextPosFromPoint(x, y, &textBlock);
+ curPosition = TextPosFromPoint(x, y, &textBlock, true);
PositionCaret(true);
Update(null);
}
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;
}
}
// 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;
{
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;
}