So far I have added support for this:
typedef enum {
WebTextSelectForward,
WebTextSelectBackward
} WebTextSelectionDirection;
typedef enum {
WebTextSelectByCharacter,
WebTextSelectByWord,
WebTextSelectByLine,
WebTextSelectByParagraph
} WebTextSelectionGranularity;
@interface WebSelection : NSObject
{
DOMRange *range;
NSSelectionAffinity affinity;
WebTextSelectionDirection direction;
WebTextSelectionGranularity granularity;
}
+ (id)webSelectionWithRange:(DOMRange *)selectionRange affinity:(NSSelectionAffinity)selectionAffinity direction:(WebTextSelectionDirection)selectionDirection granularity:(WebTextSelectionGranularity)selectionGranularity;
- (DOMRange *)range;
- (void)setRange:(DOMRange *)newRange;
- (NSSelectionAffinity)affinity;
- (void)setAffinity:(NSSelectionAffinity)newAffinity;
- (WebTextSelectionDirection)direction;
- (void)setDirection:(WebTextSelectionDirection)newDirection;
- (WebTextSelectionGranularity)granularity;
- (void)setGranularity:(WebTextSelectionGranularity)newGranularity;
@end
@interface WebView (WebPendingPublic)
- (void)setSelection:(WebSelection *)selection;
- (WebSelection *)selection;
@end
@interface NSObject (WebEditingDelegatePendingPublic)
- (BOOL)webView:(WebView *)webView shouldChangeSelection:(WebSelection *)current toSelection:(WebSelection *)proposed stillSelecting:(BOOL)flag;
@end
The original problem of dragging backwards with the mouse is mostly solved, except for when the selection granularity is not character.
What I think is happening is that the khtml::Selection m_base and m_extent contain text range the mouse actually dragged over, while m_start and m_end contain the same selection expanded with the current granularity.
Again, this information is not being carried through neither the DOMRange nor the WebSelection, so when dragging over some text with a delegate like this:
- (BOOL)webView:(WebView *)webView shouldChangeSelection:(WebSelection *)current toSelection:(WebSelection *)proposed stillSelecting:(BOOL)flag
{
[webView setSelection:proposed];
return NO;
}
what happens is that the granularity-expanded selection is re-expanded at every mouse drag event, because the programmatically set selection doesn't have the correct m_base/m_extent, and the selection quickly expands all the way to the end of line (and on to the end of page).
So the issue is extending the WebSelection to add this state information, but I'm unsure about what might be the best way. Clearly adding m_base and m_extent (as DOMNode *node; long offset; pairs), would mean the direction becomes redundant. Another option would be retaining the direction and adding a straightened m_base/m_extent pair encoded as a DOMRange, that would contain the non-expanded selection.
Ideas?
Thanks,
Duncan
_______________________________________________
webkit-dev mailing list