diff --git a/org.fortiss.tooling.common.ui/build.properties b/org.fortiss.tooling.common.ui/build.properties index ab1e37fb1bbf7fdb879ccf70079b428aacb1e8ff..15f0431a4cec282c6243329a527a4754af3d8fd7 100644 --- a/org.fortiss.tooling.common.ui/build.properties +++ b/org.fortiss.tooling.common.ui/build.properties @@ -5,7 +5,8 @@ bin.includes = .,\ lib/org.conqat.ide.commons.gef.jar,\ lib/org.conqat.ide.commons.ui.jar,\ lib/swt-grouplayout.jar,\ - res/ + res/,\ + icons/ jars.compile.order = . source.. = src/,\ res/,\ diff --git a/org.fortiss.tooling.common.ui/icons/help.png b/org.fortiss.tooling.common.ui/icons/help.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d15197971a8222c74e29151085ef7024b61567 Binary files /dev/null and b/org.fortiss.tooling.common.ui/icons/help.png differ diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/.ratings b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/.ratings index 8f3c591ba755e687b9edbb34f2a765732da80b4b..fbe218be629a52b4c74277aba0c45477700b7a93 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/.ratings +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/.ratings @@ -1,8 +1,8 @@ DiagramCoordinate.java 6b00aec99054d4cd19003a72bd4e5e774ac6a641 GREEN DiagramLayers.java 155cbb47a5f0aaa0025320ae607e6777f3a2d2e8 GREEN -DiagramViewer.java a96338d3d8e043564eb857920ade45f6e2d4ac18 GREEN +DiagramViewer.java 07e59468c9279b6a2987daaf9ed1b7da9670bb18 YELLOW DiagramViewerDefaultTags.java 6230763252409c60009ab8887b4ef582cf883229 GREEN -DiagramViewerFeatures.java 31e3fb61f915b0d8695005b083c47ce1c5be0b05 GREEN +DiagramViewerFeatures.java 44f5315505d76ef8cb0b61b5a37d7d2501195788 YELLOW DiagramViewerSelection.java e833f592543bc97077907d980a39b123fc4044e6 GREEN EDragGesture.java 5cfa098d3877db11981c2750e5e103156d62fc5e GREEN FeedbackChange.java b088fa89af648f1674f2f9c1f7f99d585ce801ca GREEN diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/DiagramViewer.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/DiagramViewer.java index a96338d3d8e043564eb857920ade45f6e2d4ac18..07e59468c9279b6a2987daaf9ed1b7da9670bb18 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/DiagramViewer.java +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/DiagramViewer.java @@ -14,19 +14,23 @@ import static java.lang.Math.ceil; import static java.lang.Math.max; import static java.lang.Math.min; import static java.util.Objects.requireNonNull; +import static javafx.geometry.VPos.TOP; import static javafx.scene.layout.GridPane.setHgrow; import static javafx.scene.layout.GridPane.setVgrow; import static javafx.scene.layout.Priority.ALWAYS; import static javafx.scene.paint.Color.ORANGERED; +import static javafx.scene.paint.Color.grayRgb; import static org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramViewerDefaultTags.LINK_TARGET_ALLOWED_TAG; import static org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramViewerDefaultTags.LINK_TARGET_DENIED_TAG; import static org.fortiss.tooling.common.ui.javafx.lwfxef.DiagramViewerDefaultTags.LINK_TARGET_MAYBE_TAG; +import static org.fortiss.tooling.common.ui.javafx.util.GraphicUtils.getFXImage; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; +import org.fortiss.tooling.common.ui.ToolingCommonUIActivator; import org.fortiss.tooling.common.ui.javafx.lwfxef.change.Change; import org.fortiss.tooling.common.ui.javafx.lwfxef.change.ChangeSet; import org.fortiss.tooling.common.ui.javafx.lwfxef.change.DefaultModelModifier; @@ -54,6 +58,8 @@ import javafx.scene.control.ContextMenu; import javafx.scene.control.Label; import javafx.scene.control.MenuItem; import javafx.scene.control.ScrollBar; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; import javafx.scene.input.KeyEvent; import javafx.scene.input.ScrollEvent; import javafx.scene.layout.GridPane; @@ -62,6 +68,7 @@ import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.shape.Line; import javafx.scene.shape.Rectangle; +import javafx.scene.text.Text; /** * This class represents the diagram viewer node, which manages the grid @@ -87,6 +94,12 @@ public class DiagramViewer { private final DiagramLayers layers; /** The viewer main pane. */ private final Pane viewerPane; + /** The help label. */ + private final Label helpLabel = new Label(""); + /** The help display. */ + private Text helpText = null; + /** The help shadowed background. */ + private final Rectangle helpShadow = new Rectangle(0, 0); /** The mouse drag multi-selection feedback rectangle. */ private final Rectangle mouseDragRectangle = new Rectangle(0, 0); /** The initial location where the selection rectangle was started. */ @@ -178,12 +191,24 @@ public class DiagramViewer { debugLabel.setLayoutY(20); debugLabel.setTextFill(ORANGERED); + viewerPane.getChildren().add(helpLabel); + Image helpImage = getFXImage(ToolingCommonUIActivator.PLUGIN_ID, "/icons/help.png"); + ImageView view = new ImageView(helpImage); + helpLabel.setGraphic(view); + helpLabel.setLayoutX(viewerPane.getWidth() - helpLabel.getWidth()); + helpLabel.setLayoutY(0); + helpLabel.setOnMouseClicked(evt -> { + toggleHelp(); + }); + // clipping rectangle for the viewer pane Rectangle viewerClip = new Rectangle(); viewerPane.setClip(viewerClip); viewerPane.layoutBoundsProperty().addListener((obs, ov, nv) -> { - viewerClip.setWidth(nv.getWidth()); + double width = nv.getWidth(); + viewerClip.setWidth(width); viewerClip.setHeight(nv.getHeight()); + helpLabel.setLayoutX(width - helpLabel.getWidth()); }); // update the viewer content @@ -676,6 +701,41 @@ public class DiagramViewer { return getLayers().getMouseState().getDragExtent(); } + /** Toggles the in-place help. */ + private void toggleHelp() { + if(helpText == null) { + // enable help + String txt = features.getHelpText(); + if(txt == null || "".equals(txt)) { + txt = "No in-place help available."; + } + helpText = new Text(txt); + helpText.setFill(Color.WHITE); + helpText.setLayoutY(0); + double lw = viewerPane.getWidth() - helpLabel.getWidth(); + // 20% of the width with 3 pixel inset + helpText.setLayoutX(lw * .2 + 3); + helpText.setLayoutY(3); + helpText.setTextOrigin(TOP); + helpText.setWrappingWidth(lw * .8 - 6); + helpText.setOnMouseClicked(evt -> toggleHelp()); + helpShadow.setX(lw * .2); + helpShadow.setY(0); + helpShadow.setWidth(lw * .8); + helpShadow.setHeight(viewerPane.getHeight()); + helpShadow.setFill(grayRgb(32, .66)); + helpShadow.setOnMouseClicked(evt -> toggleHelp()); + + viewerPane.getChildren().add(helpShadow); + viewerPane.getChildren().add(helpText); + } else { + // disable help + viewerPane.getChildren().remove(helpText); + viewerPane.getChildren().remove(helpShadow); + helpText = null; + } + } + /** * Creates a drag controller for the given bundle, gesture, mouse location and source node also * considering the current selection. diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/DiagramViewerFeatures.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/DiagramViewerFeatures.java index 31e3fb61f915b0d8695005b083c47ce1c5be0b05..44f5315505d76ef8cb0b61b5a37d7d2501195788 100644 --- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/DiagramViewerFeatures.java +++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/DiagramViewerFeatures.java @@ -47,6 +47,8 @@ public final class DiagramViewerFeatures { private IndicatorType indicatorType = IndicatorType.CROSS; /** The background color. */ private Color backgroundColor = LIGHTGRAY; + /** The help text for the diagram viewer in-place help */ + private String helpText = null; /** Constructor. */ public DiagramViewerFeatures(DiagramViewer diagramViewer) { @@ -280,4 +282,14 @@ public final class DiagramViewerFeatures { public double getMaximumSpacing() { return max(getVerticalSpacing(), getHorizontalSpacing()); } + + /** Returns the help text. */ + public String getHelpText() { + return helpText; + } + + /** Sets help text. */ + public void setHelpText(String helpText) { + this.helpText = helpText; + } }