source: trunk/ICeCoffEE/ICeCoffEE/ICeCoffEEWebKit.m@ 448

Last change on this file since 448 was 448, checked in by Nicholas Riley, 16 years ago

Disable spelling and grammar correction marks during selection

File size: 6.5 KB
RevLine 
[66]1//
2// ICeCoffEEWebKit.m
3// ICeCoffEE APE
4//
5// Created by Nicholas Riley on Sun Jan 19 2003.
6// Copyright (c) 2003 Nicholas Riley. All rights reserved.
7//
8
9#import "ICeCoffEEWebKit.h"
[443]10#import "ICeCoffEEWebPolicyDelegate.h"
11#import "ICeCoffEEParser.h"
12#import "ICeCoffEETrigger.h"
13#import <WebKit/WebKit.h>
[66]14#import <unistd.h>
15
[443]16// XXX WebCoreFrameBridge is going away
17// (see <http://trac.webkit.org/projects/webkit/changeset/30712>)
[320]18// WebCoreBridge, from WebCoreBridge.h (Safari 2)
19// Web(Core)FrameBridge, from WebCoreFrameBridge.h (Safari 3)
[167]20@interface WebCoreBridge : NSObject
[66]21
[443]22// XXX move to DOM-based accessors
23- (DOMRange *)convertNSRangeToDOMRange:(NSRange)range;
24- (NSString *)stringForRange:(DOMRange *)range;
[167]25
[66]26@end
27
[443]28// XXX WebHTMLView is going away
[167]29@interface WebHTMLView : NSObject
[66]30
[320]31- (NSRect)selectionRect;
[443]32- (DOMRange *)_documentRange;
[66]33
[443]34- (WebView *)_webView;
35- (WebCoreBridge *)_bridge; // WebFrameBridge in Safari 3 (see above)
[167]36
[66]37@end
38
[448]39// from WebViewPrivate.h (will become public, part of WebViewEditing)
40@interface WebView (webViewGrammarChecking)
41- (BOOL)isGrammarCheckingEnabled;
42- (void)setGrammarCheckingEnabled:(BOOL)flag;
43@end
44
[66]45@implementation ICeCoffEEWebKit
46
47- (NSMenu *)menuForEvent:(NSEvent *)e;
48{
49 NSMenu *myMenu = [super menuForEvent: e];
50 return ICCF_MenuForEvent(self, myMenu, e);
51}
52
53static NSEvent *downEvent = nil;
[443]54static id /* (WebPolicyDelegate) */ policyDelegate;
55static id /* DOMRange */ selectedRange;
[167]56
[66]57- (void)mouseDown:(NSEvent *)e;
58{
[182]59 [downEvent release]; downEvent = nil;
[74]60 if (ICCF_enabled && ICCF_prefs.commandClickEnabled && ICCF_EventIsCommandMouseDown(e)) {
[443]61 if ([self respondsToSelector: @selector(_webView)]) {
62 WebView *webView = [(WebHTMLView *)self _webView];
63
[182]64 // save selection: it may be deselected on super mouseDown
[443]65 selectedRange = [[webView selectedDOMRange] retain];
66
67 // stop any URL launching from happening
68 if ([webView isEditable]) {
69 policyDelegate = [[webView policyDelegate] retain];
70 [webView setPolicyDelegate: [ICeCoffEEWebPolicyDelegate sharedDelegate]];
71 }
72
73 downEvent = [e retain];
[182]74 }
[66]75 }
76 [super mouseDown: e];
77}
78
79- (void)mouseUp:(NSEvent *)e;
80{
81 [super mouseUp: e];
82
[443]83 if (downEvent == nil)
84 return;
85
86 WebView *webView = [(WebHTMLView *)self _webView];
87 BOOL isEditable = [webView isEditable];
[448]88 BOOL isContinuousSpellCheckingEnabled = NO, isGrammarCheckingEnabled = NO;
[443]89
90 if (isEditable) {
91 [webView setPolicyDelegate: policyDelegate];
92 [policyDelegate release]; policyDelegate = nil;
93 }
94
95 NSPoint downPt = [downEvent locationInWindow];
96 NSPoint upPt = [e locationInWindow];
97 if (abs(downPt.x - upPt.x) > kICHysteresisPixels && abs(downPt.y - upPt.y) > kICHysteresisPixels)
98 return;
99
100 @try {
[448]101 if (!isEditable) {
[443]102 [webView setEditable: YES];
[448]103
104 // don't want spelling/grammar marks to persist when view is made uneditable again
105 if ([webView respondsToSelector: @selector(isContinuousSpellCheckingEnabled)] &&
106 (isContinuousSpellCheckingEnabled = [webView isContinuousSpellCheckingEnabled])) {
107 if ([webView respondsToSelector: @selector(setContinuousSpellCheckingEnabled:)])
108 [webView setContinuousSpellCheckingEnabled: NO];
109 else
110 isContinuousSpellCheckingEnabled = NO; // don't restore
111 }
[443]112
[448]113 if ([webView respondsToSelector: @selector(isGrammarCheckingEnabled)] &&
114 (isGrammarCheckingEnabled = [webView isGrammarCheckingEnabled])) {
115 if ([webView respondsToSelector: @selector(setGrammarCheckingEnabled:)])
116 [webView setGrammarCheckingEnabled: NO];
117 else
118 isGrammarCheckingEnabled = NO; // don't restore
119 }
120 }
121
122
[443]123 NSPoint viewClickPt = [webView convertPoint: downPt fromView: nil];
124 NSDictionary *elementDict = [webView elementAtPoint: viewClickPt];
125 NSLog(@"elementDict: %@", elementDict);
126 NSAssert([elementDict count] != 0, ICCF_LocalizedString(@"Sorry, ICeCoffEE was unable to find anything to select"));
[446]127
[443]128 WebCoreBridge *bridge = [(WebHTMLView *)self _bridge];
129
130 id link = [elementDict objectForKey: @"WebElementLinkURL"];
131 NSString *url = [link isKindOfClass: [NSURL class]] ? [link absoluteString] : nil;
132
133 ICCF_StartIC();
134
135 id /* DOMRange */ domRange = nil;
136
137 if (url != nil) {
138 ICLog(@"got a link");
139 if (!isEditable) {
140 ICCF_StopIC();
[436]141 return;
[182]142 }
[443]143 // XXX handle existing selection
144 domRange = [webView selectedDOMRange];
145 [domRange selectNode: [elementDict objectForKey:@"WebElementDOMNode"]];
146 [webView setSelectedDOMRange: domRange affinity: NSSelectionAffinityDownstream];
147 } else {
148 // may have become deselected in mouseDown
149 [webView setSelectedDOMRange: selectedRange affinity: NSSelectionAffinityDownstream];
150
151 // XXX at some point, characterIndexForPoint: wasn't implemented, so this will fail
152 NSRange range = [ICeCoffEETrigger rangeForEvent: downEvent onTarget: (NSView<NSTextInput> *)self];
[446]153
154 NSAssert(range.location != NSNotFound, ICCF_LocalizedString(@"Sorry, ICeCoffEE was unable to find anything to select"));
[443]155
156 // XXX limit to a reasonable size
157 // NSRange fetchRange = [bridge convertDOMRangeToNSRange: [(WebHTMLView *)self _documentRange]];
158 NSString *s = [bridge stringForRange: [(WebHTMLView *)self _documentRange]];
159
160 if (range.length == 0) {
161 range.length = 1;
162 range = ICCF_URLEnclosingRange(s, range);
163 domRange = [bridge convertNSRangeToDOMRange: range];
164 [webView setSelectedDOMRange: domRange affinity: NSSelectionAffinityDownstream];
165 } else {
166 domRange = [bridge convertNSRangeToDOMRange: range];
[183]167 }
[443]168
169 url = [s substringWithRange: range];
170 }
171
172 if (ICCF_LaunchURL(url, ICCF_KeyboardAction(downEvent)) && ICCF_prefs.textBlinkEnabled && domRange != nil) {
173 NSRect selectionRect = [(WebHTMLView *)self selectionRect];
174 for (int i = 0 ; i < ICCF_prefs.textBlinkCount ; i++) {
175 [webView setSelectedDOMRange: nil affinity: NSSelectionAffinityDownstream];
176 [self setNeedsDisplayInRect: selectionRect];
177 [self display];
178 usleep(kICBlinkDelayUsecs);
179 [webView setSelectedDOMRange: domRange affinity: NSSelectionAffinityDownstream];
180 [self setNeedsDisplayInRect: selectionRect];
181 [self display];
182 usleep(kICBlinkDelayUsecs);
[182]183 }
[436]184 }
[443]185 } @catch (NSException *e) {
186 ICCF_HandleException(e, downEvent);
187 } @finally {
188 [selectedRange release]; selectedRange = nil;
189 [downEvent release]; downEvent = nil;
[448]190 if (!isEditable) {
[443]191 [webView setEditable: NO];
[448]192 if (isContinuousSpellCheckingEnabled)
193 [webView setContinuousSpellCheckingEnabled: YES];
194 if (isGrammarCheckingEnabled)
195 [webView setGrammarCheckingEnabled: YES];
196 }
[443]197 }
[66]198
[443]199 ICCF_StopIC();
[66]200}
201
202@end
Note: See TracBrowser for help on using the repository browser.