diff options
author | Christoph Caks | 2016-11-25 15:13:38 +0000 |
---|---|---|
committer | Christoph Caks | 2016-11-25 16:17:28 +0000 |
commit | 5e5507373c327256412b81cfd84636cc93daa107 (patch) | |
tree | 4e9d387460b6f5422a4c9bb809654e38e3c55bee | |
parent | 5532c98e20c24a6610bdfcdd59e46579fc8c26c2 (diff) | |
download | org.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.java | 35 |
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) { |