Reviewed by John.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Jul 2004 04:18:19 +0000 (04:18 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Jul 2004 04:18:19 +0000 (04:18 +0000)
Added stubbed-out versions of all the NSTextInput protocol
methods, and put comments in places where we will need to call the
input manager to make input methods work 100%.

        * WebCoreSupport.subproj/WebBridge.m:
        (-[WebBridge respondToChangedSelection]):
        * WebView.subproj/WebHTMLView.m:
        (-[WebHTMLView mouseDown:]):
        (-[WebHTMLView mouseDragged:]):
        (-[WebHTMLView mouseUp:]):
        (-[WebHTMLView _interceptEditingKeyEvent:]):
        (-[WebHTMLView keyDown:]):
        (-[WebHTMLView _selectionChanged]):
        (-[WebHTMLView _delegateDragSourceActionMask]):
        (-[WebHTMLView validAttributesForMarkedText]):
        (-[WebHTMLView characterIndexForPoint:]):
        (-[WebHTMLView firstRectForCharacterRange:]):
        (-[WebHTMLView selectedRange]):
        (-[WebHTMLView markedRange]):
        (-[WebHTMLView attributedSubstringFromRange:]):
        (-[WebHTMLView conversationIdentifier]):
        (-[WebHTMLView hasMarkedText]):
        (-[WebHTMLView unmarkText]):
        (-[WebHTMLView setMarkedText:selectedRange:]):
        (-[WebHTMLView doCommandBySelector:]):
        (-[WebHTMLView insertText:]):
        * WebView.subproj/WebHTMLViewInternal.h:
        * WebView.subproj/WebView.m:

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

WebKit/ChangeLog
WebKit/WebCoreSupport.subproj/WebBridge.m
WebKit/WebView.subproj/WebHTMLView.m
WebKit/WebView.subproj/WebHTMLViewInternal.h
WebKit/WebView.subproj/WebView.m

index 5c2879c..a9d3914 100644 (file)
@@ -1,3 +1,36 @@
+2004-07-29  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by John.
+
+       Added stubbed-out versions of all the NSTextInput protocol
+       methods, and put comments in places where we will need to call the
+       input manager to make input methods work 100%.
+       
+        * WebCoreSupport.subproj/WebBridge.m:
+        (-[WebBridge respondToChangedSelection]):
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView mouseDown:]):
+        (-[WebHTMLView mouseDragged:]):
+        (-[WebHTMLView mouseUp:]):
+        (-[WebHTMLView _interceptEditingKeyEvent:]):
+        (-[WebHTMLView keyDown:]):
+        (-[WebHTMLView _selectionChanged]):
+        (-[WebHTMLView _delegateDragSourceActionMask]):
+        (-[WebHTMLView validAttributesForMarkedText]):
+        (-[WebHTMLView characterIndexForPoint:]):
+        (-[WebHTMLView firstRectForCharacterRange:]):
+        (-[WebHTMLView selectedRange]):
+        (-[WebHTMLView markedRange]):
+        (-[WebHTMLView attributedSubstringFromRange:]):
+        (-[WebHTMLView conversationIdentifier]):
+        (-[WebHTMLView hasMarkedText]):
+        (-[WebHTMLView unmarkText]):
+        (-[WebHTMLView setMarkedText:selectedRange:]):
+        (-[WebHTMLView doCommandBySelector:]):
+        (-[WebHTMLView insertText:]):
+        * WebView.subproj/WebHTMLViewInternal.h:
+        * WebView.subproj/WebView.m:
+
 === Safari-154 ===
 
 2004-07-29  Darin Adler  <darin@apple.com>
