[webkit-dev] DOMRange and khtml::Selection direction
Duncan Wilcox
duncan at mclink.it
Sun Aug 14 08:13:12 PDT 2005
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
More information about the webkit-dev
mailing list