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

Last change on this file since 167 was 167, checked in by Nicholas Riley, 15 years ago

ICeCoffEE 1.4 and preliminary 1.4.1 changes. Sorry, I forgot to
commit version 1.4 when it was released, so the precise source for
that release has been lost.

See the release notes for details of what changed in these versions.
1.4 was a significant feature release; 1.4.1 is a bug fix for 10.3.9,
incorporating up-to-date Unsanity Installer and APE.

package-ICeCoffEE.sh: use xcodebuild instead of pbxbuild.

File size: 5.9 KB
Line 
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"
10#import <unistd.h>
11
12// from WebCoreBridge.h
13@interface WebCoreBridge : NSObject
14
15- (NSDictionary *)elementAtPoint:(NSPoint)point;
16- (NSString *)selectedString;
17- (void)deselectAll;
18
19// only in Safari 1.0-1.2
20- (void)setSelectionFrom:(id /* WebDOMNode */)start startOffset:(int)startOffset to:(id /* WebDOMNode */)end endOffset:(int) endOffset;
21
22- (id /* WebDOMNode */)selectionStart;
23- (int)selectionStartOffset;
24- (id /* WebDOMNode */)selectionEnd;
25- (int)selectionEndOffset;
26
27// only in Safari 1.1-1.2
28- (NSRect)selectionRect;
29
30// only in Safari 1.3
31- (void)selectNSRange:(NSRange)range;
32
33@end
34
35// from WebKit, private
36@interface WebHTMLView : NSObject
37
38- (WebCoreBridge *)_bridge;
39
40// only in Safari 1.3
41- (NSRange)selectedRange;
42
43@end
44
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;
54
55// used in Safari < 1.3 because there's no sane way to set the selection
56typedef struct {
57    int startOffset;
58    int endOffset;
59    id fromNode;
60    id toNode;
61} ICCF_WebCoreSelection;
62
63static ICCF_WebCoreSelection selection = {nil, nil, 0, 0};
64
65void ICCF_GetWebCoreBridgeSelection(WebCoreBridge *bridge, ICCF_WebCoreSelection *ioSel) {
66    [ioSel->fromNode release]; ioSel->fromNode = nil;
67    [ioSel->toNode release]; ioSel->toNode = nil;
68    ioSel->startOffset = [bridge selectionStartOffset];
69    ioSel->endOffset = [bridge selectionEndOffset];
70    ioSel->fromNode = [[bridge selectionStart] retain];
71    ioSel->toNode = [[bridge selectionEnd] retain];
72}
73
74void ICCF_SetWebCoreBridgeSelection(WebCoreBridge *bridge, ICCF_WebCoreSelection *inSel) {
75    if (inSel->fromNode == nil || inSel->toNode == nil)
76        [bridge deselectAll];
77    [bridge setSelectionFrom: inSel->fromNode
78                 startOffset: inSel->startOffset
79                          to: inSel->toNode
80                   endOffset: inSel->endOffset];
81}
82// end Safari < 1.3 section
83
84static NSString *selectedString = nil;
85static NSRange selectedRange;
86
87- (void)mouseDown:(NSEvent *)e;
88{
89        [downEvent release]; downEvent = nil;
90    // don't want command-option-click, command-shift-click, etc. to trigger
91    if (ICCF_enabled && ICCF_prefs.commandClickEnabled && ICCF_EventIsCommandMouseDown(e)) {
92        WebCoreBridge *bridge = [(WebHTMLView *)self _bridge];
93                if ([self respondsToSelector: @selector(selectedRange)]) {
94                        // Safari 1.3 save selection: it may be deselected on super mouseDown
95                        selectedRange = [(WebHTMLView *)self selectedRange];
96                } else if ([bridge respondsToSelector: @selector(selectionStartOffset)]) {
97                        // Safari < 1.3 save selection: it will be deselected on super mouseDown
98                        ICCF_GetWebCoreBridgeSelection(bridge, &selection);
99                        ICLog(@"selection start %d@%@ end %d@%@ string %@", [bridge selectionStartOffset], [bridge selectionStart], [bridge selectionEndOffset], [bridge selectionEnd], [bridge selectedString]);
100                }
101                [selectedString release]; selectedString = nil;
102                selectedString = [[bridge selectedString] retain];
103        downEvent = [e retain];
104    }
105    [super mouseDown: e];
106}
107
108- (void)mouseUp:(NSEvent *)e;
109{
110    [super mouseUp: e];
111    if (downEvent != nil) {
112        NSPoint downPt = [downEvent locationInWindow];
113        NSPoint upPt = [e locationInWindow];
114                [downEvent release]; downEvent = nil;
115        if (abs(downPt.x - upPt.x) > kICHysteresisPixels && abs(downPt.y - upPt.y) > kICHysteresisPixels)
116            return;
117
118        NS_DURING
119            WebCoreBridge *bridge = [(WebHTMLView *)self _bridge];
120            NSPoint viewClickPt = [self convertPoint: downPt fromView: nil];
121            NSDictionary *elementDict = [bridge elementAtPoint: viewClickPt];
122            ICLog(@"elementDict: %@", elementDict);
123            NSAssert([elementDict count] != 0, @"Internal error: Got empty element dictionary from WebHTMLView");
124            if ([elementDict objectForKey: @"WebElementLinkURL"] != nil) {
125                ICLog(@"got a link");
126                NS_VOIDRETURN; // donÕt activate on links
127            }
128                        if (selectedString == nil || [selectedString length] == 0) {
129                                ICLog(@"no selected string");
130                                NS_VOIDRETURN;
131                        }
132                        ICCF_StartIC();
133                        // ICCF_LaunchURL(selectedString, ICCF_KeyboardAction());
134                        if (ICCF_prefs.textBlinkEnabled &&
135                                [bridge respondsToSelector: @selector(selectNSRange:)]) {
136                                // blink text in Safari 1.3
137                                [bridge selectNSRange: selectedRange];
138                                int i;
139                                NSRect selectionRect = [bridge selectionRect];
140                                ICLog(@"selectedRange %@ selectionRect %@ textBlinkCount %d", NSStringFromRange(selectedRange), NSStringFromRect(selectionRect), ICCF_prefs.textBlinkCount);
141                                for (i = 0 ; i < ICCF_prefs.textBlinkCount ; i++) {
142                                        [bridge deselectAll];
143                                        [self setNeedsDisplayInRect: selectionRect];
144                                        [self display];
145                                        usleep(kICBlinkDelayUsecs);
146                                        [bridge selectNSRange: selectedRange];
147                                        [self setNeedsDisplayInRect: selectionRect];
148                                        [self display];
149                                        usleep(kICBlinkDelayUsecs);
150                                }
151                        } else {
152                                // select text in Safari 1.0-1.2
153                                ICCF_SetWebCoreBridgeSelection(bridge, &selection);
154                                if (ICCF_prefs.textBlinkEnabled &&
155                                        [bridge respondsToSelector: @selector(selectionRect)]) {
156                                        // blink text in Safari 1.1/1.2
157                                        int i;
158                                        NSRect selectionRect = [bridge selectionRect];
159                                        for (i = 0 ; i < ICCF_prefs.textBlinkCount ; i++) {
160                                                [bridge deselectAll];
161                                                [self setNeedsDisplayInRect: selectionRect];
162                                                [self display];
163                                                usleep(kICBlinkDelayUsecs);
164                                                ICCF_SetWebCoreBridgeSelection(bridge, &selection);
165                                                [self setNeedsDisplayInRect: selectionRect];
166                                                [self display];
167                                                usleep(kICBlinkDelayUsecs);
168                                        }
169                                }
170                        }
171        NS_HANDLER
172            ICCF_HandleException(localException);
173        NS_ENDHANDLER
174
175        ICCF_StopIC();
176    }       
177}
178
179@end
Note: See TracBrowser for help on using the repository browser.