| 73 | | @try { |
|---|
| 74 | | NSPoint viewClickPt = [self convertPoint: downPt fromView: nil]; |
|---|
| 75 | | NSDictionary *elementDict = [(WebHTMLView *)self elementAtPoint: viewClickPt]; |
|---|
| 76 | | WebCoreBridge *bridge = [(WebHTMLView *)self _bridge]; |
|---|
| 77 | | ICLog(@"elementDict: %@", elementDict); |
|---|
| 78 | | NSAssert([elementDict count] != 0, @"Internal error: Got empty element dictionary from WebHTMLView"); |
|---|
| 79 | | if ([elementDict objectForKey: @"WebElementLinkURL"] != nil) { |
|---|
| 80 | | ICLog(@"got a link"); |
|---|
| 81 | | return; // don't activate on links |
|---|
| 82 | | } |
|---|
| 83 | | if (selectedString == nil || [selectedString length] == 0) { |
|---|
| 84 | | ICLog(@"no selected string"); |
|---|
| | 77 | if (downEvent == nil) |
|---|
| | 78 | return; |
|---|
| | 79 | |
|---|
| | 80 | WebView *webView = [(WebHTMLView *)self _webView]; |
|---|
| | 81 | BOOL isEditable = [webView isEditable]; |
|---|
| | 82 | |
|---|
| | 83 | if (isEditable) { |
|---|
| | 84 | [webView setPolicyDelegate: policyDelegate]; |
|---|
| | 85 | [policyDelegate release]; policyDelegate = nil; |
|---|
| | 86 | } |
|---|
| | 87 | |
|---|
| | 88 | NSPoint downPt = [downEvent locationInWindow]; |
|---|
| | 89 | NSPoint upPt = [e locationInWindow]; |
|---|
| | 90 | if (abs(downPt.x - upPt.x) > kICHysteresisPixels && abs(downPt.y - upPt.y) > kICHysteresisPixels) |
|---|
| | 91 | return; |
|---|
| | 92 | |
|---|
| | 93 | @try { |
|---|
| | 94 | if (!isEditable) |
|---|
| | 95 | [webView setEditable: YES]; |
|---|
| | 96 | |
|---|
| | 97 | NSPoint viewClickPt = [webView convertPoint: downPt fromView: nil]; |
|---|
| | 98 | NSDictionary *elementDict = [webView elementAtPoint: viewClickPt]; |
|---|
| | 99 | NSLog(@"elementDict: %@", elementDict); |
|---|
| | 100 | NSAssert([elementDict count] != 0, ICCF_LocalizedString(@"Sorry, ICeCoffEE was unable to find anything to select")); |
|---|
| | 101 | |
|---|
| | 102 | WebCoreBridge *bridge = [(WebHTMLView *)self _bridge]; |
|---|
| | 103 | |
|---|
| | 104 | id link = [elementDict objectForKey: @"WebElementLinkURL"]; |
|---|
| | 105 | NSString *url = [link isKindOfClass: [NSURL class]] ? [link absoluteString] : nil; |
|---|
| | 106 | |
|---|
| | 107 | ICCF_StartIC(); |
|---|
| | 108 | |
|---|
| | 109 | id /* DOMRange */ domRange = nil; |
|---|
| | 110 | |
|---|
| | 111 | if (url != nil) { |
|---|
| | 112 | ICLog(@"got a link"); |
|---|
| | 113 | if (!isEditable) { |
|---|
| | 114 | ICCF_StopIC(); |
|---|
| 87 | | ICCF_StartIC(); |
|---|
| 88 | | BOOL canSetSelection = [bridge respondsToSelector: @selector(selectNSRange:)]; |
|---|
| 89 | | if (canSetSelection) { |
|---|
| 90 | | // may have become deselected in mouseDown |
|---|
| 91 | | [bridge selectNSRange: selectedRange]; |
|---|
| | 117 | // XXX handle existing selection |
|---|
| | 118 | domRange = [webView selectedDOMRange]; |
|---|
| | 119 | [domRange selectNode: [elementDict objectForKey:@"WebElementDOMNode"]]; |
|---|
| | 120 | [webView setSelectedDOMRange: domRange affinity: NSSelectionAffinityDownstream]; |
|---|
| | 121 | } else { |
|---|
| | 122 | // may have become deselected in mouseDown |
|---|
| | 123 | [webView setSelectedDOMRange: selectedRange affinity: NSSelectionAffinityDownstream]; |
|---|
| | 124 | |
|---|
| | 125 | // XXX at some point, characterIndexForPoint: wasn't implemented, so this will fail |
|---|
| | 126 | NSRange range = [ICeCoffEETrigger rangeForEvent: downEvent onTarget: (NSView<NSTextInput> *)self]; |
|---|
| | 127 | |
|---|
| | 128 | // XXX limit to a reasonable size |
|---|
| | 129 | // NSRange fetchRange = [bridge convertDOMRangeToNSRange: [(WebHTMLView *)self _documentRange]]; |
|---|
| | 130 | NSString *s = [bridge stringForRange: [(WebHTMLView *)self _documentRange]]; |
|---|
| | 131 | |
|---|
| | 132 | if (range.length == 0) { |
|---|
| | 133 | range.length = 1; |
|---|
| | 134 | range = ICCF_URLEnclosingRange(s, range); |
|---|
| | 135 | domRange = [bridge convertNSRangeToDOMRange: range]; |
|---|
| | 136 | [webView setSelectedDOMRange: domRange affinity: NSSelectionAffinityDownstream]; |
|---|
| | 137 | } else { |
|---|
| | 138 | domRange = [bridge convertNSRangeToDOMRange: range]; |
|---|
| 93 | | if (ICCF_LaunchURL(selectedString, ICCF_KeyboardAction(downEvent)) && ICCF_prefs.textBlinkEnabled && canSetSelection) { |
|---|
| 94 | | int i; |
|---|
| 95 | | NSRect selectionRect; |
|---|
| 96 | | if ([self respondsToSelector: @selector(selectionRect)]) |
|---|
| 97 | | selectionRect = [(WebHTMLView *)self selectionRect]; |
|---|
| 98 | | else |
|---|
| 99 | | selectionRect = [(WebHTMLView *)self _selectionRect]; |
|---|
| 100 | | ICLog(@"selectedRange %@ selectionRect %@ textBlinkCount %d", NSStringFromRange(selectedRange), NSStringFromRect(selectionRect), ICCF_prefs.textBlinkCount); |
|---|
| 101 | | for (i = 0 ; i < ICCF_prefs.textBlinkCount ; i++) { |
|---|
| 102 | | [(WebHTMLView *)self deselectAll]; |
|---|
| 103 | | [self setNeedsDisplayInRect: selectionRect]; |
|---|
| 104 | | [self display]; |
|---|
| 105 | | usleep(kICBlinkDelayUsecs); |
|---|
| 106 | | [bridge selectNSRange: selectedRange]; |
|---|
| 107 | | [self setNeedsDisplayInRect: selectionRect]; |
|---|
| 108 | | [self display]; |
|---|
| 109 | | usleep(kICBlinkDelayUsecs); |
|---|
| 110 | | } |
|---|
| | 140 | |
|---|
| | 141 | url = [s substringWithRange: range]; |
|---|
| | 142 | } |
|---|
| | 143 | |
|---|
| | 144 | if (ICCF_LaunchURL(url, ICCF_KeyboardAction(downEvent)) && ICCF_prefs.textBlinkEnabled && domRange != nil) { |
|---|
| | 145 | NSRect selectionRect = [(WebHTMLView *)self selectionRect]; |
|---|
| | 146 | for (int i = 0 ; i < ICCF_prefs.textBlinkCount ; i++) { |
|---|
| | 147 | [webView setSelectedDOMRange: nil affinity: NSSelectionAffinityDownstream]; |
|---|
| | 148 | [self setNeedsDisplayInRect: selectionRect]; |
|---|
| | 149 | [self display]; |
|---|
| | 150 | usleep(kICBlinkDelayUsecs); |
|---|
| | 151 | [webView setSelectedDOMRange: domRange affinity: NSSelectionAffinityDownstream]; |
|---|
| | 152 | [self setNeedsDisplayInRect: selectionRect]; |
|---|
| | 153 | [self display]; |
|---|
| | 154 | usleep(kICBlinkDelayUsecs); |
|---|