Hi,
accidently the patch I committed contained a change to setDot/moveDot(). However
the change fixes the problem mentioned in PR 26808[0] and that is why I will
leave it in and just fix the ChangeLog.

The correct one is:

2006-03-23  Robert Schuster  <[EMAIL PROTECTED]>

        * java/awt/Component.java:
        (processMouseEvent): Remove call to consume event.
        (dispatchEventImpl): Handle specific events first, do focus request
        only when mouse event was not yet consumed.
        * javax/swing/text/DefaultCaret.java:
        (mousePressed): Rewritten.
        (setDot): Changed order of operations.
        (moveDot): Dito.

cya
Robert

[0] - http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26808

Robert Schuster wrote:
> Hi,
> as described in PR 26737[0] the focus change behavior for text components is a
> bit different than for other swing components.
> 
> I implemented that behavior by adjusting DefaultCaret a bit. However the patch
> relies on a change in Component.dispatchEventImpl() too, which someone with 
> more
> AWT/Swing knowledge should review first.
> 
> An important change is the removal of event.consume() from
> Component.processMouseEvent. When testing the RI for that behavior I could not
> observe that it consumes the event. I decided to take the description of
> MouseEvent.consume() for real and changed Component.dispatchEventImpl() in a 
> way
> that it does not change the focus of lightweight components when the 
> MouseEvent
> is consumed.
> 
> Additionally I had to make sure that the specific events (processMouseEvent 
> and
> friends) are really handled before the other stuff. This is why that code has
> moved some lines up.
> 
> Ah yes. The handling of middle-clicks in DefaultCaret will provide X11-style
> copy-n-paste behavior with Free Swing text components. It needs a small patch 
> to
> BasicTextUI which I already completed but is for a different PR.
> 
> Please comment.
> 
> Here is the ChangeLog:
> 
> 2006-03-21  Robert Schuster  <[EMAIL PROTECTED]>
> 
>         * java/awt/Component.java:
>         (processMouseEvent): Remove call to consume event.
>         (dispatchEventImpl): Handle specific events first, do focus request
>         only when mouse event was not yet consumed.
>         * javax/swing/text/DefaultCaret.java:
>         (mousePressed): Rewritten.
> 
> cya
> Robert
> 
> [0] - http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26737
> 
> 
> ------------------------------------------------------------------------
> 
> Index: java/awt/Component.java
> ===================================================================
> RCS file: /cvsroot/classpath/classpath/java/awt/Component.java,v
> retrieving revision 1.107
> diff -u -r1.107 Component.java
> --- java/awt/Component.java   18 Mar 2006 20:14:55 -0000      1.107
> +++ java/awt/Component.java   21 Mar 2006 18:21:26 -0000
> @@ -3101,7 +3101,6 @@
>            mouseListener.mouseReleased(e);
>          break;
>        }
> -      e.consume();
>    }
>  
>    /**
> @@ -4934,6 +4933,10 @@
>      
>      if (eventTypeEnabled (e.id))
>        {
> +        if (e.id != PaintEvent.PAINT && e.id != PaintEvent.UPDATE
> +            && !ignoreFocus)
> +          processEvent(e);
> +        
>          // the trick we use to communicate between dispatch and redispatch
>          // is to have KeyboardFocusManager.redispatch synchronize on the
>          // object itself. we then do not redispatch to KeyboardFocusManager
> @@ -4954,14 +4957,11 @@
>                      .dispatchEvent(e))
>                      return;
>                case MouseEvent.MOUSE_PRESSED:
> -                if (isLightweight())
> -                  requestFocus();
> +                if (isLightweight() && !e.isConsumed())
> +                    requestFocus();
>                  break;
>                }
>            }
> -        if (e.id != PaintEvent.PAINT && e.id != PaintEvent.UPDATE
> -            && !ignoreFocus)
> -          processEvent(e);
>        }
>  
>      if (peer != null)
> Index: javax/swing/text/DefaultCaret.java
> ===================================================================
> RCS file: /cvsroot/classpath/classpath/javax/swing/text/DefaultCaret.java,v
> retrieving revision 1.35
> diff -u -r1.35 DefaultCaret.java
> --- javax/swing/text/DefaultCaret.java        21 Mar 2006 18:02:46 -0000      
> 1.35
> +++ javax/swing/text/DefaultCaret.java        21 Mar 2006 18:21:26 -0000
> @@ -471,10 +471,35 @@
>     */
>    public void mousePressed(MouseEvent event)
>    {
> -    if (event.isShiftDown())
> -      moveCaret(event);
> -    else
> -      positionCaret(event);
> +    int button = event.getButton();
> +    
> +    // The implementation assumes that consuming the event makes the AWT 
> event
> +    // mechanism forget about this event instance and not transfer focus.
> +    // By observing how the RI reacts the following behavior has been
> +    // implemented (in regard to text components):
> +    // - a left-click moves the caret
> +    // - a left-click when shift is held down expands the selection
> +    // - a right-click or click with any additionaly mouse button
> +    //   on a text component is ignored
> +    // - a middle-click positions the caret and pastes the clipboard
> +    //   contents.
> +    // - a middle-click when shift is held down is ignored
> +    
> +    if (button == MouseEvent.BUTTON1)
> +      if (event.isShiftDown())
> +        moveCaret(event);
> +      else
> +        positionCaret(event);
> +      else if(button == MouseEvent.BUTTON2)
> +        if (event.isShiftDown())
> +          event.consume();
> +        else
> +          {
> +            positionCaret(event);
> +            textComponent.paste();
> +          }
> +      else
> +        event.consume();
>    }
>  
>    /**

Index: java/awt/Component.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/Component.java,v
retrieving revision 1.107
diff -u -r1.107 Component.java
--- java/awt/Component.java	18 Mar 2006 20:14:55 -0000	1.107
+++ java/awt/Component.java	23 Mar 2006 21:14:37 -0000
@@ -3101,7 +3101,6 @@
           mouseListener.mouseReleased(e);
         break;
       }
-      e.consume();
   }
 
   /**
@@ -4934,6 +4933,10 @@
     
     if (eventTypeEnabled (e.id))
       {
+        if (e.id != PaintEvent.PAINT && e.id != PaintEvent.UPDATE
+            && !ignoreFocus)
+          processEvent(e);
+        
         // the trick we use to communicate between dispatch and redispatch
         // is to have KeyboardFocusManager.redispatch synchronize on the
         // object itself. we then do not redispatch to KeyboardFocusManager
@@ -4954,14 +4957,11 @@
                     .dispatchEvent(e))
                     return;
               case MouseEvent.MOUSE_PRESSED:
-                if (isLightweight())
-                  requestFocus();
+                if (isLightweight() && !e.isConsumed())
+                    requestFocus();
                 break;
               }
           }
-        if (e.id != PaintEvent.PAINT && e.id != PaintEvent.UPDATE
-            && !ignoreFocus)
-          processEvent(e);
       }
 
     if (peer != null)
Index: javax/swing/text/DefaultCaret.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/text/DefaultCaret.java,v
retrieving revision 1.35
diff -u -r1.35 DefaultCaret.java
--- javax/swing/text/DefaultCaret.java	21 Mar 2006 18:02:46 -0000	1.35
+++ javax/swing/text/DefaultCaret.java	23 Mar 2006 21:14:37 -0000
@@ -471,10 +471,35 @@
    */
   public void mousePressed(MouseEvent event)
   {
-    if (event.isShiftDown())
-      moveCaret(event);
-    else
-      positionCaret(event);
+    int button = event.getButton();
+    
+    // The implementation assumes that consuming the event makes the AWT event
+    // mechanism forget about this event instance and not transfer focus.
+    // By observing how the RI reacts the following behavior has been
+    // implemented (in regard to text components):
+    // - a left-click moves the caret
+    // - a left-click when shift is held down expands the selection
+    // - a right-click or click with any additionaly mouse button
+    //   on a text component is ignored
+    // - a middle-click positions the caret and pastes the clipboard
+    //   contents.
+    // - a middle-click when shift is held down is ignored
+    
+    if (button == MouseEvent.BUTTON1)
+      if (event.isShiftDown())
+        moveCaret(event);
+      else
+        positionCaret(event);
+      else if(button == MouseEvent.BUTTON2)
+        if (event.isShiftDown())
+          event.consume();
+        else
+          {
+            positionCaret(event);
+            textComponent.paste();
+          }
+      else
+        event.consume();
   }
 
   /**
@@ -934,8 +959,8 @@
         this.dot = Math.max(this.dot, 0);
         
         handleHighlight();
-        adjustVisibility(this);
         appear();
+        adjustVisibility(this);
       }
   }
 
@@ -959,8 +984,8 @@
         this.mark = this.dot;
         
         clearHighlight();
-        adjustVisibility(this);
         appear();
+        adjustVisibility(this);
       }
   }
   

Attachment: signature.asc
Description: PGP signature

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to