Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Caks2016-11-25 15:13:38 +0000
committerChristoph Caks2016-11-25 16:17:28 +0000
commit5e5507373c327256412b81cfd84636cc93daa107 (patch)
tree4e9d387460b6f5422a4c9bb809654e38e3c55bee
parent5532c98e20c24a6610bdfcdd59e46579fc8c26c2 (diff)
downloadorg.eclipse.efxclipse-5e5507373c327256412b81cfd84636cc93daa107.tar.gz
org.eclipse.efxclipse-5e5507373c327256412b81cfd84636cc93daa107.tar.xz
org.eclipse.efxclipse-5e5507373c327256412b81cfd84636cc93daa107.zip
refs #29
-rw-r--r--bundles/code/org.eclipse.fx.text.ui/src/org/eclipse/fx/text/ui/contentassist/ContextInformationPopup.java35
1 files changed, 29 insertions, 6 deletions
diff --git a/bundles/code/org.eclipse.fx.text.ui/src/org/eclipse/fx/text/ui/contentassist/ContextInformationPopup.java b/bundles/code/org.eclipse.fx.text.ui/src/org/eclipse/fx/text/ui/contentassist/ContextInformationPopup.java
index b70d9827d..a348cf1d6 100644
--- a/bundles/code/org.eclipse.fx.text.ui/src/org/eclipse/fx/text/ui/contentassist/ContextInformationPopup.java
+++ b/bundles/code/org.eclipse.fx.text.ui/src/org/eclipse/fx/text/ui/contentassist/ContextInformationPopup.java
@@ -21,9 +21,12 @@ import org.eclipse.fx.ui.controls.styledtext.VerifyEvent;
import javafx.beans.Observable;
import javafx.beans.value.ChangeListener;
import javafx.event.Event;
+import javafx.event.EventHandler;
+import javafx.geometry.Bounds;
import javafx.geometry.Point2D;
import javafx.scene.Node;
import javafx.scene.control.Label;
+import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.stage.PopupWindow;
@@ -121,10 +124,9 @@ class ContextInformationPopup implements IContentAssistListener {
this.fContextInfoPopup = new PopupWindow() {
};
-
-
this.fContextInfoPopup.setAutoFix(false);
- this.fContextInfoPopup.setAutoHide(true);
+ // we set autohide to false, because it prevents click events on the parent window
+ this.fContextInfoPopup.setAutoHide(false);
viewer.getTextWidget().sceneProperty().addListener( e -> {
if( viewer.getTextWidget().getScene() != null ) {
this.fContextInfoPopup.getScene().getStylesheets().setAll(viewer.getTextWidget().getScene().getStylesheets());
@@ -140,16 +142,37 @@ class ContextInformationPopup implements IContentAssistListener {
this.fContextInfoPopup.setOnShowing(this::subscribe);
this.fContextInfoPopup.setOnHidden(this::unsubscribe);
-
+
}
+ // we manually hide whenever a mouse pressed somewhere outside of the editor control occurs
+ private EventHandler<MouseEvent> mousePressed = me -> {
+ Bounds b = this.fViewer.getTextWidget().getBoundsInLocal();
+ Bounds bScreen = this.fViewer.getTextWidget().localToScreen(b);
+ if (bScreen.contains(me.getScreenX(), me.getScreenY())) {
+ // click within text widget -> no hide
+ }
+ else {
+ this.fContextInfoPopup.hide();
+ }
+ };
+
+ // we manually hide whenever the stage loses its focus
+ private ChangeListener<Boolean> stageFocusChanged = (x, o, n) -> {
+ if (!n) {
+ this.fContextInfoPopup.hide();
+ }
+ };
+
private void subscribe(Event e) {
this.fViewer.getTextWidget().caretOffsetProperty().addListener(this.selectionChange);
-// this.viewer.getTextWidget().caretOffsetProperty().addListener(this.selectionChange);
-// this.viewer.getTextWidget().getScene().addEventFilter(MouseEvent.MOUSE_PRESSED, this.mouseEvent);
+ this.fViewer.getTextWidget().getScene().addEventFilter(MouseEvent.MOUSE_PRESSED, this.mousePressed);
+ this.fViewer.getTextWidget().getScene().getWindow().focusedProperty().addListener(this.stageFocusChanged);
}
private void unsubscribe(Event e) {
this.fViewer.getTextWidget().caretOffsetProperty().removeListener(this.selectionChange);
+ this.fViewer.getTextWidget().getScene().removeEventFilter(MouseEvent.MOUSE_PRESSED, this.mousePressed);
+ this.fViewer.getTextWidget().getScene().getWindow().focusedProperty().removeListener(this.stageFocusChanged);
}
private void onSelectionChange(Observable x, Number oldSelection, Number newSelection) {

Back to the top