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);
}
}
signature.asc
Description: PGP signature
signature.asc
Description: OpenPGP digital signature
