Reviewed by me (written by Patti Yeh).
authorharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 19 Mar 2005 16:07:18 +0000 (16:07 +0000)
committerharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 19 Mar 2005 16:07:18 +0000 (16:07 +0000)
        <rdar://problem/4029491> <TCIM> CangJie: the candidate window appears at the top left hand corner during typing in Mail and iChat

        * WebView.subproj/WebHTMLView.m:
        (-[WebHTMLView firstRectForCharacterRange:]):
        Use selected range if there is no marked range.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8931 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/WebView.subproj/WebHTMLView.m

index 7903908cda8e749946f0159632838117706bd284..01f87cc8d7f49669ec4a65d93b7415030160cb2c 100644 (file)
@@ -1,3 +1,13 @@
+2005-03-19  David Harrison  <harrison@apple.com>
+
+        Reviewed by me (written by Patti Yeh).
+        
+        <rdar://problem/4029491> <TCIM> CangJie: the candidate window appears at the top left hand corner during typing in Mail and iChat
+
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView firstRectForCharacterRange:]):
+        Use selected range if there is no marked range.
+
 === Safari-408 ===
 
 2005-03-18  David Harrison  <harrison@apple.com>
index d18f0a9f1373c33ebf2481b205778023fc8b5b4c..7c9d2cf6a39842953e680a0187fc722d6976ae23 100644 (file)
@@ -4899,20 +4899,27 @@ static NSArray *validAttributes = nil;
 
 - (NSRect)firstRectForCharacterRange:(NSRange)theRange
 {
-    if (![self hasMarkedText]) {
-        return NSMakeRect(0,0,0,0);
-    }
-
+    NSRect resultRect = NSMakeRect(0,0,0,0);
     WebBridge *bridge = [self _bridge];
+    DOMRange *rectRange = nil;
+    
+    if ([self hasMarkedText]) {
+        rectRange = [[bridge DOMDocument] createRange];
+        DOMRange *markedRange = [bridge markedTextDOMRange];
+        [rectRange setStart:[markedRange startContainer] :theRange.location];
+        [rectRange setEnd:[markedRange startContainer] :(theRange.location + theRange.length)];
+    } else {
+        // no marked text, so use current selection instead
+        // this helps for text input methods that unmark and delete the typed characters,
+        // then put up a word selector at the current insertion point
+        rectRange = [self _selectedRange];
+    }
 
-    DOMRange *rectRange = [[bridge DOMDocument] createRange];
-    DOMRange *markedRange = [bridge markedTextDOMRange];
-    [rectRange setStart:[markedRange startContainer] :theRange.location];
-    [rectRange setEnd:[markedRange startContainer] :(theRange.location + theRange.length)];
-
-    NSRect resultRect = [self convertRect:[bridge firstRectForDOMRange:rectRange] toView:nil];
-    resultRect.origin = [[self window] convertBaseToScreen:resultRect.origin];
-
+    if ([rectRange startContainer]) {
+        resultRect = [self convertRect:[bridge firstRectForDOMRange:rectRange] toView:nil];
+        resultRect.origin = [[self window] convertBaseToScreen:resultRect.origin];
+    }
+    
     return resultRect;
 }