index ad8d0f0..2fc540c 100644 (file)
@@ -1275,7 +1275,7 @@ static id <WebFormDelegate> formDelegate(WebBridge *self)
 {
     NSView <WebDocumentView> *view = [[_frame frameView] documentView];
     if ([view isKindOfClass:[WebHTMLView class]]) {
-        [(WebHTMLView *)view _updateFontPanel];
+        [(WebHTMLView *)view _selectionChanged];
     }
     [[_frame webView] setTypingStyle:nil];
     [[NSNotificationCenter defaultCenter] postNotificationName:WebViewDidChangeSelectionNotification object:[_frame webView]];
index 2cc0e9a..e62dca9 100644 (file)
 
 #import <CoreGraphics/CGContextGState.h>
 
+// Included to help work around this bug:
+// <rdar://problem/3630640>: "Calling interpretKeyEvents: in a custom text view can fail to process keys right after app startup"
+#import <AppKit/NSKeyBindingManager.h>
+
 // By imaging to a width a little wider than the available pixels,
 // thin pages will be scaled down a little, matching the way they
 // print in IE and Camino. This lets them use fewer sheets than they
@@ -98,6 +102,9 @@ static BOOL forceRealHitTest = NO;
 - (float)_scaleFactorForPrintOperation:(NSPrintOperation *)printOperation;
 @end
 
+@interface WebHTMLView (WebNSTextInputSupport) <NSTextInput>
+@end
+
 // Any non-zero value will do, but using somethign recognizable might help us debug some day.
 #define TRACKING_RECT_TAG 0xBADFACE
 
@@ -1766,6 +1773,12 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)mouseDown:(NSEvent *)event
 {    
+    // TEXTINPUT: if there is marked text and the current input
+    // manager wants to handle mouse events, we need to make sure to
+    // pass it to them. If not, then we need to notify the input
+    // manager when the marked text is abandoned (user clicks outside
+    // the marked area)
+
     // If the web page handles the context menu event and menuForEvent: returns nil, we'll get control click events here.
     // We don't want to pass them along to KHTML a second time.
     if ([event modifierFlags] & NSControlKeyMask) {
@@ -1807,6 +1820,10 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)mouseDragged:(NSEvent *)event
 {
+    // TEXTINPUT: if there is marked text and the current input
+    // manager wants to handle mouse events, we need to make sure to
+    // pass it to them.
+
     if (!_private->ignoringMouseDraggedEvents) {
         [[self _bridge] mouseDragged:event];
     }
@@ -1990,6 +2007,10 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)mouseUp:(NSEvent *)event
 {
+    // TEXTINPUT: if there is marked text and the current input
+    // manager wants to handle mouse events, we need to make sure to
+    // pass it to them.
+
     [self _stopAutoscrollTimer];
     [[self _bridge] mouseUp:event];
     [self _updateMouseoverWithFakeEvent];
@@ -2271,14 +2292,33 @@ static WebHTMLView *lastHitView = nil;
     return [super performKeyEquivalent:event];
 }
 
+- (BOOL)_interceptEditingKeyEvent:(NSEvent *)event
+{   
+    // Work around this bug:
+    // <rdar://problem/3630640>: "Calling interpretKeyEvents: in a custom text view can fail to process keys right after app startup"
+    [NSKeyBindingManager sharedKeyBindingManager];
+    
+    // Use the isEditable state to determine whether or not to process tab key events.
+    // The idea here is that isEditable will be NO when this WebView is being used
+    // in a browser, and we desire the behavior where tab moves to the next element
+    // in tab order. If isEditable is YES, it is likely that the WebView is being
+    // embedded as the whole view, as in Mail, and tabs should input tabs as expected
+    // in a text editor.
+    if (![[self _webView] isEditable] && [event _web_isTabKeyEvent]) 
+        return NO;
+    
+    // Now process the key normally
+    [self interpretKeyEvents:[NSArray arrayWithObject:event]];
+    return YES;
+}
+
 - (void)keyDown:(NSEvent *)event
 {
     WebBridge *bridge = [self _bridge];
     if ([bridge interceptKeyEvent:event toView:self])
         return;
         
-    WebView *webView = [self _webView];
-    if (([webView isEditable] || [bridge isSelectionEditable]) && [webView _interceptEditingKeyEvent:event]) 
+    if (([[self _webView] isEditable] || [bridge isSelectionEditable]) && [self _interceptEditingKeyEvent:event]) 
         return;
     
     [super keyDown:event];
@@ -3133,23 +3173,6 @@ static WebHTMLView *lastHitView = nil;
     [NSApp stopSpeaking:sender];
 }
 
-- (void)insertText:(NSString *)text
-{
-    WebBridge *bridge = [self _bridge];
-
-    // avoid entering empty strings because it confuses WebCore
-    if ([text length] == 0) {
-       return;
-    }
-
-    if ([bridge isSelectionEditable]) {
-        WebView *webView = [self _webView];
-        if ([[webView _editingDelegateForwarder] webView:webView shouldInsertText:text replacingDOMRange:[bridge selectedDOMRange] givenAction:WebViewInsertActionTyped]) {
-            [bridge insertText:text];
-        }
-    }
-}
-
 @end
 
 @implementation WebHTMLView (WebTextSizing)
@@ -3194,6 +3217,14 @@ static WebHTMLView *lastHitView = nil;
 
 @implementation WebHTMLView (WebInternal)
 
+- (void)_selectionChanged
+{
+    // TEXTINPUT: if there is marked text, we need to tell the input
+    // manager that the selection changed
+
+    [self _updateFontPanel];
+}
+
 - (void)_updateFontPanel
 {
     // FIXME: NSTextView bails out if becoming or resigning first responder, for which it has ivar flags. Not
@@ -3274,3 +3305,97 @@ static WebHTMLView *lastHitView = nil;
 }
 
 @end
+
+
+@implementation WebHTMLView (WebNSTextInputSupport)
+
+- (NSArray *)validAttributesForMarkedText
+{
+    ERROR("TEXTINPUT: validAttributesForMarkedText not yet implemented");
+    return [NSArray array];
+}
+
+- (unsigned int)characterIndexForPoint:(NSPoint)thePoint
+{
+    ERROR("TEXTINPUT: characterIndexForPoint: not yet implemented");
+    return 0;
+}
+
+- (NSRect)firstRectForCharacterRange:(NSRange)theRange
+{
+    ERROR("TEXTINPUT: firstRectForCharacterRange: not yet implemented");
+    return NSMakeRect(0,0,0,0);
+}
+
+- (NSRange)selectedRange
+{
+    ERROR("TEXTINPUT: selectedRange not yet implemented");
+    return NSMakeRange(0,0);
+}
+
+- (NSRange)markedRange
+{
+    ERROR("TEXTINPUT: markedRange not yet implemented");
+    return NSMakeRange(0,0);
+}
+
+- (NSAttributedString *)attributedSubstringFromRange:(NSRange)theRange
+{
+    ERROR("TEXTINPUT: attributedSubstringFromRange: not yet implemented");
+    return nil;
+}
+
+- (long)conversationIdentifier
+{
+    ERROR("TEXTINPUT: conversationIdentifier not yet implemented");
+    return 0;
+}
+
+- (BOOL)hasMarkedText
+{
+    ERROR("TEXTINPUT: hasMarkedText not yet implemented");
+    return FALSE;
+}
+
+- (void)unmarkText
+{
+    ERROR("TEXTINPUT: unmarkText not yet implemented");
+}
+
+- (void)setMarkedText:(id)aString selectedRange:(NSRange)selRange
+{
+    ERROR("TEXTINPUT: setMarkedText:selectedRange: not yet implemented");
+}
+
+- (void)doCommandBySelector:(SEL)aSelector
+{
+    [super doCommandBySelector:aSelector];
+}
+       
+- (void)insertText:(id)string
+{
+    WebBridge *bridge = [self _bridge];
+
+    NSString *text;
+
+    if ([string isKindOfClass:[NSAttributedString class]]) {
+       ERROR("TEXTINPUT: requested insert of attributed string");
+       text = [string string];
+    } else {
+       text = string;
+    }
+
+    // avoid entering empty strings because it confuses WebCore
+    if ([text length] == 0) {
+       return;
+    }
+
+    if ([bridge isSelectionEditable]) {
+        WebView *webView = [self _webView];
+        if ([[webView _editingDelegateForwarder] webView:webView shouldInsertText:text replacingDOMRange:[bridge selectedDOMRange] givenAction:WebViewInsertActionTyped]) {
+            [bridge insertText:text];
+        }
+    }
+}
+
+@end
index 4dd2405..b0c9e90 100644 (file)
@@ -48,6 +48,7 @@
 @end
 
 @interface WebHTMLView (WebInternal)
+- (void)_selectionChanged;
 - (void)_updateFontPanel;
 - (unsigned int)_delegateDragSourceActionMask;
 @end
index 3d59359..9eeff1a 100644 (file)
 #import <Foundation/NSURLRequestPrivate.h>
 #import <Foundation/NSUserDefaults_NSURLExtras.h>
 
-// Included to help work around this bug:
-// <rdar://problem/3630640>: "Calling interpretKeyEvents: in a custom text view can fail to process keys right after app startup"
-#import <AppKit/NSKeyBindingManager.h>
-
 @interface NSSpellChecker (AppKitSecretsIKnow)
 - (void)_preflightChosenSpellServer;
 @end
@@ -2398,26 +2394,6 @@ static WebFrame *incrementFrame(WebFrame *curr, BOOL forward, BOOL wrapFlag)
     return [[self _bridgeAtPoint:point] editableDOMRangeForPoint:point];
 }
 
-- (BOOL)_interceptEditingKeyEvent:(NSEvent *)event
-{   
-    // Work around this bug:
-    // <rdar://problem/3630640>: "Calling interpretKeyEvents: in a custom text view can fail to process keys right after app startup"
-    [NSKeyBindingManager sharedKeyBindingManager];
-    
-    // Use the isEditable state to determine whether or not to process tab key events.
-    // The idea here is that isEditable will be NO when this WebView is being used
-    // in a browser, and we desire the behavior where tab moves to the next element
-    // in tab order. If isEditable is YES, it is likely that the WebView is being
-    // embedded as the whole view, as in Mail, and tabs should input tabs as expected
-    // in a text editor.
-    if (![self isEditable] && [event _web_isTabKeyEvent]) 
-        return NO;
-    
-    // Now process the key normally
-    [self interpretKeyEvents:[NSArray arrayWithObject:event]];
-    return YES;
-}
-
 - (BOOL)_shouldBeginEditingInDOMRange:(DOMRange *)range
 {
     return [[self _editingDelegateForwarder] webView:self shouldBeginEditingInDOMRange:range];