Skip to content

Commit

Permalink
Change overlay to support multiple overlays
Browse files Browse the repository at this point in the history
- Change so overlays must be given a name, as for frames or dialogs
- Add parameter "zorder" to overlay(). The overlays will be drawn according to the zOrder (high zOrder overlays are drawn over low zOrder overlays)
- Move HTMLJFXPanel WebView code to HTMLWebViewManager
- Separate HTMLOverlay into HTMLOverlayManager and HTMLOverlayPanel
- Feature discussed in RPTools#1425
  • Loading branch information
Merudo committed Apr 14, 2020
1 parent 7447120 commit 7981c8b
Show file tree
Hide file tree
Showing 13 changed files with 1,200 additions and 772 deletions.
59 changes: 57 additions & 2 deletions src/main/java/net/rptools/lib/swing/SwingUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,26 @@
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import javafx.application.Platform;
import javafx.scene.ImageCursor;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import net.rptools.lib.image.ImageUtil;
import net.rptools.maptool.client.tool.MeasureTool;

/** */
public class SwingUtil {
public static Cursor emptyCursor;
public static javafx.scene.Cursor emptyCursorFX;
private static final String PATH_EMPTY = "net/rptools/lib/swing/image/empty.png";

static {
try {
emptyCursor =
Toolkit.getDefaultToolkit()
.createCustomCursor(
ImageUtil.getImage("net/rptools/lib/swing/image/empty.png"), new Point(0, 0), "");
.createCustomCursor(ImageUtil.getImage(PATH_EMPTY), new Point(0, 0), "");
Platform.runLater(
() -> emptyCursorFX = new ImageCursor(new javafx.scene.image.Image(PATH_EMPTY), 0, 0));
} catch (IOException ioe) {
ioe.printStackTrace();
}
Expand Down Expand Up @@ -291,4 +297,53 @@ public static JComponent getComponent(JComponent container, String name) {
public static boolean hasComponent(JComponent container, String name) {
return getComponent(container, name) != null;
}

/**
* Returns the JavaFX cursor equivalent of a Swing cursor
*
* @param cursor the Swing cursor
* @return the JavaFX cursor
*/
public static javafx.scene.Cursor swingCursorToFX(Cursor cursor) {
if (cursor == null) {
return javafx.scene.Cursor.DEFAULT;
}
if (cursor == emptyCursor) {
return emptyCursorFX;
}
if (cursor == MeasureTool.getMeasureCursor()) {
return MeasureTool.getMeasureCursorFX();
}

switch (cursor.getType()) {
case Cursor.CROSSHAIR_CURSOR:
return javafx.scene.Cursor.CROSSHAIR;
case Cursor.E_RESIZE_CURSOR:
return javafx.scene.Cursor.E_RESIZE;
case Cursor.HAND_CURSOR:
return javafx.scene.Cursor.HAND;
case Cursor.MOVE_CURSOR:
return javafx.scene.Cursor.MOVE;
case Cursor.N_RESIZE_CURSOR:
return javafx.scene.Cursor.N_RESIZE;
case Cursor.NE_RESIZE_CURSOR:
return javafx.scene.Cursor.NE_RESIZE;
case Cursor.NW_RESIZE_CURSOR:
return javafx.scene.Cursor.NW_RESIZE;
case Cursor.S_RESIZE_CURSOR:
return javafx.scene.Cursor.S_RESIZE;
case Cursor.SE_RESIZE_CURSOR:
return javafx.scene.Cursor.SE_RESIZE;
case Cursor.SW_RESIZE_CURSOR:
return javafx.scene.Cursor.SW_RESIZE;
case Cursor.TEXT_CURSOR:
return javafx.scene.Cursor.TEXT;
case Cursor.W_RESIZE_CURSOR:
return javafx.scene.Cursor.W_RESIZE;
case Cursor.WAIT_CURSOR:
return javafx.scene.Cursor.WAIT;
default:
return javafx.scene.Cursor.DEFAULT;
}
}
}
3 changes: 2 additions & 1 deletion src/main/java/net/rptools/maptool/client/MapTool.java
Original file line number Diff line number Diff line change
Expand Up @@ -998,7 +998,8 @@ public static void setCampaign(Campaign campaign, GUID defaultRendererId) {
AssetManager.updateRepositoryList();
MapTool.getFrame().getCampaignPanel().reset();
MapTool.getFrame().getGmPanel().reset();
MapTool.getFrame().getHtmlOverlay().closeRequest(); // overlay vanishes after campaign change
// overlay vanishes after campaign change
MapTool.getFrame().getOverlayPanel().removeAllOverlays();
UserDefinedMacroFunctions.getInstance().loadCampaignLibFunctions();
}

Expand Down
24 changes: 15 additions & 9 deletions src/main/java/net/rptools/maptool/client/MapToolLineParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import net.rptools.maptool.client.functions.ReturnFunction.ReturnFunctionException;
import net.rptools.maptool.client.functions.json.JSONMacroFunctions;
import net.rptools.maptool.client.ui.htmlframe.HTMLFrameFactory;
import net.rptools.maptool.client.ui.htmlframe.HTMLFrameFactory.FrameType;
import net.rptools.maptool.client.ui.macrobuttons.buttons.MacroButtonPrefs;
import net.rptools.maptool.client.ui.zone.ZoneRenderer;
import net.rptools.maptool.language.I18N;
Expand Down Expand Up @@ -359,7 +360,7 @@ private enum OptionType {
// HTML webView
FRAME5("frame5", 1, 2, "\"\""),
// HTML overlay
OVERLAY("overlay", 0, 1, "\"\""),
OVERLAY("overlay", 1, 2, "\"\""),
// Run for another token
TOKEN("token", 1, 1);

Expand Down Expand Up @@ -1037,8 +1038,9 @@ public String parseLine(
break;
case OVERLAY:
codeType = CodeType.CODEBLOCK;
frameName = option.getParsedParam(0, resolver, tokenInContext).toString();
frameOpts = option.getParsedParam(1, resolver, tokenInContext).toString();
outputTo = OutputLoc.OVERLAY;
frameOpts = option.getParsedParam(0, resolver, tokenInContext).toString();
break;
///////////////////////////////////////////////////
// CODE OPTIONS
Expand Down Expand Up @@ -1431,26 +1433,30 @@ public String parseLine(
switch (outputTo) {
case FRAME:
HTMLFrameFactory.show(
frameName, true, false, frameOpts, expressionBuilder.toString());
frameName, FrameType.FRAME, false, frameOpts, expressionBuilder.toString());
break;
case DIALOG:
HTMLFrameFactory.show(
frameName, false, false, frameOpts, expressionBuilder.toString());
frameName, FrameType.DIALOG, false, frameOpts, expressionBuilder.toString());
break;
case OVERLAY:
MapTool.getFrame()
.getHtmlOverlay()
.updateContents(expressionBuilder.toString(), true);
HTMLFrameFactory.show(
frameName, FrameType.OVERLAY, true, frameOpts, expressionBuilder.toString());
break;
case CHAT:
builder.append(expressionBuilder);
break;
case FRAME5:
HTMLFrameFactory.show(frameName, true, true, frameOpts, expressionBuilder.toString());
HTMLFrameFactory.show(
frameName, FrameType.FRAME, true, frameOpts, expressionBuilder.toString());
break;
case DIALOG5:
HTMLFrameFactory.show(
frameName, false, true, frameOpts, expressionBuilder.toString());
frameName,
HTMLFrameFactory.FrameType.DIALOG,
true,
frameOpts,
expressionBuilder.toString());
break;
}

Expand Down
30 changes: 23 additions & 7 deletions src/main/java/net/rptools/maptool/client/tool/MeasureTool.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import java.io.IOException;
import java.text.NumberFormat;
import java.util.Map;
import javafx.application.Platform;
import javafx.scene.ImageCursor;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
Expand All @@ -48,24 +50,38 @@ public class MeasureTool extends DefaultTool implements ZoneOverlay {

private ZoneWalker walker;
private Path<ZonePoint> gridlessPath;
private Cursor measureCursor;
private static Cursor measureCursor;
private static javafx.scene.Cursor measureCursorFX;

private static final String PATH_RULER_IMG =
"net/rptools/maptool/client/image/tool/ruler-blue.png";
private static final String PATH_MEASURE_IMG =
"net/rptools/maptool/client/image/cursor-tape-measure.png";

public MeasureTool() {
try {
setIcon(
new ImageIcon(
ImageUtil.getImage("net/rptools/maptool/client/image/tool/ruler-blue.png")));
setIcon(new ImageIcon(ImageUtil.getImage(PATH_RULER_IMG)));
measureCursor =
Toolkit.getDefaultToolkit()
.createCustomCursor(
ImageUtil.getImage("net/rptools/maptool/client/image/cursor-tape-measure.png"),
new Point(2, 28),
CURSOR_NAME);
ImageUtil.getImage(PATH_MEASURE_IMG), new Point(2, 28), CURSOR_NAME);
Platform.runLater(
() ->
measureCursorFX =
new ImageCursor(new javafx.scene.image.Image(PATH_MEASURE_IMG), 2, 28));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}

public static Cursor getMeasureCursor() {
return measureCursor;
}

public static javafx.scene.Cursor getMeasureCursorFX() {
return measureCursorFX;
}

@Override
protected void attachTo(ZoneRenderer renderer) {
renderer.setCursor(measureCursor);
Expand Down
16 changes: 8 additions & 8 deletions src/main/java/net/rptools/maptool/client/ui/MapToolFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@
import net.rptools.maptool.client.ui.drawpanel.DrawPanelTreeCellRenderer;
import net.rptools.maptool.client.ui.drawpanel.DrawPanelTreeModel;
import net.rptools.maptool.client.ui.drawpanel.DrawablesPanel;
import net.rptools.maptool.client.ui.htmlframe.HTMLOverlay;
import net.rptools.maptool.client.ui.htmlframe.HTMLOverlayPanel;
import net.rptools.maptool.client.ui.lookuptable.LookupTablePanel;
import net.rptools.maptool.client.ui.macrobuttons.buttons.MacroButton;
import net.rptools.maptool.client.ui.macrobuttons.panels.*;
Expand Down Expand Up @@ -172,7 +172,7 @@ public class MapToolFrame extends DefaultDockableHolder
/** The panel showing the initiative order. */
private final InitiativePanel initiativePanel;
/** The HTML pane showing the map overlay. */
private final HTMLOverlay htmlOverlay;
private HTMLOverlayPanel overlayPanel;

private final PointerOverlay pointerOverlay;
private final CommandPanel commandPanel;
Expand Down Expand Up @@ -456,7 +456,7 @@ public MapToolFrame(JMenuBar menuBar) {
connectionPanel = createConnectionPanel();
toolbox = new Toolbox();
initiativePanel = createInitiativePanel();
htmlOverlay = new HTMLOverlay();
overlayPanel = new HTMLOverlayPanel();

zoneRendererList = new CopyOnWriteArrayList<ZoneRenderer>();
pointerOverlay = new PointerOverlay();
Expand Down Expand Up @@ -512,8 +512,8 @@ public MapToolFrame(JMenuBar menuBar) {
rendererBorderPanel.add(zoneRendererPanel);
toolbarPanel = new ToolbarPanel(toolbox);

zoneRendererPanel.add(htmlOverlay, PositionalLayout.Position.CENTER, 0);
htmlOverlay.setVisible(false); // disabled by default
zoneRendererPanel.add(overlayPanel, PositionalLayout.Position.CENTER, 0);
overlayPanel.setVisible(false); // disabled by default

// Put it all together
setJMenuBar(menuBar);
Expand Down Expand Up @@ -1524,9 +1524,9 @@ public ZoneRenderer getCurrentZoneRenderer() {
return currentRenderer;
}

/** @return the HTMLOverlay */
public HTMLOverlay getHtmlOverlay() {
return htmlOverlay;
/** @return the HTML Overlay Panel */
public HTMLOverlayPanel getOverlayPanel() {
return overlayPanel;
}

public void addZoneRenderer(ZoneRenderer renderer) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ public void windowClosing(WindowEvent e) {
*/
public void addHTMLPanel(boolean scrollBar, boolean isHTML5) {
if (isHTML5) {
panel = new HTMLJFXPanel(this);
panel = new HTMLJFXPanel(this, new HTMLWebViewManager());
} else {
panel = new HTMLPanel(this, scrollBar);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ public boolean getTemporary() {
*/
public void addHTMLPanel(boolean isHTML5) {
if (isHTML5) {
panel = new HTMLJFXPanel(this);
panel = new HTMLJFXPanel(this, new HTMLWebViewManager());
} else {
panel = new HTMLPanel(this, true);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,26 +27,33 @@
public class HTMLFrameFactory {
private HTMLFrameFactory() {}

public enum FrameType {
FRAME,
DIALOG,
OVERLAY
}

private static HTMLFrameFactory.Listener listener;

/**
* Shows a dialog or frame based on the options.
*
* @param name The name of the dialog or frame.
* @param isFrame Is it a frame.
* @param frameType The type of the frame.
* @param isHTML5 Does it use HTML5 (JavaFX) or HTML 3.2 (Swing).
* @param properties The properties that determine the attributes of the frame or dialog.
* @param html The html contents of frame or dialog.
*/
public static void show(
String name, boolean isFrame, boolean isHTML5, String properties, String html) {
String name, FrameType frameType, boolean isHTML5, String properties, String html) {
if (listener == null) {
listener = new HTMLFrameFactory.Listener();
}
boolean input = false;
boolean temporary = false;
int width = -1;
int height = -1;
int zOrder = 0;
String title = name;
String tabTitle = null;
Object frameValue = null;
Expand Down Expand Up @@ -94,6 +101,12 @@ public static void show(
} catch (NumberFormatException e) {
// Ignoring the value; shouldn't we warn the user?
}
} else if (keyLC.equals("zorder")) {
try {
zOrder = Integer.parseInt(value);
} catch (NumberFormatException e) {
// Ignoring the value; shouldn't we warn the user?
}
} else if (keyLC.equals("title")) {
title = value;
} else if (keyLC.equals("noframe")) {
Expand All @@ -115,7 +128,8 @@ public static void show(
// Ignoring the value; shouldn't we warn the user?
}
} else if (keyLC.equals("scrollreset")) {
if (Integer.parseInt(value) == 1) {
int v = Integer.parseInt(value);
if (v != 0) {
scrollReset = true;
}
} else if (keyLC.equals("value")) {
Expand All @@ -126,10 +140,10 @@ public static void show(
}
}
if (tabTitle == null) tabTitle = title; // if tabTitle not set, make it same as title
if (isFrame) {
if (frameType == FrameType.FRAME) {
HTMLFrame.showFrame(
name, title, tabTitle, width, height, temporary, scrollReset, isHTML5, frameValue, html);
} else {
} else if (frameType == FrameType.DIALOG) {
HTMLDialog.showDialog(
name,
title,
Expand All @@ -143,28 +157,30 @@ public static void show(
isHTML5,
frameValue,
html);
} else if (frameType == FrameType.OVERLAY) {
MapTool.getFrame().getOverlayPanel().showOverlay(name, zOrder, html);
}
}

/** The list of selected tokens changed. */
public static void selectedListChanged() {
HTMLFrame.doSelectedChanged();
HTMLDialog.doSelectedChanged();
MapTool.getFrame().getHtmlOverlay().doSelectedChanged();
MapTool.getFrame().getOverlayPanel().doSelectedChanged();
}

/** A new token has been impersonated or cleared. */
public static void impersonateToken() {
HTMLFrame.doImpersonatedChanged();
HTMLDialog.doImpersonatedChanged();
MapTool.getFrame().getHtmlOverlay().doImpersonatedChanged();
MapTool.getFrame().getOverlayPanel().doImpersonatedChanged();
}

/** One of the tokens has changed. */
public static void tokenChanged(Token token) {
HTMLFrame.doTokenChanged(token);
HTMLDialog.doTokenChanged(token);
MapTool.getFrame().getHtmlOverlay().doTokenChanged(token);
MapTool.getFrame().getOverlayPanel().doTokenChanged(token);
}

public static class Listener implements ModelChangeListener, AppEventListener {
Expand Down
Loading

0 comments on commit 7981c8b

Please sign in to comment.