diff --git a/build.gradle b/build.gradle index 465ffafb5c..c43dae63d6 100644 --- a/build.gradle +++ b/build.gradle @@ -424,6 +424,7 @@ dependencies { implementation(libs.bundles.gdx) implementation(variantOf(libs.gdx.platform) { classifier('natives-desktop')}) implementation(variantOf(libs.gdx.freetype.platform) { classifier('natives-desktop')}) + implementation("net.java.jinput:jinput-platform:2.0.7") } processResources { diff --git a/src/main/java/net/rptools/maptool/client/AppActions.java b/src/main/java/net/rptools/maptool/client/AppActions.java index 8c8f9588a7..285d48638d 100644 --- a/src/main/java/net/rptools/maptool/client/AppActions.java +++ b/src/main/java/net/rptools/maptool/client/AppActions.java @@ -42,6 +42,7 @@ import net.rptools.lib.FileUtil; import net.rptools.lib.MD5Key; import net.rptools.lib.OsDetection; +import net.rptools.maptool.client.AppPreferenceEnums.VisionType; import net.rptools.maptool.client.swing.GenericDialog; import net.rptools.maptool.client.swing.SwingUtil; import net.rptools.maptool.client.tool.FacingTool; @@ -63,7 +64,7 @@ import net.rptools.maptool.client.ui.htmlframe.HTMLOverlayManager; import net.rptools.maptool.client.ui.mappropertiesdialog.MapPropertiesDialog; import net.rptools.maptool.client.ui.players.PlayerDatabaseDialog; -import net.rptools.maptool.client.ui.preferencesdialog.PreferencesDialog; +import net.rptools.maptool.client.ui.preferencesdialog.PreferenceDialog; import net.rptools.maptool.client.ui.startserverdialog.StartServerDialog; import net.rptools.maptool.client.ui.startserverdialog.StartServerDialogPreferences; import net.rptools.maptool.client.ui.theme.Icons; @@ -75,7 +76,6 @@ import net.rptools.maptool.language.I18N; import net.rptools.maptool.model.*; import net.rptools.maptool.model.Zone.Layer; -import net.rptools.maptool.model.Zone.VisionType; import net.rptools.maptool.model.campaign.CampaignManager; import net.rptools.maptool.model.drawing.DrawableTexturePaint; import net.rptools.maptool.model.player.*; @@ -483,7 +483,7 @@ protected void executeAction() { protected void executeAction() { // Probably don't have to create a new one each time - PreferencesDialog dialog = new PreferencesDialog(); + PreferenceDialog dialog = PreferenceDialog.getInstance(); dialog.showDialog(); } }; diff --git a/src/main/java/net/rptools/maptool/client/AppPreferenceEnums.java b/src/main/java/net/rptools/maptool/client/AppPreferenceEnums.java new file mode 100644 index 0000000000..51642ca85f --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/AppPreferenceEnums.java @@ -0,0 +1,493 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client; + +import com.twelvemonkeys.image.ResampleOp; +import java.awt.*; +import net.rptools.maptool.language.I18N; +import net.rptools.maptool.model.GridFactory; +import net.rptools.maptool.model.localisedObject.LocalEnumListItem; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class AppPreferenceEnums { + public enum ShowTokenNumbering + implements LocalEnumListItem.EnumPreferenceItem { + NAME("Preferences.combo.tokens.numbering.name"), + GM("Preferences.combo.tokens.numbering.gm"), + BOTH("Preferences.combo.tokens.numbering.both"); + + private final String i18nKey; + private final String displayName; + + ShowTokenNumbering(String key) { + i18nKey = key; + displayName = I18N.getString(key); + } + + /** + * @return the value used by the preference. + */ + @Override + public @NotNull ShowTokenNumbering getValue() { + return valueOf(name()); + } + + /** + * @return the lookup key for UI use + */ + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public @NotNull String getDisplayName() { + return displayName; + } + + @Override + public void updatePreference(Enum newValue) { + AppPreferences.tokenNumberDisplay.set(newValue.name().toLowerCase()); + } + } + + public enum UvttLosImportType implements LocalEnumListItem.EnumPreferenceItem { + Walls("uvttLosImportType.walls"), + Masks("uvttLosImportType.masks"), + Prompt("uvttLosImportType.prompt"); + + private final String displayName; + private final String i18nKey; + + UvttLosImportType(String key) { + i18nKey = key; + displayName = I18N.getString(key); + } + + /** + * @return the value used by the preference. + */ + @Override + public @NotNull UvttLosImportType getValue() { + return valueOf(name()); + } + + /** + * @return the lookup key for UI use + */ + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public @NotNull String getDisplayName() { + return displayName; + } + + @Override + public void updatePreference(Enum newValue) { + AppPreferences.uvttLosImportType.set( + AppPreferences.UvttLosImportType.valueOf(newValue.name())); + } + } + + // Based off vision type enum in Zone.java, this could easily get tossed somewhere else if + // preferred. + public enum MapSortType implements LocalEnumListItem.EnumPreferenceItem { + DISPLAY_NAME(), + GM_NAME(); + + private final String i18nKey; + private final String displayName; + + MapSortType() { + i18nKey = "mapSortType." + name(); + displayName = I18N.getString(i18nKey); + } + + /** + * @return the value used by the preference. + */ + @Override + public @NotNull MapSortType getValue() { + return valueOf(name()); + } + + /** + * @return the lookup key for UI use + */ + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public @NotNull String getDisplayName() { + return displayName; + } + + @Override + public void updatePreference(Enum newValue) { + AppPreferences.mapSortType.set(AppPreferences.MapSortType.valueOf(newValue.name())); + } + } + + public enum RenderQuality implements LocalEnumListItem.EnumPreferenceItem { + LOW_SCALING("Preferences.combo.render.low"), + PIXEL_ART_SCALING("Preferences.combo.render.pixel"), + MEDIUM_SCALING("Preferences.combo.render.medium"), + HIGH_SCALING("Preferences.combo.render.high"); + private final String i18nKey; + private final String displayName; + + RenderQuality(String key) { + i18nKey = key; + displayName = I18N.getString(key); + } + + /** + * @return the value used by the preference. + */ + @Override + public @NotNull RenderQuality getValue() { + return valueOf(name()); + } + + /** + * @return the lookup key for UI use + */ + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public @NotNull String getDisplayName() { + return displayName; + } + + @Override + public void updatePreference(Enum newValue) { + AppPreferences.renderQuality.set( + net.rptools.lib.image.RenderQuality.valueOf(newValue.name())); + } + + public void setRenderingHints(Graphics2D g) { + switch (this) { + case LOW_SCALING, PIXEL_ART_SCALING -> { + g.setRenderingHint( + RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); + } + case MEDIUM_SCALING -> { + g.setRenderingHint( + RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_DEFAULT); + } + case HIGH_SCALING -> { + g.setRenderingHint( + RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + } + } + } + + public void setShrinkRenderingHints(Graphics2D d) { + switch (this) { + case LOW_SCALING, PIXEL_ART_SCALING -> { + d.setRenderingHint( + RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); + d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); + } + case MEDIUM_SCALING -> { + d.setRenderingHint( + RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_DEFAULT); + } + case HIGH_SCALING -> { + d.setRenderingHint( + RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + } + } + } + + public int getResampleOpFilter() { + return switch (this) { + case LOW_SCALING, PIXEL_ART_SCALING -> ResampleOp.FILTER_POINT; + case MEDIUM_SCALING -> ResampleOp.FILTER_TRIANGLE; + case HIGH_SCALING -> ResampleOp.FILTER_QUADRATIC; + }; + } + } + + public enum NumberTokenDuplicateMethod + implements LocalEnumListItem.EnumPreferenceItem { + INCREMENT("Preferences.combo.tokens.duplicate.increment"), + RANDOM("Preferences.combo.tokens.duplicate.random"); + + private final String i18nKey; + private final String displayName; + + NumberTokenDuplicateMethod(String key) { + i18nKey = key; + displayName = I18N.getString(key); + } + + /** + * @return the value used by the preference. + */ + @Override + public @NotNull NumberTokenDuplicateMethod getValue() { + return valueOf(name()); + } + + /** + * @return the lookup key for UI use + */ + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public @NotNull String getDisplayName() { + return displayName; + } + + @Override + public void updatePreference(Enum newValue) { + AppPreferences.duplicateTokenNumber.set(StringUtils.capitalize(newValue.name())); + } + } + + public enum NewTokenNameUse implements LocalEnumListItem.EnumPreferenceItem { + FILE_NAME("Preferences.combo.tokens.naming.fileName", null), + CREATURE("Preferences.combo.tokens.naming.creature", "Token.name.creature"); + + private final String i18nKey; + private final String displayName; + + NewTokenNameUse(String key, @Nullable String i18nArgKey) { + i18nKey = key; + if (i18nArgKey == null) { + displayName = I18N.getText(key); + } else { + displayName = I18N.getText(i18nKey, I18N.getText(i18nArgKey)); + } + } + + /** + * @return the value used by the preference. + */ + @Override + public @NotNull NewTokenNameUse getValue() { + return valueOf(name()); + } + + /** + * @return the lookup key for UI use + */ + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public @NotNull String getDisplayName() { + return displayName; + } + + @Override + public void updatePreference(Enum newValue) { + AppPreferences.newTokenNaming.set(newValue.equals(FILE_NAME) ? "Use Filename" : "Creature"); + } + } + + public enum UIIconType implements LocalEnumListItem.EnumPreferenceItem { + CLASSIC("Icon.type.classic"), + ROD_TAKEHARA("Icon.type.RodTakehara"); + private final String i18nKey; + private final String displayName; + + UIIconType(String key) { + i18nKey = key; + displayName = I18N.getString(i18nKey); + } + + /** + * @return the value used by the preference. + */ + @Override + public @NotNull UIIconType getValue() { + return valueOf(name()); + } + + /** + * @return the lookup key for UI use + */ + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public String toString() { + return displayName; + } + + @Override + public @NotNull String getDisplayName() { + return displayName; + } + + @Override + public void updatePreference(Enum newValue) { + AppPreferences.iconTheme.set(newValue.equals(CLASSIC) ? "Classic" : "Rod Takehara"); + } + } + + public enum WalkerMetric implements LocalEnumListItem.EnumPreferenceItem { + NO_DIAGONALS(), + MANHATTAN(), + ONE_TWO_ONE(), + ONE_ONE_ONE(); + + private final String displayName; + private final String i18nKey; + + WalkerMetric() { + i18nKey = "WalkerMetric." + name(); + displayName = I18N.getString(i18nKey); + } + + /** + * @return the value used by the preference. + */ + @Override + public @NotNull WalkerMetric getValue() { + return valueOf(name()); + } + + /** + * @return the lookup key for UI use + */ + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public @NotNull String getDisplayName() { + return displayName; + } + + @Override + public void updatePreference(Enum newValue) { + AppPreferences.movementMetric.set( + net.rptools.maptool.client.walker.WalkerMetric.valueOf(newValue.name())); + } + } + + public enum GridType implements LocalEnumListItem.EnumPreferenceItem { + HEX_HORI(GridFactory.HEX_HORI, "Preferences.combo.maps.grid.hexHori"), + HEX_VERT(GridFactory.HEX_VERT, "Preferences.combo.maps.grid.hexVert"), + NONE(GridFactory.NONE, "MapPropertiesDialog.image.noGrid"), + SQUARE(GridFactory.SQUARE, "Preferences.combo.maps.grid.square"), + ISOMETRIC(GridFactory.ISOMETRIC, "Preferences.combo.maps.grid.isometric"); + + private final String i18nKey; + private final String type; + private final String displayName; + + GridType(String type, String key) { + this.type = type; + i18nKey = key; + this.displayName = I18N.getText(i18nKey); + } + + @Override + public void updatePreference(Enum newValue) { + AppPreferences.defaultGridType.set(valueOf(newValue.name()).type); + } + + /** + * @return the value used by the preference. + */ + @Override + public @NotNull GridType getValue() { + return valueOf(name()); + } + + /** + * @return the key to look up the localised display value + */ + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public @NotNull String getDisplayName() { + return displayName; + } + } + + /** The vision type (OFF, DAY, NIGHT). */ + public enum VisionType implements LocalEnumListItem.EnumPreferenceItem { + OFF(), + DAY(), + NIGHT(); + + private final String displayName; + private final String i18nKey; + + VisionType() { + i18nKey = "visionType." + name(); + displayName = I18N.getString(i18nKey); + } + + /** + * @return the value used by the preference. + */ + @Override + public @NotNull VisionType getValue() { + return valueOf(name()); + } + + /** + * @return the key to look up the localised display value + */ + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public @NotNull String getDisplayName() { + return displayName; + } + + @Override + public void updatePreference(Enum newValue) { + AppPreferences.defaultVisionType.set(valueOf(VisionType.class, newValue.name())); + } + } +} diff --git a/src/main/java/net/rptools/maptool/client/AppPreferences.java b/src/main/java/net/rptools/maptool/client/AppPreferences.java index 1dbcd35a3a..c09b81dbf6 100644 --- a/src/main/java/net/rptools/maptool/client/AppPreferences.java +++ b/src/main/java/net/rptools/maptool/client/AppPreferences.java @@ -22,7 +22,6 @@ import net.rptools.maptool.language.I18N; import net.rptools.maptool.model.GridFactory; import net.rptools.maptool.model.Label; -import net.rptools.maptool.model.Zone; import net.rptools.maptool.util.preferences.Preference; import net.rptools.maptool.util.preferences.PreferenceStore; @@ -40,8 +39,8 @@ public static PreferenceStore getAppPreferenceStore() { public static final Preference fillSelectionBox = store.defineBoolean( "fillSelectionBox", - "Preferences.label.performance.fillselection", - "Preferences.label.performance.fillselection.tooltip", + "Preferences.label.performance.fillSelection", + "Preferences.label.performance.fillSelection.tooltip", true); public static final Preference chatColor = @@ -99,8 +98,8 @@ public static PreferenceStore getAppPreferenceStore() { public static final Preference mapVisibilityWarning = store.defineBoolean( "mapVisibilityWarning", - "Preferences.label.fog.mapvisibilitywarning", - "Preferences.label.fog.mapvisibilitywarning.tooltip", + "Preferences.label.fog.mapVisibilityWarning", + "Preferences.label.fog.mapVisibilityWarning.tooltip", false); public static final Preference autoRevealVisionOnGMMovement = @@ -197,8 +196,8 @@ public static PreferenceStore getAppPreferenceStore() { public static final Preference suppressToolTipsForMacroLinks = store.defineBoolean( "suppressToolTipsMacroLinks", - "Preferences.label.chat.macrolinks", - "Preferences.label.chat.macrolinks.tooltip", + "Preferences.label.chat.macroLinks", + "Preferences.label.chat.macroLinks.tooltip", false); public static final Preference chatNotificationColor = @@ -251,8 +250,8 @@ public static PreferenceStore getAppPreferenceStore() { (Preference.Numeric) store .defineInteger("portraitSize", 175) - .setLabel("Preferences.label.tokens.statsheet") - .setTooltip("Preferences.label.tokens.statsheet.tooltip"); + .setLabel("Preferences.label.tokens.statSheet") + .setTooltip("Preferences.label.tokens.statSheet.tooltip"); public static final Preference.Numeric thumbnailSize = store.defineInteger("thumbnailSize", 500); @@ -351,9 +350,12 @@ public static PreferenceStore getAppPreferenceStore() { .setLabel("Preferences.label.maps.vision") .setTooltip("Preferences.label.maps.vision.tooltip"); - public static final Preference defaultVisionType = + public static final Preference defaultVisionType = store - .defineEnum(Zone.VisionType.class, "defaultVisionType", Zone.VisionType.OFF) + .defineEnum( + AppPreferenceEnums.VisionType.class, + "defaultVisionType", + AppPreferenceEnums.VisionType.OFF) .setLabel("Preferences.label.maps.light") .setTooltip("Preferences.label.maps.light.tooltip"); @@ -584,15 +586,15 @@ public static PreferenceStore getAppPreferenceStore() { public static final Preference showStatSheet = store.defineBoolean( "showStatSheet", - "Preferences.label.tokens.statsheet.mouse", - "Preferences.label.tokens.statsheet.mouse.tooltip", + "Preferences.label.tokens.statSheet.mouse", + "Preferences.label.tokens.statSheet.mouse.tooltip", true); public static final Preference showStatSheetRequiresModifierKey = store.defineBoolean( "showStatSheetModifier", - "Preferences.label.tokens.statsheet.shift", - "Preferences.label.tokens.statsheet.shift.tooltip", + "Preferences.label.tokens.statSheet.shift", + "Preferences.label.tokens.statSheet.shift.tooltip", false); public static final Preference showPortrait = @@ -612,8 +614,8 @@ public static PreferenceStore getAppPreferenceStore() { public static final Preference fitGmView = store.defineBoolean( "fitGMView", - "Preferences.label.client.fitview", - "Preferences.label.client.fitview.tooltip", + "Preferences.label.client.fitView", + "Preferences.label.client.fitView.tooltip", true); public static final Preference defaultUserName = @@ -713,8 +715,8 @@ public static PreferenceStore getAppPreferenceStore() { public static final Preference initiativePanelHidesNpcs = store.defineBoolean( "initHideNpcs", - "Preferences.label.initiative.hidenpc", - "Preferences.label.initiative.hidenpc.tooltip", + "Preferences.label.initiative.hideNPC", + "Preferences.label.initiative.hideNPC.tooltip", false); public static final Preference initiativePanelAllowsOwnerPermissions = @@ -757,8 +759,8 @@ public static PreferenceStore getAppPreferenceStore() { public static final Preference iconTheme = store .defineString("iconTheme", "Rod Takehara") - .setLabel("Label.icontheme") - .setTooltip("Preferences.label.icontheme.tooltip"); + .setLabel("Label.iconTheme") + .setTooltip("Preferences.label.iconTheme.tooltip"); public static final Preference useCustomThemeFontProperties = store.defineBoolean( diff --git a/src/main/java/net/rptools/maptool/client/ClientMessageHandler.java b/src/main/java/net/rptools/maptool/client/ClientMessageHandler.java index 0278b07602..6dd8f6bce2 100644 --- a/src/main/java/net/rptools/maptool/client/ClientMessageHandler.java +++ b/src/main/java/net/rptools/maptool/client/ClientMessageHandler.java @@ -27,6 +27,7 @@ import javax.swing.SwingUtilities; import net.rptools.clientserver.simple.MessageHandler; import net.rptools.lib.MD5Key; +import net.rptools.maptool.client.AppPreferenceEnums.VisionType; import net.rptools.maptool.client.events.PlayerStatusChanged; import net.rptools.maptool.client.functions.ExecFunction; import net.rptools.maptool.client.functions.MacroLinkFunction; @@ -53,7 +54,6 @@ import net.rptools.maptool.model.TextMessage; import net.rptools.maptool.model.Token; import net.rptools.maptool.model.Zone; -import net.rptools.maptool.model.Zone.VisionType; import net.rptools.maptool.model.ZonePoint; import net.rptools.maptool.model.drawing.Drawable; import net.rptools.maptool.model.drawing.DrawnElement; @@ -562,7 +562,7 @@ private void handle(SetVisionTypeMsg msg) { EventQueue.invokeLater( () -> { var zoneGUID = GUID.valueOf(msg.getZoneGuid()); - VisionType visionType = VisionType.valueOf(msg.getVision().name()); + VisionType visionType = AppPreferenceEnums.VisionType.valueOf(msg.getVision().name()); var zone = client.getCampaign().getZone(zoneGUID); if (zone != null) { zone.setVisionType(visionType); diff --git a/src/main/java/net/rptools/maptool/client/ServerCommandClientImpl.java b/src/main/java/net/rptools/maptool/client/ServerCommandClientImpl.java index b1429fca94..50728a664f 100644 --- a/src/main/java/net/rptools/maptool/client/ServerCommandClientImpl.java +++ b/src/main/java/net/rptools/maptool/client/ServerCommandClientImpl.java @@ -25,10 +25,10 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; import net.rptools.lib.MD5Key; +import net.rptools.maptool.client.AppPreferenceEnums.VisionType; import net.rptools.maptool.client.functions.ExecFunction; import net.rptools.maptool.client.functions.MacroLinkFunction; import net.rptools.maptool.model.*; -import net.rptools.maptool.model.Zone.VisionType; import net.rptools.maptool.model.drawing.Drawable; import net.rptools.maptool.model.drawing.DrawnElement; import net.rptools.maptool.model.drawing.Pen; diff --git a/src/main/java/net/rptools/maptool/client/functions/MapFunctions.java b/src/main/java/net/rptools/maptool/client/functions/MapFunctions.java index 1c77c55446..f7b9bfea5c 100644 --- a/src/main/java/net/rptools/maptool/client/functions/MapFunctions.java +++ b/src/main/java/net/rptools/maptool/client/functions/MapFunctions.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; +import net.rptools.maptool.client.AppPreferenceEnums; import net.rptools.maptool.client.AppPreferences; import net.rptools.maptool.client.MapTool; import net.rptools.maptool.client.MapToolUtil; @@ -200,7 +201,7 @@ public Object childEvaluate( } if (config.has("vision type")) { newMap.setVisionType( - Zone.VisionType.valueOf( + AppPreferenceEnums.VisionType.valueOf( config.getAsJsonPrimitive("vision type").getAsString().toUpperCase())); } if (config.has("vision distance")) { @@ -404,10 +405,15 @@ public Object childEvaluate( throw new ParserException(I18N.getText("macro.function.map.none", functionName)); } switch (parameters.get(0).toString().toLowerCase()) { - case "off" -> MapTool.serverCommand().setVisionType(currentZR.getId(), Zone.VisionType.OFF); - case "day" -> MapTool.serverCommand().setVisionType(currentZR.getId(), Zone.VisionType.DAY); + case "off" -> + MapTool.serverCommand() + .setVisionType(currentZR.getId(), AppPreferenceEnums.VisionType.OFF); + case "day" -> + MapTool.serverCommand() + .setVisionType(currentZR.getId(), AppPreferenceEnums.VisionType.DAY); case "night" -> - MapTool.serverCommand().setVisionType(currentZR.getId(), Zone.VisionType.NIGHT); + MapTool.serverCommand() + .setVisionType(currentZR.getId(), AppPreferenceEnums.VisionType.NIGHT); default -> throw new ParserException( I18N.getText("macro.function.general.argumentTypeInvalid", functionName)); diff --git a/src/main/java/net/rptools/maptool/client/swing/GenericDialog.java b/src/main/java/net/rptools/maptool/client/swing/GenericDialog.java index 1744aa616d..37ff1fff33 100644 --- a/src/main/java/net/rptools/maptool/client/swing/GenericDialog.java +++ b/src/main/java/net/rptools/maptool/client/swing/GenericDialog.java @@ -23,20 +23,23 @@ import java.util.List; import javax.swing.*; import net.rptools.maptool.client.MapTool; +import net.rptools.maptool.client.ui.theme.RessourceManager; import net.rptools.maptool.language.I18N; public class GenericDialog extends JDialog { public static final String AFFIRM = ButtonPanel.AFFIRMATIVE_BUTTON; public static final String DENY = ButtonPanel.CANCEL_BUTTON; - private Dimension _preferredSize = null; - private boolean hasBeenShown; + private boolean hasPositionedItself; private String _dialogResult = ButtonPanel.CANCEL_BUTTON; - protected final Resizable _resizable; private final JComponent _contentPane = new JPanel(); - private JComponent _content = new JPanel(); + private JComponent _mainContent = new JPanel(); + private JComponent _header = new JPanel(); + private JComponent _navPane = new JPanel(); + private JComponent _sideBarPane = new JPanel(); + private JComponent _toolbar = new JToolBar(); private final JScrollPane _scrollPane = new JScrollPane(); - private ScrollableButtonPanel _buttonPanel; - private boolean _usingAbeillePanel = false; + private ButtonPanel _buttonPanel; + private final List> abeillePanelList = new ArrayList<>(); private ActionListener _onCloseAction; private ActionListener _onShowAction; @@ -48,9 +51,7 @@ public static GenericDialogFactory getFactory() { public GenericDialog() { super(MapTool.getFrame()); super.setContentPane(_contentPane); - initComponents(); - - this._resizable = + Resizable _resizable = new Resizable(getRootPane()) { public void resizing(int resizeDir, int newX, int newY, int newW, int newH) { Container container = GenericDialog.this.getContentPane(); @@ -60,13 +61,18 @@ public void resizing(int resizeDir, int newX, int newY, int newW, int newH) { } } }; - this._resizable.setResizeCornerSize(18); - this._resizable.setResizableCorners(Resizable.LOWER_LEFT | Resizable.LOWER_RIGHT); + _resizable.setResizeCornerSize(18); + _resizable.setResizableCorners(Resizable.LOWER_LEFT | Resizable.LOWER_RIGHT); super.setResizable(true); - this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + + getToolbar().setVisible(false); + getNavPane().setVisible(false); + getSideBarPane().setVisible(false); + getHeader().setVisible(false); - this.addWindowListener( + addWindowListener( new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { @@ -81,84 +87,106 @@ public GenericDialog(String title, JPanel panel) { public GenericDialog(String title, JComponent panel, boolean modal) { this(); - this.setDialogTitle(title); - this.setModal(modal); - this.setContent(panel); + setDialogTitle(title); + setModal(modal); + setContent(panel); } - protected void initComponents() { - JideBoxLayout layout = new JideBoxLayout(this.getContentPane(), JideBoxLayout.PAGE_AXIS); - this.getContentPane().setLayout(layout); - this._scrollPane.setViewportView(this.getContent()); - this.getContentPane().add(this._scrollPane, JideBoxLayout.VARY); - this.getContentPane().add(this.getButtonPanel(), JideBoxLayout.FIX); + protected void layoutComponents() { + getScrollPane().setViewportView(getContentPanel()); + getContentPane().setLayout(new BorderLayout()); + getContentPane().add(getToolbar(), BorderLayout.BEFORE_FIRST_LINE); + getContentPane().add(getHeader(), BorderLayout.NORTH); + getContentPane().add(getNavPane(), BorderLayout.WEST); + getContentPane().add(getScrollPane(), BorderLayout.CENTER); + getContentPane().add(getSideBarPane(), BorderLayout.EAST); + getContentPane().add(getButtonPanel(), BorderLayout.SOUTH); } @Override public JComponent getContentPane() { - return _contentPane; + return this._contentPane; } - public JComponent getContent() { - return _content; + public JComponent getToolbar() { + return this._toolbar; + } + + public JComponent getHeader() { + return this._header; + } + + public JComponent getContentPanel() { + return this._mainContent; + } + + public JComponent getSideBarPane() { + return this._sideBarPane; + } + + public JComponent getNavPane() { + return this._navPane; + } + + public JScrollPane getScrollPane() { + return this._scrollPane; } @SuppressWarnings("UnusedReturnValue") public ButtonPanel getButtonPanel() { if (this._buttonPanel == null) { - this._buttonPanel = new ScrollableButtonPanel() {}; + this._buttonPanel = new ScrollableButtonPanel(); this._buttonPanel.setSizeConstraint(ButtonPanel.NO_LESS_THAN); - this._buttonPanel.setBorder(UIManager.getDefaults().getBorder("DesktopIcon.border")); + this._buttonPanel.setBorder( + BorderFactory.createCompoundBorder( + new PartialLineBorder( + UIManager.getDefaults().getColor("windowBorder"), 1, PartialLineBorder.NORTH), + BorderFactory.createEmptyBorder(4, 6, 6, 6))); } return this._buttonPanel; } @SuppressWarnings("UnusedReturnValue") public void setDefaultButton(ButtonKind buttonKind) { - JButton button = (JButton) this._buttonPanel.getButtonByName(buttonKind.name); + JButton button = (JButton) getButtonPanel().getButtonByName(buttonKind.name); if (button == null) { - this.addButton(buttonKind); - button = (JButton) this._buttonPanel.getButtonByName(buttonKind.name); + addButton(buttonKind); + button = (JButton) getButtonPanel().getButtonByName(buttonKind.name); } - this.getRootPane().setDefaultButton(button); - } - - public void addButton(AbstractButton button, Object constraints, int index) { - this._buttonPanel.addButton(button, constraints, index); + getRootPane().setDefaultButton(button); } - public void addButton(AbstractButton button, Object constraints) { - this.addButton(button, constraints, -1); + public void setButtonOrder(String buttonOrder) { + getButtonPanel().setButtonOrder(buttonOrder); } - public void addButton(AbstractButton button, ActionListener l) { - this.addButton(button, l, ButtonPanel.AFFIRMATIVE_BUTTON); + public void setOppositeButtonOrder(String buttonOrder) { + getButtonPanel().setOppositeButtonOrder(buttonOrder); } - public void addButton(AbstractButton button, ActionListener l, Object constraints) { - button.addActionListener(l); - this.addButton(button, constraints, -1); + public void addNonButton(Component c, Object constraints, int index) { + getButtonPanel().add(c, constraints, index); } - public void addButton(AbstractButton button) { - this.addButton(button, ButtonPanel.AFFIRMATIVE_BUTTON); + public void addButton(AbstractButton button, Object constraints, int index) { + getButtonPanel().addButton(button, constraints, index); } public void addButton(ButtonKind buttonKind) { - this.addButton(buttonKind, null, null); + addButton(buttonKind, null, null); } public void addButton(ButtonKind buttonKind, Action action) { - this.addButton(buttonKind, action, null); + addButton(buttonKind, action, null); } public void addButton(ButtonKind buttonKind, ActionListener listener) { - this.addButton(buttonKind, null, listener); + addButton(buttonKind, null, listener); } public void addButton(ButtonKind buttonKind, Action action, ActionListener listener) { // check button exists - AbstractButton b = (AbstractButton) _buttonPanel.getButtonByName(buttonKind.name); + AbstractButton b = (AbstractButton) getButtonPanel().getButtonByName(buttonKind.name); boolean needNewButton = b == null; if (needNewButton) { b = new JButton(buttonKind.i18nText); @@ -192,63 +220,128 @@ public void actionPerformed(ActionEvent e) { b.addActionListener(listener); } if (needNewButton) { - this._buttonPanel.addButton(b, buttonKind.buttonPanelButtonType); + this.getButtonPanel().addButton(b, buttonKind.buttonPanelButtonType); } } - public void addNonButton(Component c, Object constraints, int index) { - this._buttonPanel.add(c, constraints, index); + public void createOkCancelButtons() { + addButton(ButtonKind.OK); + addButton(ButtonKind.CANCEL); } - public void createOkCancelButtons() { - this.addButton(ButtonKind.OK); - this.addButton(ButtonKind.CANCEL); + public void onBeforeShow(ActionListener listener) { + _onShowAction = listener; } - public void setButtonOrder(String buttonOrder) { - this._buttonPanel.setButtonOrder(buttonOrder); + public void onBeforeClose(ActionListener listener) { + _onCloseAction = listener; } - public void setOppositeButtonOrder(String buttonOrder) { - this._buttonPanel.setOppositeButtonOrder(buttonOrder); + public void setDialogTitle(String title) { + super.setTitle(title); } - public void onBeforeShow(ActionListener listener) { - this._onShowAction = listener; + public void setToolbar(JComponent toolbarContent) { + if (toolbarContent instanceof JToolBar toolbar) { + this._toolbar = toolbar; + } else { + this._toolbar.add(toolbarContent); + } + this._toolbar.setVisible(true); + this._toolbar.setMinimumSize( + new Dimension(this.getPreferredSize().width, RessourceManager.smallIconSize)); + if (toolbarContent instanceof AbeillePanel panel) { + abeillePanelList.add(panel); + } + this.getContentPane() + .setBorder( + new PartialLineBorder( + UIManager.getDefaults().getColor("windowBorder"), 1, PartialLineBorder.NORTH)); } - public void onBeforeClose(ActionListener listener) { - this._onCloseAction = listener; + public void setHeader(JComponent headerContent) { + this._header = headerContent; + this._header.setVisible(true); + if (headerContent instanceof AbeillePanel panel) { + abeillePanelList.add(panel); + } } - public void setDialogTitle(String title) { - super.setTitle(title); + @SuppressWarnings("unused") + public void setNavPane(JComponent navContent) { + this._navPane = navContent; + this._navPane.setVisible(true); + if (navContent instanceof AbeillePanel panel) { + abeillePanelList.add(panel); + } } - public void setContent(JComponent content) { - this._content = content; - this._usingAbeillePanel = content instanceof AbeillePanel; - this._scrollPane.setViewportView(content); + @SuppressWarnings("unused") + public void setSideBarPane(JComponent sideBarContent) { + this._sideBarPane = sideBarContent; + this._sideBarPane.setVisible(true); + if (sideBarContent instanceof AbeillePanel panel) { + abeillePanelList.add(panel); + } + } + + public void setContent(JComponent mainContent) { + this._mainContent = mainContent; + if (mainContent instanceof AbeillePanel panel) { + abeillePanelList.add(panel); + } + this._scrollPane.setViewportView(mainContent); + + // ESCAPE cancels the window without committing + mainContent + .getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) + .put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "close"); + mainContent + .getActionMap() + .put( + "close", + new AbstractAction() { + public void actionPerformed(ActionEvent e) { + closeDialog(); + } + }); } public AbstractButton getOKButton() { - return this.getButton(ButtonKind.OK); + return getButton(ButtonKind.OK); } public AbstractButton getCancelButton() { - return this.getButton(ButtonKind.CANCEL); + return getButton(ButtonKind.CANCEL); + } + + public void closeDialog() { + if (_onCloseAction != null) { + _onCloseAction.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "close")); + } + if (!abeillePanelList.isEmpty()) { + for (AbeillePanel panel : abeillePanelList) { + if (panel.getModel() != null && getDialogResult().equals(AFFIRM)) { + panel.commit(); + } + if (getDefaultCloseOperation() == DISPOSE_ON_CLOSE) { + panel.unbind(); + } + } + } + super.setVisible(false); } public AbstractButton getButton(ButtonKind buttonKind) { - return (AbstractButton) this._buttonPanel.getButtonByName(buttonKind.name); + return (AbstractButton) getButtonPanel().getButtonByName(buttonKind.name); } protected void setDialogResult(String result) { - this._dialogResult = result; + _dialogResult = result; } public String getDialogResult() { - return this._dialogResult; + return _dialogResult; } private Dimension getMaxScreenSize() { @@ -259,49 +352,28 @@ private Dimension getMaxScreenSize() { bounds.width - insets.left - insets.right, bounds.height - insets.top - insets.bottom); } - private List getAllComponents(Container c) { - List listOut = new ArrayList<>(); - Component[] components = c.getComponents(); - for (Component _c : components) { - listOut.add(_c); - if (_c instanceof Container c_) { - listOut.addAll(getAllComponents(c_)); - } - } - return listOut; - } - @Override public Dimension getPreferredSize() { - // for (Component c : getAllComponents(this)) { - // System.out.println(c.getName() + c.getPreferredSize()); - // } - int scrollBarSize = UIManager.getDefaults().getInt("ScrollBar.width"); - Dimension frameSize = MapTool.getFrame().getSize(); Dimension superPref = super.getPreferredSize(); superPref = new Dimension(superPref.width + 2 * scrollBarSize, superPref.height + scrollBarSize); Dimension screenMax = getMaxScreenSize(); return new Dimension( - Math.min(Math.min(superPref.width, screenMax.width), frameSize.width), - Math.min(Math.min(superPref.height, screenMax.height), frameSize.height)); + Math.min(superPref.width, screenMax.width), Math.min(superPref.height, screenMax.height)); } @Override public Dimension getMaximumSize() { Dimension superMax = super.getMaximumSize(); Dimension screenMax = getMaxScreenSize(); - Dimension frameSize = MapTool.getFrame().getSize(); return new Dimension( - Math.min(Math.min(superMax.width, screenMax.width), frameSize.width), - Math.min(Math.min(superMax.height, screenMax.height), frameSize.height)); + Math.min(superMax.width, screenMax.width), Math.min(superMax.height, screenMax.height)); } @Override public void setMaximumSize(Dimension maximumSize) { Dimension screenMax = getMaxScreenSize(); - // limit size to screen size super.setMaximumSize( new Dimension( Math.min(maximumSize.width, screenMax.width), @@ -309,68 +381,45 @@ public void setMaximumSize(Dimension maximumSize) { } public String showDialogWithReturnValue() { - // have to be modal to return a result if (!isModal()) { - this.setModal(true); + setModal(true); } - showDialog(); + setVisible(true); return this.getDialogResult(); } public void showDialog() { - // things to do when first displayed - if (!this.hasBeenShown) { - this.invalidate(); - this.pack(); - // tie escape key to dialogue close - this._content - .getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) - .put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel"); - this._content - .getActionMap() - .put( - "cancel", - new AbstractAction() { - public void actionPerformed(ActionEvent e) { - setDialogResult(GenericDialog.DENY); - closeDialog(); - } - }); - // if not set, and there is only one button, make it the default. - if (this.getRootPane().getDefaultButton() == null - && _buttonPanel.getComponents().length == 1) { - this.getRootPane().setDefaultButton((JButton) _buttonPanel.getComponents()[0]); - } - // Center the dialogue over its parent - SwingUtil.centerOver(this, this.getOwner()); - this.hasBeenShown = true; - } - // set off the onShowAction if present - if (this._onShowAction != null) { - this._onShowAction.actionPerformed( - new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "show")); - } - // let it be seen - super.setVisible(true); + setVisible(true); + _scrollPane.requestFocus(); } - public void closeDialog() { - if (this._usingAbeillePanel && ((AbeillePanel) this._content).getModel() != null) { - // wrap up any AbeillePanel commits and unbinding - if (this.getDialogResult().equals(AFFIRM)) { - ((AbeillePanel) _content).commit(); + @Override + public void setVisible(boolean visible) { + if (visible) { + layoutComponents(); + getRootPane().invalidate(); + // We want to center over our parent, but only the first time. + // If this dialog is reused, we want it to show up where it was last. + pack(); + if (!hasPositionedItself) { + positionInitialView(); + hasPositionedItself = true; } - ((AbeillePanel) _content).unbind(); - } - // set off the onCloseAction if present - if (this._onCloseAction != null) { - this._onCloseAction.actionPerformed( - new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "close")); - } - // hide or dispose as appropriate - switch (getDefaultCloseOperation()) { - case DISPOSE_ON_CLOSE, EXIT_ON_CLOSE -> this.dispose(); - case HIDE_ON_CLOSE -> super.setVisible(false); + if (_onShowAction != null) { + _onShowAction.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "show")); + revalidate(); + } + if (getRootPane().getDefaultButton() == null + && getButtonPanel().getComponents().length == 1) { + getRootPane().setDefaultButton((JButton) getButtonPanel().getComponents()[0]); + } + super.setVisible(true); + } else { + super.setVisible(false); } } + + protected void positionInitialView() { + SwingUtil.centerOver(this, getOwner()); + } } diff --git a/src/main/java/net/rptools/maptool/client/swing/GenericDialogFactory.java b/src/main/java/net/rptools/maptool/client/swing/GenericDialogFactory.java index 2772ff7680..6b7c0dc08b 100644 --- a/src/main/java/net/rptools/maptool/client/swing/GenericDialogFactory.java +++ b/src/main/java/net/rptools/maptool/client/swing/GenericDialogFactory.java @@ -14,6 +14,7 @@ */ package net.rptools.maptool.client.swing; +import com.jidesoft.dialog.ButtonPanel; import java.awt.*; import java.awt.event.ActionListener; import javax.swing.*; @@ -138,8 +139,31 @@ public GenericDialogFactory setDialogTitle(String title) { } @SuppressWarnings("UnusedReturnValue") - public GenericDialogFactory setContent(JComponent content) { - delegate.setContent(content); + public GenericDialogFactory setToolbar(JComponent toolbarContent) { + delegate.setToolbar(toolbarContent); + return this; + } + + public GenericDialogFactory setHeader(JComponent headerContent) { + delegate.setHeader(headerContent); + return this; + } + + @SuppressWarnings("UnusedReturnValue") + public GenericDialogFactory setContent(JComponent mainContent) { + delegate.setContent(mainContent); + return this; + } + + @SuppressWarnings("UnusedReturnValue") + public GenericDialogFactory setNavPane(JComponent navContent) { + delegate.setNavPane(navContent); + return this; + } + + @SuppressWarnings({"UnusedReturnValue", "unused"}) + public GenericDialogFactory setSideBar(JComponent sideBarContent) { + delegate.setSideBarPane(sideBarContent); return this; } @@ -149,6 +173,11 @@ public GenericDialogFactory setDialogResult(String string) { return this; } + @SuppressWarnings("unused") + public ButtonPanel getButtonPanel() { + return delegate.getButtonPanel(); + } + @SuppressWarnings("UnusedReturnValue") public GenericDialogFactory display() { delegate.showDialog(); @@ -177,6 +206,21 @@ public String closeDialog() { return result; } + @SuppressWarnings("unused") + public JComponent getSideBarPane() { + return delegate.getSideBarPane(); + } + + @SuppressWarnings("unused") + public JComponent getNavPane() { + return delegate.getNavPane(); + } + + @SuppressWarnings("unused") + public JScrollPane getScrollPane() { + return delegate.getScrollPane(); + } + public JButton getDefaultButton() { return delegate.getRootPane().getDefaultButton(); } diff --git a/src/main/java/net/rptools/maptool/client/swing/searchable/SearchWords.java b/src/main/java/net/rptools/maptool/client/swing/searchable/SearchWords.java new file mode 100644 index 0000000000..3b2a3d660a --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/swing/searchable/SearchWords.java @@ -0,0 +1,21 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.swing.searchable; + +import java.util.List; + +public interface SearchWords { + public List getSearchWords(); +} diff --git a/src/main/java/net/rptools/maptool/client/swing/searchable/SearchableBarEx.java b/src/main/java/net/rptools/maptool/client/swing/searchable/SearchableBarEx.java new file mode 100644 index 0000000000..59909f3c6d --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/swing/searchable/SearchableBarEx.java @@ -0,0 +1,926 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.swing.searchable; + +import com.formdev.flatlaf.extras.components.FlatButton; +import com.formdev.flatlaf.extras.components.FlatPopupMenuSeparator; +import com.formdev.flatlaf.extras.components.FlatTextField; +import com.formdev.flatlaf.extras.components.FlatToggleButton; +import com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon; +import com.formdev.flatlaf.icons.FlatSearchIcon; +import com.jidesoft.plaf.UIDefaultsLookup; +import com.jidesoft.popup.JidePopup; +import com.jidesoft.popup.JidePopupFactory; +import com.jidesoft.swing.*; +import com.jidesoft.swing.event.SearchableEvent; +import java.awt.*; +import java.awt.event.*; +import java.util.*; +import java.util.List; +import javax.swing.*; +import javax.swing.Timer; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import net.rptools.maptool.client.ui.theme.Icons; +import net.rptools.maptool.client.ui.theme.RessourceManager; +import net.rptools.maptool.client.ui.theme.ThemeSupport; +import net.rptools.maptool.language.I18N; +import net.rptools.maptool.model.localisedObject.LocalObject; + +public class SearchableBarEx extends JToolBar implements SearchableProvider { + + private static final ImageIcon ICON_CASE = RessourceManager.getSmallIcon(Icons.ACTION_TEXT_CASE); + private static final ImageIcon ICON_HIGHLIGHT = + RessourceManager.getSmallIcon(Icons.ACTION_TEXT_HIGHLIGHT); + private static final ImageIcon ICON_NEXT = + RessourceManager.getSmallIcon(Icons.STATUSBAR_RECEIVE_ON); + private static final ImageIcon ICON_PREV = + RessourceManager.getSmallIcon(Icons.STATUSBAR_TRANSMIT_ON); + private static final ImageIcon ICON_RECURSIVE = + RessourceManager.getSmallIcon(Icons.ACTION_RECURSIVE); + private static final ImageIcon ICON_REGEX = + RessourceManager.getSmallIcon(Icons.ACTION_TEXT_REGEX); + private static final ImageIcon ICON_WORDS = RessourceManager.getSmallIcon(Icons.WINDOW_LIBRARY); + + private final SearchableEx _searchable; + private int _menuInsertPoint = 0; + protected JLabel _statusLabel; + protected JLabel _leadingLabel; + protected JTextField _searchTextField; + // protected JComboBox _comboBox; + + protected AbstractButton _closeButton; + protected AbstractButton _findPrevButton; + protected AbstractButton _findNextButton; + protected AbstractButton _highlightsToggle; + protected AbstractButton _matchCaseToggle; + protected AbstractButton _wholeWordsToggle; + protected AbstractButton _repeatToggle; + protected AbstractButton _regexToggle; + protected JideSplitButton _dropDown; + + @SuppressWarnings("unused") + public static final int SHOW_CLOSE = 1; + + @SuppressWarnings("unused") + public static final int SHOW_NAVIGATION = 2; + + @SuppressWarnings("unused") + public static final int SHOW_HIGHLIGHTS = 4; + + @SuppressWarnings({"unused", "SpellCheckingInspection"}) + public static final int SHOW_MATCHCASE = 8; + + @SuppressWarnings("unused") + public static final int SHOW_REPEATS = 16; + + @SuppressWarnings("unused") + public static final int SHOW_STATUS = 32; + + @SuppressWarnings("unused") + public static final int SHOW_WHOLE_WORDS = 64; + + @SuppressWarnings("unused") + public static final int SHOW_REGEX = 128; + + @SuppressWarnings("unused") + public static final int SHOW_ALL = -1; + + @SuppressWarnings("unused") + public static final String PROPERTY_MAX_HISTORY_LENGTH = "maxHistoryLength"; + + private int _visibleButtons; + private boolean _compact; + private boolean _showMatchCount; + private JidePopup _messagePopup; + private MouseMotionListener _mouseMotionListener; + private KeyListener _keyListener; + private final List _searchHistory = new ArrayList<>(); + private int _maxHistoryLength; + private int _previousCursor; + private static final Color DEFAULT_MISMATCH_BACKGROUND = + ThemeSupport.getThemeColor(ThemeSupport.ThemeColor.YELLOW); + private Color _mismatchBackground; + private SearchableBarEx.Installer _installer; + + public SearchableBarEx(SearchableEx searchable) { + this(searchable, "", false); + } + + @SuppressWarnings("unused") + public SearchableBarEx(SearchableEx searchable, boolean compact) { + this(searchable, "", compact); + } + + public SearchableBarEx(SearchableEx searchable, String initialText, boolean compact) { + this._visibleButtons = -17; + this._showMatchCount = false; + this._maxHistoryLength = 18; + this._previousCursor = -1; + this.setFloatable(false); + this.setRollover(true); + this._searchable = searchable; + setSearchingText(searchable.getSearchingText()); + this._searchable.addSearchableListener( + e -> { + if (e.getID() == 3005 + && SearchableBarEx.this._searchable.getSearchingText() != null + && !SearchableBarEx.this._searchable.getSearchingText().isBlank()) { + SearchableBarEx.this.highlightAllOrNext(); + } + }); + this._searchable.setSearchableProvider(this); + this._compact = compact; + this.initComponents(initialText); + } + + private void initComponents(String initialText) { + final AbstractAction closeAction = + new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (SearchableBarEx.this.getInstaller() != null) { + SearchableBarEx.this.getInstaller().closeSearchBar(SearchableBarEx.this); + } + } + }; + final AbstractAction findNextAction = + new AbstractAction() { + public void actionPerformed(ActionEvent e) { + SearchableBarEx.this._highlightsToggle.setSelected(false); + String text = SearchableBarEx.this.getSearchingText(); + SearchableBarEx.this.addSearchingTextToHistory(text); + int cursor = SearchableBarEx.this._searchable.getSelectedIndex(); + SearchableBarEx.this._searchable.setCursor(cursor); + int found = SearchableBarEx.this._searchable.findNext(text); + if (found == cursor) { + SearchableBarEx.this.select(found, text, false); + SearchableBarEx.this.clearStatus(); + } else if (found != -1 + && SearchableBarEx.this._searchable.isRepeats() + && found <= cursor) { + SearchableBarEx.this.select(found, text, false); + SearchableBarEx.this.setStatus( + SearchableBarEx.this.getResourceString("SearchableBarEx.reachedBottomRepeat"), + SearchableBarEx.this.getImageIcon("icons/repeat.png")); + } else if (!SearchableBarEx.this._searchable.isRepeats() && found == -1) { + SearchableBarEx.this.setStatus( + SearchableBarEx.this.getResourceString("SearchableBarEx.reachedBottom"), + SearchableBarEx.this.getImageIcon("icons/error.png")); + } else if (found != -1) { + SearchableBarEx.this.select(found, text, false); + SearchableBarEx.this.clearStatus(); + if (SearchableBarEx.this._searchable.getSearchingDelay() < 0) { + SearchableBarEx.this.highlightAllOrNext(); + } + } + } + }; + final AbstractAction findPrevAction = + new AbstractAction() { + public void actionPerformed(ActionEvent e) { + SearchableBarEx.this._highlightsToggle.setSelected(false); + String text = SearchableBarEx.this.getSearchingText(); + SearchableBarEx.this.addSearchingTextToHistory(text); + int cursor = SearchableBarEx.this._searchable.getSelectedIndex(); + SearchableBarEx.this._searchable.setCursor(cursor); + int found = SearchableBarEx.this._searchable.findPrevious(text); + if (found == cursor) { + SearchableBarEx.this.select(found, text, false); + SearchableBarEx.this.clearStatus(); + } else if (found != -1 + && SearchableBarEx.this._searchable.isRepeats() + && found >= cursor) { + SearchableBarEx.this.select(found, text, false); + SearchableBarEx.this.setStatus( + SearchableBarEx.this.getResourceString("SearchableBarEx.reachedTopRepeat"), + SearchableBarEx.this.getImageIcon("icons/repeat.png")); + } else if (!SearchableBarEx.this._searchable.isRepeats() && found == -1) { + SearchableBarEx.this.setStatus( + SearchableBarEx.this.getResourceString("SearchableBarEx.reachedTop"), + SearchableBarEx.this.getImageIcon("icons/error.png")); + } else if (found != -1) { + SearchableBarEx.this.select(found, text, false); + SearchableBarEx.this.clearStatus(); + } + } + }; + this._mouseMotionListener = + new MouseMotionAdapter() { + public void mouseMoved(MouseEvent e) { + SearchableBarEx.this.hideMessage(); + } + }; + this._keyListener = + new KeyAdapter() { + public void keyTyped(KeyEvent e) { + SearchableBarEx.this.hideMessage(); + } + }; + this._closeButton = this.createCloseButton(closeAction); + this._findNextButton = this.createFindNextButton(findNextAction); + this._findPrevButton = this.createFindPrevButton(findPrevAction); + this._highlightsToggle = this.createHighlightButton(); + this._matchCaseToggle = this.createMatchCaseButton(); + this._wholeWordsToggle = this.createWholeWordsButton(); + this._repeatToggle = this.createRepeatsButton(); + this._regexToggle = this.createRegexButton(); + this._statusLabel = new JLabel(); + this._dropDown = this.createDropDown(); + this._searchTextField = this.createSearchTextField(); + getSearchTextField() + .addFocusListener( + new FocusAdapter() { + public void focusGained(FocusEvent e) { + SearchableBarEx.this._searchTextField.selectAll(); + } + }); + + getSearchTextField().setColumns(13); + // this._comboBox = this.createComboBox(); + DocumentListener listener = + new DocumentListener() { + private final Timer timer = + new Timer( + SearchableBarEx.this._searchable.getSearchingDelay(), + e -> SearchableBarEx.this.highlightAllOrNext()); + + public void insertUpdate(DocumentEvent e) { + this.startTimer(); + } + + public void removeUpdate(DocumentEvent e) { + this.startTimer(); + } + + public void changedUpdate(DocumentEvent e) { + this.startTimer(); + } + + void startTimer() { + if (SearchableBarEx.this._searchable.getSearchingDelay() > 0) { + if (this.timer.isRunning()) { + this.timer.restart(); + } else { + this.timer.setRepeats(false); + this.timer.start(); + } + } else if (SearchableBarEx.this._searchable.getSearchingDelay() == 0) { + SearchableBarEx.this.highlightAllOrNext(); + } + } + }; + getSearchTextField().getDocument().addDocumentListener(listener); + getSearchTextField().setText(initialText); + getSearchTextField().registerKeyboardAction(findNextAction, KeyStroke.getKeyStroke(40, 0), 0); + getSearchTextField().registerKeyboardAction(findNextAction, KeyStroke.getKeyStroke(10, 0), 0); + getSearchTextField().registerKeyboardAction(findPrevAction, KeyStroke.getKeyStroke(38, 0), 0); + getSearchTextField().registerKeyboardAction(closeAction, KeyStroke.getKeyStroke(27, 0), 0); + if (getSearchTextField() != null) { + (getSearchTextField()).getDocument().addDocumentListener(listener); + this.registerKeyboardActions(closeAction, findNextAction, findPrevAction); + } + + // this._comboBox.setSelectedItem(initialText); + // this._comboBox.setPreferredSize(this._searchTextField.getPreferredSize()); + this.installComponents(); + int found = this._searchable.findFromCursor(this.getSearchingText()); + if (!initialText.isBlank() && found == -1) { + this.select(found, initialText, false); + } + } + + private void registerKeyboardActions( + AbstractAction closeAction, AbstractAction findNextAction, AbstractAction findPrevAction) { + (getSearchTextField()).registerKeyboardAction(findNextAction, KeyStroke.getKeyStroke(40, 0), 0); + (getSearchTextField()).registerKeyboardAction(findNextAction, KeyStroke.getKeyStroke(10, 0), 0); + (getSearchTextField()).registerKeyboardAction(findPrevAction, KeyStroke.getKeyStroke(38, 0), 0); + (getSearchTextField()).registerKeyboardAction(closeAction, KeyStroke.getKeyStroke(27, 0), 0); + } + + private void unregisterKeyboardActions() { + (getSearchTextField()).unregisterKeyboardAction(KeyStroke.getKeyStroke(40, 0)); + (getSearchTextField()).unregisterKeyboardAction(KeyStroke.getKeyStroke(10, 0)); + (getSearchTextField()).unregisterKeyboardAction(KeyStroke.getKeyStroke(38, 0)); + (getSearchTextField()).unregisterKeyboardAction(KeyStroke.getKeyStroke(27, 0)); + } + + protected JTextField createSearchTextField() { + FlatTextField searchField = _searchable.getSearchField(); + searchField.setLeadingComponent(_dropDown); + return searchField; + } + + protected JTextField getSearchTextField() { + return this._searchTextField; + } + + protected JideSplitButton createDropDown() { + _dropDown = new JideSplitButton(new FlatSearchIcon()); + _dropDown.setEnabled(false); + _dropDown.setButtonStyle(JideSplitButton.TOOLBOX_STYLE); + return _dropDown; + } + + public void addSearchHistoryItem(String entry) { + for (int i = 0; i < getSearchHistory().size(); i++) { + JMenuItem mi = _searchHistory.get(i); + if (mi.getActionCommand().equals(entry)) { + _searchHistory.remove(mi); + if (i < _menuInsertPoint) { + _searchHistory.addFirst(mi); + mi.setFont(mi.getFont().deriveFont(Font.BOLD)); + } else { + _searchHistory.add(_menuInsertPoint - 1, mi); + } + return; + } else { + mi.setFont(mi.getFont().deriveFont(Font.PLAIN)); + } + } + JMenuItem menuItem = new JMenuItem(entry); + menuItem.setActionCommand(entry); + menuItem.addActionListener(e -> getSearchTextField().setText(e.getActionCommand())); + _dropDown.add(menuItem, _menuInsertPoint); + _dropDown.setEnabled(true); + } + + public void addPresetSearchValues(Set items) { + for (LocalObject item : items) { + addPresetSearchValue(item); + } + } + + public void addPresetSearchValue(LocalObject item) { + JMenuItem menuItem = new JMenuItem(I18N.getText(item.getI18nKey())); + menuItem.setActionCommand(item.getValue().toString()); + menuItem.addActionListener(e -> getSearchTextField().setText(e.getActionCommand())); + _dropDown.add(menuItem, 0); + if (_menuInsertPoint == 0) { + _dropDown.add(new FlatPopupMenuSeparator()); + _menuInsertPoint++; + } + _menuInsertPoint++; + _dropDown.setEnabled(true); + } + + public SearchableEx getSearchable() { + return this._searchable; + } + + protected AbstractButton createCloseButton(AbstractAction closeAction) { + FlatButton button = new FlatButton(); + button.setIcon(new FlatInternalFrameCloseIcon()); + button.addActionListener(closeAction); + button.setRolloverEnabled(true); + button.setOpaque(false); + button.setRequestFocusEnabled(false); + button.setFocusable(false); + return button; + } + + protected AbstractButton createFindNextButton(AbstractAction findNextAction) { + FlatButton button = new FlatButton(); + button.setText(isCompact() ? "" : this.getResourceString("Button.findNext")); + button.setIcon(ICON_NEXT); + button.setToolTipText(this.getResourceString("SearchableBarEx.findNext.tooltip")); + button.setMnemonic(this.getResourceString("Button.findNext.mnemonic").charAt(0)); + button.setRequestFocusEnabled(false); + button.setFocusable(false); + button.addActionListener(findNextAction); + button.setEnabled(false); + return button; + } + + protected AbstractButton createFindPrevButton(AbstractAction findPrevAction) { + FlatButton button = new FlatButton(); + button.setText(isCompact() ? "" : this.getResourceString("Button.findPrevious")); + button.setIcon(ICON_PREV); + button.setToolTipText(this.getResourceString("Button.findPrevious")); + button.setMnemonic(this.getResourceString("Button.findPrevious.mnemonic").charAt(0)); + button.setRequestFocusEnabled(false); + button.setFocusable(false); + button.addActionListener(findPrevAction); + button.setEnabled(false); + return button; + } + + protected AbstractButton createHighlightButton() { + FlatToggleButton button = new FlatToggleButton(); + button.setText(isCompact() ? "" : this.getResourceString("Button.showAll")); + button.setIcon(ICON_HIGHLIGHT); + button.setButtonType(FlatButton.ButtonType.tab); + button.setToolTipText(this.getResourceString("Button.showAll")); + button.setMnemonic(this.getResourceString("Button.showAll.mnemonic").charAt(0)); + // button.setSelectedIcon(this.getImageIcon("icons/highlightsS.png")); + // button.setDisabledIcon(this.getImageIcon("icons/highlightsD.png")); + // button.setRolloverIcon(this.getImageIcon("icons/highlightsR.png")); + // button.setRolloverSelectedIcon(this.getImageIcon("icons/highlightsRS.png")); + button.setRequestFocusEnabled(false); + button.setFocusable(false); + AbstractAction highlightAllAction = + new AbstractAction() { + public void actionPerformed(ActionEvent e) { + SearchableBarEx.this.addSearchingTextToHistory(SearchableBarEx.this.getSearchingText()); + SearchableBarEx.this.highlightAllOrNext(); + } + }; + button.addActionListener(highlightAllAction); + button.setEnabled(false); + return button; + } + + protected AbstractButton createRepeatsButton() { + FlatToggleButton button = new FlatToggleButton(); + button.setButtonType(FlatButton.ButtonType.tab); + button.setText(isCompact() ? "" : this.getResourceString("Button.showAll")); + button.setIcon(ICON_RECURSIVE); + button.setMnemonic(this.getResourceString("Button.showAll.mnemonic").charAt(0)); + button.setRequestFocusEnabled(false); + button.setFocusable(false); + button.setSelected(this.getSearchable().isRepeats()); + button.addItemListener( + e -> { + if (e.getSource() instanceof AbstractButton) { + SearchableBarEx.this + .getSearchable() + .setRepeats(((AbstractButton) e.getSource()).isSelected()); + } + }); + button.setOpaque(false); + return button; + } + + protected AbstractButton createRegexButton() { + FlatToggleButton button = new FlatToggleButton(); + button.setButtonType(FlatButton.ButtonType.tab); + button.setText(isCompact() ? "" : this.getResourceString("Button.regex")); + button.setIcon(ICON_REGEX); + button.setMnemonic(this.getResourceString("Button.regex.mnemonic").charAt(0)); + button.setRequestFocusEnabled(false); + button.setFocusable(false); + button.setSelected(this.getSearchable().isRepeats()); + button.addItemListener( + e -> { + if (e.getSource() instanceof AbstractButton) { + SearchableBarEx.this + .getSearchable() + .setWildcardEnabled(((AbstractButton) e.getSource()).isSelected()); + } + }); + button.setOpaque(false); + return button; + } + + protected AbstractButton createMatchCaseButton() { + FlatToggleButton button = new FlatToggleButton(); + button.setButtonType(FlatButton.ButtonType.tab); + button.setText(isCompact() ? "" : this.getResourceString("Button.matchCase")); + button.setIcon(ICON_CASE); + button.setMnemonic(this.getResourceString("Button.matchCase.mnemonic").charAt(0)); + button.setRequestFocusEnabled(false); + button.setFocusable(false); + button.setSelected(this.getSearchable().isCaseSensitive()); + button.addItemListener( + e -> { + if (e.getSource() instanceof AbstractButton) { + SearchableBarEx.this + .getSearchable() + .setCaseSensitive(((AbstractButton) e.getSource()).isSelected()); + SearchableBarEx.this.addSearchingTextToHistory(SearchableBarEx.this.getSearchingText()); + SearchableBarEx.this.highlightAllOrNext(); + } + }); + button.setOpaque(false); + return button; + } + + protected AbstractButton createWholeWordsButton() { + FlatToggleButton button = new FlatToggleButton(); + button.setButtonType(FlatButton.ButtonType.tab); + button.setText(isCompact() ? "" : this.getResourceString("Button.wholeWords")); + button.setIcon(ICON_WORDS); + button.setMnemonic(this.getResourceString("Button.wholeWords.mnemonic").charAt(0)); + button.setRequestFocusEnabled(false); + button.setFocusable(false); + if (this.getSearchable() instanceof WholeWordsSupport) { + button.setSelected(((WholeWordsSupport) this.getSearchable()).isWholeWords()); + } else { + button.setSelected(false); + button.setEnabled(false); + } + + button.addItemListener( + e -> { + if (e.getSource() instanceof AbstractButton + && SearchableBarEx.this.getSearchable() instanceof WholeWordsSupport) { + ((WholeWordsSupport) SearchableBarEx.this.getSearchable()) + .setWholeWords(((AbstractButton) e.getSource()).isSelected()); + SearchableBarEx.this.addSearchingTextToHistory(SearchableBarEx.this.getSearchingText()); + SearchableBarEx.this.highlightAllOrNext(); + } + }); + button.setOpaque(false); + return button; + } + + protected void installComponents() { + this.setBorder(BorderFactory.createEtchedBorder()); + this.setLayout(new JideBoxLayout(this, 0)); + this.add(Box.createHorizontalStrut(4), "fix"); + if ((this._visibleButtons & SHOW_CLOSE) != 0) { + this.add(this._closeButton); + this.add(Box.createHorizontalStrut(10)); + } + + this._leadingLabel = new JLabel(this.getResourceString("Button.find")); + this._leadingLabel.setDisplayedMnemonic( + this.getResourceString("Button.find.mnemonic").charAt(0)); + this.add(this._leadingLabel); + this.add(Box.createHorizontalStrut(2), "fix"); + this.add(JideSwingUtilities.createCenterPanel(getSearchTextField()), "fix"); + this._leadingLabel.setLabelFor(getSearchTextField()); + + this.add(Box.createHorizontalStrut(2), "fix"); + if ((this._visibleButtons & SHOW_NAVIGATION) != 0) { + this.add(this._findNextButton); + this.add(this._findPrevButton); + } + if ((this._visibleButtons & SHOW_HIGHLIGHTS) != 0) { + this.add(this._highlightsToggle); + this.add(Box.createHorizontalStrut(2)); + } + if ((this._visibleButtons & SHOW_REPEATS) != 0) { + this.add(this._repeatToggle); + } + + if ((this._visibleButtons & SHOW_MATCHCASE) != 0) { + this.add(this._matchCaseToggle); + this.add(Box.createHorizontalStrut(2)); + } + + if ((this._visibleButtons & SHOW_WHOLE_WORDS) != 0 + && this.getSearchable() instanceof WholeWordsSupport) { + this.add(this._wholeWordsToggle); + this.add(Box.createHorizontalStrut(2)); + } + + if ((this._visibleButtons & SHOW_REGEX) != 0) { + this.add(this._regexToggle); + this.add(Box.createHorizontalStrut(2)); + } + + if ((this._visibleButtons & SHOW_STATUS) != 0) { + this.add(Box.createHorizontalStrut(24)); + this.add(this._statusLabel, "vary"); + } + + this.add(Box.createHorizontalStrut(6), "fix"); + } + + public boolean isHighlightAll() { + return this._highlightsToggle.isSelected(); + } + + public void setHighlightAll(boolean highlightAll) { + this._highlightsToggle.setSelected(highlightAll); + } + + private void highlightAllOrNext() { + if (this._highlightsToggle.isSelected()) { + this._previousCursor = this._searchable.getCurrentIndex(); + this.highlightNext(); + this.highlightAll(); + } else { + if (this._previousCursor >= 0) { + this._searchable.setCursor(this._previousCursor); + this._searchable.setSelectedIndex(this._previousCursor, false); + } + + this.highlightNext(); + } + } + + private void highlightAll() { + String text = this.getSearchingText(); + if (text != null && !text.isBlank()) { + boolean old = this._searchable.isRepeats(); + this._searchable.setRepeats(false); + int index = this._searchable.findFirst(text); + if (index != -1) { + this._searchable.setSelectedIndex(index, false); + this._searchable.setCursor(index); + this._findNextButton.setEnabled(true); + this._findPrevButton.setEnabled(true); + this._highlightsToggle.setEnabled(true); + this.clearStatus(); + } else { + this.select(-1, text, false); + this._findNextButton.setEnabled(false); + this._findPrevButton.setEnabled(false); + this._highlightsToggle.setEnabled(false); + this.setStatus( + this.getResourceString("SearchableBarEx.notFound"), + this.getImageIcon("icons/error.png")); + } + + this._searchable.highlightAll(); + this._searchable.setRepeats(old); + this._searchable.setCursor(0); + } else { + this._findNextButton.setEnabled(false); + this._findPrevButton.setEnabled(false); + this._highlightsToggle.setEnabled(false); + this.select(-1, "", false); + this.clearStatus(); + } + } + + private void highlightNext() { + this._searchable.cancelHighlightAll(); + String text = this.getSearchingText(); + if (text != null && !text.isBlank()) { + int found = this._searchable.findFromCursor(text); + if (found == -1) { + this.select(-1, "", false); + this._findNextButton.setEnabled(false); + this._findPrevButton.setEnabled(false); + this._highlightsToggle.setEnabled(false); + this.setStatus( + this.getResourceString("SearchableBarEx.notFound"), + this.getImageIcon("icons/error.png")); + } else { + this.select(found, text, false); + this._findNextButton.setEnabled(true); + this._findPrevButton.setEnabled(true); + this._highlightsToggle.setEnabled(true); + this.clearStatus(); + } + + } else { + this._findNextButton.setEnabled(false); + this._findPrevButton.setEnabled(false); + this._highlightsToggle.setEnabled(false); + this.select(-1, "", false); + this.clearStatus(); + } + } + + private void clearStatus() { + this._statusLabel.setIcon(null); + getSearchTextField().setBackground(UIDefaultsLookup.getColor("TextField.background")); + getSearchTextField().setBackground(UIDefaultsLookup.getColor("TextField.background")); + if (!this.isShowMatchCount() + || getSearchTextField().getText().length() <= 0 + && (getSearchTextField()).getText().length() <= 0) { + this._statusLabel.setText(""); + } else { + this._statusLabel.setText( + this.getSearchable().getMatchCount() + + " " + + this.getResourceString("SearchableBarEx.matches")); + } + this.hideMessage(); + } + + private void setStatus(String message, Icon icon) { + this._statusLabel.setIcon(icon); + // this._statusLabel.setText(message); + // this._statusLabel.setToolTipText(message); + // if (!this._statusLabel.isShowing() || this._statusLabel.getWidth() < 25) { + this.showMessage(message); + // } + + } + + public void focusSearchField() { + if (getSearchTextField() != null && getSearchTextField().isVisible()) { + getSearchTextField().requestFocus(); + } + } + + protected void select(int index, String searchingText, boolean incremental) { + if (index != -1) { + this._searchable.setSelectedIndex(index, incremental); + this._searchable.setCursor(index, incremental); + getSearchTextField().setBackground(UIDefaultsLookup.getColor("TextField.background")); + getSearchTextField().setBackground(UIDefaultsLookup.getColor("TextField.background")); + } else { + this._searchable.setSelectedIndex(-1, false); + getSearchTextField().setBackground(this.getMismatchBackground()); + getSearchTextField().setBackground(UIDefaultsLookup.getColor("TextField.background")); + } + + this._searchable.firePropertyChangeEvent(searchingText); + if (index != -1) { + Object element = this._searchable.getElementAt(index); + this._searchable.fireSearchableEvent( + new SearchableEvent( + this._searchable, + 3002, + searchingText, + element, + this._searchable.convertElementToString(element))); + } else { + this._searchable.fireSearchableEvent( + new SearchableEvent(this._searchable, 3003, searchingText)); + } + } + + public String getSearchingText() { + if (getSearchTextField() != null && getSearchTextField().isVisible()) { + return getSearchTextField().getText(); + } else { + return ""; + } + } + + @SuppressWarnings("unused") + public void setSearchingText(String searchingText) { + if (getSearchTextField() != null && getSearchTextField().isVisible()) { + getSearchTextField().setText(searchingText); + } + } + + public boolean isPassive() { + return false; + } + + public void setMismatchForeground(Color mismatchBackground) { + this._mismatchBackground = mismatchBackground; + } + + public Color getMismatchBackground() { + return this._mismatchBackground == null + ? DEFAULT_MISMATCH_BACKGROUND + : this._mismatchBackground; + } + + public List getSearchHistory() { + return this._searchHistory == null ? new ArrayList<>() : this._searchHistory; + } + + public void setSearchHistory(String[] searchHistory) { + if (searchHistory != null && searchHistory.length != 0) { + this._searchHistory.clear(); + for (int i = Math.min(_maxHistoryLength, searchHistory.length) - 1; i >= 0; i--) { + addSearchHistoryItem(searchHistory[i]); + if (i == 0) { + getSearchTextField().setText(searchHistory[i]); + } + } + } + } + + public int getMaxHistoryLength() { + return this._maxHistoryLength; + } + + public void setMaxHistoryLength(int maxHistoryLength) { + if (this._maxHistoryLength != maxHistoryLength) { + int old = this._maxHistoryLength; + this._maxHistoryLength = maxHistoryLength; + if (this.getMaxHistoryLength() == 0) { + this._leadingLabel.setLabelFor(getSearchTextField()); + _dropDown.setEnabled(false); + } else { + _dropDown.setEnabled(true); + } + this.firePropertyChange("maxHistoryLength", old, this._maxHistoryLength); + } + } + + public boolean isShowMatchCount() { + return this._showMatchCount; + } + + public void setShowMatchCount(boolean showMatchCount) { + this._showMatchCount = showMatchCount; + if (this.getSearchable() != null) { + this.getSearchable().setCountMatch(this.isShowMatchCount()); + } + } + + public SearchableBarEx.Installer getInstaller() { + return this._installer; + } + + public void setInstaller(SearchableBarEx.Installer installer) { + this._installer = installer; + } + + public static SearchableBarEx install( + SearchableEx searchable, KeyStroke keyStroke, SearchableBarEx.Installer installer) { + final SearchableBarEx searchableBar = new SearchableBarEx(searchable); + searchableBar.setInstaller(installer); + ((JComponent) searchable.getComponent()) + .registerKeyboardAction( + new AbstractAction() { + public void actionPerformed(ActionEvent e) { + searchableBar.getInstaller().openSearchBar(searchableBar); + searchableBar.focusSearchField(); + } + }, + keyStroke, + JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + return searchableBar; + } + + public void processKeyEvent(KeyEvent e) {} + + public int getVisibleButtons() { + return this._visibleButtons; + } + + public void setVisibleButtons(int visibleButtons) { + this._visibleButtons = visibleButtons; + this.removeAll(); + this.installComponents(); + this.revalidate(); + this.repaint(); + } + + public boolean isCompact() { + return this._compact; + } + + public void setCompact(boolean compact) { + this._compact = compact; + this._findNextButton.setText( + this._compact ? "" : this.getResourceString("SearchableBarEx.findNext")); + this._highlightsToggle.setText( + this._compact ? "" : this.getResourceString("SearchableBarEx.highlights")); + this._findPrevButton.setText( + this._compact ? "" : this.getResourceString("SearchableBarEx.findPrevious")); + } + + protected ImageIcon getImageIcon(String name) { + return SearchableBarIconsFactory.getImageIcon(name); + } + + protected String getResourceString(String key) { + return I18N.getText(key); + } + + private void showMessage(String message) { + this.hideMessage(); + this._messagePopup = JidePopupFactory.getSharedInstance().createPopup(); + JLabel label = new JLabel(message); + label.setOpaque(true); + label.setFont(UIDefaultsLookup.getFont("Label.font").deriveFont(Font.BOLD, 11.0F)); + label.setBackground(new Color(253, 254, 226)); + label.setBorder(BorderFactory.createEmptyBorder(2, 6, 2, 6)); + label.setForeground(UIDefaultsLookup.getColor("ToolTip.foreground")); + this._messagePopup.getContentPane().setLayout(new BorderLayout()); + this._messagePopup.getContentPane().add(label); + if (getSearchTextField() != null && getSearchTextField().isVisible()) { + this._messagePopup.setOwner(getSearchTextField()); + } + + this._messagePopup.setDefaultMoveOperation(0); + this._messagePopup.setTransient(true); + this._messagePopup.showPopup(); + this.addMouseMotionListener(this._mouseMotionListener); + if (getSearchTextField() != null && getSearchTextField().isVisible()) { + getSearchTextField().addKeyListener(this._keyListener); + } + } + + private void hideMessage() { + if (this._messagePopup != null) { + this._messagePopup.hidePopupImmediately(); + this._messagePopup = null; + } + + if (this._mouseMotionListener != null) { + this.removeMouseMotionListener(this._mouseMotionListener); + } + + if (this._keyListener != null) { + getSearchTextField().removeKeyListener(this._keyListener); + } + } + + private void addSearchingTextToHistory(String searchingText) { + if (searchingText != null && !searchingText.isBlank()) { + addSearchHistoryItem(searchingText); + } + } + + public interface Installer { + void openSearchBar(SearchableBarEx bar); + + void closeSearchBar(SearchableBarEx bar); + } +} diff --git a/src/main/java/net/rptools/maptool/client/swing/searchable/SearchableEx.java b/src/main/java/net/rptools/maptool/client/swing/searchable/SearchableEx.java new file mode 100644 index 0000000000..f86fe25e92 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/swing/searchable/SearchableEx.java @@ -0,0 +1,952 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.swing.searchable; + +import com.formdev.flatlaf.extras.components.FlatTextField; +import com.jidesoft.plaf.UIDefaultsLookup; +import com.jidesoft.swing.JideSwingUtilities; +import com.jidesoft.swing.Searchable; +import com.jidesoft.swing.SearchableProvider; +import com.jidesoft.swing.event.SearchableEvent; +import com.jidesoft.swing.event.SearchableListener; +import com.jidesoft.utils.DefaultWildcardSupport; +import com.jidesoft.utils.WildcardSupport; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.*; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.util.*; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; +import javax.swing.JComponent; +import javax.swing.event.EventListenerList; +import net.rptools.maptool.language.I18N; +import org.bouncycastle.util.Strings; + +/** This is just reconstituted JideSearchable */ +public abstract class SearchableEx { + public static final String CLIENT_PROPERTY_SEARCHABLE = "SearchableEx"; + private final PropertyChangeSupport _propertyChangeSupport = new PropertyChangeSupport(this); + protected final JComponent _component; + private SearchableProvider _searchableProvider; + private Pattern _pattern; + private String _searchText; + private String _previousSearchText; + private boolean _fromStart = true; + private boolean _caseSensitive = false; + private boolean _repeats = true; + private boolean _wildcardEnabled = true; + private boolean _countMatch; + protected int _matchCount; + private WildcardSupport _wildcardSupport = null; + private Color _mismatchForeground; + private Color _foreground = null; + private Color _background = null; + protected ComponentListener _componentListener; + protected KeyListener _keyListener; + protected FocusListener _focusListener; + private SearchableListener _searchableListener; + private int _cursor = -1; + private String _searchLabel = I18N.getText("Button.find"); + private int _searchingDelay = 0; + private boolean _reverseOrder = false; + protected EventListenerList listenerList = new EventListenerList(); + private final Set _selection; + private boolean _processModelChangeEvent = true; + private SearchTextField _searchTextField = null; + + public SearchableEx(JComponent _component) { + this._component = _component; + SearchableEx searchable = getSearchable(_component); + if (searchable != null) { + searchable.uninstallSearchable(searchable); + } + + this._previousSearchText = null; + this._selection = new HashSet<>(); + this.installListeners(); + this.updateClientProperty(this._component, this); + } + + @SuppressWarnings("unused") + public SearchableEx(JComponent _component, SearchableProvider searchableProvider) { + SearchableEx searchable = getSearchable(_component); + if (searchable != null) { + searchable.uninstallSearchable(searchable); + } + + this._searchableProvider = searchableProvider; + this._previousSearchText = null; + this._component = _component; + this._selection = new HashSet<>(); + this.installListeners(); + this.updateClientProperty(this._component, this); + } + + protected abstract int getSelectedIndex(); + + protected abstract void setSelectedIndex(int index, boolean incremental); + + @SuppressWarnings("unused") + public void adjustSelectedIndex(int index, boolean incremental) { + this.setSelectedIndex(index, incremental); + } + + protected abstract int getElementCount(); + + protected abstract Object getElementAt(int index); + + protected abstract String convertElementToString(Object element); + + @SuppressWarnings("unused") + public String convertToString(Object element) { + return this.convertElementToString(element); + } + + @SuppressWarnings("unused") + public SearchableProvider getSearchableProvider() { + return this._searchableProvider; + } + + public void setSearchableProvider(SearchableProvider searchableProvider) { + this._searchableProvider = searchableProvider; + } + + protected ComponentListener createComponentListener() { + return new ComponentAdapter() { + public void componentHidden(ComponentEvent e) { + super.componentHidden(e); + boolean passive = + SearchableEx.this._searchableProvider == null + || SearchableEx.this._searchableProvider.isPassive(); + } + + public void componentResized(ComponentEvent e) { + super.componentResized(e); + } + + public void componentMoved(ComponentEvent e) { + super.componentMoved(e); + } + }; + } + + public void installListeners() { + if (this._componentListener == null) { + this._componentListener = this.createComponentListener(); + } + + this._component.addComponentListener(this._componentListener); + Component scrollPane = JideSwingUtilities.getScrollPane(this._component); + if (scrollPane != null) { + scrollPane.addComponentListener(this._componentListener); + } + + if (this._keyListener == null) { + this._keyListener = this.createKeyListener(); + } + + JideSwingUtilities.insertKeyListener(this.getComponent(), this._keyListener, 0); + if (this._focusListener == null) { + this._focusListener = this.createFocusListener(); + } + + this.getComponent().addFocusListener(this._focusListener); + if (this._searchableListener == null) { + this._searchableListener = e -> {}; + } + + this.addSearchableListener(this._searchableListener); + } + + protected KeyListener createKeyListener() { + return new KeyAdapter() { + public void keyTyped(KeyEvent e) { + boolean passive = + SearchableEx.this._searchableProvider == null + || SearchableEx.this._searchableProvider.isPassive(); + if (passive) { + SearchableEx.this.keyTypedOrPressed(e); + } + } + + public void keyPressed(KeyEvent e) { + boolean passive = + SearchableEx.this._searchableProvider == null + || SearchableEx.this._searchableProvider.isPassive(); + if (passive) { + SearchableEx.this.keyTypedOrPressed(e); + } + } + }; + } + + protected FocusListener createFocusListener() { + return new FocusAdapter() { + public void focusLost(FocusEvent focusevent) { + boolean passive = + SearchableEx.this._searchableProvider == null + || SearchableEx.this._searchableProvider.isPassive(); + } + }; + } + + private void updateClientProperty(JComponent component, SearchableEx searchable) { + if (component != null) { + Object clientProperty = this._component.getClientProperty(CLIENT_PROPERTY_SEARCHABLE); + if (clientProperty instanceof Searchable) { + ((Searchable) clientProperty).uninstallListeners(); + } + + component.putClientProperty(CLIENT_PROPERTY_SEARCHABLE, searchable); + } + } + + public void uninstallListeners() { + if (this._componentListener != null) { + this.getComponent().removeComponentListener(this._componentListener); + Component scrollPane = JideSwingUtilities.getScrollPane(this.getComponent()); + if (scrollPane != null) { + scrollPane.removeComponentListener(this._componentListener); + } + this._componentListener = null; + } + + if (this._keyListener != null) { + this.getComponent().removeKeyListener(this._keyListener); + this._keyListener = null; + } + + if (this._focusListener != null) { + this.getComponent().removeFocusListener(this._focusListener); + this._focusListener = null; + } + + if (this._searchableListener != null) { + this.removeSearchableListener(this._searchableListener); + this._searchableListener = null; + } + } + + public void addPropertyChangeListener(PropertyChangeListener propertychangelistener) { + this._propertyChangeSupport.addPropertyChangeListener(propertychangelistener); + } + + public void removePropertyChangeListener(PropertyChangeListener propertychangelistener) { + this._propertyChangeSupport.removePropertyChangeListener(propertychangelistener); + } + + public void firePropertyChangeEvent(String searchingText) { + if (!searchingText.equals(this._previousSearchText)) { + this._propertyChangeSupport.firePropertyChange( + "searchText", this._previousSearchText, searchingText); + this.fireSearchableEvent( + new SearchableEvent( + this, 3004, searchingText, this.getCurrentIndex(), this._previousSearchText)); + this._previousSearchText = searchingText; + if (searchingText.isBlank()) { + this.searchingTextEmpty(); + } + } + } + + protected void searchingTextEmpty() {} + + protected boolean compare(Object element, String lookFor) { + return compare(element, Arrays.asList(Strings.split(lookFor, ' '))); + } + + protected boolean compare(Object element, List lookForList) { + final String lookAt = + this.isCaseSensitive() + ? this.convertElementToString(element) + : this.convertElementToString(element).toLowerCase(); + if (lookAt == null) { + return false; + } + for (String lookFor : lookForList) { + if (!this.compare(lookAt, lookFor)) { + return false; + } + } + return true; + } + + protected boolean compare(String lookAt, String lookFor) { + if (lookFor != null && !lookFor.isBlank()) { + if (this.isWildcardEnabled()) { + if (this._searchText != null && this._searchText.equals(lookFor) && this._pattern != null) { + return this._pattern.matcher(lookAt).find(); + } else { + WildcardSupport wildcardSupport = this.getWildcardSupport(); + String s = wildcardSupport.convert(lookFor); + if (lookFor.equals(s)) { + return this.isFromStart() ? lookAt.startsWith(lookFor) : lookAt.contains(lookFor); + } else { + this._searchText = lookFor; + try { + this._pattern = + Pattern.compile( + this.isFromStart() ? "^" + s : s, + this.isCaseSensitive() ? 0 : Pattern.CASE_INSENSITIVE); + return this._pattern.matcher(lookAt).find(); + } catch (PatternSyntaxException pse) { + return false; + } + } + } + } else { + filter: + { + if (lookFor.equals(lookAt)) { + break filter; + } + if (lookFor.isBlank()) { + if (this.isFromStart()) { + if (lookAt.startsWith(lookFor)) { + break filter; + } + } else if (lookAt.contains(lookFor)) { + break filter; + } + } + return false; + } + return true; + } + } else { + return true; + } + } + + public boolean isFromStart() { + return this._fromStart; + } + + @SuppressWarnings("unused") + public void setFromStart(boolean fromStart) { + this._fromStart = fromStart; + } + + public int getCursor() { + return this._cursor; + } + + public void setCursor(int cursor) { + this.setCursor(cursor, false); + } + + public void setCursor(int cursor, boolean incremental) { + if (!incremental || this._cursor < 0) { + this._selection.clear(); + } + + if (this._cursor >= 0) { + this._selection.add(cursor); + } + + this._cursor = cursor; + } + + protected void highlightAll() { + int firstIndex = -1; + int index = this.getSelectedIndex(); + String text = this.getSearchingText(); + + while (index != -1) { + int newIndex = this.findNext(text); + if (index == newIndex) { + index = -1; + } else { + index = newIndex; + } + + if (index != -1) { + if (firstIndex == -1) { + firstIndex = index; + } + + this.select(index, text); + } + } + + if (firstIndex != -1) { + this.select(firstIndex, text); + } + } + + protected void cancelHighlightAll() {} + + protected void select(int index, String searchingText) { + if (index != -1) { + this.setSelectedIndex(index, true); + this.setCursor(index, true); + Object element = this.getElementAt(index); + this.fireSearchableEvent( + new SearchableEvent( + this, 3002, searchingText, element, this.convertElementToString(element))); + } else { + this.setSelectedIndex(-1, false); + this.fireSearchableEvent(new SearchableEvent(this, 3003, searchingText)); + } + } + + public int findNext(String s) { + String str = this.isCaseSensitive() ? s : s.toLowerCase(); + int count = this.getElementCount(); + if (count == 0) { + return s.isBlank() ? -1 : 0; + } else { + int selectedIndex = this.getCurrentIndex(); + + for (int i = selectedIndex + 1; i < count; ++i) { + Object element = this.getElementAt(i); + if (this.compare(element, str)) { + return i; + } + } + + if (this.isRepeats()) { + for (int i = 0; i < selectedIndex; ++i) { + Object element = this.getElementAt(i); + if (this.compare(element, str)) { + return i; + } + } + } + + return selectedIndex == -1 + ? -1 + : (this.compare(this.getElementAt(selectedIndex), str) ? selectedIndex : -1); + } + } + + protected int getCurrentIndex() { + if (this._selection.contains(this.getSelectedIndex())) { + return this._cursor != -1 ? this._cursor : this.getSelectedIndex(); + } else { + this._selection.clear(); + return this.getSelectedIndex(); + } + } + + public int findPrevious(String s) { + String str = this.isCaseSensitive() ? s : s.toLowerCase(); + int count = this.getElementCount(); + if (count == 0) { + return s.isBlank() ? -1 : 0; + } else { + int selectedIndex = this.getCurrentIndex(); + + for (int i = selectedIndex - 1; i >= 0; --i) { + Object element = this.getElementAt(i); + if (this.compare(element, str)) { + return i; + } + } + + if (this.isRepeats()) { + for (int i = count - 1; i >= selectedIndex; --i) { + Object element = this.getElementAt(i); + if (this.compare(element, str)) { + return i; + } + } + } + + return selectedIndex == -1 + ? -1 + : (this.compare(this.getElementAt(selectedIndex), str) ? selectedIndex : -1); + } + } + + public int findFromCursor(String s) { + if (this.isCountMatch()) { + boolean reverse = this.isReverseOrder(); + this.setReverseOrder(false); + int selectedIndex = this.getCurrentIndex(); + if (selectedIndex < 0) { + selectedIndex = 0; + } + + int newIndex = -1; + this._matchCount = -1; + + int oldIndex; + do { + this.setSelectedIndex(newIndex, false); + oldIndex = newIndex; + newIndex = this.findNext(s); + ++this._matchCount; + } while (newIndex > oldIndex); + + this.setSelectedIndex(selectedIndex, false); + this.setReverseOrder(reverse); + } + + if (this.isReverseOrder()) { + return this.reverseFindFromCursor(s); + } else { + String str = this.isCaseSensitive() ? s : s.toLowerCase(); + int selectedIndex = this.getCurrentIndex(); + if (selectedIndex < 0) { + selectedIndex = 0; + } + + int count = this.getElementCount(); + if (count != 0) { + for (int i = selectedIndex; i < count; ++i) { + Object element = this.getElementAt(i); + if (this.compare(element, str)) { + return i; + } + } + + for (int i = 0; i < selectedIndex; ++i) { + Object element = this.getElementAt(i); + if (this.compare(element, str)) { + return i; + } + } + } + return -1; + } + } + + public int reverseFindFromCursor(String s) { + if (!this.isReverseOrder()) { + return this.findFromCursor(s); + } else { + String str = this.isCaseSensitive() ? s : s.toLowerCase(); + int selectedIndex = this.getCurrentIndex(); + if (selectedIndex < 0) { + selectedIndex = 0; + } + + int count = this.getElementCount(); + if (count != 0) { + for (int i = selectedIndex; i >= 0; --i) { + Object element = this.getElementAt(i); + if (this.compare(element, str)) { + return i; + } + } + + for (int i = count - 1; i >= selectedIndex; --i) { + Object element = this.getElementAt(i); + if (this.compare(element, str)) { + return i; + } + } + } + return -1; + } + } + + public int findFirst(String s) { + String str = this.isCaseSensitive() ? s : s.toLowerCase(); + int count = this.getElementCount(); + if (count == 0) { + return s.isBlank() ? -1 : 0; + } else { + for (int i = 0; i < count; ++i) { + int index = this.getIndex(count, i); + Object element = this.getElementAt(index); + if (this.compare(element, str)) { + return index; + } + } + + return -1; + } + } + + @SuppressWarnings("unused") + public int findLast(String s) { + String str = this.isCaseSensitive() ? s : s.toLowerCase(); + int count = this.getElementCount(); + if (count == 0) { + return s.isBlank() ? -1 : 0; + } else { + for (int i = count - 1; i >= 0; --i) { + Object element = this.getElementAt(i); + if (this.compare(element, str)) { + return i; + } + } + + return -1; + } + } + + protected void keyTypedOrPressed(KeyEvent e) { + if (this._searchableProvider != null && this._searchableProvider.isPassive()) { + this._searchableProvider.processKeyEvent(e); + } else { + if (this.isActivateKey(e)) { + String searchingText = ""; + if (e.getID() == 400) { + if (JideSwingUtilities.isMenuShortcutKeyDown(e)) { + return; + } + if (e.isAltDown()) { + return; + } + searchingText = String.valueOf(e.getKeyChar()); + } + if (e.getKeyCode() != 10) { + e.consume(); + } + } + } + } + + private int getIndex(int count, int index) { + return this.isReverseOrder() ? count - index - 1 : index; + } + + public String getSearchingText() { + return this._searchableProvider != null ? this._searchableProvider.getSearchingText() : ""; + } + + protected boolean isFindFirstKey(KeyEvent e) { + return e.getKeyCode() == 36; + } + + protected boolean isFindLastKey(KeyEvent e) { + return e.getKeyCode() == 35; + } + + protected boolean isFindPreviousKey(KeyEvent e) { + return e.getKeyCode() == 38; + } + + protected boolean isFindNextKey(KeyEvent e) { + return e.getKeyCode() == 40; + } + + protected boolean isNavigationKey(KeyEvent e) { + return this.isFindFirstKey(e) + || this.isFindLastKey(e) + || this.isFindNextKey(e) + || this.isFindPreviousKey(e); + } + + protected boolean isActivateKey(KeyEvent e) { + char keyChar = e.getKeyChar(); + return e.getID() == 400 && keyChar > ' ' && keyChar != 127; + } + + protected boolean isDeactivateKey(KeyEvent e) { + int keyCode = e.getKeyCode(); + return keyCode == 10 + || keyCode == 27 + || keyCode == 33 + || keyCode == 34 + || keyCode == 36 + || keyCode == 35 + || keyCode == 37 + || keyCode == 39 + || keyCode == 38 + || keyCode == 40; + } + + protected boolean isSelectAllKey(KeyEvent e) { + return JideSwingUtilities.isMenuShortcutKeyDown(e) && e.getKeyCode() == 65; + } + + @SuppressWarnings("unused") + protected boolean isIncrementalSelectKey(KeyEvent e) { + return JideSwingUtilities.isMenuShortcutKeyDown(e); + } + + @SuppressWarnings("unused") + public Color getMismatchForeground() { + return this._mismatchForeground == null ? Color.RED : this._mismatchForeground; + } + + @SuppressWarnings("unused") + public void setMismatchForeground(Color mismatchForeground) { + this._mismatchForeground = mismatchForeground; + } + + public boolean isCaseSensitive() { + return this._caseSensitive; + } + + public void setCaseSensitive(boolean caseSensitive) { + this._caseSensitive = caseSensitive; + } + + public int getSearchingDelay() { + return this._searchingDelay; + } + + @SuppressWarnings("unused") + public void setSearchingDelay(int searchingDelay) { + this._searchingDelay = searchingDelay; + } + + @SuppressWarnings("unused") + public boolean isRepeats() { + return this._repeats; + } + + public void setRepeats(boolean repeats) { + this._repeats = repeats; + } + + public Color getForeground() { + return this._foreground == null + ? UIDefaultsLookup.getColor("ToolTip.foreground") + : this._foreground; + } + + public void setForeground(Color foreground) { + this._foreground = foreground; + } + + public Color getBackground() { + return this._background == null + ? UIDefaultsLookup.getColor("ToolTip.background") + : this._background; + } + + public void setBackground(Color background) { + this._background = background; + } + + public boolean isWildcardEnabled() { + return this._wildcardEnabled; + } + + public void setWildcardEnabled(boolean wildcardEnabled) { + this._wildcardEnabled = wildcardEnabled; + } + + public WildcardSupport getWildcardSupport() { + if (this._wildcardSupport == null) { + this._wildcardSupport = new DefaultWildcardSupport(); + } + + return this._wildcardSupport; + } + + @SuppressWarnings("unused") + public void setWildcardSupport(WildcardSupport wildcardSupport) { + this._wildcardSupport = wildcardSupport; + } + + @SuppressWarnings("unused") + public String getSearchLabel() { + return this._searchLabel; + } + + public void setSearchLabel(String searchLabel) { + this._searchLabel = searchLabel; + } + + public void addSearchableListener(SearchableListener l) { + this.listenerList.add(SearchableListener.class, l); + } + + public void removeSearchableListener(SearchableListener l) { + this.listenerList.remove(SearchableListener.class, l); + } + + public SearchableListener[] getSearchableListeners() { + return this.listenerList.getListeners(SearchableListener.class); + } + + @SuppressWarnings("unused") + public boolean isSearchableListenerInstalled(SearchableListener l) { + SearchableListener[] listeners = this.getSearchableListeners(); + + for (SearchableListener listener : listeners) { + if (listener == l) { + return true; + } + } + + return false; + } + + protected void fireSearchableEvent(SearchableEvent e) { + Object[] listeners = this.listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == SearchableListener.class) { + ((SearchableListener) listeners[i + 1]).searchableEventFired(e); + } + } + } + + public Component getComponent() { + return this._component; + } + + public boolean isReverseOrder() { + return this._reverseOrder; + } + + public void setReverseOrder(boolean reverseOrder) { + this._reverseOrder = reverseOrder; + } + + public static SearchableEx getSearchable(JComponent component) { + Object clientProperty = component.getClientProperty(CLIENT_PROPERTY_SEARCHABLE); + return clientProperty instanceof SearchableEx ? (SearchableEx) clientProperty : null; + } + + public boolean isProcessModelChangeEvent() { + return this._processModelChangeEvent; + } + + public void setProcessModelChangeEvent(boolean processModelChangeEvent) { + this._processModelChangeEvent = processModelChangeEvent; + } + + public boolean isCountMatch() { + return this._countMatch; + } + + public void setCountMatch(boolean countMatch) { + this._countMatch = countMatch; + } + + int getMatchCount() { + return this._matchCount; + } + + @SuppressWarnings("unused") + public List findAll(String s) { + String str = this.isCaseSensitive() ? s : s.toLowerCase(); + List list = new ArrayList<>(); + int i = 0; + + for (int count = this.getElementCount(); i < count; ++i) { + Object elementAt = this.getElementAt(i); + if (this.compare(elementAt, str)) { + list.add(i); + } + } + + return list; + } + + @SuppressWarnings("unused") + public String getElementAtAsString(int index) { + return this.convertElementToString(this.getElementAt(index)); + } + + @SuppressWarnings("unused") + protected void textChanged(String text) { + if (text != null && !text.isBlank()) { + int found = this.findFromCursor(text); + if (found == -1) { + this.firePropertyChangeEvent(text); + this.fireSearchableEvent(new SearchableEvent(this, 3003, text)); + } else { + this.firePropertyChangeEvent(text); + Object element = this.getElementAt(found); + this.fireSearchableEvent( + new SearchableEvent(this, 3002, text, element, this.convertElementToString(element))); + } + } else { + this.firePropertyChangeEvent(""); + } + } + + @SuppressWarnings("unused") + public int findFirstExactly(String s) { + String str = this.isCaseSensitive() ? s : s.toLowerCase(); + int count = this.getElementCount(); + if (count == 0) { + return s.isBlank() ? -1 : 0; + } else { + for (int i = 0; i < count; ++i) { + int index = this.getIndex(count, i); + Object element = this.getElementAt(index); + String text = this.convertElementToString(element); + if (JideSwingUtilities.equals(text, str)) { + return index; + } + } + return -1; + } + } + + protected SearchTextField getSearchField() { + if (this._searchTextField == null) { + this._searchTextField = new SearchTextField(); + } + return this._searchTextField; + } + + protected class SearchTextField extends FlatTextField { + SearchTextField() { + super(); + setPlaceholderText("^" + I18N.getText("Label.macroPermissions") + " *"); + setColumns(24); + + setShowClearButton(true); + JideSwingUtilities.setComponentTransparent(this); + } + + public Dimension getMinimumSize() { + Dimension size = super.getPreferredSize(); + size.width = this.getFontMetrics(this.getFont()).stringWidth(this.getPlaceholderText()) + 24; + return size; + } + + public void processKeyEvent(KeyEvent e) { + int keyCode = e.getKeyCode(); + if (keyCode == 8 && this.getDocument().getLength() == 0) { + e.consume(); + } else { + boolean isNavigationKey = SearchableEx.this.isNavigationKey(e); + if (SearchableEx.this.isDeactivateKey(e) && !isNavigationKey) { + if (keyCode == 27) { + e.consume(); + } + } else { + super.processKeyEvent(e); + if (keyCode == 8 || isNavigationKey) { + e.consume(); + } + if (SearchableEx.this.isSelectAllKey(e)) { + e.consume(); + } + } + } + } + } + + private void uninstallSearchable(SearchableEx searchable) { + if (searchable != null) { + searchable.uninstallListeners(); + if (searchable.getComponent() instanceof JComponent) { + Object clientProperty = + ((JComponent) searchable.getComponent()).getClientProperty(CLIENT_PROPERTY_SEARCHABLE); + if (clientProperty == searchable) { + ((JComponent) searchable.getComponent()) + .putClientProperty(CLIENT_PROPERTY_SEARCHABLE, null); + } + } + } + } +} diff --git a/src/main/java/net/rptools/maptool/client/swing/searchable/SearchableTree.java b/src/main/java/net/rptools/maptool/client/swing/searchable/SearchableTree.java new file mode 100644 index 0000000000..026be34511 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/swing/searchable/SearchableTree.java @@ -0,0 +1,218 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.swing.searchable; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import javax.swing.*; +import javax.swing.event.*; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.TreeModel; +import javax.swing.tree.TreePath; +import net.rptools.maptool.model.localisedObject.LocalObject; +import org.apache.logging.log4j.util.Strings; + +/** An alternate version of com.jidesoft.swing.TreeSearchable */ +public class SearchableTree extends SearchableEx + implements TreeModelListener, PropertyChangeListener { + protected final JTree _tree; + private boolean _recursive = true; + private transient java.util.List _treePaths; + + public SearchableTree(JTree tree) { + super(tree); + this._tree = tree; + if (tree.getModel() != null) { + tree.getModel().addTreeModelListener(this); + } + tree.addPropertyChangeListener("model", this); + } + + public boolean isRecursive() { + return this._recursive; + } + + public void setRecursive(boolean recursive) { + this._recursive = recursive; + this.resetTreePaths(); + } + + public void uninstallListeners() { + super.uninstallListeners(); + if (this._tree != null && this._tree.getModel() != null) { + this._tree.getModel().removeTreeModelListener(this); + } + Objects.requireNonNull(this._tree).removePropertyChangeListener("model", this); + } + + protected void setSelectedIndex(int index, boolean incremental) { + this._tree.expandRow(index); + if (!this.isRecursive()) { + if (incremental) { + this._tree.addSelectionInterval(index, index); + } else { + this._tree.setSelectionRow(index); + } + this._tree.scrollRowToVisible(index); + } else { + Object elementAt = this.getElementAt(index); + if (elementAt instanceof TreePath path) { + if (incremental) { + this._tree.addSelectionPath(path); + } else { + this._tree.setSelectionPath(path); + } + this._tree.scrollPathToVisible(path); + } + } + } + + protected int getSelectedIndex() { + if (this.isRecursive()) { + TreePath[] treePaths = this._tree.getSelectionPaths(); + return treePaths != null && treePaths.length > 0 + ? this.getTreePaths().indexOf(treePaths[0]) + : -1; + } else { + int[] ai = this._tree.getSelectionRows(); + return ai != null && ai.length != 0 ? ai[0] : -1; + } + } + + protected Object getElementAt(int index) { + if (index == -1) { + return null; + } else { + return !this.isRecursive() ? this._tree.getPathForRow(index) : this.getTreePaths().get(index); + } + } + + protected int getElementCount() { + return !this.isRecursive() ? this._tree.getRowCount() : this.getTreePaths().size(); + } + + protected void populateTreePaths() { + this._treePaths = new ArrayList<>(); + Object root = this._tree.getModel().getRoot(); + this.populateTreePaths0(root, new TreePath(root), this._tree.getModel()); + } + + private void populateTreePaths0(Object node, TreePath path, TreeModel model) { + if (this._tree.isRootVisible() + || path.getLastPathComponent() != this._tree.getModel().getRoot()) { + this._treePaths.add(path); + } + + for (int i = 0; i < model.getChildCount(node); ++i) { + Object childNode = model.getChild(node, i); + this.populateTreePaths0(childNode, path.pathByAddingChild(childNode), model); + } + } + + protected void resetTreePaths() { + this._treePaths = null; + } + + protected List getTreePaths() { + if (this._treePaths == null) { + this.populateTreePaths(); + } + return this._treePaths; + } + + protected String convertElementToString(Object object) { + String textToSearch = ""; + if (object instanceof TreePath) { + Object treeNode = ((TreePath) object).getLastPathComponent(); + if (treeNode instanceof DefaultMutableTreeNode dmtn) { + Object userObject = dmtn.getUserObject(); + if (userObject instanceof SearchWords searchWords) { + textToSearch = Strings.join(searchWords.getSearchWords(), ' '); + } else if (userObject instanceof LocalObject localisedItem) { + textToSearch = + localisedItem + + " " + + localisedItem.getValue() + + localisedItem.getI18nKey().replace('.', ' '); + } + } + if (!(this.getComponent() instanceof JTree tree)) { + textToSearch += " " + treeNode.toString(); + } else { + TreePath[] selectionPaths = tree.getSelectionPaths(); + boolean selected = false; + if (selectionPaths != null) { + for (TreePath selectedPath : selectionPaths) { + if (selectedPath == object) { + selected = true; + break; + } + } + } + textToSearch += + " " + + tree.convertValueToText( + treeNode, + selected, + tree.isExpanded((TreePath) object), + tree.getModel().isLeaf(treeNode), + tree.getRowForPath((TreePath) object), + tree.hasFocus() && tree.getLeadSelectionPath() == object); + } + } else { + textToSearch += object != null ? " " + object : ""; + } + return textToSearch; + } + + public void treeNodesChanged(TreeModelEvent e) { + if (this.isProcessModelChangeEvent()) { + this.resetTreePaths(); + } + } + + public void treeNodesInserted(TreeModelEvent e) { + if (this.isProcessModelChangeEvent()) { + this.resetTreePaths(); + } + } + + public void treeNodesRemoved(TreeModelEvent e) { + if (this.isProcessModelChangeEvent()) { + this.resetTreePaths(); + } + } + + public void treeStructureChanged(TreeModelEvent e) { + if (this.isProcessModelChangeEvent()) { + this.resetTreePaths(); + } + } + + public void propertyChange(PropertyChangeEvent evt) { + if ("model".equals(evt.getPropertyName())) { + if (evt.getOldValue() instanceof TreeModel) { + ((TreeModel) evt.getOldValue()).removeTreeModelListener(this); + } + if (evt.getNewValue() instanceof TreeModel) { + ((TreeModel) evt.getNewValue()).addTreeModelListener(this); + } + this.resetTreePaths(); + } + } +} diff --git a/src/main/java/net/rptools/maptool/client/tool/PointerTool.java b/src/main/java/net/rptools/maptool/client/tool/PointerTool.java index 30cda463fa..c3f840a2d9 100644 --- a/src/main/java/net/rptools/maptool/client/tool/PointerTool.java +++ b/src/main/java/net/rptools/maptool/client/tool/PointerTool.java @@ -54,7 +54,6 @@ import net.rptools.maptool.events.MapToolEventBus; import net.rptools.maptool.model.*; import net.rptools.maptool.model.Pointer.Type; -import net.rptools.maptool.model.Zone.VisionType; import net.rptools.maptool.model.player.Player.Role; import net.rptools.maptool.model.sheet.stats.StatSheetManager; import net.rptools.maptool.util.GraphicsUtil; @@ -1926,7 +1925,7 @@ private boolean validateMove( } boolean useTokenExposedArea = MapTool.getServerPolicy().isUseIndividualFOW() - && zone.getVisionType() != VisionType.OFF; + && zone.getVisionType() != AppPreferenceEnums.VisionType.OFF; int deltaX = leadTokenNewAnchor.x - this.dragAnchor.x; int deltaY = leadTokenNewAnchor.y - this.dragAnchor.y; Grid grid = zone.getGrid(); @@ -2016,7 +2015,7 @@ private boolean validateMove_legacy(Set tokenSet, ZonePoint leadTokenNewAn bounds.height = intervalX * (dx + 1) / 3 - intervalX * dx / 3; if (!MapTool.getServerPolicy().isUseIndividualFOW() - || zone.getVisionType() == VisionType.OFF) { + || zone.getVisionType() == AppPreferenceEnums.VisionType.OFF) { if (fow.contains(bounds)) { counter++; } diff --git a/src/main/java/net/rptools/maptool/client/tool/texttool/EditLabelDialogView.form b/src/main/java/net/rptools/maptool/client/tool/texttool/EditLabelDialogView.form index 6c4b9ae292..99e5a76a3a 100644 --- a/src/main/java/net/rptools/maptool/client/tool/texttool/EditLabelDialogView.form +++ b/src/main/java/net/rptools/maptool/client/tool/texttool/EditLabelDialogView.form @@ -22,7 +22,7 @@ - + diff --git a/src/main/java/net/rptools/maptool/client/ui/AppMenuBar.java b/src/main/java/net/rptools/maptool/client/ui/AppMenuBar.java index 54b586abc1..752207c1ee 100644 --- a/src/main/java/net/rptools/maptool/client/ui/AppMenuBar.java +++ b/src/main/java/net/rptools/maptool/client/ui/AppMenuBar.java @@ -33,7 +33,6 @@ import net.rptools.maptool.client.ui.theme.RessourceManager; import net.rptools.maptool.client.ui.zone.renderer.ZoneRenderer; import net.rptools.maptool.language.I18N; -import net.rptools.maptool.model.Zone; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -174,9 +173,15 @@ protected JMenu createMapMenu() { protected JMenu createVisionTypeMenu() { JMenu menu = I18N.createMenu("menu.vision"); - menu.add(new RPCheckBoxMenuItem(new AppActions.SetVisionType(Zone.VisionType.OFF), menu)); - menu.add(new RPCheckBoxMenuItem(new AppActions.SetVisionType(Zone.VisionType.DAY), menu)); - menu.add(new RPCheckBoxMenuItem(new AppActions.SetVisionType(Zone.VisionType.NIGHT), menu)); + menu.add( + new RPCheckBoxMenuItem( + new AppActions.SetVisionType(AppPreferenceEnums.VisionType.OFF), menu)); + menu.add( + new RPCheckBoxMenuItem( + new AppActions.SetVisionType(AppPreferenceEnums.VisionType.DAY), menu)); + menu.add( + new RPCheckBoxMenuItem( + new AppActions.SetVisionType(AppPreferenceEnums.VisionType.NIGHT), menu)); return menu; } diff --git a/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialog.java b/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialog.java index 408625b7bf..1147f41f4c 100644 --- a/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialog.java +++ b/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialog.java @@ -39,6 +39,7 @@ import net.rptools.lib.net.FTPLocation; import net.rptools.lib.net.LocalLocation; import net.rptools.lib.net.Location; +import net.rptools.maptool.client.AppPreferenceEnums; import net.rptools.maptool.client.MapTool; import net.rptools.maptool.client.swing.AbeillePanel; import net.rptools.maptool.client.swing.SwingUtil; @@ -100,7 +101,7 @@ public enum Status { // a single ExportDialog to ever be instanced. // Pseudo-layers - private static Zone.VisionType savedVision; + private static AppPreferenceEnums.VisionType savedVision; private static boolean savedFog; private static boolean savedBoard; // for ZoneRenderer preservation @@ -324,7 +325,8 @@ public void setToDefault() { if (this == ExportLayers.LAYER_FOG) { ExportLayers.LAYER_FOG.setChecked(zone.hasFog()); } else if (this == ExportLayers.LAYER_VISIBILITY) { - ExportLayers.LAYER_VISIBILITY.setChecked(zone.getVisionType() != Zone.VisionType.OFF); + ExportLayers.LAYER_VISIBILITY.setChecked( + zone.getVisionType() != AppPreferenceEnums.VisionType.OFF); } else { setChecked(true); } @@ -338,7 +340,8 @@ public static void setDefaultChecked() { } // however, some pseudo-layers do have a state, so set that appropriately final Zone zone = MapTool.getFrame().getCurrentZoneRenderer().getZone(); - ExportLayers.LAYER_VISIBILITY.setChecked(zone.getVisionType() != Zone.VisionType.OFF); + ExportLayers.LAYER_VISIBILITY.setChecked( + zone.getVisionType() != AppPreferenceEnums.VisionType.OFF); ExportLayers.LAYER_FOG.setChecked(zone.hasFog()); } @@ -382,7 +385,7 @@ public static void enforceButtonRules() { // only enable fog and visibility check-boxes // when the map has those things turned on. if (layer == ExportLayers.LAYER_VISIBILITY) { - enabled &= (zone.getVisionType() != Zone.VisionType.OFF); + enabled &= (zone.getVisionType() != AppPreferenceEnums.VisionType.OFF); } if (layer == ExportLayers.LAYER_FOG) { enabled &= zone.hasFog(); @@ -741,7 +744,7 @@ private static void setupZoneLayers() throws OutOfMemoryError { // zone.setHasFog(ExportLayers.LAYER_FOG.isChecked()); if (!ExportLayers.LAYER_VISIBILITY.isChecked()) { - zone.setVisionType(Zone.VisionType.OFF); + zone.setVisionType(AppPreferenceEnums.VisionType.OFF); } zone.setDrawBoard(ExportLayers.LAYER_BOARD.isChecked()); diff --git a/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialogView.form b/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialogView.form index 38aedb490c..56cc048f85 100644 --- a/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialogView.form +++ b/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialogView.form @@ -174,7 +174,7 @@ - + diff --git a/src/main/java/net/rptools/maptool/client/ui/lookuptable/EditLookupTablePanelView.form b/src/main/java/net/rptools/maptool/client/ui/lookuptable/EditLookupTablePanelView.form index ca121af885..c028a63392 100644 --- a/src/main/java/net/rptools/maptool/client/ui/lookuptable/EditLookupTablePanelView.form +++ b/src/main/java/net/rptools/maptool/client/ui/lookuptable/EditLookupTablePanelView.form @@ -117,7 +117,7 @@ - + diff --git a/src/main/java/net/rptools/maptool/client/ui/mappropertiesdialog/MapPropertiesDialog.java b/src/main/java/net/rptools/maptool/client/ui/mappropertiesdialog/MapPropertiesDialog.java index 731f2c03e4..9f0f383304 100644 --- a/src/main/java/net/rptools/maptool/client/ui/mappropertiesdialog/MapPropertiesDialog.java +++ b/src/main/java/net/rptools/maptool/client/ui/mappropertiesdialog/MapPropertiesDialog.java @@ -324,7 +324,7 @@ private void copyUIToZone() { StringUtil.parseInteger( getDefaultVisionTextField().getText(), zone.getTokenVisionDistance())); - zone.setVisionType((Zone.VisionType) getVisionTypeCombo().getSelectedItem()); + zone.setVisionType((AppPreferenceEnums.VisionType) getVisionTypeCombo().getSelectedItem()); zone.setLightingStyle((Zone.LightingStyle) getLightingStyleCombo().getSelectedItem()); zone.setAStarRounding( (Zone.AStarRoundingOptions) getAStarRoundingOptionsComboBox().getSelectedItem()); @@ -536,8 +536,8 @@ private void initDefaultVisionTextField() { } private void initVisionTypeCombo() { - DefaultComboBoxModel model = new DefaultComboBoxModel<>(); - for (Zone.VisionType vt : Zone.VisionType.values()) { + DefaultComboBoxModel model = new DefaultComboBoxModel<>(); + for (AppPreferenceEnums.VisionType vt : AppPreferenceEnums.VisionType.values()) { model.addElement(vt); } model.setSelectedItem(AppPreferences.defaultVisionType.get()); diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/AppConfigDialog.form b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/AppConfigDialog.form new file mode 100644 index 0000000000..fc39ebeb76 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/AppConfigDialog.form @@ -0,0 +1,423 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/AppConfigDialog.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/AppConfigDialog.java new file mode 100644 index 0000000000..886f3da88a --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/AppConfigDialog.java @@ -0,0 +1,39 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import javax.swing.*; + +/** + * The PreferencesDialogView class represents the view for a preferences dialog. It provides methods + * for accessing the root component of the dialog. + */ +public class AppConfigDialog { + + /** + * The mainPanel variable represents the root component of the preferences dialog view. It is an + * instance of JPanel and serves as the main content panel for the dialog. + */ + private JPanel mainPanel; + + /** + * Returns the root component of the preferences dialog view. + * + * @return The root component of the preferences dialog view. + */ + public JComponent getRootComponent() { + return mainPanel; + } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/Classify.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/Classify.java new file mode 100644 index 0000000000..04d6ab1712 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/Classify.java @@ -0,0 +1,384 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import static net.rptools.maptool.client.ui.preferencesdialog.Classify.Group.*; +import static net.rptools.maptool.client.ui.preferencesdialog.Classify.Section.*; + +import java.util.*; +import java.util.List; +import java.util.function.Predicate; +import net.rptools.maptool.client.AppPreferences; +import net.rptools.maptool.client.swing.searchable.SearchWords; +import net.rptools.maptool.language.I18N; +import net.rptools.maptool.model.localisedObject.LocalObject; +import net.rptools.maptool.util.preferences.Preference; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +class Classify { + /** Broad groupings, along the lines of tab names, used for panel titles, table entries, etc */ + enum Section implements LocalObject { + // @formatter:off + // spotless:off + Audio ("Label.sounds", false), + Developer ("Preferences.tab.developer", true), + JVMConfig ("Label.startup", true), + Config ("EditTokenDialog.tab.config", false), + Campaign ("panel.Campaign", false), + Chat ("panel.Chat", false), + Initiative("panel.Initiative", false), + Map ("Label.maps", false), + Theme ("Label.themes", true), + Token ("Label.token", false), + ; + // spotless:on + // @formatter:on + /** has a separate dialog or panel to open */ + final boolean separate; + + /** the i18n lookup key */ + final String i18nKey; + + /** the resolved i18n string */ + final String displayName; + + Section(String i18nKey, boolean separate) { + this.separate = separate; + this.i18nKey = i18nKey; + this.displayName = I18N.getText(i18nKey); + } + + /** + * @return the value used by the preference. + */ + @Override + public @NotNull Section getValue() { + return this; + } + + /** + * @return the key to look up the localised display value + */ + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public String getDisplayName() { + return displayName; + } + + @Override + public @NotNull String toString() { + return this.displayName; + } + } + + /** + * Narrow groupings, to separate settings within sections, used for panel titles, table entries, + * etc + */ + enum Group implements LocalObject { + // @formatter:off + // spotless:off, + NONE (""), + Authentication("Label.auth"), + Facing ("Label.facing"), + Fog ("Label.fogOfWar"), + Grid ("Label.grid"), + Halo ("token.popup.menu.halo"), + Label ("Preferences.label.access.tokenLabel"), + Light ("CampaignPropertiesDialog.tab.light"), + Macro ("Label.macros"), + New_Token ("dialog.NewToken.title"), + Notification ("Label.notifications"), + Performance ("Label.performance"), + Save ("Button.save"), + Size ("EditTokenDialog.label.size"), + Snap ("Label.snapToGrid"), + StatSheet ("EditTokenDialog.label.statSheet"), + StatusBar ("Preferences.label.access.status.options"), + Tooltip ("component.label.macro.toolTip"), + Trusted ("Label.trusted"), + Visible ("Label.visibility"), + Vision ("Label.lights"), + ; + // spotless:on + // @formatter:on + /** the i18n lookup key */ + final String i18nKey; + + /** the resolved i18n string */ + final String displayName; + + Group(String i18nKey) { + this.i18nKey = i18nKey; + this.displayName = this.i18nKey.isBlank() ? "" : I18N.getText(i18nKey); + } + + @Override + public String getDisplayName() { + return displayName; + } + + @Override + public String getI18nKey() { + return i18nKey; + } + + @Override + public Group getValue() { + return this; + } + + @Override + public String toString() { + return this.displayName; + } + } + + public enum Collated implements SearchWords { + // @formatter:off + // spotless:off + _1_001(null, Audio , null , AppPreferences.playStreams , false, true), + _1_002(null, Audio , null , AppPreferences.playSystemSounds , false, true), + _1_003(null, Audio , null , AppPreferences.playSystemSoundsOnlyWhenNotFocused , false, true), + _1_004(null, Audio , null , AppPreferences.syrinscapeActive , false, true), + _1_005(null, Chat , null , AppPreferences.fontSize , false, true), + _1_006(null, Chat , null , AppPreferences.showAvatarInChat , false, true), + _1_007(null, Chat , null , AppPreferences.showSmilies , false, true), + _1_008(null, Chat , Save , AppPreferences.chatAutoSaveTimeInMinutes , false, true), + _1_009(null, Chat , Save , AppPreferences.chatFilenameFormat , false, true), + _1_010(null, Chat , Tooltip , AppPreferences.suppressToolTipsForMacroLinks , false, true), + _1_011(null, Chat , Tooltip , AppPreferences.useToolTipForInlineRoll , false, true), + _1_012(null, Chat , Trusted , AppPreferences.trustedPrefixBackground , false, true), + _1_013(null, Chat , Trusted , AppPreferences.trustedPrefixForeground , false, true), + _1_014(null, Chat , Notification, AppPreferences.chatNotificationBackground , false, true), + _1_015(null, Chat , Notification, AppPreferences.chatNotificationColor , false, true), + _1_016(null, Chat , Notification, AppPreferences.typingNotificationDurationInSeconds , false, true), + _1_020(null, Config , null , AppPreferences.defaultUserName , false, true), + _1_039(null, Config , null , AppPreferences.upnpDiscoveryTimeout , false, true), + _1_017(null, Config , Macro , AppPreferences.allowExternalMacroAccess , false, true), + _1_018(null, Config , Macro , AppPreferences.allowPlayerMacroEditsDefault , false, true), + _1_019(null, Config , Macro , AppPreferences.openEditorForNewMacro , false, true), + _1_021(null, Config , Performance , AppPreferences.fillSelectionBox , false, true), + _1_022(null, Config , Performance , AppPreferences.frameRateCap , false, true), + _1_023(null, Config , Performance , AppPreferences.renderQuality , false, true), + _1_024(null, Config , Save , AppPreferences.autoSaveIncrement , true , true), + _1_025(null, Config , Save , AppPreferences.fileSyncPath , false, true), + _1_026(null, Config , Save , AppPreferences.loadMruCampaignAtStart , false, true), + _1_027(null, Config , Save , AppPreferences.saveReminder , true , true), + _1_028(null, Config , StatSheet , AppPreferences.portraitSize , false, true), + _1_029(null, Config , StatSheet , AppPreferences.showPortrait , false, true), + _1_030(null, Config , StatSheet , AppPreferences.showStatSheet , false, true), + _1_031(null, Config , StatSheet , AppPreferences.showStatSheetRequiresModifierKey , false, true), + _1_032(null, Config , StatusBar , AppPreferences.scrollStatusEndPause , false, true), + _1_033(null, Config , StatusBar , AppPreferences.scrollStatusMessages , false, true), + _1_034(null, Config , StatusBar , AppPreferences.scrollStatusSpeed , false, true), + _1_035(null, Config , StatusBar , AppPreferences.scrollStatusStartDelay , false, true), + _1_036(null, Config , StatusBar , AppPreferences.scrollStatusTempDuration , false, true), + _1_037(null, Config , Tooltip , AppPreferences.toolTipDismissDelay , false, true), + _1_038(null, Config , Tooltip , AppPreferences.toolTipInitialDelay , false, true), + _1_040(null, Initiative, null , AppPreferences.initiativeMovementLocked , false, true), + _1_041(null, Initiative, null , AppPreferences.initiativePanelAllowsOwnerPermissions , false, true), + _1_042(null, Initiative, null , AppPreferences.initiativePanelHidesNpcs , false, true), + _1_043(null, Initiative, null , AppPreferences.initiativePanelShowsInitiativeOnLine2 , false, true), + _1_044(null, Initiative, null , AppPreferences.initiativePanelShowsTokenImage , false, true), + _1_045(null, Initiative, null , AppPreferences.initiativePanelShowsTokenState , false, true), + _1_046(null, Initiative, null , AppPreferences.initiativePanelWarnWhenResettingRoundCounter, true , true), + _1_047(null, Initiative, null , AppPreferences.showInitiativeGainedMessage , false, true), + _1_061(null, Map , null , AppPreferences.mapSortType , false, true), + _1_062(null, Map , null , AppPreferences.mapVisibilityWarning , true , true), + _1_063(null, Map , null , AppPreferences.newMapsVisible , false, true), + _1_064(null, Map , null , AppPreferences.auraOverlayOpacity , false, true), + _1_065(null, Map , null , AppPreferences.fitGmView , false, true), + _1_066(null, Map , null , AppPreferences.drawingsWarnWhenDeleted , true , true), + _1_067(null, Map , null , AppPreferences.uvttLosImportType , false, true), + _1_048(null, Map , Fog , AppPreferences.autoRevealVisionOnGMMovement , false, true), + _1_049(null, Map , Fog , AppPreferences.fogOverlayOpacity , false, true), + _1_050(null, Map , Fog , AppPreferences.newMapsHaveFow , false, true), + _1_051(null, Map , Grid , AppPreferences.defaultGridColor , false, true), + _1_052(null, Map , Grid , AppPreferences.defaultGridSize , false, true), + _1_053(null, Map , Grid , AppPreferences.defaultGridType , false, true), + _1_054(null, Map , Grid , AppPreferences.defaultUnitsPerCell , false, true), + _1_055(null, Map , Grid , AppPreferences.movementMetric , false, true), + _1_056(null, Map , Halo , AppPreferences.haloLineWidth , false, true), + _1_057(null, Map , Halo , AppPreferences.haloOverlayOpacity , false, true), + _1_058(null, Map , Light , AppPreferences.lightOverlayOpacity , false, true), + _1_059(null, Map , Light , AppPreferences.lumensOverlayOpacity , false, true), + _1_060(null, Map , Light , AppPreferences.useHaloColorOnVisionOverlay , false, true), + _1_068(null, Map , Vision , AppPreferences.defaultVisionDistance , false, true), + _1_069(null, Map , Vision , AppPreferences.defaultVisionType , false, true), + _1_092(null, Token , null , AppPreferences.hideTokenStackIndicator , false, true), + _1_093(null, Token , null , AppPreferences.tokensSnapWhileDragging , false, true), + _1_094(null, Token , null , AppPreferences.hideMousePointerWhileDragging , false, true), + _1_095(null, Token , null , AppPreferences.tokensWarnWhenDeleted , true , true), + _1_072(null, Token , Facing , AppPreferences.forceFacingArrow , false, true), + _1_073(null, Token , Facing , AppPreferences.faceEdge , false, true), + _1_074(null, Token , Facing , AppPreferences.faceVertex , false, true), + _1_075(null, Token , Label , AppPreferences.mapLabelFontSize , false, true), + _1_076(null, Token , Label , AppPreferences.mapLabelShowBorder , false, true), + _1_077(null, Token , Label , AppPreferences.mapLabelBorderArc , false, true), + _1_078(null, Token , Label , AppPreferences.mapLabelBorderWidth , false, true), + _1_079(null, Token , Label , AppPreferences.pcMapLabelBackground , false, true), + _1_080(null, Token , Label , AppPreferences.pcMapLabelBorder , false, true), + _1_081(null, Token , Label , AppPreferences.pcMapLabelForeground , false, true), + _1_082(null, Token , Label , AppPreferences.npcMapLabelBackground , false, true), + _1_083(null, Token , Label , AppPreferences.npcMapLabelBorder , false, true), + _1_084(null, Token , Label , AppPreferences.npcMapLabelForeground , false, true), + _1_085(null, Token , Label , AppPreferences.nonVisibleTokenMapLabelBackground , false, true), + _1_086(null, Token , Label , AppPreferences.nonVisibleTokenMapLabelBorder , false, true), + _1_087(null, Token , Label , AppPreferences.nonVisibleTokenMapLabelForeground , false, true), + _1_088(null, Token , New_Token , AppPreferences.showDialogOnNewToken , true , true), + _1_089(null, Token , New_Token , AppPreferences.newTokenNaming , false, true), + _1_090(null, Token , New_Token , AppPreferences.tokenNumberDisplay , false, true), + _1_091(null, Token , New_Token , AppPreferences.duplicateTokenNumber , false, true), + _1_096(null, Token , Size , AppPreferences.tokensStartFreesize , false, true), + _1_097(null, Token , Size , AppPreferences.objectsStartFreesize , false, true), + _1_098(null, Token , Size , AppPreferences.backgroundsStartFreesize , false, true), + _1_099(null, Token , Snap , AppPreferences.tokensStartSnapToGrid , false, true), + _1_100(null, Token , Snap , AppPreferences.objectsStartSnapToGrid , false, true), + _1_101(null, Token , Snap , AppPreferences.backgroundsStartSnapToGrid , false, true), + _1_102(null, Token , Visible , AppPreferences.newTokensVisible , false, true), + _1_103(null, Token , Visible , AppPreferences.newObjectsVisible , false, true), + _1_104(null, Token , Visible , AppPreferences.newBackgroundsVisible , false, true), + + /* Things that don't have a preference in AppPreferences or need special treatment */ + // (id , section ,group, pref, bold , useDefaultControls + DEV_OPTIONS("developerOptions", Developer, null, null, false, false), + STARTUP("startupConfig", Config, null, null, false, false), + AUTH_KEY("authentication", Config, Authentication, null, false, false), + THEME("theme", Theme, null, null, false, false), + MACRO_ED_THEME(null, Theme , null , AppPreferences.defaultMacroEditorTheme, false, false), + ICONS(null, Theme , null , AppPreferences.iconTheme, false, false), + + ; + //spotless:on + // @formatter:on + + /** seemed like a good idea for filtering stuff */ + final String id; + + /** + * @see Section + */ + final Section section; + + /** + * @see Group + */ + final @Nullable Group group; + + /** + * @see Preference + */ + final @Nullable Preference preference; + + /** not significant enough to be its own thing but should be made to stand out */ + final boolean emphasise; + + /** generate default controls in preference dialogue rather than custom-building something */ + final boolean useDefaultControls; + + /** a generated list of words that will hopefully become used in filtering */ + final List searchWords; + + Collated( + @Nullable String id, + Section section, + @Nullable Group group, + @Nullable Preference preference, + boolean emphasise, + boolean useDefaultControls) { + this.id = id != null ? id : preference != null ? preference.getKey() : null; + this.section = section; + this.group = group; // == null ? NONE : group; + // this.group = group == null ? NONE : group; + this.preference = preference; + this.emphasise = emphasise; + this.useDefaultControls = useDefaultControls; + this.searchWords = generateKeyWords(this.id, this.section, this.group, this.preference); + } + + /** + * Takes one or more strings and splits them in a variety of ways to create useful keywords + * + * @param strings Source strings + * @return List of identified bits + */ + private static List divideAndConquer(String... strings) { + List stringList = new ArrayList<>(); + for (String s : strings) { + if (s == null) { + continue; + } + stringList.add(s); + s = StringUtils.normalizeSpace(s); + Collections.addAll(stringList, StringUtils.splitByCharacterTypeCamelCase(s)); + s = s.replaceAll("[\\.,-:;/]+", " "); + // Collections.addAll(stringList, StringUtils.splitByWholeSeparator(s, ".")); + Collections.addAll(stringList, StringUtils.splitByWholeSeparator(s, null)); + } + return stringList.stream() + .distinct() + .filter(Predicate.not(String::isBlank)) + .map(String::toLowerCase) + .filter(s -> s.length() > 2) + .toList(); + } + + /** + * Generates keywords from various string sources + * + * @return List + */ + private static List generateKeyWords( + @Nullable String id, + @Nullable Section section, + @Nullable Group group, + @Nullable Preference preference) { + final List keyWords = new ArrayList<>(); + if (id != null) { + keyWords.addAll(divideAndConquer(id)); + } + if (section != null) { + keyWords.addAll(divideAndConquer(section.name(), section.i18nKey, section.displayName)); + } + if (group != null) { + keyWords.addAll(divideAndConquer(group.name(), group.i18nKey, group.displayName)); + } + if (preference != null) { + keyWords.addAll( + divideAndConquer( + preference.getClass().getSimpleName(), + preference.getValueClass().getSimpleName(), + preference.getKey(), + preference.getLabel(), + preference.getTooltip(), + String.valueOf(preference.getDefault()), + String.valueOf(preference.get()))); + } + return keyWords; + } + + @Override + public List getSearchWords() { + return searchWords; + } + } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/ClassifyII.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/ClassifyII.java new file mode 100644 index 0000000000..05da5979e0 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/ClassifyII.java @@ -0,0 +1,342 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import java.awt.*; +import java.util.*; +import javax.swing.*; + +class ClassifyII { + // record PrefRecord(Preference preference, KeyWord section, @Nullable KeyWord group, + // KeyWord[] keyWords){}; + // private static final DefaultMutableTreeNode ROOT = new DefaultMutableTreeNode(null, true); + // private static final TreeModel PREFERENCE_TREE = new DefaultTreeModel(ROOT); + // private static final BiFunction + // createBranch = (parent, object) -> { + // DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode(object, true); + // parent.add(dmtn); + // return dmtn; + // }; + // static { + // DefaultMutableTreeNode APPLICATION = createBranch.apply(ROOT, null); + // DefaultMutableTreeNode STAT_SHEET = createBranch.apply(APPLICATION, null); + // DefaultMutableTreeNode STATUS_BAR = createBranch.apply(APPLICATION, null); + // DefaultMutableTreeNode TOOLTIP = createBranch.apply(APPLICATION, null); + // DefaultMutableTreeNode CHAT = createBranch.apply(APPLICATION, null); + // DefaultMutableTreeNode CHAT_FONT_SIZE = createBranch.apply(APPLICATION, null); + // DefaultMutableTreeNode INITIATIVE = createBranch.apply(APPLICATION, null); + // DefaultMutableTreeNode MAP = createBranch.apply(APPLICATION, null); + // DefaultMutableTreeNode TOKEN = createBranch.apply(APPLICATION, null); + // + // } + // public record PreferenceDetails(String name){}; + // private enum old { + // // spotless:off +// _000(false, false, 1, "root", "", null, null), +// _001(false, false, 1, PreferencesDialog.APPEARANCE, "Appearance ", "Label.appearance", null), +// _002(false, false, 2, PreferencesDialog.APPEARANCE, "Chat ", "panel.Chat", null), +// _003(false, false, 3, PreferencesDialog.APPEARANCE, "Chat.Font ", "Label.font", null), +// _004(false, false, 4, PreferencesDialog.APPEARANCE, "Chat.Font.Size ", null, AppPreferences.fontSize), +// _005(false, false, 3, PreferencesDialog.APPEARANCE, "Chat.Trusted ", "Label.trusted", null), +// _006(false, false, 4, PreferencesDialog.APPEARANCE, "Chat.Trusted.Foreground ", null, AppPreferences.trustedPrefixForeground), +// _007(false, false, 4, PreferencesDialog.APPEARANCE, "Chat.Trusted.Background ", null, AppPreferences.trustedPrefixBackground), +// _008(false, false, 3, PreferencesDialog.APPEARANCE, "Chat.Tooltip ", "component.label.macro.toolTip", null), +// _009(false, false, 4, PreferencesDialog.APPEARANCE, "Chat.Tooltip.Inline ", null, AppPreferences.useToolTipForInlineRoll), +// _010(false, false, 4, PreferencesDialog.APPEARANCE, "Chat.Tooltip.Link.Suppress ", null, AppPreferences.suppressToolTipsForMacroLinks), +// _011(false, false, 4, PreferencesDialog.APPEARANCE, "Chat.Smilies ", null, AppPreferences.showSmilies), +// _012(false, false, 4, PreferencesDialog.APPEARANCE, "Chat.Avatar ", null, AppPreferences.showAvatarInChat), +// _013(false, false, 3, PreferencesDialog.APPEARANCE, "Chat.Notification ", "Label.notifications", null), +// _014(false, false, 4, PreferencesDialog.APPEARANCE, "Chat.Notification.Color.Foreground ", null, AppPreferences.chatNotificationColor), +// _015(false, false, 4, PreferencesDialog.APPEARANCE, "Chat.Notification.Color.Background ", null, AppPreferences.chatNotificationBackground), +// _016(false, false, 2, PreferencesDialog.APPEARANCE, "Initiative ", "initiative.menu", null), +// _017(false, false, 4, PreferencesDialog.APPEARANCE, "Initiative.Token.Image ", null, AppPreferences.initiativePanelShowsTokenImage), +// _018(false, false, 4, PreferencesDialog.APPEARANCE, "Initiative.Token.State ", null, AppPreferences.initiativePanelShowsTokenState), +// _020(false, false, 4, PreferencesDialog.APPEARANCE, "Initiative.Token.NextLine ", null, AppPreferences.initiativePanelShowsInitiativeOnLine2), +// _021(false, false, 4, PreferencesDialog.APPEARANCE, "Initiative.NPC.Hide ", null, AppPreferences.initiativePanelHidesNpcs), +// _022(false, false, 2, PreferencesDialog.APPEARANCE, "Map ", "Button.map", null), +// _023(false, false, 4, PreferencesDialog.APPEARANCE, "Map.Fog ", null, AppPreferences.fogOverlayOpacity), +// _024(false, false, 3, PreferencesDialog.APPEARANCE, "Map.Halo ", "token.popup.menu.halo", null), +// _025(false, false, 4, PreferencesDialog.APPEARANCE, "Map.Halo.Opacity ", null, AppPreferences.haloOverlayOpacity), +// _026(false, false, 4, PreferencesDialog.APPEARANCE, "Map.Halo.Weight ", null, AppPreferences.haloLineWidth), +// _027(false, false, 4, PreferencesDialog.APPEARANCE, "Map.Aura.Opacity ", null, AppPreferences.auraOverlayOpacity), +// _028(false, false, 3, PreferencesDialog.APPEARANCE, "Map.Light ", "CampaignPropertiesDialog.tab.light", null), +// _029(false, false, 4, PreferencesDialog.APPEARANCE, "Map.Light.UseHalo ", null, AppPreferences.useHaloColorOnVisionOverlay), +// _030(false, false, 4, PreferencesDialog.APPEARANCE, "Map.Light.Opacity ", null, AppPreferences.lightOverlayOpacity), +// _031(false, false, 4, PreferencesDialog.APPEARANCE, "Map.Light.Lumens.Opacity ", null, AppPreferences.lumensOverlayOpacity), +// _032(false, false, 2, PreferencesDialog.APPEARANCE, "Token ", "Label.token", null), +// _033(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Stack.Hide ", null, AppPreferences.hideTokenStackIndicator), +// _034(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Facing.Arrow.Force ", null, AppPreferences.forceFacingArrow), +// _035(false, false, 3, PreferencesDialog.APPEARANCE, "Token.Label ", "Preferences.label.access.tokenLabel", null), +// _036(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color ", "sightLight.optionLabel.color", null), +// _037(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Foreground ", "Label.foreground", null), +// _038(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Foreground.NPC ", null, AppPreferences.npcMapLabelForeground), +// _039(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Foreground.PC ", null, AppPreferences.pcMapLabelForeground), +// _040(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Foreground.Hidden", null, AppPreferences.nonVisibleTokenMapLabelForeground), +// _041(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Background ", "Label.background", null), +// _042(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Background.NPC ", null, AppPreferences.npcMapLabelBackground), +// _043(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Background.PC ", null, AppPreferences.pcMapLabelBackground), +// _044(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Background.Hidden", null, AppPreferences.nonVisibleTokenMapLabelBackground), +// _045(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Border ", "Label.border", null), +// _052(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Border.Show ", null, AppPreferences.mapLabelShowBorder), +// _046(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Border.NPC ", null, AppPreferences.npcMapLabelBorder), +// _047(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Border.PC ", null, AppPreferences.pcMapLabelBorder), +// _048(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Color.Border.NPC ", null, AppPreferences.nonVisibleTokenMapLabelBorder), +// _049(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Border.Font.Size ", null, AppPreferences.mapLabelFontSize), +// _050(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Border.Arc ", null, AppPreferences.mapLabelBorderArc), +// _051(false, false, 4, PreferencesDialog.APPEARANCE, "Token.Label.Border.Weight ", null, AppPreferences.mapLabelBorderWidth), +// _053(false, false, 2, PreferencesDialog.APPEARANCE, "StatSheet ", "EditTokenDialog.label.statSheet", null), +// _054(false, false, 4, PreferencesDialog.APPEARANCE, "StatSheet.Show ", null, AppPreferences.showStatSheet), +// _055(false, false, 3, PreferencesDialog.APPEARANCE, "StatSheet.Portrait ", "EditTokenDialog.border.title.portrait", null), +// _056(false, false, 4, PreferencesDialog.APPEARANCE, "StatSheet.Portrait.Size ", null, AppPreferences.portraitSize), +// _057(false, false, 4, PreferencesDialog.APPEARANCE, "StatSheet.Portrait.Show ", null, AppPreferences.showPortrait), +// _058(false, false, 2, PreferencesDialog.APPEARANCE, "StatusBar ", "Preferences.label.access.status.options", null), +// _059(false, false, 4, PreferencesDialog.APPEARANCE, "StatusBar.Scroll ", null, AppPreferences.scrollStatusMessages), +// _060(false, false, 4, PreferencesDialog.APPEARANCE, "StatusBar.Scroll.Speed ", null, AppPreferences.scrollStatusSpeed), +// _062(false, false, 4, PreferencesDialog.APPEARANCE, "StatusBar.Scroll.Delay.Start ", null, AppPreferences.scrollStatusStartDelay), +// _063(false, false, 4, PreferencesDialog.APPEARANCE, "StatusBar.Scroll.Delay.End ", null, AppPreferences.scrollStatusEndPause), +// _064(false, false, 4, PreferencesDialog.APPEARANCE, "StatusBar.Duration.Temp ", null, AppPreferences.scrollStatusTempDuration), +// _065(false, false, 2, PreferencesDialog.APPEARANCE, "Theme ", "Label.themes", null), +// _066(false, false, 3, PreferencesDialog.APPEARANCE, "Theme.Application ", "Label.application", null), +// _067(false, false, 4, PreferencesDialog.APPEARANCE, "Theme.Application.Icon ", null, AppPreferences.UIIcons), +// _069(false, true, 4, PreferencesDialog.APPEARANCE, "Theme.Application.Font.Settings ", "Preferences.heading.theme.fonts", null), +// _070(false, false, 4, PreferencesDialog.APPEARANCE, "Theme.Macro.Editor ", null, AppPreferences.defaultMacroEditorTheme), +// _071(false, false, 1, PreferencesDialog.OTHER, "Default ", "Label.default", null), +// _072(false, false, 2, PreferencesDialog.OTHER, "Default.Map ", "Label.maps", null), +// _073(false, false, 3, PreferencesDialog.OTHER, "Default.Map.Grid ", "Label.grid", null), +// _074(false, false, 4, PreferencesDialog.OTHER, "Default.Map.Grid.Type ", null, AppPreferences.defaultGridType), +// _075(false, false, 4, PreferencesDialog.OTHER, "Default.Map.Grid.Color ", null, AppPreferences.defaultGridColor), +// _076(false, false, 4, PreferencesDialog.OTHER, "Default.Map.Grid.Size ", null, AppPreferences.defaultGridSize), +// _077(false, false, 4, PreferencesDialog.OTHER, "Default.Map.Grid.Units ", null, AppPreferences.defaultUnitsPerCell), +// _078(false, false, 4, PreferencesDialog.OTHER, "Default.Map.Grid.Metric ", null, AppPreferences.movementMetric), +// _079(false, false, 3, PreferencesDialog.OTHER, "Default.Map.Vision ", "Label.lights", null), +// _080(false, false, 4, PreferencesDialog.OTHER, "Default.Map.Vision.Distance ", null, AppPreferences.defaultVisionDistance), +// _081(false, false, 4, PreferencesDialog.OTHER, "Default.Map.Vision.Type ", null, AppPreferences.defaultVisionType), +// _082(false, false, 2, PreferencesDialog.OTHER, "Default.User ", null, AppPreferences.defaultUserName), +// _083(false, false, 4, PreferencesDialog.OTHER, "Default.User.Name ", null, AppPreferences.defaultUserName), +// _084(false, false, 1, PreferencesDialog.BEHAVIOUR, "Behaviour ", "Label.behaviour", null), +// _085(false, false, 2, PreferencesDialog.BEHAVIOUR, "Initiative ", "initiative.menu", null), +// _086(false, false, 4, PreferencesDialog.BEHAVIOUR, "Initiative.Movement.Lock ", null, AppPreferences.initiativeMovementLocked), +// _087(false, false, 4, PreferencesDialog.BEHAVIOUR, "Initiative.Owner.Permission ", null, AppPreferences.initiativePanelAllowsOwnerPermissions), +// _088(false, false, 4, PreferencesDialog.BEHAVIOUR, "Initiative.Gain.Message ", null, AppPreferences.showInitiativeGainedMessage), +// _089(false, false, 2, PreferencesDialog.BEHAVIOUR, "Notify ", "Label.notifications", null), +// _090(false, false, 4, PreferencesDialog.BEHAVIOUR, "Notify.Typing.Duration ", null, AppPreferences.typingNotificationDurationInSeconds), +// _091(false, false, 4, PreferencesDialog.BEHAVIOUR, "Notify.Save ", null, AppPreferences.saveReminder), +// _092(false, false, 2, PreferencesDialog.BEHAVIOUR, "Save ", "token.popup.menu.save", null), +// _093(false, false, 4, PreferencesDialog.BEHAVIOUR, "Save.Campaign ", null, AppPreferences.autoSaveIncrement), +// _094(false, false, 4, PreferencesDialog.BEHAVIOUR, "Save.Chat ", null, AppPreferences.chatAutoSaveTimeInMinutes), +// _095(false, false, 4, PreferencesDialog.BEHAVIOUR, "Save.Chat.FileName ", null, AppPreferences.chatFilenameFormat), +// _096(false, true, 4, PreferencesDialog.BEHAVIOUR, "Save.File.Sync.Path ", null, AppPreferences.fileSyncPath), +// _097(false, false, 4, PreferencesDialog.BEHAVIOUR, "Save.Campaign.Load ", null, AppPreferences.loadMruCampaignAtStart), +// _098(false, false, 2, PreferencesDialog.BEHAVIOUR, "Sound ", "Label.sounds", null), +// _099(false, false, 4, PreferencesDialog.BEHAVIOUR, "Sound.System ", null, AppPreferences.playSystemSounds), +// _100(false, false, 4, PreferencesDialog.BEHAVIOUR, "Sound.System.NoFocus ", null, AppPreferences.playSystemSoundsOnlyWhenNotFocused), +// _101(false, false, 4, PreferencesDialog.BEHAVIOUR, "Sound.Stream ", null, AppPreferences.playStreams), +// _102(false, false, 4, PreferencesDialog.BEHAVIOUR, "Sound.Syrinscape ", null, AppPreferences.syrinscapeActive), +// _103(false, false, 2, PreferencesDialog.BEHAVIOUR, "StatSheet ", "EditTokenDialog.label.statSheet", null), +// _104(false, false, 4, PreferencesDialog.BEHAVIOUR, "StatSheet.Modifier ", null, AppPreferences.showStatSheetRequiresModifierKey), +// _105(false, false, 2, PreferencesDialog.BEHAVIOUR, "Map ", "Label.maps", null), +// _106(false, false, 3, PreferencesDialog.BEHAVIOUR, "Map.Fog ", "Button.fog", null), +// _107(false, false, 4, PreferencesDialog.BEHAVIOUR, "Map.Fog.New ", null, AppPreferences.newMapsHaveFow), +// _108(false, false, 4, PreferencesDialog.BEHAVIOUR, "Map.Fog.Reveal ", null, AppPreferences.autoRevealVisionOnGMMovement), +// _109(false, false, 4, PreferencesDialog.BEHAVIOUR, "Map.Import ", null, AppPreferences.uvttLosImportType), +// _110(false, false, 4, PreferencesDialog.BEHAVIOUR, "Map.Sort ", null, AppPreferences.mapSortType), +// _111(false, false, 4, PreferencesDialog.BEHAVIOUR, "Map.New.Visible ", null, AppPreferences.newMapsVisible), +// _112(false, false, 4, PreferencesDialog.BEHAVIOUR, "Map.View ", null, AppPreferences.fitGmView), +// _113(false, false, 2, PreferencesDialog.BEHAVIOUR, "New.Token ", "Label.token", null), +// _114(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Dialog ", null, AppPreferences.showDialogOnNewToken), +// _115(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Duplicate ", null, AppPreferences.numberTokenDuplicateMethod), +// _116(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Name ", null, AppPreferences.newTokenName), +// _117(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Numbering ", null, AppPreferences.showTokenNumberOn), +// _118(false, false, 3, PreferencesDialog.BEHAVIOUR, "New.Token.Size ", "EditTokenDialog.label.size", null), +// _119(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Size.Background ", null, AppPreferences.backgroundsStartFreesize), +// _120(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Size.Object ", null, AppPreferences.objectsStartFreesize), +// _121(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Size.Token ", null, AppPreferences.tokensStartFreesize), +// _122(false, false, 3, PreferencesDialog.BEHAVIOUR, "New.Token.Snap ", "Label.snapToGrid", null), +// _123(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Snap.Background ", null, AppPreferences.backgroundsStartSnapToGrid), +// _124(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Snap.Object ", null, AppPreferences.objectsStartSnapToGrid), +// _125(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Snap.Token ", null, AppPreferences.tokensStartSnapToGrid), +// _126(false, false, 3, PreferencesDialog.BEHAVIOUR, "New.Token.Visible ", "Label.visibility", null), +// _127(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Visible.Background ", null, AppPreferences.newBackgroundsVisible), +// _128(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Visible.Object ", null, AppPreferences.newObjectsVisible), +// _129(false, false, 4, PreferencesDialog.BEHAVIOUR, "New.Token.Visible.Token ", null, AppPreferences.newTokensVisible), +// _130(false, false, 2, PreferencesDialog.BEHAVIOUR, "Facing ", "Label.facing", null), +// _131(false, false, 4, PreferencesDialog.BEHAVIOUR, "Facing.Vertices ", null, AppPreferences.faceVertex), +// _132(false, false, 4, PreferencesDialog.BEHAVIOUR, "Facing.Edge ", null, AppPreferences.faceEdge), +// _133(false, false, 2, PreferencesDialog.BEHAVIOUR, "Snap ", "Label.snapToGrid", null), +// _134(false, false, 4, PreferencesDialog.BEHAVIOUR, "Snap.Drag ", null, AppPreferences.tokensSnapWhileDragging), +// _135(false, false, 4, PreferencesDialog.BEHAVIOUR, "Snap.Drag.Pointer ", null, AppPreferences.hideMousePointerWhileDragging), +// _136(false, false, 2, PreferencesDialog.BEHAVIOUR, "Tooltip ", "component.label.macro.toolTip", null), +// _137(false, false, 4, PreferencesDialog.BEHAVIOUR, "Tooltip.Delay.Initial ", null, AppPreferences.toolTipInitialDelay), +// _138(false, false, 4, PreferencesDialog.BEHAVIOUR, "Tooltip.Delay.Dismiss ", null, AppPreferences.toolTipDismissDelay), +// _139(false, false, 2, PreferencesDialog.BEHAVIOUR, "UPnP ", "Label.upnp", null), +// _140(false, false, 4, PreferencesDialog.BEHAVIOUR, "UPnP.Timeout ", null, AppPreferences.upnpDiscoveryTimeout), +// _141(false, false, 2, PreferencesDialog.BEHAVIOUR, "Warn ", "MapToolEventQueue.warning.title", null), +// _142(false, false, 4, PreferencesDialog.BEHAVIOUR, "Warn.Delete.Drawing ", null, AppPreferences.drawingsWarnWhenDeleted), +// _143(false, false, 4, PreferencesDialog.BEHAVIOUR, "Warn.Delete.Token ", null, AppPreferences.tokensWarnWhenDeleted), +// _144(false, false, 4, PreferencesDialog.BEHAVIOUR, "Warn.Map.Visible ", null, AppPreferences.mapVisibilityWarning), +// _145(false, false, 4, PreferencesDialog.BEHAVIOUR, "Warn.Initiative.Reset ", null, AppPreferences.initiativePanelWarnWhenResettingRoundCounter), +// _146(false, false, 2, PreferencesDialog.BEHAVIOUR, "Macro.Editor ", null, AppPreferences.openEditorForNewMacro), +// _147(false, false, 4, PreferencesDialog.BEHAVIOUR, "Macro.Edit.Allow ", null, AppPreferences.allowPlayerMacroEditsDefault), +// _148(false, false, 4, PreferencesDialog.BEHAVIOUR, "Macro.External.Allow ", null, AppPreferences.allowExternalMacroAccess), +// _149(false, false, 1, PreferencesDialog.PERFORMANCE, "Performance ", "Label.performance", null), +// _150(false, false, 4, PreferencesDialog.PERFORMANCE, "Render.Selection.Fill ", null, AppPreferences.fillSelectionBox), +// _151(false, false, 4, PreferencesDialog.PERFORMANCE, "Render.Scaling ", null, AppPreferences.renderQuality), +// _152(false, false, 4, PreferencesDialog.PERFORMANCE, "Render.Frame.Rate ", null, AppPreferences.frameRateCap), +// _153(false, false, 1, PreferencesDialog.OTHER, "Authentication ", "Label.auth", null), +// _154(false, true, 4, PreferencesDialog.OTHER, "Authentication.key ", null, null), +// _155(false, false, 1, PreferencesDialog.DEVELOPER, "Developer ", , null), +// _156(true, true, 4, PreferencesDialog.DEVELOPER, "Developer ", null, null), +// _157(false, false, 1, PreferencesDialog.OTHER, "Config ", , null), +// _158(false, true, 4, PreferencesDialog.OTHER, "Config.Path ", null, null); +// +// //spotless:on + // final boolean hasAction; + // final int level; + // final String preferenceKey; + // final String contentType; + // final String path; + // final String i18nKey; + // final @Nullable Preference preference; + // + // ClassifyII( + // boolean warning, + // boolean hasAction, + // int level, + // String contentType, + // String path, + // String i18nKey, + // @Nullable Preference preference) { + // this.hasAction = hasAction; + // this.level = level; + // this.contentType = contentType; + // this.path = path.trim(); + // this.i18nKey = i18nKey; + // this.preference = preference; + // this.preferenceKey = preference == null ? null : preference.getKey(); + // } + // + // static final EnumSet classifyEnumSet = EnumSet.allOf(ClassifyII.class); + // static final Set allSet = new HashSet<>(classifyEnumSet); + // + // private static final Set preferenceSet = + // classifyEnumSet.stream() + // .filter(classify -> classify.preference != null) + // .collect(Collectors.toSet()); + // static final Set appearanceSet = + // classifyEnumSet.stream() + // .filter(classify -> + // classify.contentType.equals(PreferencesDialog.APPEARANCE)) + // .collect(Collectors.toSet()); + // static final Set behaviourSet = + // classifyEnumSet.stream() + // .filter(classify -> + // classify.contentType.equals(PreferencesDialog.BEHAVIOUR)) + // .collect(Collectors.toSet()); + // static final Set performanceSet = + // classifyEnumSet.stream() + // .filter(classify -> + // classify.contentType.equals(PreferencesDialog.PERFORMANCE)) + // .collect(Collectors.toSet()); + // static final Set otherSet = + // classifyEnumSet.stream() + // .filter(classify -> classify.contentType.equals(PreferencesDialog.OTHER)) + // .collect(Collectors.toSet()); + // static final Set numberSet = + // preferenceSet.stream() + // .filter( + // classify -> + // + // Objects.requireNonNull(classify.preference).cast(Integer.class).isPresent() + // || + // classify.preference.cast(Double.class).isPresent()) + // .collect(Collectors.toSet()); + // static final Set booleanSet = + // preferenceSet.stream() + // .filter( + // classify -> + // + // Objects.requireNonNull(classify.preference).cast(Boolean.class).isPresent()) + // .collect(Collectors.toSet()); + // static final Set colourSet = + // preferenceSet.stream() + // .filter( + // classify -> + // Objects.requireNonNull(classify.preference).cast(Color.class).isPresent()) + // .collect(Collectors.toSet()); + // + // static final Set stringSet = + // preferenceSet.stream() + // .filter( + // classify -> + // + // Objects.requireNonNull(classify.preference).cast(String.class).isPresent()) + // .collect(Collectors.toSet()); + // + // private static List getChildren(ClassifyII classify) { + // List out = new ArrayList<>(); + // if (classify.level == 4) { + // return out; + // } + // out = + // allSet.stream() + // .filter(c -> c.level == classify.level + 1) + // .filter(c -> c.path.startsWith(classify.path) && + // !c.path.equals(classify.path)) + // .toList(); + // if (!out.isEmpty()) { + // return out; + // } + // return allSet.stream() + // .filter(c -> c.level < classify.level) + // .filter(c -> c.path.startsWith(classify.path) && !c.path.equals(classify.path)) + // .toList(); + // } + // + // private static void addTreeNodes(DefaultMutableTreeNode parent, List list) { + // for (ClassifyII c : list) { + // + // DefaultMutableTreeNode node = new DefaultMutableTreeNode(c, c.level != 4); + // parent.add(node); + // if (c.level != 4) { + // addTreeNodes(node, getChildren(c)); + // } + // } + // } + // + // @Override + // public String toString() { + // if (i18nKey == null) { + // return path; + // } else { + // return I18N.getText(i18nKey); + // } + // } + // + // public static final TreeModel TREE_MODEL = buildTree(); + // public static final JTree TREE = new JTree(TREE_MODEL); + // public static final Searchable SEARCHABLE = new TreeSearchable(TREE); + // + // private static TreeModel buildTree() { + // DefaultMutableTreeNode root = new DefaultMutableTreeNode(_000, true); + // TreeModel model = new DefaultTreeModel(root); + // List startingList = allSet.stream().filter(o -> o.level == 1).toList(); + // for (ClassifyII c : startingList) { + // DefaultMutableTreeNode node = new DefaultMutableTreeNode(c, c.level != 4); + // addTreeNodes(node, getChildren(c)); + // } + // return model; + // } + // } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/ConfigDialog.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/ConfigDialog.java new file mode 100644 index 0000000000..4f49197182 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/ConfigDialog.java @@ -0,0 +1,80 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import java.awt.*; +import java.awt.datatransfer.StringSelection; +import java.io.File; +import javax.swing.*; +import net.rptools.maptool.client.AppUtil; +import net.rptools.maptool.client.swing.AbeillePanel; +import net.rptools.maptool.client.swing.ButtonKind; +import net.rptools.maptool.client.swing.GenericDialog; +import net.rptools.maptool.client.swing.GenericDialogFactory; +import net.rptools.maptool.client.ui.theme.Icons; +import net.rptools.maptool.client.ui.theme.RessourceManager; +import net.rptools.maptool.language.I18N; + +public class ConfigDialog extends AbeillePanel { + private static final String CONFIG_FILE_PANEL = "configFilePanel"; + private static final String CONFIG_FILE_WARNING_PANEL = "configFileWarningPanel"; + private static final String ICON_LABEL_NAME = "configFileWarningIcon"; + private static final Icon ICON = RessourceManager.getBigIcon(Icons.WARNING); + private static final JLabel ICON_LABEL = new JLabel(ICON); + private static final String COPY_PATH_BUTTON_NAME = "copyCfgPath"; + private static final AbstractButton COPY_CONFIG_PATH = + new JButton(RessourceManager.getSmallIcon(Icons.ACTION_COPY)); + private static final String APP_CFG_PATH; + private static final String PATH_TEXT_FIELD_NAME = "cfgFilePath"; + private static final JTextField CFG_FILE_PATH_TEXT_FIELD; + private static final JComponent DIALOG_CONTENT = new AppConfigDialog().getRootComponent(); + private final GenericDialogFactory dialogFactory = GenericDialog.getFactory(); + + static { + COPY_CONFIG_PATH.setToolTipText( + I18N.getString("startup.preferences.button.copyCfgPath.tooltip")); + File appCfgFile = AppUtil.getAppCfgFile(); + if (appCfgFile != null) { + APP_CFG_PATH = appCfgFile.toString(); + } else { + APP_CFG_PATH = ""; + } + CFG_FILE_PATH_TEXT_FIELD = new JTextField(APP_CFG_PATH); + COPY_CONFIG_PATH.addActionListener( + e -> + Toolkit.getDefaultToolkit() + .getSystemClipboard() + .setContents(new StringSelection(CFG_FILE_PATH_TEXT_FIELD.getText()), null)); + CFG_FILE_PATH_TEXT_FIELD.setEditable(false); + } + + public ConfigDialog() { + super(DIALOG_CONTENT); + replaceComponent(CONFIG_FILE_WARNING_PANEL, ICON_LABEL_NAME, ICON_LABEL); + replaceComponent(CONFIG_FILE_PANEL, PATH_TEXT_FIELD_NAME, CFG_FILE_PATH_TEXT_FIELD); + replaceComponent(CONFIG_FILE_PANEL, COPY_PATH_BUTTON_NAME, COPY_CONFIG_PATH); + + dialogFactory + .setDialogTitle(I18N.getText("Label.startup")) + .setContent(DIALOG_CONTENT) + .makeModal(true) + .setCloseOperation(WindowConstants.DISPOSE_ON_CLOSE) + .addButton(ButtonKind.CLOSE); + } + + public void showDialog() { + dialogFactory.display(); + } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/DeveloperOptionsDialog.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/DeveloperOptionsDialog.java new file mode 100644 index 0000000000..a8f9ef2150 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/DeveloperOptionsDialog.java @@ -0,0 +1,127 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import java.awt.*; +import javax.swing.*; +import net.rptools.maptool.client.DeveloperOptions; +import net.rptools.maptool.client.swing.ButtonKind; +import net.rptools.maptool.client.swing.GenericDialog; +import net.rptools.maptool.client.swing.GenericDialogFactory; +import net.rptools.maptool.client.ui.theme.Icons; +import net.rptools.maptool.client.ui.theme.RessourceManager; +import net.rptools.maptool.language.I18N; +import net.rptools.maptool.util.preferences.Preference; +import org.apache.commons.text.WordUtils; + +public class DeveloperOptionsDialog { + private static class DeveloperToggleModel extends DefaultButtonModel { + private final Preference option; + + public DeveloperToggleModel(Preference option) { + this.option = option; + } + + @Override + public boolean isSelected() { + return option.get(); + } + + @Override + public void setSelected(boolean b) { + option.set(b); + super.setSelected(b); + } + } + + GenericDialogFactory dialogFactory = + GenericDialog.getFactory() + .setDialogTitle("Preferences.tab.developer") + .makeModal(true) + .addButton(ButtonKind.CLOSE); + + public DeveloperOptionsDialog() { + final var developerOptionToggles = new JPanel(new GridBagLayout()); + + final var headingConstraints = new GridBagConstraints(); + headingConstraints.insets = new Insets(6, 6, 3, 6); + headingConstraints.gridx = 0; + headingConstraints.gridy = 0; + headingConstraints.gridwidth = 2; + headingConstraints.gridheight = 2; + headingConstraints.anchor = GridBagConstraints.CENTER; + headingConstraints.fill = GridBagConstraints.VERTICAL; + + JLabel heading = + new JLabel( + "" + + WordUtils.wrap( + I18N.getText("Preferences.tab.developer.warning"), 50, "
", false) + + "", + RessourceManager.getBigIcon(Icons.WARNING), + SwingConstants.CENTER); + heading.setIconTextGap(12); + heading.setBorder( + BorderFactory.createCompoundBorder( + BorderFactory.createLineBorder( + UIManager.getColor("Component.warning.borderColor"), 4, true), + BorderFactory.createEmptyBorder(3, 8, 3, 8))); + developerOptionToggles.add(heading, headingConstraints); + + final var labelConstraints = new GridBagConstraints(); + labelConstraints.insets = new Insets(6, 0, 6, 5); + labelConstraints.gridx = 0; + labelConstraints.gridy = 2; + labelConstraints.weightx = 0.; + labelConstraints.weighty = 1.; + labelConstraints.fill = GridBagConstraints.HORIZONTAL; + + final var checkboxConstraints = new GridBagConstraints(); + checkboxConstraints.insets = new Insets(6, 5, 6, 0); + checkboxConstraints.gridx = 1; + checkboxConstraints.gridy = 2; + checkboxConstraints.weightx = 0.; + checkboxConstraints.weighty = 1.; + checkboxConstraints.fill = GridBagConstraints.HORIZONTAL; + + for (final var option : DeveloperOptions.Toggle.getOptions()) { + labelConstraints.gridy += 1; + checkboxConstraints.gridy += 1; + + final var label = new JLabel(option.getLabel()); + label.setToolTipText(option.getTooltip()); + label.setHorizontalAlignment(SwingConstants.LEADING); + label.setHorizontalTextPosition(SwingConstants.TRAILING); + + final var checkbox = new JCheckBox(); + checkbox.setModel(new DeveloperToggleModel(option)); + checkbox.addActionListener(e -> option.set(!checkbox.isSelected())); + + label.setLabelFor(checkbox); + + developerOptionToggles.add(label, labelConstraints); + developerOptionToggles.add(checkbox, checkboxConstraints); + } + dialogFactory.setContent(developerOptionToggles); + } + + public void closeDialog() { + dialogFactory.closeDialog(); + } + + public void showDialog() { + dialogFactory.display(); + } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PrefParts.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PrefParts.java new file mode 100644 index 0000000000..4c6c38a844 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PrefParts.java @@ -0,0 +1,457 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.extras.components.FlatButton; +import com.intellij.uiDesigner.core.GridConstraints; +import java.awt.*; +import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.function.Supplier; +import javax.swing.*; +import javax.swing.text.JTextComponent; +import net.rptools.maptool.client.AppPreferences; +import net.rptools.maptool.client.swing.ColorWell; +import net.rptools.maptool.client.ui.theme.Icons; +import net.rptools.maptool.client.ui.theme.RessourceManager; +import net.rptools.maptool.client.ui.theme.ThemeDialog; +import net.rptools.maptool.language.I18N; +import net.rptools.maptool.model.localisedObject.LocalEnumListItem; +import net.rptools.maptool.util.preferences.Preference; +import org.apache.commons.lang3.function.TriFunction; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +class PrefParts { + private static final Logger log = LogManager.getLogger(PrefParts.class); + + /** Main content panel - for displaying preference controls */ + protected static final JPanel PREF_PANE = new JPanel(new BorderLayout()); + + /** Panel for displaying filtering options/controls */ + protected static final JPanel SEARCH_PANE = new JPanel(); + + /** This has no use other than testing */ + protected static final JPanel SIDE_PANE = new JPanel(new GridLayout(0, 18)); + + /** Panel on LHS shortcuts, hopefully temporary */ + protected static final JPanel NAV_PANEL = new JPanel(); + + /** + * Map of control components, used for {@link #findComponent(String)} & {@link + * #findComponent(String, Container)} layout changes + */ + protected static final Map COMPONENT_MAP = new HashMap<>(); + + /** Separate dialog for managing theme settings */ + protected static final ThemeDialog themeDialog = ThemeDialog.getInstance(); + + /** Separate dialog for managing developer options */ + protected static final DeveloperOptionsDialog developerOptionsDialog = + new DeveloperOptionsDialog(); + + /** Separate dialog for showing unsettable JVM settings */ + protected static final ConfigDialog configDialog = new ConfigDialog(); + + private static final int layoutColumns = 6; + + protected enum Archetype { + SECTION, + CONTROL, + FAVOURITE, + GROUP, + HEADER, + LABEL, + ROW + } + + protected static final Map CONSTRAINTS = + new HashMap<>(); // section, group, prefLabel, prefControl, prefFave; + + /** + * Method to generate the label and control for entries in {@link Classify.Collated}. For most + * preferences everything is auto-go-matic, for things that need special creation, set the {@link + * Classify.Collated#useDefaultControls} flag to false and add a branch to the switch statement. + * + * @param collated {@link Classify.Collated} enum entry + * @return Component array of label and control + */ + protected static Component[] createComponentsFor(Classify.Collated collated) { + Component[] components; + if (!collated.useDefaultControls) { + components = + switch (collated) { + case AUTH_KEY -> + new Component[] { + Fn.createLabelUseKeys.apply( + "Preferences.label.auth.publicKey", + "Preferences.label.auth.publicKey.tooltip", + collated), + createDeveloperOptionsButton() + }; + case DEV_OPTIONS -> + new Component[] { + Fn.createLabelUseKeys.apply("Preferences.tab.developer", null, collated), + createDeveloperOptionsButton() + }; + case STARTUP -> + new Component[] { + Fn.createLabelUseKeys.apply("Label.startup", null, collated), createConfigButton() + }; + case THEME -> + new Component[] { + Fn.createLabelUseKeys.apply("Label.themes", null, collated), createThemeButton() + }; + case ICONS -> + new Component[] { + Fn.createLabelUseKeys.apply( + "Label.iconTheme", "Preferences.label.iconTheme.tooltip", collated), + createThemeButton() + }; + case MACRO_ED_THEME -> + new Component[] { + Fn.createLabelUseKeys.apply( + "Label.theme.macroEditor", "Preferences.label.macroEditor.tooltip", collated), + createThemeButton() + }; + default -> null; + }; + } else { + components = + new Component[] { + Fn.createLabel.apply(null, null, collated), Fn.createComponent.apply(collated) + }; + ((JLabel) components[0]).setLabelFor(components[1]); + } + if (components != null) { + for (Component component : components) { + COMPONENT_MAP.put(component.getName(), component); + } + } + return components; + } + + private static AbstractButton createConfigButton() { + AbstractButton button = Fn.createButton.get(); + button.setText(I18N.getText("Label.startup")); + button.addActionListener(e -> PrefParts.configDialog.showDialog()); + return button; + } + + private static AbstractButton createThemeButton() { + AbstractButton button = Fn.createButton.get(); + button.setText(I18N.getText("Label.themes")); + button.addActionListener(e -> PrefParts.themeDialog.showDialog()); + return button; + } + + private static AbstractButton createDeveloperOptionsButton() { + AbstractButton button = Fn.createButton.get(); + button.setText(I18N.getText("Preferences.tab.developer")); + button.setIcon(RessourceManager.getSmallIcon(Icons.WARNING)); + button.addActionListener(e -> PrefParts.developerOptionsDialog.showDialog()); + return button; + } + + /** Functions for generating labels and controls. */ + private static class Fn { + static Supplier createButton = + () -> { + AbstractButton button = new FlatButton(); + button.putClientProperty( + FlatClientProperties.BUTTON_TYPE, FlatButton.ButtonType.roundRect); + button.putClientProperty(FlatClientProperties.STYLE, "arc:12"); + return button; + }; + static Function, JCheckBox> createCheckbox = + booleanPreference -> { + JCheckBox cb = new JCheckBox(); + cb.setSelected(booleanPreference.get()); + cb.setHorizontalAlignment(SwingConstants.LEADING); + cb.addActionListener(e -> booleanPreference.set(cb.isSelected())); + cb.setName(booleanPreference.getKey()); + return cb; + }; + static Function, JSpinner> createSpinner = + pref -> { + Number min = pref.getMinValue(); + Number max = pref.getMaxValue(); + // Number step = pref.getPrecision(); + Number value = pref.get(); + JSpinner spinner = new JSpinner(); + spinner.setName(pref.getKey()); + SpinnerNumberModel numberModel; + try { + if (pref.cast(Integer.class).isPresent()) { + numberModel = + new SpinnerNumberModel(value.intValue(), min.intValue(), max.intValue(), 1); + } else { + numberModel = + new SpinnerNumberModel( + value.doubleValue(), min.doubleValue(), max.doubleValue(), 0.1); + } + spinner.setModel(numberModel); + JFormattedTextField ftf = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField(); + ftf.setColumns(3); + spinner.addChangeListener( + e -> { + Number val = + ((SpinnerNumberModel) ((JSpinner) e.getSource()).getModel()).getNumber(); + if (pref.cast(Integer.class).isPresent() || pref.cast(Byte.class).isPresent()) { + pref.cast(Integer.class).get().set(val.intValue()); + } else if (pref.cast(Double.class).isPresent()) { + pref.cast(Double.class).get().set(val.doubleValue()); + } + }); + } catch (Exception e) { + log.warn("Spinner creation failure: {}\n{}", pref.getKey(), e); + } + return spinner; + }; + static Function, JComponent> createTextComponent = + pref -> { + String value = pref.get(); + JTextComponent component; + if (value == null || value.length() < 60) { + component = new JTextField(value); + } else { + component = new JTextArea(value, 6, 30); + } + component.setName(pref.getKey()); + component.addFocusListener( + new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + if (!e.isTemporary()) { + JTextComponent component = (JTextComponent) e.getComponent(); + if (pref.equals(AppPreferences.chatFilenameFormat)) { + StringBuilder saveFile = new StringBuilder(component.getText()); + if (saveFile.indexOf(".") < 0) { + saveFile.append(".html"); + } + AppPreferences.chatFilenameFormat.set(saveFile.toString()); + } else { + pref.set(component.getText()); + } + } + } + }); + + return component; + }; + static Function, Component> createColorWell = + pref -> { + ColorWell colorWell = new ColorWell(); + colorWell.setColor(pref.get()); + colorWell.setAlignmentX(0); + int side = RessourceManager.bigIconSize / 3 * 2; + colorWell.setPreferredSize(new Dimension(3 * side, side)); + colorWell.addActionListener(e -> pref.set(colorWell.getColor())); + return colorWell; + }; + static Function, JComboBox> createEnumCombo = + pref -> { + try { + return LocalEnumListItem.createComboBox(pref); + } catch (Exception e) { + log.warn(e); + return null; + } + }; + static TriFunction createLabel = + (labelText, tooltipText, collated) -> { + JLabel lbl = new JLabel(); + lbl.setHorizontalAlignment(SwingConstants.TRAILING); + if (collated.emphasise) { + lbl.setFont(lbl.getFont().deriveFont(Font.BOLD)); + } + String text; + String tooltip; + if (collated.preference != null) { + text = collated.preference.getLabel(); + tooltip = collated.preference.getTooltip(); + tooltip = tooltip.equals(collated.id) ? text : tooltip; + } else { + text = labelText; + tooltip = tooltipText; + } + lbl.setText(text); + lbl.setToolTipText(tooltip == null ? text : tooltipText); + lbl.setName(collated.id + "Label"); + return lbl; + }; + static TriFunction createLabelUseKeys = + (labelKey, tooltipKey, collated) -> { + String text = I18N.getText(labelKey); + String tooltip = tooltipKey == null ? text : I18N.getText(tooltipKey); + return createLabel.apply(text, tooltip, collated); + }; + static Function createComponent = + collated -> { + Preference pref = Objects.requireNonNull(collated.preference); + Component component = new JLabel(); + if (pref.getValueClass().getEnumConstants() != null) { + component = createEnumCombo.apply(pref); + } else if (pref.cast(File.class).isPresent()) { + log.warn("You should not be seeing this: File Preference -> {}", pref.getKey()); + } else if (pref.cast(Integer.class).isPresent()) { + component = createSpinner.apply((Preference.Numeric) pref.cast(Integer.class).get()); + } else if (pref.cast(Double.class).isPresent()) { + component = createSpinner.apply((Preference.Numeric) pref.cast(Double.class).get()); + } else if (pref.cast(Color.class).isPresent()) { + component = createColorWell.apply(pref.cast(Color.class).get()); + } else if (pref.cast(String.class).isPresent()) { + component = createTextComponent.apply(pref.cast(String.class).get()); + } else if (pref.cast(Boolean.class).isPresent()) { + component = createCheckbox.apply(pref.cast(Boolean.class).get()); + } else { + component = new JLabel(); + } + component.setName(collated.id); + return component; + }; + } + + /** Return component from COMPONENT_MAP or search for it the hard way */ + protected static Component findComponent(String name) { + if (COMPONENT_MAP.containsKey(name)) { + return COMPONENT_MAP.get(name); + } else { + return findComponent(name, PREF_PANE); + } + } + + /** Find a component by name the hard way */ + protected static Component findComponent(String name, Container parent) { + for (Component c : parent.getComponents()) { + if (c.getName() != null && c.getName().equalsIgnoreCase(name)) { + return c; + } else if (c instanceof Container container) { + return findComponent(name, container); + } + } + return null; + } + + protected static void initLayoutAndConstraints() { + LayoutManager layout = new GridBagLayout(); + PREF_PANE.setLayout(layout); + CONSTRAINTS.put( + Archetype.HEADER, + new GridBagConstraints( + 0, + 0, + layoutColumns, + 1, + 0, + 0, + GridBagConstraints.LINE_START, + GridBagConstraints.HORIZONTAL, + new Insets(6, 12, 8, 12), + 4, + 2)); + + GridBagConstraints section = + new GridBagConstraints( + 0, + 1, + layoutColumns, + 1, + 0, + 0, + GridBagConstraints.LINE_START, + GridBagConstraints.HORIZONTAL, + new Insets(6, 12, 8, 12), + 4, + 2); + + GridBagConstraints group = (GridBagConstraints) section.clone(); + group.gridx = 1; + group.gridwidth = layoutColumns - 1; + + CONSTRAINTS.put( + Archetype.ROW, + new GridBagConstraints( + 2, + 2, + layoutColumns - 2, + 1, + 0, + 0, + GridBagConstraints.LINE_END, + GridConstraints.FILL_HORIZONTAL, + new Insets(4, 6, 4, 8), + 4, + 2)); + + GridBagConstraints prefLabel = + new GridBagConstraints( + 2, + 0, + 1, + 1, + 0, + 0, + GridBagConstraints.LINE_END, + GridConstraints.FILL_HORIZONTAL, + new Insets(4, 6, 4, 8), + 4, + 2); + + GridBagConstraints prefControl = (GridBagConstraints) prefLabel.clone(); + prefControl.gridx = 3; + prefControl.anchor = GridBagConstraints.LINE_START; + prefControl.fill = GridBagConstraints.BOTH; + + GridBagConstraints prefFave = (GridBagConstraints) prefLabel.clone(); + prefFave.gridx = 4; + prefFave.fill = GridBagConstraints.NONE; + prefFave.anchor = GridBagConstraints.LINE_END; + + CONSTRAINTS.put(Archetype.SECTION, section); + CONSTRAINTS.put(Archetype.GROUP, group); + CONSTRAINTS.put(Archetype.LABEL, prefLabel); + CONSTRAINTS.put(Archetype.CONTROL, prefControl); + CONSTRAINTS.put(Archetype.FAVOURITE, prefFave); + } + + /** Listener specific to toggling enabled state of token border related controls */ + static final ActionListener labelBorderListener = + e -> { + if (((JCheckBox) e.getSource()).isSelected()) { + Objects.requireNonNull(PrefParts.findComponent("pcMapLabelBorderColor")).setEnabled(true); + Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderColor")).setEnabled(true); + Objects.requireNonNull(PrefParts.findComponent("nonVisMapLabelBorderColor")) + .setEnabled(true); + Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderWidth")).setEnabled(true); + Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderArc")).setEnabled(true); + } else { + Objects.requireNonNull(PrefParts.findComponent("pcMapLabelBorderColor")) + .setEnabled(false); + Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderColor")).setEnabled(false); + Objects.requireNonNull(PrefParts.findComponent("nonVisMapLabelBorderColor")) + .setEnabled(false); + Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderWidth")).setEnabled(false); + Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderArc")).setEnabled(false); + } + }; +} diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferenceDialog.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferenceDialog.java new file mode 100644 index 0000000000..f1fd350d88 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferenceDialog.java @@ -0,0 +1,562 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import com.formdev.flatlaf.extras.FlatSVGIcon; +import com.formdev.flatlaf.extras.components.FlatToggleButton; +import com.formdev.flatlaf.extras.components.FlatTree; +import com.formdev.flatlaf.ui.FlatTreeUI; +import com.jidesoft.swing.JideScrollPane; +import com.jidesoft.swing.event.SearchableEvent; +import com.jidesoft.swing.event.SearchableListener; +import java.awt.*; +import java.lang.reflect.Field; +import java.util.*; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.TreeUI; +import javax.swing.table.*; +import javax.swing.tree.*; +import net.rptools.lib.cipher.CipherUtil; +import net.rptools.maptool.client.AppPreferences; +import net.rptools.maptool.client.MapTool; +import net.rptools.maptool.client.swing.*; +import net.rptools.maptool.client.swing.searchable.SearchableBarEx; +import net.rptools.maptool.client.swing.searchable.SearchableEx; +import net.rptools.maptool.client.swing.searchable.SearchableTree; +import net.rptools.maptool.client.ui.theme.Icons; +import net.rptools.maptool.client.ui.theme.RessourceManager; +import net.rptools.maptool.language.I18N; +import net.rptools.maptool.model.localisedObject.LocalObject; +import net.rptools.maptool.util.GraphicsUtil; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * Class: PreferenceDialog + * + *

A dialog box to manage user preferences. + */ +public class PreferenceDialog extends AbeillePanel { + /** Logger instance used for logging messages in the PreferenceDialog class. */ + private static final Logger log = LogManager.getLogger(PreferenceDialog.class); + + private static final PreferenceDialog instance; + + public static PreferenceDialog getInstance() { + return instance; + } + + /** my version of percentile screen width */ + private static final int vw = + (int) + Math.max( + GraphicsEnvironment.getLocalGraphicsEnvironment() + .getDefaultScreenDevice() + .getDefaultConfiguration() + .getBounds() + .getWidth() + / 100, + 8); + + /** Because we want to, you know, show this to people */ + private static final GenericDialogFactory dialogFactory = + GenericDialog.getFactory() + .setDialogTitle(I18N.getString("Label.preferences")) + .makeModal(true) + .setContent(PrefParts.PREF_PANE) + .setNavPane(new JScrollPane(PrefParts.NAV_PANEL)) + .setToolbar(PrefParts.SEARCH_PANE) + .setSideBar(new JScrollPane(PrefParts.SIDE_PANE)); + + private static final FlatTree prefTree; + private static final TableModel tableModel = new PreferencesTableModel(); + private static final PreferencesTable table; + private static final SearchableEx SEARCHABLE_TREE; + private static final SearchableBarEx SEARCHABLE_BAR; + + static { + DefaultMutableTreeNode root = new DefaultMutableTreeNode(); + + final Color CLEAR = new Color(1f, 1f, 1f, 0); + PrefParts.initLayoutAndConstraints(); + final Map> sectionMembers = + Arrays.stream(Classify.Collated.values()) + .sorted(Comparator.nullsFirst(Comparator.comparing(o -> o.group))) + .toList() + .stream() + .sorted(Comparator.nullsFirst(Comparator.comparing(collated -> collated.section))) + .toList() + .stream() + .collect(Collectors.groupingBy(collated -> collated.section)); + int sectionRow = 0; + for (Classify.Section sect : Classify.Section.values()) { + final List members = sectionMembers.get(sect); + if (members == null) { + continue; + } + DefaultMutableTreeNode sectNode = new DefaultMutableTreeNode(sect, true); + root.add(sectNode); + JPanel sectionPanel = new JPanel(new GridBagLayout()); + PrefParts.CONSTRAINTS.get(PrefParts.Archetype.SECTION).gridy = sectionRow; + PrefParts.PREF_PANE.add(sectionPanel, PrefParts.CONSTRAINTS.get(PrefParts.Archetype.SECTION)); + sectionRow++; + sectionPanel.setBorder( + BorderFactory.createCompoundBorder( + BorderFactory.createTitledBorder( + BorderFactory.createLineBorder(UIManager.getDefaults().getColor("Window.border")), + sect.displayName), + BorderFactory.createEmptyBorder(6, 12, 4, 8))); + final List ungrouped = + members.stream().filter(collated -> collated.group == null).toList(); + final List grouped = + members.stream().filter(collated -> collated.group != null).toList(); + final Map> memberGroups = + grouped.stream() + .sorted( + Comparator.comparing( + collated -> Classify.Collated.valueOf(collated.name()).ordinal())) + .collect(Collectors.groupingBy(collated -> collated.group)); + + int groupRow = 0; + for (Classify.Group g : memberGroups.keySet()) { + DefaultMutableTreeNode groupNode; + if (g.equals(Classify.Group.NONE)) { + groupNode = sectNode; + } else { + groupNode = new DefaultMutableTreeNode(g, true); + } + + JPanel groupPanel = new JPanel(new GridBagLayout()); + PrefParts.CONSTRAINTS.get(PrefParts.Archetype.GROUP).gridy = groupRow; + groupRow++; + sectionPanel.add(groupPanel, PrefParts.CONSTRAINTS.get(PrefParts.Archetype.GROUP)); + groupPanel.setBorder( + BorderFactory.createCompoundBorder( + BorderFactory.createTitledBorder( + g.equals(Classify.Group.NONE) + ? BorderFactory.createLineBorder(CLEAR) + : BorderFactory.createLineBorder( + UIManager.getDefaults().getColor("Window.border")), + g.equals(Classify.Group.NONE) ? null : g.displayName), + BorderFactory.createEmptyBorder(6, 8, 4, 12))); + int controlRow = 0; + + for (Classify.Collated collated : memberGroups.get(g)) { + Component[] components = PrefParts.createComponentsFor(collated); + PrefParts.CONSTRAINTS.get(PrefParts.Archetype.LABEL).gridy = controlRow; + PrefParts.CONSTRAINTS.get(PrefParts.Archetype.CONTROL).gridy = controlRow; + PrefParts.CONSTRAINTS.get(PrefParts.Archetype.FAVOURITE).gridy = controlRow; + try { + groupPanel.add(components[0], PrefParts.CONSTRAINTS.get(PrefParts.Archetype.LABEL)); + groupPanel.add(components[1], PrefParts.CONSTRAINTS.get(PrefParts.Archetype.CONTROL)); + groupPanel.add( + new JCheckBox(), PrefParts.CONSTRAINTS.get(PrefParts.Archetype.FAVOURITE)); + DefaultMutableTreeNode prefNode = new DefaultMutableTreeNode(collated); + + groupNode.add(prefNode); + } catch (Exception e) { + log.error(e); + } + controlRow++; + } + if (!groupNode.equals(sectNode)) { + sectNode.add(groupNode); + } + } + } + TreeModel treeModel = new DefaultTreeModel(root); + prefTree = new PreferenceTree(treeModel); + prefTree.setRootVisible(false); + prefTree.putClientPropertyBoolean("Tree.paintLines", true, true); + prefTree.setCellRenderer(new PrefTreeCellRenderer()); + TreeUI UI = (TreeUI) PreferenceTreeUI.createUI(prefTree); + prefTree.setUI(UI); + + PrefParts.PREF_PANE.removeAll(); + + // { + // static class JComponentRenderer extends JComponent implements TableCellRenderer, + // UIResource { + // private static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); + // + // public JComponentRenderer() { + // super(); + // setAlignmentX(0.5f); + // setBorder(noFocusBorder); + // } + // + // public void setValue(Object value) { if(value instanceof JComponent + // jComponent){add(jComponent); }}; + // @Override + // public Component getTableCellRendererComponent(JTable table, Object value, + // boolean isSelected, boolean + // hasFocus, int row, int column) { + // if (isSelected) { + // setForeground(table.getSelectionForeground()); + // super.setBackground(table.getSelectionBackground()); + // } + // else { + // setForeground(table.getForeground()); + // setBackground(table.getBackground()); + // } + // + // if (hasFocus) { + // setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); + // } else { + // setBorder(noFocusBorder); + // } + // + // return this; + // } + // } + // @Override + // protected void createDefaultRenderers() { + // super.createDefaultRenderers(); + // defaultRenderersByColumnClass.put(JComponent.class, (UIDefaults.LazyValue) + // t -> new JComponentRenderer()); + // } + // }; + // table.setFillsViewportHeight(true); + // table.setDefaultRenderer(Component.class, new ButtonTableCellEditorRenderer()); + // TableColumnModel columnModel = table.getColumnModel(); + // for (int i = 0; i < columnModel.getColumnCount(); i++) { + // TableColumn column = columnModel.getColumn(i); + // column.setResizable(i < columnModel.getColumnCount() - 1); + // } + // System.out.println(tableModel.getColumnCount()); + JideScrollPane tableScrollPane = new JideScrollPane(); + table = new PreferencesTable(tableScrollPane); + table.doLayout(); + PrefParts.PREF_PANE.setLayout(new BorderLayout()); + PrefParts.PREF_PANE.add(tableScrollPane, BorderLayout.CENTER); + + SEARCHABLE_TREE = new SearchableTree(prefTree); + SEARCHABLE_TREE.addSearchableListener(getSearchableListener()); + SEARCHABLE_TREE.setWildcardEnabled(true); + SEARCHABLE_TREE.setCaseSensitive(false); + SEARCHABLE_TREE.setProcessModelChangeEvent(true); + SEARCHABLE_TREE.setSearchLabel("What"); + SEARCHABLE_TREE.setRepeats(true); + + SEARCHABLE_BAR = new SearchableBarEx(SEARCHABLE_TREE, true); + SEARCHABLE_BAR.setHighlightAll(true); + SEARCHABLE_BAR.setCompact(true); + SEARCHABLE_BAR.setVisibleButtons( + SearchableBarEx.SHOW_NAVIGATION + + SearchableBarEx.SHOW_HIGHLIGHTS + + SearchableBarEx.SHOW_REPEATS + + SearchableBarEx.SHOW_STATUS + + SearchableBarEx.SHOW_WHOLE_WORDS + + SearchableBarEx.SHOW_MATCHCASE + + SearchableBarEx.SHOW_REGEX); + SEARCHABLE_BAR.addPresetSearchValues( + Arrays.stream(Classify.Section.values()).collect(Collectors.toSet())); + SEARCHABLE_BAR + .getSearchable() + .addSearchableListener( + searchableEvent -> table.setFilterText(searchableEvent.getSearchingText())); + PrefParts.NAV_PANEL.add(prefTree); + + instance = new PreferenceDialog(); + } + + /** + * The PreferenceDialog class represents a dialog window that allows users to customize their + * preferences. + * + *

This dialog window is modal. + */ + public PreferenceDialog() { + super(new PreferencesEditorDialog().getRootComponent()); + dialogFactory + .setCloseOperation(WindowConstants.HIDE_ON_CLOSE) + .addButton(ButtonKind.CLOSE) + .setDefaultButton(ButtonKind.CLOSE); + + setInitialState(); + + // copyPublicKey.addActionListener( + // e -> { + // Toolkit.getDefaultToolkit() + // .getSystemClipboard() + //// .setContents(new StringSelection(publicKeyTextArea.getText()), null); + // }); + // + // regeneratePublicKey.addActionListener( + // e -> { + // CompletableFuture keys = new + // PublicPrivateKeyStore().regenerateKeys(); + // + // keys.thenAccept( + // cu -> { + // SwingUtilities.invokeLater( + // () -> { + //// publicKeyTextArea.setText(cu.getEncodedPublicKeyText()); + // }); + // }); + // }); + } + + public void showDialog() { + dialogFactory.display(); + } + + /// Most controls have their state set at creation. Initialise things here where this is + /// insufficient, such as adding listeners or the like. Custom creation should be handled in + // {@link PrefParts#createComponentsFor(Classify.Collated)} + private void setInitialState() { + JCheckBox labelBorderCheckbox = + ((JCheckBox) PrefParts.findComponent(AppPreferences.mapLabelShowBorder.getKey())); + Objects.requireNonNull(labelBorderCheckbox).addActionListener(PrefParts.labelBorderListener); + labelBorderCheckbox.setSelected(AppPreferences.mapLabelShowBorder.get()); + + Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderColor")) + .setEnabled(labelBorderCheckbox.isSelected()); + Objects.requireNonNull(PrefParts.findComponent("pcMapLabelBorderColor")) + .setEnabled(labelBorderCheckbox.isSelected()); + Objects.requireNonNull(PrefParts.findComponent("nonVisMapLabelBorderColor")) + .setEnabled(labelBorderCheckbox.isSelected()); + Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderWidth")) + .setEnabled(labelBorderCheckbox.isSelected()); + Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderArc")) + .setEnabled(labelBorderCheckbox.isSelected()); + + CompletableFuture keys = MapTool.getKeyStore().getKeys(); + + keys.thenAccept( + cu -> { + SwingUtilities.invokeLater( + () -> { + // publicKeyTextArea.setText(cu.getEncodedPublicKeyText()); + }); + }); + } + + static { + AbstractButton collapseButton = new FlatToggleButton(); + collapseButton.setIcon(RessourceManager.getSmallIcon(Icons.PROPERTIES_TABLE_COLLAPSE)); + collapseButton.addActionListener( + e -> { + for (int i = 0; i < prefTree.getRowCount(); i++) { + prefTree.collapseRow(i); + } + }); + AbstractButton expandButton = new FlatToggleButton(); + expandButton.setIcon(RessourceManager.getSmallIcon(Icons.PROPERTIES_TABLE_EXPAND)); + expandButton.addActionListener( + e -> { + for (int i = 0; i < prefTree.getRowCount(); i++) { + prefTree.expandRow(i); + } + }); + PrefParts.NAV_PANEL.add(collapseButton, 0); + PrefParts.NAV_PANEL.add(expandButton, 0); + + PrefParts.SEARCH_PANE.add(SEARCHABLE_BAR); + } + + private static SearchableListener getSearchableListener() { + return new SearchableListener() { + @Override + public void searchableEventFired(SearchableEvent searchableEvent) { + if (searchableEvent.getID() == SearchableEvent.SEARCHABLE_MATCH) { + Object o = searchableEvent.getMatchingObject(); + if (o instanceof Component[] components) { + Rectangle r = components[1].getBounds(); + System.out.println(r); + Point p = PrefParts.findComponent(components[1].getName()).getLocation(); + System.out.println(p); + PrefParts.PREF_PANE.scrollRectToVisible(r); + } + } else { + log.info(searchableEvent.paramString()); + } + log.info(searchableEvent); + } + }; + } + + private static class PrefTreeCellRenderer extends DefaultTreeCellRenderer { + /** Icon used to show leaf nodes. */ + protected transient Icon leafIcon = RessourceManager.getSmallIcon(Icons.MAPTOOL); + + private static final FlatSVGIcon.ColorFilter NEGATIVE_FILTER = + new FlatSVGIcon.ColorFilter().addAll(GraphicsUtil.INVERTED_ICON_COLOURS); + + @Override + public Icon getLeafIcon() { + return leafIcon; + } + + @Override + public void setLeafIcon(Icon leafIcon) {} + + /** + * Configures the renderer based on the passed in components. The value is set from messaging + * the tree with convertValueToText, which ultimately invokes toString + * on value. The foreground color is set based on the selection and the icon is set + * based on the leaf and expanded parameters. + */ + public Component getTreeCellRendererComponent( + JTree tree, + Object value, + boolean sel, + boolean expanded, + boolean leaf, + int row, + boolean hasFocus) { + PreferenceTree pTree = (PreferenceTree) tree; + DefaultMutableTreeNode node = null; + if (value != null) { + node = (DefaultMutableTreeNode) value; + } + String stringValue = + pTree.convertValueToText(node == null ? value : node, sel, expanded, leaf, row, hasFocus); + String tipText = + pTree.convertValueToTooltipText( + node == null ? value : node, sel, expanded, leaf, row, hasFocus); + this.hasFocus = hasFocus; + setText(stringValue); + setToolTipText(tipText); + Color fg = null; + + JTree.DropLocation dropLocation = tree.getDropLocation(); + if (dropLocation != null + && dropLocation.getChildIndex() == -1 + && tree.getRowForPath(dropLocation.getPath()) == row) { + } else if (sel) { + fg = getTextSelectionColor(); + } else { + fg = getTextNonSelectionColor(); + } + + setForeground(fg); + + Icon icon = null; + if (leaf) { + icon = leafIcon; + } + + if (!tree.isEnabled()) { + setEnabled(false); + LookAndFeel laf = UIManager.getLookAndFeel(); + Icon disabledIcon = + sel ? laf.getDisabledSelectedIcon(tree, icon) : laf.getDisabledIcon(tree, icon); + if (disabledIcon != null) icon = disabledIcon; + setDisabledIcon(icon); + } else { + setEnabled(true); + if (icon instanceof FlatSVGIcon svgIcon) { + svgIcon.setColorFilter(!sel ? null : NEGATIVE_FILTER); + } + setIcon(icon); + } + setComponentOrientation(tree.getComponentOrientation()); + selected = sel; + return this; + } + } + + private static class PreferenceTree extends FlatTree { + protected transient PrefTreeCellRenderer cellRenderer = new PrefTreeCellRenderer(); + + PreferenceTree(TreeModel model) { + super(); + super.setModel(model); + super.setCellRenderer(cellRenderer); + super.setRootVisible(false); + super.setScrollsOnExpand(true); + super.setShowsRootHandles(true); + super.setWideCellRenderer(true); + } + + /** + * Called by the renderers to convert the specified value to text. This implementation returns + * value.toString, ignoring all other arguments. To control the conversion, + * subclass this method and use any of the arguments you need. + * + * @param value the Object to convert to text + * @param selected true if the node is selected + * @param expanded true if the node is expanded + * @param leaf true if the node is a leaf node + * @param row an integer specifying the node's display row, where 0 is the first row in the + * display + * @param hasFocus true if the node has the focus + * @return the String representation of the node's value + */ + @Override + public String convertValueToText( + Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + if (value instanceof DefaultMutableTreeNode node) { + Object o = node.getUserObject(); + if (o instanceof LocalObject localObject) { + return localObject.getDisplayName(); + } else if (o instanceof Classify.Collated collated) { + if (collated.preference != null) { + return collated.preference.getLabel(); + } else { + return collated.id; + } + } + } + return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus); + } + + public String convertValueToTooltipText( + Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + if (value instanceof DefaultMutableTreeNode node) { + Object o = node.getUserObject(); + if (o instanceof Classify.Collated collated) { + if (collated.preference != null) { + return collated.preference.getTooltip(); + } else { + return collated.id; + } + } + } + return null; + } + } + + private class PreferenceTreeUI extends FlatTreeUI { + public static ComponentUI createUI(JComponent c) { + return new FlatTreeUI(); + } + + @Override + public void installUI(JComponent c) { + super.installUI(c); + tree = (JTree) c; + } + + @Override + protected void installDefaults() { + super.installDefaults(); + try { + Field paintLines = super.getClass().getField("paintLines"); + paintLines.setAccessible(true); + paintLines.setBoolean( + tree.getUI(), + Boolean.parseBoolean(tree.getClientProperty("Tree.paintLines").toString())); + } catch (IllegalAccessException | NoSuchFieldException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferenceDialog_lessOld.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferenceDialog_lessOld.java new file mode 100644 index 0000000000..837190ca59 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferenceDialog_lessOld.java @@ -0,0 +1,639 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import java.awt.*; +import java.util.*; +import javax.swing.*; + +/** + * Class: PreferenceDialog + * + *

A dialog box to manage user preferences. + */ +public class PreferenceDialog_lessOld { // } extends AbeillePanel { + // /** + // * Logger instance used for logging messages in the PreferenceDialog class. + // */ + // private static final Logger log = LogManager.getLogger(PreferenceDialog_lessOld.class); + // + // private static final PreferenceDialog_lessOld instance; + // + // public static PreferenceDialog_lessOld getInstance() { + // return instance; + // } + // + // protected static final List> ENUM_PREFS = + // List.of( + // AppPreferences.defaultGridType, + // AppPreferences.numberTokenDuplicateMethod, + // AppPreferences.showTokenNumberOn, + // AppPreferences.newTokenName, + // AppPreferences.renderQuality, + // AppPreferences.mapSortType, + // AppPreferences.uvttLosImportType, + // AppPreferences.movementMetric, + // AppPreferences.UIIcons, + // AppPreferences.defaultVisionType); + // + // + // /** + // * Listener specific to toggling enabled state of token border related controls + // */ + // private static final ActionListener labelBorderListener = + // e -> { + // if (((JCheckBox) e.getSource()).isSelected()) { + // + // Objects.requireNonNull(PrefParts.findComponent("pcMapLabelBorderColor")).setEnabled(true); + // + // Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderColor")).setEnabled(true); + // + // Objects.requireNonNull(PrefParts.findComponent("nonVisMapLabelBorderColor")).setEnabled(true); + // + // Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderWidth")).setEnabled(true); + // + // Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderArc")).setEnabled(true); + // } else { + // + // Objects.requireNonNull(PrefParts.findComponent("pcMapLabelBorderColor")).setEnabled(false); + // + // Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderColor")).setEnabled(false); + // + // Objects.requireNonNull(PrefParts.findComponent("nonVisMapLabelBorderColor")).setEnabled(false); + // + // Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderWidth")).setEnabled(false); + // + // Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderArc")).setEnabled(false); + // } + // }; + // + // + // /** + // * my version of percentile screen width + // */ + // private static final int vw = + // (int) + // Math.max( + // GraphicsEnvironment.getLocalGraphicsEnvironment() + // .getDefaultScreenDevice() + // .getDefaultConfiguration() + // .getBounds() + // .getWidth() + // / 100, + // 8); + // + // /** + // * Because we want to, you know, show this to people + // */ + // private static final GenericDialogFactory dialogFactory = + // GenericDialog.getFactory() + // .setDialogTitle(I18N.getString("Label.preferences")) + // .makeModal(true) + // .setContent(PrefParts.PREF_PANE) + // .setNavPane(new JScrollPane(PrefParts.NAV_PANEL)) + // .setToolbar(PrefParts.SEARCH_PANE) + // .setSideBar(new JScrollPane(PrefParts.SIDE_PANE)); + // + // private static final JTreeTable treeTable; + // private static final FlatTree prefTree; + // private static final SearchableEx SEARCHABLE_TREE; + // private static final SearchableBarEx SEARCHABLE_BAR; + // + // static { + // DefaultMutableTreeNode root = new DefaultMutableTreeNode(); + // + // final Color CLEAR = new Color(1f, 1f, 1f, 0); + // PrefParts.initLayoutAndConstraints(); + // final Map> sectionMembers = + // Arrays.stream(Classify.Collated.values()) + // .sorted(Comparator.comparing(collated -> + // Classify.Collated.valueOf(collated.name()).ordinal())) + // .collect(Collectors.groupingBy(collated -> collated.section)); + // int sectionRow = 0; + // for (Classify.Section sect : Classify.Section.values()) { + // final List members = sectionMembers.get(sect); + // if (members == null) { + // continue; + // } + // DefaultMutableTreeNode sectNode = new DefaultMutableTreeNode(sect, true); + // root.add(sectNode); + // JPanel sectionPanel = new JPanel(new GridBagLayout()); + // PrefParts.CONSTRAINTS.get(PrefParts.Archetype.SECTION).gridy = sectionRow; + // PrefParts.PREF_PANE.add(sectionPanel, + // PrefParts.CONSTRAINTS.get(PrefParts.Archetype.SECTION)); + // sectionRow++; + // sectionPanel.setBorder( + // BorderFactory.createCompoundBorder( + // BorderFactory.createTitledBorder( + // + // BorderFactory.createLineBorder(UIManager.getDefaults().getColor("Window.border")), + // sect.displayName), + // BorderFactory.createEmptyBorder(6, 12, 4, 8) + // )); + // final Map> memberGroups = + // members.stream().sorted(Comparator.comparing(collated -> + // Classify.Collated.valueOf(collated.name()).ordinal())).collect(Collectors.groupingBy(collated + // -> collated.group)); + // + // int groupRow = 0; + // for (Classify.Group g : memberGroups.keySet()) { + // DefaultMutableTreeNode groupNode; + // if (g.equals(Classify.Group.NONE)) { + // groupNode = sectNode; + // } else { + // groupNode = new DefaultMutableTreeNode(g, true); + // } + // JPanel groupPanel = new JPanel(new GridBagLayout()); + // PrefParts.CONSTRAINTS.get(PrefParts.Archetype.GROUP).gridy = groupRow; + // groupRow++; + // sectionPanel.add(groupPanel, + // PrefParts.CONSTRAINTS.get(PrefParts.Archetype.GROUP)); + // groupPanel.setBorder( + // BorderFactory.createCompoundBorder( + // BorderFactory.createTitledBorder( + // g.equals(Classify.Group.NONE) ? + // BorderFactory.createLineBorder(CLEAR) : + // + // BorderFactory.createLineBorder(UIManager.getDefaults().getColor("Window.border")) + // , + // g.equals(Classify.Group.NONE) ? null : g.displayName), + // BorderFactory.createEmptyBorder(6, 8, 4, 12) + // )); + // int controlRow = 0; + // for (Classify.Collated collated : memberGroups.get(g)) { + // Component[] components = PrefParts.createComponentsFor(collated); + // PrefParts.CONSTRAINTS.get(PrefParts.Archetype.LABEL).gridy = controlRow; + // PrefParts.CONSTRAINTS.get(PrefParts.Archetype.CONTROL).gridy = controlRow; + // PrefParts.CONSTRAINTS.get(PrefParts.Archetype.FAVOURITE).gridy = controlRow; + // try { + // groupPanel.add(components[0], + // PrefParts.CONSTRAINTS.get(PrefParts.Archetype.LABEL)); + // groupPanel.add(components[1], + // PrefParts.CONSTRAINTS.get(PrefParts.Archetype.CONTROL)); + // groupPanel.add(new JCheckBox(), + // PrefParts.CONSTRAINTS.get(PrefParts.Archetype.FAVOURITE)); + // DefaultMutableTreeNode prefNode = new DefaultMutableTreeNode(collated); + // + // groupNode.add(prefNode); + // } catch (Exception e) { + // log.error(e); + // } + // controlRow++; + // } + // if (!groupNode.equals(sectNode)) { + // sectNode.add(groupNode); + // } + // } + // } + // TreeModel treeModel = new DefaultTreeModel(root); + // prefTree = new PreferenceTree(treeModel); + // prefTree.setRootVisible(true); + // + // TreeTableModel treeTableModel = + // DefaultTreeTableModelII.createDefaultTreeTableModelII(root); + // treeTable = new JTreeTable(treeTableModel); + //// treeTable.updateUI(); + // + // + // prefTree.putClientProperty("JTree.lineStyle", "Angled"); + //// prefTree.setCellRenderer(new StyledTreeCellRenderer()); + // + // SEARCHABLE_TREE = new SearchableTree(prefTree); + // SEARCHABLE_TREE.addSearchableListener(getSearchableListener()); + // SEARCHABLE_TREE.setWildcardEnabled(true); + // SEARCHABLE_TREE.setCaseSensitive(false); + // SEARCHABLE_TREE.setProcessModelChangeEvent(true); + // SEARCHABLE_TREE.setSearchLabel("WHat"); + // SEARCHABLE_TREE.setRepeats(true); + // + // SEARCHABLE_BAR = new SearchableBarEx(SEARCHABLE_TREE, true); + // SEARCHABLE_BAR.setHighlightAll(true); + // SEARCHABLE_BAR.setCompact(true); + // SEARCHABLE_BAR.setVisibleButtons(SearchableBarEx.SHOW_NAVIGATION + // + SearchableBarEx.SHOW_HIGHLIGHTS + // + SearchableBarEx.SHOW_REPEATS + // + SearchableBarEx.SHOW_STATUS + // + SearchableBarEx.SHOW_WHOLE_WORDS + // + SearchableBarEx.SHOW_MATCHCASE + // + SearchableBarEx.SHOW_REGEX + // ); + // + // SEARCHABLE_BAR.addPresetSearchValues(Arrays.stream(Classify.Section.values()).collect(Collectors.toSet())); + // PrefParts.NAV_PANEL.add(prefTree); + // + // instance = new PreferenceDialog_lessOld(); + // } + // + // /** + // * The PreferenceDialog class represents a dialog window that allows users to customize + // their + // * preferences. + // * + // *

This dialog window is modal. + // */ + // public PreferenceDialog_lessOld() { + // super(new PreferencesEditorDialog().getRootComponent()); + // dialogFactory + // .setCloseOperation(WindowConstants.HIDE_ON_CLOSE) + // .addButton(ButtonKind.CLOSE) + // .setDefaultButton(ButtonKind.CLOSE); + // + // JCheckBox labelBorderCheckbox = + // ((JCheckBox) + // PrefParts.findComponent(AppPreferences.mapLabelShowBorder.getKey())); + // Objects.requireNonNull(labelBorderCheckbox).addActionListener(labelBorderListener); + // labelBorderCheckbox.setSelected(AppPreferences.mapLabelShowBorder.get()); + // Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderColor")) + // .setEnabled(labelBorderCheckbox.isSelected()); + // Objects.requireNonNull(PrefParts.findComponent("pcMapLabelBorderColor")) + // .setEnabled(labelBorderCheckbox.isSelected()); + // Objects.requireNonNull(PrefParts.findComponent("nonVisMapLabelBorderColor")) + // .setEnabled(labelBorderCheckbox.isSelected()); + // Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderWidth")) + // .setEnabled(labelBorderCheckbox.isSelected()); + // Objects.requireNonNull(PrefParts.findComponent("mapLabelBorderArc")) + // .setEnabled(labelBorderCheckbox.isSelected()); + // + // setInitialState(); + // + // // copyPublicKey.addActionListener( + // // e -> { + // // Toolkit.getDefaultToolkit() + // // .getSystemClipboard() + // //// .setContents(new StringSelection(publicKeyTextArea.getText()), null); + // // }); + // // + // // regeneratePublicKey.addActionListener( + // // e -> { + // // CompletableFuture keys = new + // // PublicPrivateKeyStore().regenerateKeys(); + // // + // // keys.thenAccept( + // // cu -> { + // // SwingUtilities.invokeLater( + // // () -> { + // //// publicKeyTextArea.setText(cu.getEncodedPublicKeyText()); + // // }); + // // }); + // // }); + // } + // + // + // public void showDialog() { + // dialogFactory.display(); + // } + // + // /** + // * Initializes and sets the initial state of various user preferences in the application. + // This + // * method is called during the initialization process. + // */ + // private void setInitialState() { + // CompletableFuture keys = new PublicPrivateKeyStore().getKeys(); + // + // keys.thenAccept( + // cu -> { + // SwingUtilities.invokeLater( + // () -> { + // // + // publicKeyTextArea.setText(cu.getEncodedPublicKeyText()); + // }); + // }); + // } + // + // static { + // AbstractButton collapseButton = new FlatToggleButton(); + // collapseButton.setIcon(RessourceManager.getSmallIcon(Icons.PROPERTIES_TABLE_COLLAPSE)); + // collapseButton.addActionListener(e -> { + // for (int i = 0; i < prefTree.getRowCount(); i++) { + // treeTable.getTree().collapseRow(i); + // } + // }); + // AbstractButton expandButton = new FlatToggleButton(); + // expandButton.setIcon(RessourceManager.getSmallIcon(Icons.PROPERTIES_TABLE_EXPAND)); + // expandButton.addActionListener(e -> { + // for (int i = 0; i < prefTree.getRowCount(); i++) { + // treeTable.getTree().expandRow(i); + // } + // }); + // PrefParts.NAV_PANEL.add(collapseButton, 0); + // PrefParts.NAV_PANEL.add(expandButton, 0); + // + // PrefParts.SEARCH_PANE.add(SEARCHABLE_BAR); + // } + // + // private static SearchableListener getSearchableListener() { + // return new SearchableListener() { + // @Override + // public void searchableEventFired(SearchableEvent searchableEvent) { + // if (searchableEvent.getID() == SearchableEvent.SEARCHABLE_MATCH) { + // Object o = searchableEvent.getMatchingObject(); + // if (o instanceof Component[] components) { + // Rectangle r = components[1].getBounds(); + // System.out.println(r); + // Point p = + // PrefParts.findComponent(components[1].getName()).getLocation(); + // System.out.println(p); + // PrefParts.PREF_PANE.scrollRectToVisible(r); + // } + // } else { + // log.info(searchableEvent.paramString()); + // } + // log.info(searchableEvent); + // } + // }; + // } + // + // private static class PrefTreeCellRenderer extends DefaultTreeCellRenderer { + // /** + // * Icon used to show leaf nodes. + // */ + // protected transient Icon leafIcon = RessourceManager.getSmallIcon(Icons.TREE_LEAF); + // + // private static final FlatSVGIcon.ColorFilter NEGATIVE_FILTER = new + // FlatSVGIcon.ColorFilter().addAll(GraphicsUtil.INVERTED_ICON_COLOURS); + // + // @Override + // public Icon getLeafIcon() { + // return leafIcon; + // } + // + // @Override + // public void setLeafIcon(Icon leafIcon) { + // } + // + // /** + // * Configures the renderer based on the passed in components. + // * The value is set from messaging the tree with + // * convertValueToText, which ultimately invokes + // * toString on value. + // * The foreground color is set based on the selection and the icon + // * is set based on the leaf and expanded + // * parameters. + // */ + // public Component getTreeCellRendererComponent(JTree tree, Object value, + // boolean sel, + // boolean expanded, + // boolean leaf, int row, + // boolean hasFocus) { + // PreferenceTree pTree = (PreferenceTree) tree; + // DefaultMutableTreeNode node = null; + // if (value != null) { + // node = (DefaultMutableTreeNode) value; + // } + // String stringValue = pTree.convertValueToText(node == null ? value : node, sel, + // expanded, leaf, row, hasFocus); + // String tipText = pTree.convertValueToTooltipText(node == null ? value : node, sel, + // expanded, leaf, row, hasFocus); + // this.hasFocus = hasFocus; + // setText(stringValue); + // setToolTipText(tipText); + // Color fg = null; + //// isDropCell = false; + // + // JTree.DropLocation dropLocation = tree.getDropLocation(); + // if (dropLocation != null + // && dropLocation.getChildIndex() == -1 + // && tree.getRowForPath(dropLocation.getPath()) == row) { + //// + //// Color col = DefaultLookup.getColor(this, ui, "Tree.dropCellForeground"); + //// if (col != null) { + //// fg = col; + //// } else { + //// fg = getTextSelectionColor(); + //// } + // + //// isDropCell = true; + // } else if (sel) { + // fg = getTextSelectionColor(); + // } else { + // fg = getTextNonSelectionColor(); + // } + // + // setForeground(fg); + // + // Icon icon = null; + // if (leaf) { + // icon = leafIcon; + // } + // + // if (!tree.isEnabled()) { + // setEnabled(false); + // LookAndFeel laf = UIManager.getLookAndFeel(); + // Icon disabledIcon = sel ? laf.getDisabledSelectedIcon(tree, icon) : + // laf.getDisabledIcon(tree, icon); + // if (disabledIcon != null) icon = disabledIcon; + // setDisabledIcon(icon); + // } else { + // setEnabled(true); + // if (icon instanceof FlatSVGIcon svgIcon) { + // svgIcon.setColorFilter(!sel ? null : NEGATIVE_FILTER); + // } + // setIcon(icon); + // } + // setComponentOrientation(tree.getComponentOrientation()); + // selected = sel; + // return this; + // } + // } + // + // private static class PreferenceTree extends FlatTree { + // protected transient PrefTreeCellRenderer cellRenderer = new PrefTreeCellRenderer(); + // + // PreferenceTree(TreeModel model) { + // super(); + // super.setModel(model); + // super.setCellRenderer(cellRenderer); + // super.setRootVisible(false); + // super.setScrollsOnExpand(true); + // super.setShowsRootHandles(true); + // super.setWideCellRenderer(true); + // } + // + // /** + // * Called by the renderers to convert the specified value to + // * text. This implementation returns value.toString, ignoring + // * all other arguments. To control the conversion, subclass this + // * method and use any of the arguments you need. + // * + // * @param value the Object to convert to text + // * @param selected true if the node is selected + // * @param expanded true if the node is expanded + // * @param leaf true if the node is a leaf node + // * @param row an integer specifying the node's display row, where 0 is + // * the first row in the display + // * @param hasFocus true if the node has the focus + // * @return the String representation of the node's value + // */ + // @Override + // public String convertValueToText(Object value, boolean selected, boolean expanded, + // boolean leaf, int row, boolean hasFocus) { + // if (value instanceof DefaultMutableTreeNode node) { + // Object o = node.getUserObject(); + // if (o instanceof LocalisedItem localisedItem) { + // return localisedItem.toString(); + // } else if (o instanceof Classify.Collated collated) { + // if (collated.preference != null) { + // return collated.preference.getLabel(); + // } else { + // return collated.id; + // } + // } + // } + // return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus); + // } + // + // public String convertValueToTooltipText(Object value, boolean selected, boolean + // expanded, boolean leaf, int row, boolean hasFocus) { + // if (value instanceof DefaultMutableTreeNode node) { + // Object o = node.getUserObject(); + // if (o instanceof Classify.Collated collated) { + // if (collated.preference != null) { + // return collated.preference.getTooltip(); + // } else { + // return collated.id; + // } + // } + // } + // return null; + // } + // } + // static { + // final Map> sectionMembers = + // Arrays.stream(Classify.Collated.values()) + // .sorted(Comparator.comparing(collated -> + // Classify.Collated.valueOf(collated.name()).ordinal())) + // .collect(Collectors.groupingBy(collated -> collated.section)); + // List sectionGroups = new ArrayList<>(); + // for(Classify.Section section: sectionMembers.keySet()){ + // Map> grouped = + // sectionMembers.get(section).stream().collect(Collectors.groupingBy(collated -> + // collated.group)); + // List groupedChildren = new ArrayList<>(); + // for(Classify.Group group: + // grouped.keySet().stream().sorted(Comparator.nullsFirst(Comparator.comparing(Classify.Group::toString))).toList()){ + // System.out.println(group); + // List children = new ArrayList<>(); + // for(Classify.Collated collated: grouped.get(group)){ + // Component[] components = PrefParts.createComponentsFor(collated); + // children.add(new PrefDataNode(collated.section, collated.group, (JLabel) + // components[0], components[1], new JCheckBox(),collated, null)); + // } + // groupedChildren.add(new PrefDataNode(section, group,null, null, null, null, + // children)); + // } + // sectionGroups.add(new PrefDataNode(section, null,null, null, null, null, + // groupedChildren)); + // } + // PrefDataNode myRootDataNode = new PrefDataNode(null, null,null,null,null, null, + // sectionGroups); + // MyAbstractTreeTableModel treeTableModel = new PrefDataModel(myRootDataNode); + // MyTreeTable myTreeTable = new MyTreeTable(treeTableModel); + // PrefParts.PREF_PANE.add(myTreeTable, + // PrefParts.CONSTRAINTS.get(PrefParts.Archetype.SECTION)); + // } + // protected static class PrefDataModel extends MyAbstractTreeTableModel { + // static protected String[] columnNames = {"Tree", "Section", "Group", "Label", "Control", + // "Fave", "Collated", "Children"}; + // + // // Spalten Typen. + // static protected Class[] columnTypes = {PrefDataModel.class, Classify.Section.class, + // Classify.Group.class, Component.class, Component.class, Component.class, + // Classify.Collated.class, PrefDataNode.class}; + // + // public PrefDataModel(PrefDataNode rootNode) { + // super(rootNode); + // root = rootNode; + // } + // + // public Object getChild(Object parent, int index) { + // return ((PrefDataNode) parent).children.get(index); + // } + // + // + // public int getChildCount(Object parent) { + // return ((PrefDataNode) parent).children.size(); + // } + // + // + // public int getColumnCount() { + // return columnNames.length; + // } + // + // + // public String getColumnName(int column) { + // return columnNames[column]; + // } + // + // + // public Class getColumnClass(int column) { + // return columnTypes[column]; + // } + // + // public Object getValueAt(Object node, int column) { + // return switch (column) { + // case 0 -> ((PrefDataNode) node).section; + // case 1 -> ((PrefDataNode) node).group; + // case 2 -> ((PrefDataNode) node).label; + // case 3 -> ((PrefDataNode) node).component; + // case 4 -> ((PrefDataNode) node).fave; + // case 5 -> ((PrefDataNode) node).collated; + // case 6 -> ((PrefDataNode) node).children; + // default -> null; + // }; + // } + // + // public boolean isCellEditable(Object node, int column) { + // return true; // Important to activate TreeExpandListener + // } + // + // public void setValueAt(Object aValue, Object node, int column) { + // } + // + // } + // protected static class PrefDataNode { + // Classify.Section section; + // Classify.Group group; + // JLabel label; + // Component component; + // Component fave; + // Classify.Collated collated; + // List children; + // + // + // public PrefDataNode(Classify.Section section, Classify.Group group, JLabel label, + // Component component, Component fave, Classify.Collated collated, List children) { + // this.section = section; + // this.group = group; + // this.label = label; + // this.component = component; + // this.fave = fave; + // this.children = children; + // if (this.children == null) { + // this.children = Collections.emptyList(); + // } + // } + // public String toString() { + // if(label != null) { + // return label.getText(); + // } else if(group != null){ + // return group.toString(); + // } else if(section != null){ + // return section.toString(); + // } + // return "Preferences"; + // } + // } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesDialog.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesDialog.java index 515a3f8c9d..dce02acd5b 100644 --- a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesDialog.java +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesDialog.java @@ -17,7 +17,6 @@ import static net.rptools.maptool.util.UserJvmOptions.getLanguages; import static net.rptools.maptool.util.UserJvmOptions.setJvmOption; -import com.formdev.flatlaf.extras.FlatSVGIcon; import java.awt.*; import java.awt.datatransfer.StringSelection; import java.awt.event.FocusAdapter; @@ -39,15 +38,12 @@ import net.rptools.lib.StringUtil; import net.rptools.lib.cipher.CipherUtil; import net.rptools.lib.image.RenderQuality; -import net.rptools.maptool.client.AppConstants; -import net.rptools.maptool.client.AppPreferences; +import net.rptools.maptool.client.*; import net.rptools.maptool.client.AppPreferences.UvttLosImportType; -import net.rptools.maptool.client.AppUtil; -import net.rptools.maptool.client.DeveloperOptions; -import net.rptools.maptool.client.MapTool; import net.rptools.maptool.client.events.PreferencesChanged; import net.rptools.maptool.client.functions.MediaPlayerAdapter; import net.rptools.maptool.client.swing.*; +import net.rptools.maptool.client.ui.theme.Icons; import net.rptools.maptool.client.ui.theme.RessourceManager; import net.rptools.maptool.client.ui.theme.ThemeFontPreferences; import net.rptools.maptool.client.ui.theme.ThemeSupport; @@ -70,7 +66,7 @@ * *

A dialog box to manage user preferences. */ -public class PreferencesDialog extends AbeillePanel { +public class PreferencesDialog extends AbeillePanel { /** Logger instance used for logging messages in the PreferencesDialog class. */ private static final Logger log = LogManager.getLogger(PreferencesDialog.class); @@ -147,7 +143,8 @@ public class PreferencesDialog extends AbeillePanel { private final JComboBox movementMetricCombo = getComboBox("movementMetricCombo"); /** JComboBox variable used to display vision type options. */ - private final JComboBox visionTypeCombo = getComboBox("visionTypeCombo"); + private final JComboBox visionTypeCombo = + getComboBox("visionTypeCombo"); /** JComboBox variable used to display map sorting options. */ private final JComboBox mapSortType = getComboBox("mapSortTypeCombo"); @@ -644,8 +641,7 @@ private void initComponents() { installDirTextField.setText(AppUtil.getInstallDirectory().toString()); JLabel configFileWarningIcon = getLabel("configFileWarningIcon"); - configFileWarningIcon.setIcon( - new FlatSVGIcon("net/rptools/maptool/client/image/warning.svg", 16, 16)); + configFileWarningIcon.setIcon(RessourceManager.getSmallIcon(Icons.WARNING)); copyCfgFilePathButton.addActionListener( e -> { @@ -1448,12 +1444,12 @@ public void focusLost(FocusEvent e) { AppPreferences.movementMetric.set( (WalkerMetric) movementMetricCombo.getSelectedItem())); - visionTypeCombo.setModel(new DefaultComboBoxModel<>(Zone.VisionType.values())); + visionTypeCombo.setModel(new DefaultComboBoxModel<>(AppPreferenceEnums.VisionType.values())); visionTypeCombo.setSelectedItem(AppPreferences.defaultVisionType.get()); visionTypeCombo.addItemListener( e -> AppPreferences.defaultVisionType.set( - (Zone.VisionType) visionTypeCombo.getSelectedItem())); + (AppPreferenceEnums.VisionType) visionTypeCombo.getSelectedItem())); mapSortType.setModel(new DefaultComboBoxModel<>(AppPreferences.MapSortType.values())); mapSortType.setSelectedItem(AppPreferences.mapSortType.get()); diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesDialogView.form b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesDialogView.form index 963181d8b9..843623cbe3 100644 --- a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesDialogView.form +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesDialogView.form @@ -1,20 +1,29 @@
- + - + + + + + + + + + + + - @@ -61,7 +70,7 @@ - + @@ -80,7 +89,7 @@ - + @@ -171,7 +180,7 @@ - + @@ -189,7 +198,7 @@ - + @@ -207,7 +216,7 @@ - + @@ -225,7 +234,7 @@ - + @@ -324,7 +333,7 @@ - + @@ -334,7 +343,7 @@ - + @@ -462,8 +471,8 @@ - - + + @@ -474,7 +483,7 @@ - + @@ -630,7 +639,7 @@ - + @@ -649,7 +658,7 @@ - + @@ -749,8 +758,8 @@ - - + + @@ -778,7 +787,7 @@ - + @@ -797,8 +806,8 @@ - - + + @@ -835,8 +844,8 @@ - - + + @@ -1355,7 +1364,7 @@ - + @@ -1385,7 +1394,7 @@ - + @@ -1394,8 +1403,8 @@ - - + + @@ -1403,7 +1412,7 @@ - + @@ -1453,8 +1462,8 @@ - - + + @@ -1482,7 +1491,7 @@ - + @@ -1563,8 +1572,8 @@ - - + + @@ -1585,7 +1594,7 @@ - + @@ -1637,7 +1646,7 @@ - + @@ -1658,7 +1667,7 @@ - + @@ -1681,7 +1690,7 @@ - + @@ -1725,7 +1734,7 @@ - + @@ -1738,7 +1747,7 @@ - + @@ -1791,7 +1800,7 @@ - + @@ -1891,7 +1900,7 @@ @@ -1900,9 +1909,254 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1928,7 +2182,7 @@ - + @@ -2049,7 +2303,7 @@ - + @@ -2075,8 +2329,8 @@ - - + + @@ -2096,8 +2350,8 @@ - - + + @@ -2155,7 +2409,7 @@ - + @@ -2207,7 +2461,7 @@ - + @@ -2269,7 +2523,7 @@ - + @@ -2383,7 +2637,7 @@ - + @@ -2398,7 +2652,7 @@ - + @@ -2422,7 +2676,7 @@ - + @@ -2484,7 +2738,7 @@ - + @@ -2507,7 +2761,7 @@ - + @@ -2547,7 +2801,7 @@ - + @@ -2558,7 +2812,7 @@ - + @@ -2596,7 +2850,7 @@ - + @@ -2699,254 +2953,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesDialog_old.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesDialog_old.java new file mode 100644 index 0000000000..4fe6591bd4 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesDialog_old.java @@ -0,0 +1,1983 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import java.awt.*; +import javax.swing.*; +import net.rptools.maptool.client.*; + +/** + * Class: PreferenceDialog + * + *

A dialog box to manage user preferences. + */ +public class PreferencesDialog_old extends JDialog { + // + // /** Logger instance used for logging messages in the PreferenceDialog class. */ + // private static final Logger log = LogManager.getLogger(PreferencesDialog_old.class); + // + // /** + // * Represents a tabbed panel in the PreferenceDialog class. This panel is used for displaying + // and + // * managing multiple tabs. + // */ + // // Tabbed Panel + // private final JTabbedPane tabbedPane; + // + // /** + // * Represents a check box for the preference setting to have fog of war (FOW) enabled on new + // maps. + // */ + // // Interactions + // private final JCheckBox newMapsHaveFOWCheckBox; + // + // /** Represents a check box for enabling a warning popup when a token is deleted. */ + // private final JCheckBox tokensPopupWarningWhenDeletedCheckBox; + // + // /** The checkbox used to indicate whether tokens should start snapping to the grid. */ + // private final JCheckBox tokensStartSnapToGridCheckBox; + // + // /** + // * Represents a checkbox for the preference setting to have tokens snap to the grid while + // being + // * dragged. + // */ + // private final JCheckBox tokensSnapWhileDraggingCheckBox; + // + // /** Represents a checkbox that allows the user to hide the mouse pointer while dragging. */ + // private final JCheckBox hideMousePointerWhileDraggingCheckBox; + // + // /** Represents a checkbox indicating whether to hide the token stack indicator. */ + // private final JCheckBox hideTokenStackIndicatorCheckBox; + // + // /** Represents a checkbox for controlling the visibility of new maps. */ + // private final JCheckBox newMapsVisibleCheckBox; + // + // /** Represents the checkbox for controlling the visibility of new tokens. */ + // private final JCheckBox newTokensVisibleCheckBox; + // + // /** Represents the checkbox for starting tokens with free size. */ + // private final JCheckBox tokensStartFreeSizeCheckBox; + // + // /** The checkbox for new stamps with snap-to-grid enabled. */ + // private final JCheckBox stampsStartSnapToGridCheckBox; + // + // /** The checkbox for new stamps with free size enabled. */ + // private final JCheckBox stampsStartFreeSizeCheckBox; + // + // /** Provides a checkbox for new backgrounds snap-to-grid enabled. */ + // private final JCheckBox backgroundsStartSnapToGridCheckBox; + // + // /** The checkbox for new backgrounds free size enabled. */ + // private final JCheckBox backgroundsStartFreeSizeCheckBox; + // + // /** JComboBox variable used to display duplicate token naming options. */ + // private final JComboBox duplicateTokenCombo; + // + // /** JComboBox variable used to display token naming options for imported tokens. */ + // private final JComboBox tokenNamingCombo; + // + // /** JComboBox variable used to display token numbering options. */ + // private final JComboBox showNumberingCombo; + // + // /** JComboBox variable used to display movement metric options. */ + // private final JComboBox movementMetricCombo; + // + // /** JComboBox variable used to display vision type options. */ + // private final JComboBox visionTypeCombo; + // + // /** JComboBox variable used to display map sorting options. */ + // private final JComboBox mapSortType; + // + // private final JComboBox uvttLosImportType; + // + // /** Checkbox for displaying or hiding * the statistics sheet on token mouseover. */ + // private final JCheckBox showStatSheetCheckBox; + // + // /** Checkbox for displaying or hiding the token portrait on token mouseover. */ + // private final JCheckBox showPortraitCheckBox; + // + // /** Checkbox for if the modifier key needs to be held down to show the stat sheet. */ + // private final JCheckBox showStatSheetModifierCheckBox; + // + // /** Checkbox for if the facing arrow should be forced to be shown. */ + // private final JCheckBox forceFacingArrowCheckBox; + // + // /** Checkbox for if the map visibility warning should be shown. */ + // private final JCheckBox mapVisibilityWarning; + // + // /** Spinner for the halo line width. */ + // private final JSpinner haloLineWidthSpinner; + // + // /** Spinner for the halo overlay opacity. */ + // private final JSpinner haloOverlayOpacitySpinner; + // + // /** Spinner for the aura overlay opacity. */ + // private final JSpinner auraOverlayOpacitySpinner; + // + // /** Spinner for the light overlay opacity. */ + // private final JSpinner lightOverlayOpacitySpinner; + // + // /** Spinner for the luminosity overlay opacity. */ + // private final JSpinner lumensOverlayOpacitySpinner; + // + // /** Spinner for the luminosity overlay border thickness. */ + // private final JSpinner lumensOverlayBorderThicknessSpinner; + // + // /** Checkbox for if the luminosity overlay should be shown by default. */ + // private final JCheckBox lumensOverlayShowByDefaultCheckBox; + // + // /** Checkbox for if the environmental lights should be shown by default. */ + // private final JCheckBox lightsShowByDefaultCheckBox; + // + // /** Spinner for the fog opacity. */ + // private final JSpinner fogOverlayOpacitySpinner; + // + // /** Checkbox for if the halo color should be used as the vision overlay. */ + // private final JCheckBox useHaloColorAsVisionOverlayCheckBox; + // + // /** Checkbox for if the vision should be auto-revealed on GM move. */ + // private final JCheckBox autoRevealVisionOnGMMoveCheckBox; + // + // /** Checkbox for if smilies should be converted to images in chat. */ + // private final JCheckBox showSmiliesCheckBox; + // + // /** Checkbox for if system sounds should be played. */ + // private final JCheckBox playSystemSoundCheckBox; + // + // /** Checkbox for if audio streams should be played. */ + // private final JCheckBox playStreamsCheckBox; + // + // /** Checkbox for if system sounds should be played only when not focused. */ + // private final JCheckBox playSystemSoundOnlyWhenNotFocusedCheckBox; + // + // /** Checkbox for if Syrinscape integration should be enabled. */ + // private final JCheckBox syrinscapeActiveCheckBox; + // + // /** Checkbox for if token facing is allowed to point to edges of the grid cells. */ + // private final JCheckBox facingFaceEdges; + // + // /** Checkbox for if token facing is allowed to point to vertices of the grid cells. */ + // private final JCheckBox facingFaceVertices; + // + // /** Checkbox for if the avatar should be shown in chat. */ + // private final JCheckBox showAvatarInChat; + // + // /** Checkbox for if new macros should be editable by players by default. */ + // private final JCheckBox allowPlayerMacroEditsDefault; + // + // /** Checkbox for opening macro editor on creating new macro. */ + // private final JCheckBox openEditorForNewMacros; + // + // /** Checkbox for if the details of inline rolls should be shown in tooltips. */ + // private final JCheckBox toolTipInlineRolls; + // + // /** Checkbox for if macro link details should be suppressed in tooltips. */ + // private final JCheckBox suppressToolTipsMacroLinks; + // + // /** ColorWell for the completed trusted path output foreground color. */ + // private final ColorWell trustedOutputForeground; + // + // /** ColorWell for the completed trusted path output background color. */ + // private final ColorWell trustedOutputBackground; + // + // /** Spinner for the chat autosave time. */ + // private final JSpinner chatAutosaveTime; + // + // /** Text field for the chat autosave filename format. */ + // private final JTextField chatFilenameFormat; + // + // /** Spinner for the typing notification duration. */ + // private final JSpinner typingNotificationDuration; + // + // /** ComboBox for the macro editor theme. */ + // private final JComboBox macroEditorThemeCombo; + // + // /** ComboBox for the icon theme. */ + // private final JComboBox iconThemeCombo; + // + // // Chat Notification + // /** ColorWell for the chat notification color. */ + // private final ColorWell chatNotificationColor; + // + // /** Checkbox for if the chat notification background should be shown. */ + // private final JCheckBox chatNotificationShowBackground; + // + // // Defaults + // /** ComboBox for the default grid type to use for new maps. */ + // private final JComboBox defaultGridTypeCombo; + // + // /** Text field for the default grid size to use for new maps. */ + // private final JTextField defaultGridSizeTextField; + // + // /** Text field for the default units per cell to use for new maps. */ + // private final JTextField defaultUnitsPerCellTextField; + // + // /** Text field for the default vision distance to use for new maps. */ + // private final JTextField defaultVisionDistanceTextField; + // + // /** Spinner for the stat sheet portrait size. */ + // private final JTextField statsheetPortraitSize; + // + // /** Spinner for the auto-save interval for campaign data. */ + // private final JSpinner autoSaveSpinner; + // + // /** Checkbox for if the save reminder should be shown on exit, new campaign etc. */ + // private final JCheckBox saveReminderCheckBox; + // + // /** Checkbox for if the dialog should be shown on new token creation. */ + // private final JCheckBox showDialogOnNewToken; + // + // // Accessibility + // /** Text field for the chat font size. */ + // private final JTextField fontSizeTextField; + // + // /** Spinner for the initial delay for tooltips. */ + // private final JTextField toolTipInitialDelay; + // + // /** Spinner for the dismiss delay for tooltips. */ + // private final JTextField toolTipDismissDelay; + // + // // Application + // /** Checkbox for if the client should fit the GM view automatically. */ + // private final JCheckBox fitGMView; + // + // /** Checkbox for if the selection should be filled when selecting objects. */ + // private final JCheckBox fillSelectionCheckBox; + // + // /** Text field for the frame rate cap for rendering. */ + // private final JTextField frameRateCapTextField; + // + // /** ComboBox for the render performance optimization level. */ + // private final JComboBox renderPerformanceComboBox; + // + // /** Text field for the default username when not logged into a server. */ + // private final JTextField defaultUsername; + // + // /** Checkbox for if non-player characters should be hidden when creating a new map. */ + // private final JCheckBox hideNPCs; + // + // /** Checkbox for if owner permissions should be granted when creating a new campaign. */ + // private final JCheckBox ownerPermissions; + // + // /** Checkbox for if movement should be locked in new campaigns. */ + // private final JCheckBox lockMovement; + // + // /** Checkbox for if initiative gain messages should be shown. */ + // private final JCheckBox showInitGainMessage; + // + // /** Text field for the UPnP discovery timeout. */ + // private final JTextField upnpDiscoveryTimeoutTextField; + // + // /** Text field for the file synchronization path. */ + // private final JTextField fileSyncPath; + // + // /** Button for opening the file synchronization path selection dialog. */ + // private final JButton fileSyncPathButton; + // + // /** Checkbox for if macros should be allowed to access external resources. */ + // private final JCheckBox allowExternalMacroAccessCheckBox; + // + // // Authentication + // /** Text area for displaying the public key for authentication. */ + // private final JTextArea publicKeyTextArea; + // + // /** Button for regenerating the public key. */ + // private final JButton regeneratePublicKey; + // + // /** Button for copying the public key to the clipboard. */ + // private final JButton copyPublicKey; + // + // // Themes + // /** List for displaying available themes. */ + // private final JList themeList; + // + // /** Label for displaying the theme image. */ + // private final JLabel themeImageLabel; + // + // /** Label for displaying the theme name. */ + // private final JLabel themeNameLabel; + // + // /** List model for all available themes. */ + // private final ListModel allThemesListModel; + // + // /** List model for light themes. */ + // private final ListModel lightThemesListModel; + // + // /** List model for dark themes. */ + // private final ListModel darkThemesListModel; + // + // /** Combo box for selecting the theme filter. */ + // private final JComboBox themeFilterCombo; + // + // /** Checkbox for if the theme should be applied to the chat window. */ + // private final JCheckBox useThemeForChat; + // + // // Startup + // /** Text field for the JVM maximum memory allocation. */ + // private final JTextField jvmXmxTextField; + // + // /** Text field for the JVM initial memory allocation. */ + // private final JTextField jvmXmsTextField; + // + // /** Text field for the JVM thread stack size. */ + // private final JTextField jvmXssTextField; + // + // /** Text field for the data directory. */ + // private final JTextField dataDirTextField; + // + // /** Checkbox for if the JVM should use Direct3D. */ + // private final JCheckBox jvmDirect3dCheckbox; + // + // /** Checkbox for if the JVM should use OpenGL. */ + // private final JCheckBox jvmOpenGLCheckbox; + // + // /** Checkbox for if the JVM should initialize AWT. */ + // private final JCheckBox jvmInitAwtCheckbox; + // + // /** Combo box for selecting the language override for JAM messages. */ + // private final JComboBox jamLanguageOverrideComboBox; + // + // /** Label for displaying startup information. */ + // private final JTextField cfgFilePath; + // + // private final AbstractButton copyCfgFilePathButton; + // + // private final JPanel configFileWarningPanel; + // + // /** Flag indicating if JVM values have been changed. */ + // private boolean jvmValuesChanged = false; + // + // /** Flag indicating if theme has been changed. */ + // private boolean themeChanged = false; + // + // // Map Token Labels + // /** ColorWell for displaying the PC token label foreground color. */ + // private final ColorWell pcTokenLabelFG; + // + // /** ColorWell for displaying the PC token label background color. */ + // private final ColorWell pcTokenLabelBG; + // + // /** ColorWell for displaying the NPC token label foreground color. */ + // private final ColorWell npcTokenLabelFG; + // + // /** ColorWell for displaying the NPC token label background color. */ + // private final ColorWell npcTokenLabelBG; + // + // /** ColorWell for displaying the non-visibility token label foreground color. */ + // private final ColorWell nonVisTokenLabelFG; + // + // /** ColorWell for displaying the non-visibility token label background color. */ + // private final ColorWell nonVisTokenLabelBG; + // + // /** Spinner for setting the token label font size. */ + // private final JSpinner labelFontSizeSpinner; + // + // /** ColorWell for displaying the token label border color for PCs. */ + // private final ColorWell pcTokenLabelBorderColor; + // + // /** ColorWell for displaying the token label border color for NPCs. */ + // private final ColorWell npcTokenLabelBorderColor; + // + // /** ColorWell for displaying the token label border color for non-visible tokens. */ + // private final ColorWell nonVisTokenLabelBorderColor; + // + // /** Spinner for setting the token label border width. */ + // private final JSpinner labelBorderWidthSpinner; + // + // /** Spinner for setting the token label border arc. */ + // private final JSpinner labelBorderArcSpinner; + // + // /** Checkbox for showing the token label border. */ + // private final JCheckBox showLabelBorderCheckBox; + // + // // ** Checkbox for loading the most recently used campaign on startup */ + // private final JCheckBox loadMRUcheckbox; + // + // /** status bar scrolling checkbox */ + // private final JCheckBox statusScrollEnable; + // + // /** status bar temp time display */ + // private final JSpinner statusTempMessageTimeSpinner; + // + // /** status bar scrolling speed */ + // private final JSpinner statusScrollSpeedSpinner; + // + // /** status bar scroll start delay */ + // private final JSpinner statusScrollStartDelaySpinner; + // + // /** status bar scroll end delay */ + // private final JSpinner statusScrollEndPause; + // + // /** + // * Array of LocalizedComboItems representing the default grid types for the preferences + // dialog. + // * Each item in the array consists of a grid type and its corresponding localized display + // name. + // */ + // private static final LocalizedComboItem[] defaultGridTypeComboItems = { + // new LocalizedComboItem(GridFactory.SQUARE, "Preferences.combo.maps.grid.square"), + // new LocalizedComboItem(GridFactory.HEX_HORI, "Preferences.combo.maps.grid.hexHori"), + // new LocalizedComboItem(GridFactory.HEX_VERT, "Preferences.combo.maps.grid.hexVert"), + // new LocalizedComboItem(GridFactory.ISOMETRIC, "Preferences.combo.maps.grid.isometric"), + // new LocalizedComboItem(GridFactory.NONE, "MapPropertiesDialog.image.noGrid") + // }; + // + // /** + // * Stores the localized combo items for duplicate token preferences. + // * + // * @see LocalizedComboItem + // */ + // private static final LocalizedComboItem[] duplicateTokenComboItems = { + // new LocalizedComboItem(Token.NUM_INCREMENT, "Preferences.combo.tokens.duplicate.increment"), + // new LocalizedComboItem(Token.NUM_RANDOM, "Preferences.combo.tokens.duplicate.random"), + // }; + // + // /** + // * Array of LocalizedComboItem objects for showing numbering options in a combo box. + // * + // * @see LocalizedComboItem + // */ + // private static final LocalizedComboItem[] showNumberingComboItems = { + // new LocalizedComboItem(Token.NUM_ON_NAME, "Preferences.combo.tokens.numbering.name"), + // new LocalizedComboItem(Token.NUM_ON_GM, "Preferences.combo.tokens.numbering.gm"), + // new LocalizedComboItem(Token.NUM_ON_BOTH, "Preferences.combo.tokens.numbering.both") + // }; + // + // /** + // * Array of LocalizedComboItem objects for showing vision type options in a combo box. + // * + // * @see LocalizedComboItem + // */ + // private static final LocalizedComboItem[] tokenNamingComboItems = { + // new LocalizedComboItem(Token.NAME_USE_FILENAME, "Preferences.combo.tokens.naming.filename"), + // new LocalizedComboItem( + // Token.NAME_USE_CREATURE, + // "Preferences.combo.tokens.naming.creature", + // I18N.getString("Token.name.creature")) + // }; + // + // /** + // * An array of WalkerMetric objects that represent different movement metrics. + // * + // * @see WalkerMetric + // */ + // private static final WalkerMetric[] movementMetricComboItems = { + // WalkerMetric.ONE_TWO_ONE, + // WalkerMetric.ONE_ONE_ONE, + // WalkerMetric.MANHATTAN, + // WalkerMetric.NO_DIAGONALS + // }; + // + // /** + // * Array of LocalizedComboItem objects for showing render performance options in a combo box. + // * + // * @see LocalizedComboItem + // */ + // private static final LocalizedComboItem[] renderPerformanceComboItems = { + // new LocalizedComboItem( + // MapToolConstants.RenderQuality.LOW_SCALING.name(), "Preferences.combo.render.low"), + // new LocalizedComboItem( + // MapToolConstants.RenderQuality.PIXEL_ART_SCALING.name(), + // "Preferences.combo.render.pixel"), + // new LocalizedComboItem( + // MapToolConstants.RenderQuality.MEDIUM_SCALING.name(), + // "Preferences.combo.render.medium"), + // new LocalizedComboItem( + // MapToolConstants.RenderQuality.HIGH_SCALING.name(), "Preferences.combo.render.high") + // }; + // + // /** + // * Array of LocalizedComboItem objects for showing theme filter options in a combo box. + // * + // * @see LocalizedComboItem + // */ + // private static final LocalizedComboItem[] themeFilterComboItems = { + // new LocalizedComboItem("All", "Preferences.combo.themes.filter.all"), + // new LocalizedComboItem("Dark", "Preferences.combo.themes.filter.dark"), + // new LocalizedComboItem("Light", "Preferences.combo.themes.filter.light") + // }; + // + // /** + // * The PreferenceDialog class represents a dialog window that allows users to customize their + // * preferences. + // * + // *

This dialog window is modal. + // */ + // public PreferencesDialog_old() { + // super(MapTool.getFrame(), I18N.getString("Label.preferences"), true); + // setDefaultCloseOperation(DISPOSE_ON_CLOSE); + // ((JPanel) getContentPane()).setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + // + // var lm = new DefaultListModel(); + // Arrays.stream(ThemeSupport.THEMES).map(ThemeDetails::name).sorted().forEach(lm::addElement); + // allThemesListModel = lm; + // + // lm = new DefaultListModel(); + // Arrays.stream(ThemeSupport.THEMES) + // .filter(ThemeDetails::dark) + // .map(ThemeDetails::name) + // .sorted() + // .forEach(lm::addElement); + // darkThemesListModel = lm; + // + // lm = new DefaultListModel(); + // Arrays.stream(ThemeSupport.THEMES) + // .filter(t -> !t.dark()) + // .map(ThemeDetails::name) + // .sorted() + // .forEach(lm::addElement); + // lightThemesListModel = lm; + // + // AbeillePanel panel = new AbeillePanel(new PreferencesDialogView().getRootComponent()); + // + // JButton okButton = (JButton) panel.getButton("okButton"); + // getRootPane().setDefaultButton(okButton); + // AbeillePanel themeFontPreferences = new ThemeFontPreferences(); + // okButton.addActionListener( + // e -> { + // boolean close = true; + // if (close) { + // themeChanged = themeChanged | themeFontPreferences.commit(); + // setVisible(false); + // dispose(); + // } + // new MapToolEventBus().getMainEventBus().post(new PreferencesChanged()); + // if (themeChanged || ThemeSupport.needsRestartForNewTheme()) { + // MapTool.showMessage( + // "PreferenceDialog.themeChangeWarning", + // "PreferenceDialog.themeChangeWarningTitle", + // JOptionPane.WARNING_MESSAGE); + // } + // }); + // JPanel ui = (JPanel) panel.getComponent("uiFontPrefs"); + // ui.add(themeFontPreferences, BorderLayout.CENTER); + // + // tabbedPane = panel.getTabbedPane("TabPane"); + // + // forceFacingArrowCheckBox = panel.getCheckBox("forceFacingArrow"); + // showStatSheetCheckBox = panel.getCheckBox("showStatSheet"); + // showPortraitCheckBox = panel.getCheckBox("showPortrait"); + // showStatSheetModifierCheckBox = panel.getCheckBox("showStatSheetModifier"); + // showNumberingCombo = panel.getComboBox("showNumberingCombo"); + // saveReminderCheckBox = panel.getCheckBox("saveReminderCheckBox"); + // fillSelectionCheckBox = panel.getCheckBox("fillSelectionCheckBox"); + // frameRateCapTextField = panel.getTextField("frameRateCapTextField"); + // renderPerformanceComboBox = panel.getComboBox("renderPerformanceComboBox"); + // + // defaultUsername = panel.getTextField("defaultUsername"); + // autoSaveSpinner = panel.getSpinner("autoSaveSpinner"); + // duplicateTokenCombo = panel.getComboBox("duplicateTokenCombo"); + // tokenNamingCombo = panel.getComboBox("tokenNamingCombo"); + // newMapsHaveFOWCheckBox = panel.getCheckBox("newMapsHaveFOWCheckBox"); + // tokensPopupWarningWhenDeletedCheckBox = + // panel.getCheckBox("tokensPopupWarningWhenDeletedCheckBox"); // new + // tokensStartSnapToGridCheckBox = panel.getCheckBox("tokensStartSnapToGridCheckBox"); + // tokensSnapWhileDraggingCheckBox = panel.getCheckBox("tokensSnapWhileDragging"); + // hideMousePointerWhileDraggingCheckBox = panel.getCheckBox("hideMousePointerWhileDragging"); + // hideTokenStackIndicatorCheckBox = panel.getCheckBox("hideTokenStackIndicator"); + // newMapsVisibleCheckBox = panel.getCheckBox("newMapsVisibleCheckBox"); + // newTokensVisibleCheckBox = panel.getCheckBox("newTokensVisibleCheckBox"); + // stampsStartFreeSizeCheckBox = panel.getCheckBox("stampsStartFreeSize"); + // tokensStartFreeSizeCheckBox = panel.getCheckBox("tokensStartFreeSize"); + // stampsStartSnapToGridCheckBox = panel.getCheckBox("stampsStartSnapToGrid"); + // backgroundsStartFreeSizeCheckBox = panel.getCheckBox("backgroundsStartFreeSize"); + // backgroundsStartSnapToGridCheckBox = panel.getCheckBox("backgroundsStartSnapToGrid"); + // defaultGridTypeCombo = panel.getComboBox("defaultGridTypeCombo"); + // defaultGridSizeTextField = panel.getTextField("defaultGridSize"); + // defaultUnitsPerCellTextField = panel.getTextField("defaultUnitsPerCell"); + // defaultVisionDistanceTextField = panel.getTextField("defaultVisionDistance"); + // statsheetPortraitSize = panel.getTextField("statsheetPortraitSize"); + // fontSizeTextField = panel.getTextField("fontSize"); + // + // haloLineWidthSpinner = panel.getSpinner("haloLineWidthSpinner"); + // haloOverlayOpacitySpinner = panel.getSpinner("haloOverlayOpacitySpinner"); + // auraOverlayOpacitySpinner = panel.getSpinner("auraOverlayOpacitySpinner"); + // lightOverlayOpacitySpinner = panel.getSpinner("lightOverlayOpacitySpinner"); + // lumensOverlayOpacitySpinner = panel.getSpinner("lumensOverlayOpacitySpinner"); + // lumensOverlayBorderThicknessSpinner = + // panel.getSpinner("lumensOverlayBorderThicknessSpinner"); + // lumensOverlayShowByDefaultCheckBox = + // panel.getCheckBox("lumensOverlayShowByDefaultCheckBox"); + // lightsShowByDefaultCheckBox = panel.getCheckBox("lightsShowByDefaultCheckBox"); + // fogOverlayOpacitySpinner = panel.getSpinner("fogOverlayOpacitySpinner"); + // mapVisibilityWarning = panel.getCheckBox("mapVisibilityWarning"); + // + // useHaloColorAsVisionOverlayCheckBox = + // panel.getCheckBox("useHaloColorAsVisionOverlayCheckBox"); + // autoRevealVisionOnGMMoveCheckBox = panel.getCheckBox("autoRevealVisionOnGMMoveCheckBox"); + // showSmiliesCheckBox = panel.getCheckBox("showSmiliesCheckBox"); + // playSystemSoundCheckBox = panel.getCheckBox("playSystemSounds"); + // playStreamsCheckBox = panel.getCheckBox("playStreams"); + // playSystemSoundOnlyWhenNotFocusedCheckBox = panel.getCheckBox("soundsOnlyWhenNotFocused"); + // syrinscapeActiveCheckBox = panel.getCheckBox("syrinscapeActive"); + // showAvatarInChat = panel.getCheckBox("showChatAvatar"); + // showDialogOnNewToken = panel.getCheckBox("showDialogOnNewToken"); + // visionTypeCombo = panel.getComboBox("defaultVisionType"); + // mapSortType = panel.getComboBox("mapSortType"); + // uvttLosImportType = panel.getComboBox("uvttLosImportType"); + // movementMetricCombo = panel.getComboBox("movementMetric"); + // openEditorForNewMacros = panel.getCheckBox("openEditorForNewMacros"); + // allowPlayerMacroEditsDefault = panel.getCheckBox("allowPlayerMacroEditsDefault"); + // toolTipInlineRolls = panel.getCheckBox("toolTipInlineRolls"); + // suppressToolTipsMacroLinks = panel.getCheckBox("suppressToolTipsMacroLinks"); + // trustedOutputForeground = (ColorWell) panel.getComponent("trustedOuputForeground"); + // trustedOutputBackground = (ColorWell) panel.getComponent("trustedOuputBackground"); + // toolTipInitialDelay = panel.getTextField("toolTipInitialDelay"); + // toolTipDismissDelay = panel.getTextField("toolTipDismissDelay"); + // facingFaceEdges = panel.getCheckBox("facingFaceEdges"); + // facingFaceVertices = panel.getCheckBox("facingFaceVertices"); + // + // chatNotificationColor = (ColorWell) panel.getComponent("chatNotificationColor"); + // chatNotificationShowBackground = panel.getCheckBox("chatNotificationShowBackground"); + // + // chatAutosaveTime = panel.getSpinner("chatAutosaveTime"); + // chatFilenameFormat = panel.getTextField("chatFilenameFormat"); + // + // macroEditorThemeCombo = panel.getComboBox("macroEditorThemeCombo"); + // iconThemeCombo = panel.getComboBox("iconThemeCombo"); + // + // fitGMView = panel.getCheckBox("fitGMView"); + // hideNPCs = panel.getCheckBox("hideNPCs"); + // ownerPermissions = panel.getCheckBox("ownerPermission"); + // lockMovement = panel.getCheckBox("lockMovement"); + // showInitGainMessage = panel.getCheckBox("showInitGainMessage"); + // upnpDiscoveryTimeoutTextField = panel.getTextField("upnpDiscoveryTimeoutTextField"); + // typingNotificationDuration = panel.getSpinner("typingNotificationDuration"); + // allowExternalMacroAccessCheckBox = panel.getCheckBox("allowExternalMacroAccessCheckBox"); + // fileSyncPath = panel.getTextField("fileSyncPath"); + // fileSyncPathButton = (JButton) panel.getButton("fileSyncPathButton"); + // loadMRUcheckbox = (JCheckBox) panel.getCheckBox("loadMRUcheckbox"); + // final var installDirTextField = (JTextField) panel.getComponent("InstallDirTextField"); + // installDirTextField.setText(AppUtil.getInstallDirectory().toString()); + // + // publicKeyTextArea = (JTextArea) panel.getTextComponent("publicKeyTextArea"); + // regeneratePublicKey = (JButton) panel.getButton("regeneratePublicKey"); + // copyPublicKey = (JButton) panel.getButton("copyKey"); + // + // themeList = (JList) panel.getList("themeList"); + // themeImageLabel = (JLabel) panel.getComponent("themeImage"); + // themeNameLabel = (JLabel) panel.getComponent("currentThemeName"); + // useThemeForChat = (JCheckBox) panel.getComponent("useThemeForChat"); + // themeFilterCombo = panel.getComboBox("themeFilterCombo"); + // + // jvmXmxTextField = panel.getTextField("jvmXmxTextField"); + // jvmXmsTextField = panel.getTextField("jvmXmsTextField"); + // jvmXssTextField = panel.getTextField("jvmXssTextField"); + // + // dataDirTextField = panel.getTextField("dataDirTextField"); + // + // jvmDirect3dCheckbox = panel.getCheckBox("jvmDirect3dCheckbox"); + // jvmOpenGLCheckbox = panel.getCheckBox("jvmOpenGLCheckbox"); + // jvmInitAwtCheckbox = panel.getCheckBox("jvmInitAwtCheckbox"); + // + // jamLanguageOverrideComboBox = panel.getComboBox("jvmLanguageOverideComboBox"); + // + // configFileWarningPanel = (JPanel) panel.getComponent("configFileWarningPanel"); + // JLabel configFileWarningIcon = panel.getLabel("configFileWarningIcon"); + // configFileWarningIcon.setIcon( + // new FlatSVGIcon("net/rptools/maptool/client/image/warning.svg", 16, 16)); + // + // cfgFilePath = panel.getTextField("cfgFilePath"); + // copyCfgFilePathButton = panel.getButton("copyCfgPath"); + // copyCfgFilePathButton.addActionListener( + // e -> { + // Toolkit.getDefaultToolkit() + // .getSystemClipboard() + // .setContents(new StringSelection(cfgFilePath.getText()), null); + // }); + // + // pcTokenLabelFG = (ColorWell) panel.getComponent("pcTokenLabelFG"); + // pcTokenLabelFG.setColor(AppPreferences.pcMapLabelForeground.get()); + // pcTokenLabelBG = (ColorWell) panel.getComponent("pcTokenLabelBG"); + // pcTokenLabelBG.setColor(AppPreferences.pcMapLabelBackground.get()); + // pcTokenLabelBorderColor = (ColorWell) panel.getComponent("pcTokenLabelBorder"); + // pcTokenLabelBorderColor.setColor(AppPreferences.pcMapLabelBorder.get()); + // npcTokenLabelFG = (ColorWell) panel.getComponent("npcTokenLabelFG"); + // npcTokenLabelFG.setColor(AppPreferences.npcMapLabelForeground.get()); + // npcTokenLabelBG = (ColorWell) panel.getComponent("npcTokenLabelBG"); + // npcTokenLabelBG.setColor(AppPreferences.npcMapLabelBackground.get()); + // npcTokenLabelBorderColor = (ColorWell) panel.getComponent("npcTokenLabelBorder"); + // npcTokenLabelBorderColor.setColor(AppPreferences.npcMapLabelBorder.get()); + // nonVisTokenLabelFG = (ColorWell) panel.getComponent("nonVisTokenLabelFG"); + // nonVisTokenLabelFG.setColor(AppPreferences.nonVisibleTokenMapLabelForeground.get()); + // nonVisTokenLabelBG = (ColorWell) panel.getComponent("nonVisTokenLabelBG"); + // nonVisTokenLabelBG.setColor(AppPreferences.nonVisibleTokenMapLabelBackground.get()); + // nonVisTokenLabelBorderColor = (ColorWell) panel.getComponent("nonVisTokenLabelBorder"); + // nonVisTokenLabelBorderColor.setColor(AppPreferences.nonVisibleTokenMapLabelBorder.get()); + // + // labelFontSizeSpinner = (JSpinner) panel.getComponent("labelFontSizeSpinner"); + // labelFontSizeSpinner.setValue(AppPreferences.mapLabelFontSize.get()); + // labelBorderWidthSpinner = (JSpinner) panel.getComponent("labelBorderWidthSpinner"); + // labelBorderWidthSpinner.setValue(AppPreferences.mapLabelBorderWidth.get()); + // labelBorderArcSpinner = (JSpinner) panel.getComponent("labelBorderArcSpinner"); + // labelBorderArcSpinner.setValue(AppPreferences.mapLabelBorderArc.get()); + // + // statusScrollEnable = panel.getCheckBox("statusScrollEnable"); + // statusScrollEnable.setSelected(AppPreferences.scrollStatusMessages.get()); + // statusScrollEnable.addChangeListener( + // e -> AppPreferences.scrollStatusMessages.set(((JCheckBox) e.getSource()).isSelected())); + // + // statusTempMessageTimeSpinner = panel.getSpinner("statusTempMessageTimeSpinner"); + // statusTempMessageTimeSpinner.setModel( + // new SpinnerNumberModel( + // AppPreferences.scrollStatusTempDuration.get().doubleValue(), + // AppPreferences.scrollStatusTempDuration.getMinValue().doubleValue(), + // AppPreferences.scrollStatusTempDuration.getMaxValue().doubleValue(), + // .5)); + // statusTempMessageTimeSpinner.addChangeListener( + // e -> + // AppPreferences.scrollStatusTempDuration.set( + // ((SpinnerNumberModel) ((JSpinner) e.getSource()).getModel()) + // .getNumber() + // .doubleValue())); + // statusScrollSpeedSpinner = panel.getSpinner("statusScrollSpeedSpinner"); + // statusScrollSpeedSpinner.setModel( + // new SpinnerNumberModel( + // AppPreferences.scrollStatusSpeed.get().doubleValue(), + // AppPreferences.scrollStatusSpeed.getMinValue().doubleValue(), + // AppPreferences.scrollStatusSpeed.getMaxValue().doubleValue(), + // 0.05)); + // statusScrollSpeedSpinner.addChangeListener( + // e -> + // AppPreferences.scrollStatusSpeed.set( + // ((SpinnerNumberModel) ((JSpinner) e.getSource()).getModel()) + // .getNumber() + // .doubleValue())); + // + // statusScrollStartDelaySpinner = panel.getSpinner("statusScrollStartDelaySpinner"); + // statusScrollStartDelaySpinner.setModel( + // new SpinnerNumberModel( + // AppPreferences.scrollStatusStartDelay.get().doubleValue(), + // AppPreferences.scrollStatusStartDelay.getMinValue().doubleValue(), + // AppPreferences.scrollStatusStartDelay.getMaxValue().doubleValue(), + // 0.1)); + // statusScrollStartDelaySpinner.addChangeListener( + // e -> + // AppPreferences.scrollStatusStartDelay.set( + // ((SpinnerNumberModel) ((JSpinner) e.getSource()).getModel()) + // .getNumber() + // .doubleValue())); + // statusScrollEndPause = panel.getSpinner("statusScrollEndPause"); + // statusScrollEndPause.setModel( + // new SpinnerNumberModel( + // AppPreferences.scrollStatusEndPause.get().doubleValue(), + // AppPreferences.scrollStatusEndPause.getMinValue().doubleValue(), + // AppPreferences.scrollStatusEndPause.getMaxValue().doubleValue(), + // 0.1)); + // statusScrollEndPause.addChangeListener( + // e -> + // AppPreferences.scrollStatusEndPause.set( + // ((SpinnerNumberModel) ((JSpinner) e.getSource()).getModel()) + // .getNumber() + // .doubleValue())); + // + // showLabelBorderCheckBox = (JCheckBox) panel.getComponent("showLabelBorder"); + // showLabelBorderCheckBox.addActionListener( + // e -> { + // if (showLabelBorderCheckBox.isSelected()) { + // pcTokenLabelBorderColor.setVisible(true); // Disabling a color well does not work + // npcTokenLabelBorderColor.setVisible(true); // Disabling a color well does not work + // nonVisTokenLabelBorderColor.setVisible(true); // Disabling a color well does not + // work + // labelBorderWidthSpinner.setEnabled(true); + // labelBorderArcSpinner.setEnabled(true); + // AppPreferences.mapLabelShowBorder.set(true); + // } else { + // pcTokenLabelBorderColor.setVisible(false); // Disabling a color well does not work + // npcTokenLabelBorderColor.setVisible(false); // Disabling a color well does not work + // nonVisTokenLabelBorderColor.setVisible(false); // Disabling a color well does not + // work + // labelBorderWidthSpinner.setEnabled(false); + // labelBorderArcSpinner.setEnabled(false); + // AppPreferences.mapLabelShowBorder.set(false); + // } + // }); + // + // boolean showBorder = AppPreferences.mapLabelShowBorder.get(); + // showLabelBorderCheckBox.setSelected(showBorder); + // if (showBorder) { + // pcTokenLabelBorderColor.setVisible(true); + // npcTokenLabelBorderColor.setVisible(true); + // nonVisTokenLabelBorderColor.setVisible(true); + // labelBorderWidthSpinner.setEnabled(true); + // labelBorderArcSpinner.setEnabled(true); + // } else { + // pcTokenLabelBorderColor.setVisible(false); + // npcTokenLabelBorderColor.setVisible(false); + // nonVisTokenLabelBorderColor.setVisible(false); + // labelBorderWidthSpinner.setEnabled(false); + // labelBorderArcSpinner.setEnabled(false); + // } + // + // { + // final var developerOptionToggles = (JPanel) panel.getComponent("developerOptionToggles"); + // final var developerLayout = developerOptionToggles.getLayout(); + // + // final var labelConstraints = new GridBagConstraints(); + // labelConstraints.insets = new Insets(6, 0, 6, 5); + // labelConstraints.gridx = 0; + // labelConstraints.gridy = 0; + // labelConstraints.weightx = 0.; + // labelConstraints.weighty = 1.; + // labelConstraints.fill = GridBagConstraints.HORIZONTAL; + // + // final var checkboxConstraints = new GridBagConstraints(); + // checkboxConstraints.insets = new Insets(6, 5, 6, 0); + // checkboxConstraints.gridx = 1; + // checkboxConstraints.gridy = 0; + // checkboxConstraints.weightx = 0.; + // checkboxConstraints.weighty = 1.; + // checkboxConstraints.fill = GridBagConstraints.HORIZONTAL; + // + // for (final var option : DeveloperOptions.Toggle.getOptions()) { + // labelConstraints.gridy += 1; + // checkboxConstraints.gridy += 1; + // + // final var label = new JLabel(option.getLabel()); + // label.setToolTipText(option.getTooltip()); + // label.setHorizontalAlignment(SwingConstants.LEADING); + // label.setHorizontalTextPosition(SwingConstants.TRAILING); + // + // final var checkbox = new JCheckBox(); + // checkbox.setModel(new DeveloperToggleModel(option)); + // checkbox.addActionListener(e -> option.set(!checkbox.isSelected())); + // + // label.setLabelFor(checkbox); + // + // developerOptionToggles.add(label, labelConstraints); + // developerOptionToggles.add(checkbox, checkboxConstraints); + // } + // } + // + // File appCfgFile = AppUtil.getAppCfgFile(); + // if (appCfgFile != null) { + // cfgFilePath.setText(appCfgFile.toString()); + // cfgFilePath.setCaretPosition(0); + // } else { + // cfgFilePath.setText(""); + // } + // + // // jpackage config files can't be written to. Show a warning to the user describing the + // // situation. + // + // if (appCfgFile != null) { + // configFileWarningPanel.setVisible(true); + // } else { + // configFileWarningPanel.setVisible(false); + // } + // + // DefaultComboBoxModel languageModel = new DefaultComboBoxModel(); + // languageModel.addAll(getLanguages()); + // jamLanguageOverrideComboBox.setModel(languageModel); + // + // setInitialState(); + // + // // And keep it updated + // facingFaceEdges.addActionListener( + // e -> { + // AppPreferences.faceEdge.set(facingFaceEdges.isSelected()); + // }); + // facingFaceVertices.addActionListener( + // e -> { + // AppPreferences.faceVertex.set(facingFaceVertices.isSelected()); + // }); + // + // toolTipInlineRolls.addActionListener( + // e -> AppPreferences.useToolTipForInlineRoll.set(toolTipInlineRolls.isSelected())); + // + // suppressToolTipsMacroLinks.addActionListener( + // e -> + // AppPreferences.suppressToolTipsForMacroLinks.set( + // suppressToolTipsMacroLinks.isSelected())); + // + // toolTipInitialDelay + // .getDocument() + // .addDocumentListener( + // new DocumentListenerProxy(toolTipInitialDelay) { + // @Override + // protected void storeNumericValue(Integer value) { + // AppPreferences.toolTipInitialDelay.set(value); + // ToolTipManager.sharedInstance().setInitialDelay(value); + // } + // + // @Override + // protected Integer convertString(String value) throws ParseException { + // return StringUtil.parseInteger(value); + // } + // }); + // toolTipDismissDelay + // .getDocument() + // .addDocumentListener( + // new DocumentListenerProxy(toolTipDismissDelay) { + // @Override + // protected void storeNumericValue(Integer value) { + // AppPreferences.toolTipDismissDelay.set(value); + // ToolTipManager.sharedInstance().setDismissDelay(value); + // } + // + // @Override + // protected Integer convertString(String value) throws ParseException { + // return StringUtil.parseInteger(value); + // } + // }); + // + // chatNotificationColor.addActionListener( + // e -> { + // AppPreferences.chatNotificationColor.set(chatNotificationColor.getColor()); + // + // MapTool.getFrame().setChatTypingLabelColor(AppPreferences.chatNotificationColor.get()); + // }); + // + // trustedOutputForeground.addActionListener( + // e -> { + // AppPreferences.trustedPrefixForeground.set(trustedOutputForeground.getColor()); + // MapTool.getFrame() + // .getCommandPanel() + // .setTrustedMacroPrefixColors( + // AppPreferences.trustedPrefixForeground.get(), + // AppPreferences.trustedPrefixBackground.get()); + // }); + // trustedOutputBackground.addActionListener( + // e -> { + // AppPreferences.trustedPrefixBackground.set(trustedOutputBackground.getColor()); + // MapTool.getFrame() + // .getCommandPanel() + // .setTrustedMacroPrefixColors( + // AppPreferences.trustedPrefixForeground.get(), + // AppPreferences.trustedPrefixBackground.get()); + // }); + // + // chatAutosaveTime.addChangeListener( + // new ChangeListenerProxy() { + // @Override + // protected void storeSpinnerValue(int value) { + // if (value >= 0) { + // AppPreferences.chatAutoSaveTimeInMinutes.set(value); + // } + // } + // }); + // typingNotificationDuration.addChangeListener( + // new ChangeListenerProxy() { + // @Override + // protected void storeSpinnerValue(int value) { + // AppPreferences.typingNotificationDurationInSeconds.set(value); + // } + // }); + // + // chatFilenameFormat.addFocusListener( + // new FocusAdapter() { + // @Override + // public void focusLost(FocusEvent e) { + // if (!e.isTemporary()) { + // StringBuilder saveFile = new StringBuilder(chatFilenameFormat.getText()); + // if (saveFile.indexOf(".") < 0) { + // saveFile.append(".html"); + // } + // AppPreferences.chatFilenameFormat.set(saveFile.toString()); + // } + // } + // }); + // + // allowPlayerMacroEditsDefault.addActionListener( + // e -> + // AppPreferences.allowPlayerMacroEditsDefault.set( + // allowPlayerMacroEditsDefault.isSelected())); + // openEditorForNewMacros.addActionListener( + // e -> AppPreferences.openEditorForNewMacro.set(openEditorForNewMacros.isSelected())); + // showAvatarInChat.addActionListener( + // e -> AppPreferences.showAvatarInChat.set(showAvatarInChat.isSelected())); + // saveReminderCheckBox.addActionListener( + // e -> AppPreferences.saveReminder.set(saveReminderCheckBox.isSelected())); + // fillSelectionCheckBox.addActionListener( + // e -> AppPreferences.fillSelectionBox.set(fillSelectionCheckBox.isSelected())); + // frameRateCapTextField + // .getDocument() + // .addDocumentListener( + // new DocumentListenerProxy(frameRateCapTextField) { + // @Override + // protected void storeNumericValue(Integer value) { + // AppPreferences.frameRateCap.set(value); + // + // // AppPreferences may have rejected the value, so read it back. + // final var cap = AppPreferences.frameRateCap.get(); + // for (final var renderer : MapTool.getFrame().getZoneRenderers()) { + // renderer.setFrameRateCap(cap); + // } + // } + // + // @Override + // protected Integer convertString(String value) throws ParseException { + // final var result = StringUtil.parseInteger(value); + // if (result <= 0) { + // throw new ParseException("Frame rate cap must be positive", 0); + // } + // return result; + // } + // }); + // + // renderPerformanceComboBox.setModel( + // getLocalizedModel(renderPerformanceComboItems, + // AppPreferences.renderQuality.get().name())); + // renderPerformanceComboBox.addItemListener( + // e -> { + // AppPreferences.renderQuality.set( + // MapToolConstants.RenderQuality.valueOf( + // ((LocalizedComboItem) + // renderPerformanceComboBox.getSelectedItem()).getValue())); + // }); + // + // defaultUsername.addFocusListener( + // new FocusAdapter() { + // @Override + // public void focusLost(FocusEvent e) { + // if (!e.isTemporary()) { + // StringBuilder userName = new StringBuilder(defaultUsername.getText()); + // AppPreferences.defaultUserName.set(userName.toString()); + // } + // } + // }); + // + // loadMRUcheckbox.addActionListener( + // e -> AppPreferences.loadMruCampaignAtStart.set(loadMRUcheckbox.isSelected())); + // allowExternalMacroAccessCheckBox.addActionListener( + // e -> + // AppPreferences.allowExternalMacroAccess.set( + // allowExternalMacroAccessCheckBox.isSelected())); + // showDialogOnNewToken.addActionListener( + // e -> AppPreferences.showDialogOnNewToken.set(showDialogOnNewToken.isSelected())); + // autoSaveSpinner.addChangeListener( + // ce -> { + // int newInterval = (Integer) autoSaveSpinner.getValue(); + // AppPreferences.autoSaveIncrement.set(newInterval); + // }); + // newMapsHaveFOWCheckBox.addActionListener( + // e -> AppPreferences.newMapsHaveFow.set(newMapsHaveFOWCheckBox.isSelected())); + // tokensPopupWarningWhenDeletedCheckBox.addActionListener( + // e -> + // AppPreferences.tokensWarnWhenDeleted.set( + // tokensPopupWarningWhenDeletedCheckBox.isSelected())); + // tokensStartSnapToGridCheckBox.addActionListener( + // e -> + // AppPreferences.tokensStartSnapToGrid.set(tokensStartSnapToGridCheckBox.isSelected())); + // tokensSnapWhileDraggingCheckBox.addActionListener( + // e -> + // AppPreferences.tokensSnapWhileDragging.set( + // tokensSnapWhileDraggingCheckBox.isSelected())); + // hideMousePointerWhileDraggingCheckBox.addActionListener( + // e -> + // AppPreferences.hideMousePointerWhileDragging.set( + // hideMousePointerWhileDraggingCheckBox.isSelected())); + // hideTokenStackIndicatorCheckBox.addActionListener( + // e -> + // AppPreferences.hideTokenStackIndicator.set( + // hideTokenStackIndicatorCheckBox.isSelected())); + // newMapsVisibleCheckBox.addActionListener( + // e -> AppPreferences.newMapsVisible.set(newMapsVisibleCheckBox.isSelected())); + // newTokensVisibleCheckBox.addActionListener( + // e -> AppPreferences.newTokensVisible.set(newTokensVisibleCheckBox.isSelected())); + // stampsStartFreeSizeCheckBox.addActionListener( + // e -> AppPreferences.objectsStartFreesize.set(stampsStartFreeSizeCheckBox.isSelected())); + // tokensStartFreeSizeCheckBox.addActionListener( + // e -> AppPreferences.tokensStartFreesize.set(tokensStartFreeSizeCheckBox.isSelected())); + // stampsStartSnapToGridCheckBox.addActionListener( + // e -> + // AppPreferences.objectsStartSnapToGrid.set(stampsStartSnapToGridCheckBox.isSelected())); + // showStatSheetCheckBox.addActionListener( + // e -> AppPreferences.showStatSheet.set(showStatSheetCheckBox.isSelected())); + // showPortraitCheckBox.addActionListener( + // e -> AppPreferences.showPortrait.set(showPortraitCheckBox.isSelected())); + // showStatSheetModifierCheckBox.addActionListener( + // e -> + // AppPreferences.showStatSheetRequiresModifierKey.set( + // showStatSheetModifierCheckBox.isSelected())); + // forceFacingArrowCheckBox.addActionListener( + // e -> AppPreferences.forceFacingArrow.set(forceFacingArrowCheckBox.isSelected())); + // backgroundsStartFreeSizeCheckBox.addActionListener( + // e -> + // AppPreferences.backgroundsStartFreesize.set( + // backgroundsStartFreeSizeCheckBox.isSelected())); + // backgroundsStartSnapToGridCheckBox.addActionListener( + // e -> + // AppPreferences.backgroundsStartSnapToGrid.set( + // backgroundsStartSnapToGridCheckBox.isSelected())); + // defaultGridSizeTextField + // .getDocument() + // .addDocumentListener( + // new DocumentListenerProxy(defaultGridSizeTextField) { + // @Override + // protected void storeNumericValue(Integer value) { + // AppPreferences.defaultGridSize.set(value); + // } + // + // @Override + // protected Integer convertString(String value) throws ParseException { + // return StringUtil.parseInteger(value); + // } + // }); + // + // defaultUnitsPerCellTextField + // .getDocument() + // .addDocumentListener( + // new DocumentListenerProxy(defaultUnitsPerCellTextField) { + // @Override + // protected void storeNumericValue(Double value) { + // AppPreferences.defaultUnitsPerCell.set(value); + // } + // + // @Override + // protected Double convertString(String value) throws ParseException { + // return StringUtil.parseDecimal(value); + // } + // }); + // defaultVisionDistanceTextField + // .getDocument() + // .addDocumentListener( + // new DocumentListenerProxy(defaultVisionDistanceTextField) { + // @Override + // protected void storeNumericValue(Integer value) { + // AppPreferences.defaultVisionDistance.set(value); + // } + // + // @Override + // protected Integer convertString(String value) throws ParseException { + // return StringUtil.parseInteger(value); + // } + // }); + // statsheetPortraitSize + // .getDocument() + // .addDocumentListener( + // new DocumentListenerProxy(statsheetPortraitSize) { + // @Override + // protected void storeNumericValue(Integer value) { + // AppPreferences.portraitSize.set(value); + // } + // + // @Override + // protected Integer convertString(String value) throws ParseException { + // return StringUtil.parseInteger(value); + // } + // }); + // haloLineWidthSpinner.addChangeListener( + // ce -> AppPreferences.haloLineWidth.set((Integer) haloLineWidthSpinner.getValue())); + // + // // Overlay opacity options in AppPreferences, with + // // error checking to ensure values are within the acceptable range + // // of 0 and 255. + // haloOverlayOpacitySpinner.addChangeListener( + // new ChangeListenerProxy() { + // @Override + // protected void storeSpinnerValue(int value) { + // AppPreferences.haloOverlayOpacity.set(value); + // MapTool.getFrame().refresh(); + // } + // }); + // auraOverlayOpacitySpinner.addChangeListener( + // new ChangeListenerProxy() { + // @Override + // protected void storeSpinnerValue(int value) { + // AppPreferences.auraOverlayOpacity.set(value); + // MapTool.getFrame().refresh(); + // } + // }); + // lightOverlayOpacitySpinner.addChangeListener( + // new ChangeListenerProxy() { + // @Override + // protected void storeSpinnerValue(int value) { + // AppPreferences.lightOverlayOpacity.set(value); + // MapTool.getFrame().refresh(); + // } + // }); + // lumensOverlayOpacitySpinner.addChangeListener( + // new ChangeListenerProxy() { + // @Override + // protected void storeSpinnerValue(int value) { + // AppPreferences.lumensOverlayOpacity.set(value); + // MapTool.getFrame().refresh(); + // } + // }); + // lumensOverlayBorderThicknessSpinner.addChangeListener( + // new ChangeListenerProxy() { + // @Override + // protected void storeSpinnerValue(int value) { + // AppPreferences.lumensOverlayBorderThickness.set(value); + // MapTool.getFrame().refresh(); + // } + // }); + // lumensOverlayShowByDefaultCheckBox.addActionListener( + // e -> + // AppPreferences.lumensOverlayShowByDefault.set( + // lumensOverlayShowByDefaultCheckBox.isSelected())); + // lightsShowByDefaultCheckBox.addActionListener( + // e -> AppPreferences.lightsShowByDefault.set(lightsShowByDefaultCheckBox.isSelected())); + // fogOverlayOpacitySpinner.addChangeListener( + // new ChangeListenerProxy() { + // @Override + // protected void storeSpinnerValue(int value) { + // AppPreferences.fogOverlayOpacity.set(value); + // + // Zone zone = MapTool.getFrame().getCurrentZoneRenderer().getZone(); + // zone.setHasFog(zone.hasFog()); + // MapTool.getFrame().refresh(); + // } + // }); + // useHaloColorAsVisionOverlayCheckBox.addActionListener( + // e -> + // AppPreferences.useHaloColorOnVisionOverlay.set( + // useHaloColorAsVisionOverlayCheckBox.isSelected())); + // autoRevealVisionOnGMMoveCheckBox.addActionListener( + // e -> + // AppPreferences.autoRevealVisionOnGMMovement.set( + // autoRevealVisionOnGMMoveCheckBox.isSelected())); + // showSmiliesCheckBox.addActionListener( + // e -> AppPreferences.showSmilies.set(showSmiliesCheckBox.isSelected())); + // playSystemSoundCheckBox.addActionListener( + // e -> AppPreferences.playSystemSounds.set(playSystemSoundCheckBox.isSelected())); + // mapVisibilityWarning.addActionListener( + // e -> AppPreferences.mapVisibilityWarning.set(mapVisibilityWarning.isSelected())); + // + // playStreamsCheckBox.addActionListener( + // e -> { + // AppPreferences.playStreams.set(playStreamsCheckBox.isSelected()); + // if (!playStreamsCheckBox.isSelected()) { + // MediaPlayerAdapter.stopStream("*", true, 0); + // } + // }); + // + // playSystemSoundOnlyWhenNotFocusedCheckBox.addActionListener( + // e -> + // AppPreferences.playSystemSoundsOnlyWhenNotFocused.set( + // playSystemSoundOnlyWhenNotFocusedCheckBox.isSelected())); + // + // syrinscapeActiveCheckBox.addActionListener( + // e -> AppPreferences.syrinscapeActive.set(syrinscapeActiveCheckBox.isSelected())); + // + // fontSizeTextField + // .getDocument() + // .addDocumentListener( + // new DocumentListenerProxy(fontSizeTextField) { + // @Override + // protected void storeNumericValue(Integer value) { + // AppPreferences.fontSize.set(value); + // } + // + // @Override + // protected Integer convertString(String value) throws ParseException { + // return StringUtil.parseInteger(value); + // } + // }); + // + // npcTokenLabelBG.addActionListener( + // e -> { + // AppPreferences.npcMapLabelBackground.set(npcTokenLabelBG.getColor()); + // }); + // + // npcTokenLabelFG.addActionListener( + // e -> { + // AppPreferences.npcMapLabelForeground.set(npcTokenLabelFG.getColor()); + // }); + // + // pcTokenLabelBG.addActionListener( + // e -> { + // AppPreferences.pcMapLabelBackground.set(pcTokenLabelBG.getColor()); + // }); + // + // pcTokenLabelFG.addActionListener( + // e -> { + // AppPreferences.pcMapLabelForeground.set(pcTokenLabelFG.getColor()); + // }); + // + // nonVisTokenLabelBG.addActionListener( + // e -> { + // AppPreferences.nonVisibleTokenMapLabelBackground.set(nonVisTokenLabelBG.getColor()); + // }); + // + // nonVisTokenLabelFG.addActionListener( + // e -> { + // AppPreferences.nonVisibleTokenMapLabelForeground.set(nonVisTokenLabelFG.getColor()); + // }); + // + // labelFontSizeSpinner.addChangeListener( + // new ChangeListenerProxy() { + // @Override + // protected void storeSpinnerValue(int value) { + // AppPreferences.mapLabelFontSize.set(Math.max(value, 0)); + // } + // }); + // + // pcTokenLabelBorderColor.addActionListener( + // e -> { + // AppPreferences.pcMapLabelBorder.set(pcTokenLabelBorderColor.getColor()); + // }); + // + // npcTokenLabelBorderColor.addActionListener( + // e -> { + // AppPreferences.npcMapLabelBorder.set(npcTokenLabelBorderColor.getColor()); + // }); + // + // nonVisTokenLabelBorderColor.addActionListener( + // e -> { + // + // AppPreferences.nonVisibleTokenMapLabelBorder.set(nonVisTokenLabelBorderColor.getColor()); + // }); + // + // labelBorderWidthSpinner.addChangeListener( + // new ChangeListenerProxy() { + // @Override + // protected void storeSpinnerValue(int value) { + // AppPreferences.mapLabelBorderWidth.set(Math.max(value, 0)); + // } + // }); + // + // labelBorderArcSpinner.addChangeListener( + // new ChangeListenerProxy() { + // @Override + // protected void storeSpinnerValue(int value) { + // AppPreferences.mapLabelBorderArc.set(Math.max(value, 0)); + // } + // }); + // + // fitGMView.addActionListener(e -> AppPreferences.fitGmView.set(fitGMView.isSelected())); + // hideNPCs.addActionListener( + // e -> AppPreferences.initiativePanelHidesNPCs.set(hideNPCs.isSelected())); + // ownerPermissions.addActionListener( + // e -> + // AppPreferences.initiativePanelAllowsOwnerPermissions.set( + // ownerPermissions.isSelected())); + // lockMovement.addActionListener( + // e -> AppPreferences.initiativeMovementLocked.set(lockMovement.isSelected())); + // showInitGainMessage.addActionListener( + // e -> AppPreferences.showInitiativeGainedMessage.set(showInitGainMessage.isSelected())); + // upnpDiscoveryTimeoutTextField + // .getDocument() + // .addDocumentListener( + // new DocumentListenerProxy(upnpDiscoveryTimeoutTextField) { + // @Override + // protected void storeNumericValue(Integer value) { + // AppPreferences.upnpDiscoveryTimeout.set(value); + // } + // + // @Override + // protected Integer convertString(String value) throws ParseException { + // return StringUtil.parseInteger(value); + // } + // }); + // fileSyncPathButton.addActionListener( + // e -> { + // JFileChooser fileChooser = new JFileChooser(AppPreferences.fileSyncPath.get()); + // fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + // int returnVal = fileChooser.showOpenDialog(null); + // + // if (returnVal == JFileChooser.APPROVE_OPTION) { + // String selectedPath = fileChooser.getSelectedFile().getPath(); + // + // // Set the text field + // fileSyncPath.setText(selectedPath); + // fileSyncPath.setCaretPosition(0); + // + // // Save to preferences + // AppPreferences.fileSyncPath.set(selectedPath); + // } + // }); + // jvmXmxTextField.addFocusListener( + // new FocusAdapter() { + // @Override + // public void focusLost(FocusEvent e) { + // if (!e.isTemporary()) { + // String jvmXmx = jvmXmxTextField.getText().trim(); + // + // if (UserJvmOptions.verifyJvmOptions(jvmXmx)) { + // setJvmOption(JVM_OPTION.MAX_MEM, jvmXmx); + // } else { + // jvmXmxTextField.setText(JVM_OPTION.MAX_MEM.getDefaultValue()); + // setJvmOption(JVM_OPTION.MAX_MEM, JVM_OPTION.MAX_MEM.getDefaultValue()); + // log.warn("Invalid JVM Xmx parameter entered: " + jvmXmx); + // } + // jvmValuesChanged = true; + // } + // } + // }); + // jvmXmsTextField.addFocusListener( + // new FocusAdapter() { + // @Override + // public void focusLost(FocusEvent e) { + // if (!e.isTemporary()) { + // String jvmXms = jvmXmsTextField.getText().trim(); + // + // if (UserJvmOptions.verifyJvmOptions(jvmXms)) { + // setJvmOption(JVM_OPTION.MIN_MEM, jvmXms); + // } else { + // jvmXmsTextField.setText(JVM_OPTION.MIN_MEM.getDefaultValue()); + // setJvmOption(JVM_OPTION.MIN_MEM, JVM_OPTION.MIN_MEM.getDefaultValue()); + // log.warn("Invalid JVM Xms parameter entered: " + jvmXms); + // } + // jvmValuesChanged = true; + // } + // } + // }); + // jvmXssTextField.addFocusListener( + // new FocusAdapter() { + // @Override + // public void focusLost(FocusEvent e) { + // if (!e.isTemporary()) { + // String jvmXss = jvmXssTextField.getText().trim(); + // + // if (UserJvmOptions.verifyJvmOptions(jvmXss)) { + // setJvmOption(JVM_OPTION.STACK_SIZE, jvmXss); + // } else { + // jvmXssTextField.setText(JVM_OPTION.STACK_SIZE.getDefaultValue()); + // setJvmOption(JVM_OPTION.STACK_SIZE, JVM_OPTION.STACK_SIZE.getDefaultValue()); + // log.warn("Invalid JVM Xss parameter entered: " + jvmXss); + // } + // jvmValuesChanged = true; + // } + // } + // }); + // dataDirTextField.addFocusListener( + // new FocusAdapter() { + // @Override + // public void focusLost(FocusEvent e) { + // if (!e.isTemporary()) { + // setJvmOption(JVM_OPTION.DATA_DIR, dataDirTextField.getText().trim()); + // jvmValuesChanged = true; + // } + // } + // }); + // jvmDirect3dCheckbox.addActionListener( + // e -> { + // setJvmOption(JVM_OPTION.JAVA2D_D3D, jvmDirect3dCheckbox.isSelected()); + // jvmValuesChanged = true; + // }); + // jvmOpenGLCheckbox.addActionListener( + // e -> { + // setJvmOption(JVM_OPTION.JAVA2D_OPENGL_OPTION, jvmOpenGLCheckbox.isSelected()); + // jvmValuesChanged = true; + // }); + // jvmInitAwtCheckbox.addActionListener( + // e -> { + // setJvmOption(JVM_OPTION.MACOSX_EMBEDDED_OPTION, jvmInitAwtCheckbox.isSelected()); + // jvmValuesChanged = true; + // }); + // + // jamLanguageOverrideComboBox.addItemListener( + // e -> { + // setJvmOption( + // JVM_OPTION.LOCALE_LANGUAGE, + // Objects.requireNonNull(jamLanguageOverrideComboBox.getSelectedItem()).toString()); + // jvmValuesChanged = true; + // }); + // + // chatNotificationShowBackground.addActionListener( + // e -> + // AppPreferences.chatNotificationBackground.set( + // chatNotificationShowBackground.isSelected())); + // + // defaultGridTypeCombo.setModel( + // getLocalizedModel(defaultGridTypeComboItems, AppPreferences.defaultGridType.get())); + // defaultGridTypeCombo.addItemListener( + // e -> + // AppPreferences.defaultGridType.set( + // ((LocalizedComboItem) (defaultGridTypeCombo.getSelectedItem())).getValue())); + // + // duplicateTokenCombo.setModel( + // getLocalizedModel(duplicateTokenComboItems, AppPreferences.duplicateTokenNumber.get())); + // duplicateTokenCombo.addItemListener( + // e -> + // AppPreferences.duplicateTokenNumber.set( + // ((LocalizedComboItem) (duplicateTokenCombo.getSelectedItem())).getValue())); + // + // showNumberingCombo.setModel( + // getLocalizedModel(showNumberingComboItems, AppPreferences.tokenNumberDisplay.get())); + // showNumberingCombo.addItemListener( + // e -> + // AppPreferences.tokenNumberDisplay.set( + // ((LocalizedComboItem) showNumberingCombo.getSelectedItem()).getValue())); + // + // tokenNamingCombo.setModel( + // getLocalizedModel(tokenNamingComboItems, AppPreferences.newTokenNaming.get())); + // tokenNamingCombo.addItemListener( + // e -> + // AppPreferences.newTokenNaming.set( + // ((LocalizedComboItem) (tokenNamingCombo.getSelectedItem())).getValue())); + // + // movementMetricCombo.setModel(new DefaultComboBoxModel<>(movementMetricComboItems)); + // movementMetricCombo.setSelectedItem(AppPreferences.movementMetric.get()); + // movementMetricCombo.addItemListener( + // e -> + // AppPreferences.movementMetric.set( + // (WalkerMetric) movementMetricCombo.getSelectedItem())); + // + // visionTypeCombo.setModel(new DefaultComboBoxModel<>(Zone.VisionType.values())); + // visionTypeCombo.setSelectedItem(AppPreferences.defaultVisionType.get()); + // visionTypeCombo.addItemListener( + // e -> + // AppPreferences.defaultVisionType.set( + // (Zone.VisionType) visionTypeCombo.getSelectedItem())); + // + // mapSortType.setModel(new DefaultComboBoxModel<>(MapToolConstants.MapSortType.values())); + // mapSortType.setSelectedItem(AppPreferences.mapSortType.get()); + // mapSortType.addItemListener( + // e -> + // AppPreferences.mapSortType.set( + // (MapToolConstants.MapSortType) mapSortType.getSelectedItem())); + // + // uvttLosImportType.setModel( + // new DefaultComboBoxModel<>(MapToolConstants.UvttLosImportType.values())); + // uvttLosImportType.setSelectedItem(AppPreferences.uvttLosImportType.get()); + // uvttLosImportType.addItemListener( + // e -> + // AppPreferences.uvttLosImportType.set( + // (UvttLosImportType) uvttLosImportType.getSelectedItem())); + // + // macroEditorThemeCombo.setModel(new DefaultComboBoxModel<>()); + // try (Stream paths = Files.list(AppConstants.THEMES_DIR.toPath())) { + // paths + // .filter(Files::isRegularFile) + // .filter(p -> p.toString().toLowerCase().endsWith(".xml")) + // .forEach( + // p -> + // macroEditorThemeCombo.addItem( + // FilenameUtils.removeExtension(p.getFileName().toString()))); + // macroEditorThemeCombo.setSelectedItem(AppPreferences.defaultMacroEditorTheme.get()); + // } catch (IOException ioe) { + // log.warn("Unable to list macro editor themes.", ioe); + // macroEditorThemeCombo.addItem("Default"); + // } + // macroEditorThemeCombo.addItemListener( + // e -> + // AppPreferences.defaultMacroEditorTheme.set( + // (String) macroEditorThemeCombo.getSelectedItem())); + // + // iconThemeCombo.setModel(new DefaultComboBoxModel<>()); + // iconThemeCombo.addItem(RessourceManager.CLASSIC); + // iconThemeCombo.addItem(RessourceManager.ROD_TAKEHARA); + // iconThemeCombo.setSelectedItem(AppPreferences.iconTheme.get()); + // iconThemeCombo.addItemListener( + // e -> AppPreferences.iconTheme.set((String) iconThemeCombo.getSelectedItem())); + // + // themeFilterCombo.setModel(getLocalizedModel(themeFilterComboItems, "All")); + // themeFilterCombo.addItemListener( + // e -> { + // String filter = ((LocalizedComboItem) themeFilterCombo.getSelectedItem()).getValue(); + // switch (filter) { + // case "All": + // themeList.setModel(allThemesListModel); + // break; + // case "Dark": + // themeList.setModel(darkThemesListModel); + // break; + // case "Light": + // themeList.setModel(lightThemesListModel); + // break; + // } + // }); + // + // copyPublicKey.addActionListener( + // e -> { + // Toolkit.getDefaultToolkit() + // .getSystemClipboard() + // .setContents(new StringSelection(publicKeyTextArea.getText()), null); + // }); + // + // regeneratePublicKey.addActionListener( + // e -> { + // CompletableFuture keys = new PublicPrivateKeyStore().regenerateKeys(); + // + // keys.thenAccept( + // cu -> { + // SwingUtilities.invokeLater( + // () -> { + // publicKeyTextArea.setText(cu.getEncodedPublicKeyText()); + // }); + // }); + // }); + // + // add(panel); + // pack(); + // } + // + // @Override + // public void setVisible(boolean b) { + // if (b) { + // SwingUtil.centerOver(this, MapTool.getFrame()); + // themeChanged = false; + // } + // super.setVisible(b); + // } + // + // /** + // * Initializes and sets the initial state of various user preferences in the application. This + // * method is called during the initialization process. + // */ + // private void setInitialState() { + // showDialogOnNewToken.setSelected(AppPreferences.showDialogOnNewToken.get()); + // saveReminderCheckBox.setSelected(AppPreferences.saveReminder.get()); + // fillSelectionCheckBox.setSelected(AppPreferences.fillSelectionBox.get()); + // frameRateCapTextField.setText(Integer.toString(AppPreferences.frameRateCap.get())); + // defaultUsername.setText(AppPreferences.defaultUserName.get()); + // autoSaveSpinner.setValue(AppPreferences.autoSaveIncrement.get()); + // loadMRUcheckbox.setSelected(AppPreferences.loadMruCampaignAtStart.get()); + // newMapsHaveFOWCheckBox.setSelected(AppPreferences.newMapsHaveFow.get()); + // + // tokensPopupWarningWhenDeletedCheckBox.setSelected(AppPreferences.tokensWarnWhenDeleted.get()); + // tokensStartSnapToGridCheckBox.setSelected(AppPreferences.tokensStartSnapToGrid.get()); + // tokensSnapWhileDraggingCheckBox.setSelected(AppPreferences.tokensSnapWhileDragging.get()); + // hideMousePointerWhileDraggingCheckBox.setSelected( + // AppPreferences.hideMousePointerWhileDragging.get()); + // hideTokenStackIndicatorCheckBox.setSelected(AppPreferences.hideTokenStackIndicator.get()); + // newMapsVisibleCheckBox.setSelected(AppPreferences.newMapsVisible.get()); + // newTokensVisibleCheckBox.setSelected(AppPreferences.newTokensVisible.get()); + // stampsStartFreeSizeCheckBox.setSelected(AppPreferences.objectsStartFreesize.get()); + // tokensStartFreeSizeCheckBox.setSelected(AppPreferences.tokensStartFreesize.get()); + // stampsStartSnapToGridCheckBox.setSelected(AppPreferences.objectsStartSnapToGrid.get()); + // backgroundsStartFreeSizeCheckBox.setSelected(AppPreferences.backgroundsStartFreesize.get()); + // showStatSheetCheckBox.setSelected(AppPreferences.showStatSheet.get()); + // showPortraitCheckBox.setSelected(AppPreferences.showPortrait.get()); + // showStatSheetModifierCheckBox.setSelected( + // AppPreferences.showStatSheetRequiresModifierKey.get()); + // forceFacingArrowCheckBox.setSelected(AppPreferences.forceFacingArrow.get()); + // + // backgroundsStartSnapToGridCheckBox.setSelected(AppPreferences.backgroundsStartSnapToGrid.get()); + // defaultGridSizeTextField.setText(Integer.toString(AppPreferences.defaultGridSize.get())); + // // Localizes units per cell, using the proper separator. Fixes #507. + // defaultUnitsPerCellTextField.setText( + // StringUtil.formatDecimal(AppPreferences.defaultUnitsPerCell.get(), 1)); + // defaultVisionDistanceTextField.setText( + // Integer.toString(AppPreferences.defaultVisionDistance.get())); + // statsheetPortraitSize.setText(Integer.toString(AppPreferences.portraitSize.get())); + // fontSizeTextField.setText(Integer.toString(AppPreferences.fontSize.get())); + // haloLineWidthSpinner.setValue(AppPreferences.haloLineWidth.get()); + // mapVisibilityWarning.setSelected(AppPreferences.mapVisibilityWarning.get()); + // + // haloOverlayOpacitySpinner.setModel( + // new SpinnerNumberModel(AppPreferences.haloOverlayOpacity.get().intValue(), 0, 255, 1)); + // auraOverlayOpacitySpinner.setModel( + // new SpinnerNumberModel(AppPreferences.auraOverlayOpacity.get().intValue(), 0, 255, 1)); + // lightOverlayOpacitySpinner.setModel( + // new SpinnerNumberModel(AppPreferences.lightOverlayOpacity.get().intValue(), 0, 255, 1)); + // lumensOverlayOpacitySpinner.setModel( + // new SpinnerNumberModel(AppPreferences.lumensOverlayOpacity.get().intValue(), 0, 255, + // 1)); + // lumensOverlayBorderThicknessSpinner.setModel( + // new SpinnerNumberModel( + // AppPreferences.lumensOverlayBorderThickness.get().intValue(), 0, Integer.MAX_VALUE, + // 1)); + // + // lumensOverlayShowByDefaultCheckBox.setSelected(AppPreferences.lumensOverlayShowByDefault.get()); + // lightsShowByDefaultCheckBox.setSelected(AppPreferences.lightsShowByDefault.get()); + // fogOverlayOpacitySpinner.setModel( + // new SpinnerNumberModel(AppPreferences.fogOverlayOpacity.get().intValue(), 0, 255, 1)); + // + // useHaloColorAsVisionOverlayCheckBox.setSelected( + // AppPreferences.useHaloColorOnVisionOverlay.get()); + // + // autoRevealVisionOnGMMoveCheckBox.setSelected(AppPreferences.autoRevealVisionOnGMMovement.get()); + // showSmiliesCheckBox.setSelected(AppPreferences.showSmilies.get()); + // playSystemSoundCheckBox.setSelected(AppPreferences.playSystemSounds.get()); + // playStreamsCheckBox.setSelected(AppPreferences.playStreams.get()); + // playSystemSoundOnlyWhenNotFocusedCheckBox.setSelected( + // AppPreferences.playSystemSoundsOnlyWhenNotFocused.get()); + // syrinscapeActiveCheckBox.setSelected(AppPreferences.syrinscapeActive.get()); + // showAvatarInChat.setSelected(AppPreferences.showAvatarInChat.get()); + // allowPlayerMacroEditsDefault.setSelected(AppPreferences.allowPlayerMacroEditsDefault.get()); + // openEditorForNewMacros.setSelected(AppPreferences.openEditorForNewMacro.get()); + // toolTipInlineRolls.setSelected(AppPreferences.useToolTipForInlineRoll.get()); + // suppressToolTipsMacroLinks.setSelected(AppPreferences.suppressToolTipsForMacroLinks.get()); + // trustedOutputForeground.setColor(AppPreferences.trustedPrefixForeground.get()); + // trustedOutputBackground.setColor(AppPreferences.trustedPrefixBackground.get()); + // toolTipInitialDelay.setText(Integer.toString(AppPreferences.toolTipInitialDelay.get())); + // toolTipDismissDelay.setText(Integer.toString(AppPreferences.toolTipDismissDelay.get())); + // facingFaceEdges.setSelected(AppPreferences.faceEdge.get()); + // facingFaceVertices.setSelected(AppPreferences.faceVertex.get()); + // + // chatAutosaveTime.setModel( + // new SpinnerNumberModel( + // AppPreferences.chatAutoSaveTimeInMinutes.get().intValue(), 0, 24 * 60, 1)); + // chatFilenameFormat.setText(AppPreferences.chatFilenameFormat.get()); + // + // fitGMView.setSelected(AppPreferences.fitGmView.get()); + // hideNPCs.setSelected(AppPreferences.initiativePanelHidesNPCs.get()); + // ownerPermissions.setSelected(AppPreferences.initiativePanelAllowsOwnerPermissions.get()); + // lockMovement.setSelected(AppPreferences.initiativeMovementLocked.get()); + // showInitGainMessage.setSelected(AppPreferences.showInitiativeGainedMessage.get()); + // upnpDiscoveryTimeoutTextField.setText( + // Integer.toString(AppPreferences.upnpDiscoveryTimeout.get())); + // allowExternalMacroAccessCheckBox.setSelected(AppPreferences.allowExternalMacroAccess.get()); + // fileSyncPath.setText(AppPreferences.fileSyncPath.get()); + // + // // get JVM User Defaults/User override preferences + // if (!UserJvmOptions.loadAppCfg()) { + // tabbedPane.setEnabledAt(tabbedPane.indexOfTab(I18N.getString("Label.startup")), false); + // } else { + // try { + // + // jvmXmxTextField.setText(UserJvmOptions.getJvmOption(JVM_OPTION.MAX_MEM)); + // jvmXmsTextField.setText(UserJvmOptions.getJvmOption(JVM_OPTION.MIN_MEM)); + // jvmXssTextField.setText(UserJvmOptions.getJvmOption(JVM_OPTION.STACK_SIZE)); + // dataDirTextField.setText(UserJvmOptions.getJvmOption(JVM_OPTION.DATA_DIR)); + // + // jvmDirect3dCheckbox.setSelected(UserJvmOptions.hasJvmOption(JVM_OPTION.JAVA2D_D3D)); + // + // jvmOpenGLCheckbox.setSelected(UserJvmOptions.hasJvmOption(JVM_OPTION.JAVA2D_OPENGL_OPTION)); + // jvmInitAwtCheckbox.setSelected( + // UserJvmOptions.hasJvmOption(JVM_OPTION.MACOSX_EMBEDDED_OPTION)); + // + // jamLanguageOverrideComboBox.setSelectedItem( + // UserJvmOptions.getJvmOption(JVM_OPTION.LOCALE_LANGUAGE)); + // } catch (Exception e) { + // log.error("Unable to retrieve JVM user options!", e); + // } + // } + // + // Integer rawVal = AppPreferences.typingNotificationDurationInSeconds.get(); + // Integer typingVal = null; + // if (rawVal != null + // && rawVal > 99) { // backward compatibility -- used to be stored in ms, now in seconds + // double dbl = rawVal / 1000; + // if (dbl >= 1) { + // long fixedUp = Math.round(dbl); + // typingVal = (int) fixedUp; + // typingVal = typingVal > 99 ? 99 : typingVal; + // } else { + // typingVal = 1; + // } + // } + // int value = Math.abs((typingVal == null || typingVal > rawVal) ? rawVal : typingVal); + // AppPreferences.typingNotificationDurationInSeconds.set(value); + // + // SpinnerNumberModel typingDurationModel = + // new SpinnerNumberModel( + // (int) AppPreferences.typingNotificationDurationInSeconds.get(), 0, 99, 1); + // typingNotificationDuration.setModel(typingDurationModel); + // + // chatNotificationColor.setColor(AppPreferences.chatNotificationColor.get()); + // chatNotificationShowBackground.setSelected(AppPreferences.chatNotificationBackground.get()); + // + // CompletableFuture keys = new PublicPrivateKeyStore().getKeys(); + // + // keys.thenAccept( + // cu -> { + // SwingUtilities.invokeLater( + // () -> { + // publicKeyTextArea.setText(cu.getEncodedPublicKeyText()); + // }); + // }); + // + // themeList.setModel(allThemesListModel); + // themeList.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION); + // themeList.setSelectedValue(ThemeSupport.getThemeName(), true); + // SwingUtilities.invokeLater( + // () -> { + // themeImageLabel.setIcon(ThemeSupport.getExampleImageIcon(themeImageLabel.getSize())); + // }); + // themeList.addListSelectionListener( + // e -> { + // if (!e.getValueIsAdjusting()) { + // String theme = themeList.getSelectedValue(); + // ThemeSupport.setTheme(theme); + // themeImageLabel.setIcon( + // ThemeSupport.getExampleImageIcon(theme, themeImageLabel.getSize())); + // } + // }); + // themeNameLabel.setText(ThemeSupport.getThemeName()); + // useThemeForChat.setSelected(ThemeSupport.shouldUseThemeColorsForChat()); + // useThemeForChat.addActionListener( + // l -> { + // ThemeSupport.setUseThemeColorsForChat(useThemeForChat.isSelected()); + // }); + // } + // + // /** Utility method to create and set the selected item for LocalizedComboItem combo box + // models. */ + // private ComboBoxModel getLocalizedModel( + // LocalizedComboItem[] items, String currPref) { + // DefaultComboBoxModel model = new DefaultComboBoxModel<>(items); + // model.setSelectedItem( + // Stream.of(items).filter(i -> + // i.getValue().equals(currPref)).findFirst().orElse(items[0])); + // return model; + // } + // + // private static class DeveloperToggleModel extends DefaultButtonModel { + // private final Preference option; + // + // public DeveloperToggleModel(Preference option) { + // this.option = option; + // } + // + // @Override + // public boolean isSelected() { + // return option.get(); + // } + // + // @Override + // public void setSelected(boolean b) { + // option.set(b); + // super.setSelected(b); + // } + // } + // + // /** + // * Private abstract static class representing a proxy implementation of the DocumentListener + // * interface. This class is used to handle document changes in a JTextField and update a + // numeric + // * value based on the entered text. + // * + // * @param The type of numeric value to handle. + // */ + // private abstract static class DocumentListenerProxy implements DocumentListener { + // + // /** + // * This variable represents a JTextField component to listen for chqnges on. + // * + // * @see JTextField + // */ + // JTextField comp; + // + // /** + // * A proxy implementation of the DocumentListener interface. This class is used to handle + // * document changes in a JTextField and update a numeric value based on the entered text. + // */ + // public DocumentListenerProxy(JTextField tf) { + // comp = tf; + // } + // + // @Override + // public void changedUpdate(DocumentEvent e) { + // updateValue(); + // } + // + // @Override + // public void insertUpdate(DocumentEvent e) { + // updateValue(); + // } + // + // @Override + // public void removeUpdate(DocumentEvent e) { + // updateValue(); + // } + // + // /** + // * This method is used to update a numeric value based on the text entered in a JTextField + // * component. It calls the convertString() method to parse the text and convert it into the + // * appropriate numeric value. The parsed value is then passed to the storeNumericValue() + // method + // * to update the numeric value. If the text cannot be parsed, a ParseException is caught and + // * ignored. + // */ + // protected void updateValue() { + // try { + // storeNumericValue(convertString(comp.getText())); // Localized + // } catch (ParseException nfe) { + // // Ignore it + // } + // } + // + // /** + // * Converts a string value to a specific type. + // * + // * @param value the string value to convert + // * @return the converted value + // * @throws ParseException if the string value cannot be converted + // */ + // protected abstract T convertString(String value) throws ParseException; + // + // /** + // * This method is used to store a numeric value. + // * + // * @param value the numeric value to store + // */ + // protected abstract void storeNumericValue(T value); + // } + // + // /** + // * @author frank + // */ + // private abstract static class ChangeListenerProxy implements ChangeListener { + // + // @Override + // public void stateChanged(ChangeEvent ce) { + // JSpinner sp = (JSpinner) ce.getSource(); + // int value = (Integer) sp.getValue(); + // storeSpinnerValue(value); + // } + // + // /** + // * This method is used to store the value of a spinner. It is called when the state of the + // * spinner changes. + // * + // * @param value the new value of the spinner + // */ + // protected abstract void storeSpinnerValue(int value); + // } + // + // /** + // * Stores the localized display name and preference value String for menu items that don't + // have a + // * corresponding enum. + // */ + // private static class LocalizedComboItem { + // /** Represents the localized display name of a menu item or combo box option. */ + // private final String displayName; + // + // /** + // * This variable represents a preference value. It stores a string that is used as a + // preference + // * value for menu items or combo box options. + // */ + // private final String prefValue; + // + // /** + // * Creates a localized combo box item. + // * + // * @param prefValue the preference key to store. + // * @param i18nKey the i18n key to use for the display name. + // */ + // LocalizedComboItem(String prefValue, String i18nKey) { + // this.prefValue = prefValue; + // displayName = I18N.getText(i18nKey); + // } + // + // /** + // * Creates a localized combo box item. + // * + // * @param prefValue the preference key to store. + // * @param i18nKey the i18n key to use for the display name. + // * @param args the arguments to use for the i18n key. + // */ + // LocalizedComboItem(String prefValue, String i18nKey, Object... args) { + // this.prefValue = prefValue; + // displayName = I18N.getText(i18nKey, args); + // } + // + // /** + // * Returns the preference key value for this item. + // * + // * @return the preference key value for this item. + // */ + // public String getValue() { + // return prefValue; + // } + // + // /** + // * Returns the localized display name of the menu item or combo box option. + // * + // * @return the localized display name + // */ + // public String toString() { + // return displayName; + // } + // } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesEditorDialog.form b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesEditorDialog.form new file mode 100644 index 0000000000..2fd5adb7c2 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesEditorDialog.form @@ -0,0 +1,3002 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesEditorDialog.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesEditorDialog.java new file mode 100644 index 0000000000..06b5b3d145 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesEditorDialog.java @@ -0,0 +1,25 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import javax.swing.*; + +public class PreferencesEditorDialog { + private JPanel main; + + public JComponent getRootComponent() { + return main; + } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesTable.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesTable.java new file mode 100644 index 0000000000..c09b3e69a0 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesTable.java @@ -0,0 +1,430 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import com.formdev.flatlaf.FlatLaf; +import com.jidesoft.grid.*; +import com.jidesoft.swing.JideScrollPane; +import com.jidesoft.swing.Resizable; +import com.jidesoft.utils.PortingUtils; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.event.ListSelectionEvent; +import javax.swing.table.*; +import net.rptools.maptool.client.MapTool; +import net.rptools.maptool.client.swing.searchable.SearchableEx; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class PreferencesTable extends CategorizedTable { + private static final Logger log = LogManager.getLogger(PreferencesTable.class); + private final StringProperty filterText = new SimpleStringProperty(""); + private final JideScrollPane tableScrollPane; + private int minimumWidth = -1; + private static final PreferencesTableModel PREFERENCES_TABLE_MODEL = new PreferencesTableModel(); + private static SearchableEx searchableEx; + private static final DefaultGroupTableModel DEFAULT_GROUP_TABLE_MODEL = + new DefaultGroupTableModel(PREFERENCES_TABLE_MODEL); + + private final TableRowSorter SORTER = getTableRowSorter(); + + protected SearchableEx getSearchableEx() { + return searchableEx; + } + + PreferencesTable(JideScrollPane tableScrollPane) { + super(DEFAULT_GROUP_TABLE_MODEL); + searchableEx = SearchableEx.getSearchable(this); + setUseTableRendererForCategoryRow(false); + this.tableScrollPane = tableScrollPane; + initScrollPane(); + + this.filterText.addListener(observable -> newRowFilter()); + + CellRendererManager.registerRenderer( + PreferencesTableModel.PrefComponentPane.class, new ComponentCellRenderer()); + CellEditorManager.registerEditor( + PreferencesTableModel.PrefComponentPane.class, + (CellEditorFactory) new ComponentCellEditor()); + + DEFAULT_GROUP_TABLE_MODEL.setDisplayGroupColumns(false); + DEFAULT_GROUP_TABLE_MODEL.setRemoveNullGrouper(false); + DEFAULT_GROUP_TABLE_MODEL.addGroupColumn(0); + DEFAULT_GROUP_TABLE_MODEL.addGroupColumn(1); + this.removeColumn(columnModel.getColumn(3)); + this.removeColumn(columnModel.getColumn(2)); + + this.setColumnResizable(true); + this.setAutoResizeMode(AUTO_RESIZE_FILL); + this.setRowResizable(true); + this.setRowAutoResizes(true); + this.setFillsViewportHeight(true); + + this.setShowVerticalLines(false); + this.setNestedTableHeader(true); + + this.setRowSelectionAllowed(true); + this.setRowAutoResizes(true); + + this.setAutoCreateColumnsFromModel(true); + + // setTableStyleProvider(new StyleProvider()); + // setShowTreeLines(true); + // setShowLeafNodeTreeLines(true); + // setExpandAllAllowed(true); + // + + // prettify(); + DEFAULT_GROUP_TABLE_MODEL.groupAndRefresh(); + } + + protected TableRowSorter getTableRowSorter() { + return SORTER; + } + + protected void newRowFilter() { + RowFilter rf = null; + // If current expression doesn't parse, don't update. + try { + rf = RowFilter.regexFilter(filterText.get(), 0); + } catch (java.util.regex.PatternSyntaxException e) { + return; + } + SORTER.setRowFilter(rf); + DEFAULT_GROUP_TABLE_MODEL.refresh(); + } + + private void initScrollPane() { + tableScrollPane.setViewportView(this); + tableScrollPane.setKeepCornerVisible(true); + tableScrollPane.setColumnHeaderView(tableHeader); + setPreferredSize(new Dimension(getMinimumWidth(), getPreferredSize().height)); + + Resizable.ResizeCorner cornerLR = new Resizable.ResizeCorner(Resizable.LOWER_RIGHT); + Resizable.ResizeCorner cornerLL = new Resizable.ResizeCorner(Resizable.LOWER_LEFT); + tableScrollPane.setCorner(ScrollPaneConstants.LOWER_TRAILING_CORNER, cornerLR); + tableScrollPane.setCorner(ScrollPaneConstants.LOWER_LEADING_CORNER, cornerLL); + Resizable _resizable = + new Resizable(getTableScrollPane()) { + public void resizing(int resizeDir, int newX, int newY, int newW, int newH) { + PortingUtils.setPreferredSize(getTableScrollPane(), new Dimension(newW, newH)); + PreferencesTable.this.setBounds(newX, newY, newW, newH); + } + }; + _resizable.setResizeCornerSize(18); + _resizable.setResizableCorners(Resizable.LOWER_LEFT | Resizable.LOWER_RIGHT); + } + + public void setFilterText(String filterText) { + this.filterText.set(filterText); + } + + public void finalizeCellEditing() { + if (this.isEditing()) { + this.getCellEditor().stopCellEditing(); + } + } + + public JScrollPane getTableScrollPane() { + Component parent = this.getParent(); + while (!(parent instanceof JScrollPane)) { + parent = parent.getParent(); + } + return (JScrollPane) parent; + } + + public void valueChanged(ListSelectionEvent e) { + ListSelectionModel lsm = (ListSelectionModel) e.getSource(); + int visibleRowIndex = this.getSelectedRow(); // Get the index of the selected row + // Convert from the selection index based on the visible items to the + // internal index for all elements. + int internalRowIndex = convertRowIndexToModel(visibleRowIndex); + } + + /** + * Returns an appropriate renderer for the cell specified by this row and column. If the + * TableColumn for this column has a non-null renderer, returns that. If not, finds the + * class of the data in this column (using getColumnClass) and returns the default + * renderer for this type of data. + * + *

Note: Throughout the table package, the internal implementations always use this + * method to provide renderers so that this default behavior can be safely overridden by a + * subclass. + * + * @param row the row of the cell to render, where 0 is the first row + * @param column the column of the cell to render, where 0 is the first column + * @return the assigned renderer; if null returns the default renderer for this type + * of object + * @see DefaultTableCellRenderer + * @see TableColumn#setCellRenderer + * @see #setDefaultRenderer + */ + @Override + public TableCellRenderer getCellRenderer(int row, int column) { + return super.getCellRenderer(row, column); + } + + @Override + public Dimension getMinimumSize() { + Dimension superMin = super.getMinimumSize(); + return new Dimension( + getMinimumWidth() + tableScrollPane.getVerticalScrollBar().getPreferredSize().width, + superMin.height); + } + + private int getMinimumWidth() { + if (minimumWidth == -1) { + minimumWidth = getColumnWidths().stream().reduce(0, Integer::sum); + } + return minimumWidth; + } + + private final List columnWidths = new ArrayList<>(); + + private List getColumnWidths() { + if (!columnWidths.isEmpty()) { + return columnWidths; + } + Font font = this.getFont(); + FontMetrics fm = getFontMetrics(font); + // string widths + int width = 0; + for (Classify.Section section : Classify.Section.values()) { + width = Math.max(width, fm.stringWidth(section.toString())); + } + columnWidths.add(width + this.getRowMargin()); + width = 0; + for (Classify.Group group : Classify.Group.values()) { + width = Math.max(width, fm.stringWidth(group.toString())); + } + columnWidths.add(width + this.getRowMargin()); + width = 0; + int width1 = 0; + // DefaultGroupRow + for (int i = 0; i < PREFERENCES_TABLE_MODEL.getRowCount(); i++) { + width = + Math.max( + width, fm.stringWidth(((JLabel) PREFERENCES_TABLE_MODEL.getValueAt(i, 2)).getText())); + width1 = + Math.max( + width1, + ((JComponent) PREFERENCES_TABLE_MODEL.getValueAt(i, 3)).getPreferredSize().width); + } + columnWidths.add(width + this.getRowMargin()); + columnWidths.add(width1); + return columnWidths; + } + + @Override + public FontMetrics getFontMetrics(Font font) { + if (font == null) { + font = Font.decode(FlatLaf.getPreferredFontFamily()); + } + if (this.isVisible()) { + return super.getFontMetrics(font); + } else { + return MapTool.getFrame() + .getGraphicsConfiguration() + .getDevice() + .getDefaultConfiguration() + .createCompatibleVolatileImage(1, 1) + .getGraphics() + .getFontMetrics(font); + } + } + + public void prettify() { + final List headerSizes = getColumnWidths(); + + // for (int i = 0; i < getColumnCount(); i++) { + // getColumnModel().getColumn(i).setHeaderValue(getModel().getColumnName(i)); + // getColumnModel().getColumn(i).setMinWidth(headerSizes.get(i)); + // getColumnModel().getColumn(i).setMaxWidth(headerSizes.get(i) / 2 * 3); + // getColumnModel().getColumn(i).setPreferredWidth(headerSizes.get(i) + 12); + // } + /* fix text areas to look like labels + * dig down to the appropriate container level + * then set the backgrounds to transparent + */ + // JPanel jPanel = (JPanel) this.getParent(); + // List jPanels = + // Arrays.stream(jPanel.getComponents()).filter(c -> c instanceof + // JPanel).toList(); + // + // final Color CLEAR = new Color(1f,1f,1f, 1); + // for (Component panel : jPanels) { + // JPanel jp = (JPanel) panel; + // Component[] components = jp.getComponents(); + // Arrays.stream(components).toList().forEach(c -> c.setBackground(CLEAR)); + // } + + /* prettify - take cell background colour and adjust the luminance for cell contrast. + change the hue and saturation for the grid line colour + */ + Color bg, bgSmall, gridColour; + bg = this.getTableHeader().getComponent(0).getBackground(); // get background colour + float[] hsbComponents = new float[3]; + Color.RGBtoHSB(bg.getRed(), bg.getGreen(), bg.getBlue(), hsbComponents); // convert to HSB + + boolean lighten = hsbComponents[2] < 0.5f; // to determine direction of change + hsbComponents[2] = + lighten + ? hsbComponents[2] + 0.015f + : hsbComponents[2] - 0.025f; // small change in brilliance + bgSmall = new Color(Color.HSBtoRGB(hsbComponents[0], hsbComponents[1], hsbComponents[2])); + + hsbComponents[2] = + lighten + ? hsbComponents[2] + 0.04f + : hsbComponents[2] - 0.02f; // bigger change in brilliance + bg = new Color(Color.HSBtoRGB(hsbComponents[0], hsbComponents[1], hsbComponents[2])); + + hsbComponents[0] = + hsbComponents[0] < 0.5 + ? hsbComponents[0] + 0.5f + : hsbComponents[0] - 0.5f; // change hue 180 degrees + hsbComponents[1] = + hsbComponents[1] < 0.25 + ? hsbComponents[1] + 0.25f // increase saturation if it is low + : hsbComponents[1]; + gridColour = new Color(Color.HSBtoRGB(hsbComponents[0], hsbComponents[1], hsbComponents[2])); + + DefaultTableCellRenderer cellRenderer = + new DefaultTableCellRenderer(); // cell renderer for contrasting cells + cellRenderer.setBackground(bgSmall); + cellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.LEFT); + + // cell renderer for contrasting headings + Color finalBg = bg; + Function headerRenderer = + column -> { + DefaultTableCellRenderer hr = new DefaultTableCellRenderer(); + if ((column & 1) == 1) { + hr.setBackground(finalBg); + } + hr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); + hr.setVerticalAlignment( + column == 1 || column == 4 ? SwingConstants.TOP : SwingConstants.CENTER); + // hr.setToolTipText( + // ((PreferencesTableModel) + // jTable.getModel()).getColumnTooltipText(column)); + return hr; + }; + + this.setGridColor(gridColour); + this.setIntercellSpacing(new Dimension(2, 2)); + this.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + this.setShowHorizontalLines(true); + this.setFillsViewportHeight(true); + + for (int i = 0; i < this.getColumnCount(); i++) { + this.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer.apply(i)); + switch (i) { // set column shading + case 1, 3 -> this.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); + } + } + doLayout(); + } + + @Override + public void setVisible(boolean visible) { + super.setVisible(visible); + // this.prettify(); + } + + private static final Border margin = BorderFactory.createEmptyBorder(1, 2, 1, 2); + + private static class EditorRenderer extends AbstractTableCellEditorRenderer { + @Override + public Component createTableCellEditorRendererComponent(JTable table, int row, int column) { + JPanel panel = new JPanel(new BorderLayout()); + panel.setBorder(margin); + return panel; + } + + @Override + public void configureTableCellEditorRendererComponent( + JTable table, + Component editorRendererComponent, + boolean forRenderer, + Object value, + boolean isSelected, + boolean hasFocus, + int row, + int column) { + if (table.getColumnClass(column).equals(PreferencesTableModel.PrefComponentPane.class)) { + ((JPanel) editorRendererComponent).add((JComponent) value, BorderLayout.CENTER); + } + } + + /** + * Returns the value contained in the editor. + * + * @return the value contained in the editor + */ + @Override + public Object getCellEditorValue() { + return null; + } + } + + private static class ComponentCellEditor extends AbstractCellEditor + implements CellEditorFactory, TableCellEditor { + public ComponentCellEditor() {} + + public Component getTableCellEditorComponent( + JTable table, Object value, boolean isSelected, int row, int column) { + if (value instanceof JComponent jComponent) { + JPanel panel = new JPanel(new BorderLayout()); + panel.setBorder(margin); + panel.add(jComponent, BorderLayout.CENTER); + return panel; + } else { + return new DefaultTableCellRenderer(); + } + } + + @Override + public Object getCellEditorValue() { + return null; + } + + @Override + public CellEditor create() { + return new ComponentCellEditor(); + } + } + + private static class ComponentCellRenderer implements TableCellRenderer { + ComponentCellRenderer() {} + + @Override + public Component getTableCellRendererComponent( + JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + JPanel panel = new JPanel(new BorderLayout()); + panel.setBorder(margin); + if (value instanceof JComponent jComponent) { + panel.add(jComponent, BorderLayout.CENTER); + } + return panel; + } + } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesTableModel.java b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesTableModel.java new file mode 100644 index 0000000000..18ae075586 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/preferencesdialog/PreferencesTableModel.java @@ -0,0 +1,127 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.preferencesdialog; + +import java.awt.*; +import javax.swing.*; +import javax.swing.table.AbstractTableModel; + +/** Table model for the token properties type table. */ +public class PreferencesTableModel extends AbstractTableModel { + protected record PrefComponentPane(JComponent component) {} + + /** + * Copy of the token type map from the campaign properties. This is used to populate the table. We + * create an empty map to begin with so that we don't get a null pointer exception when the table + * is first displayed. + */ + private final Object[][] tableData; + + private final String[] columnNames = { + "section", "group", "label", "control", "searchWords", "collated" + }; + private final Class[] columnClasses = { + Classify.Section.class, + Classify.Group.class, + PrefComponentPane.class, + PrefComponentPane.class, + String.class, + Classify.Collated.class + }; + private final int rowCount; + private final int columnCount; + + protected PreferencesTableModel() { + super(); + + tableData = getTableData(); + rowCount = tableData.length; + columnCount = columnNames.length; + } + + protected Object[][] getTableData() { + if (tableData != null) { + return tableData; + } + Classify.Collated[] values = Classify.Collated.values(); + Object[][] data = new Object[values.length][]; + for (int i = 0; i < values.length; i++) { + Classify.Collated collated = values[i]; + Component[] components = PrefParts.createComponentsFor(collated); + data[i] = + new Object[] { + collated.section, + collated.group, + components[0], + components[1], + collated.searchWords, + collated + }; + } + return data; + } + + protected String[] getColumnNames() { + return columnNames; + } + + @Override + public int getRowCount() { + return rowCount; + } + + @Override + public int getColumnCount() { + return columnCount; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return tableData[rowIndex][columnIndex]; + } + + @Override + public String getColumnName(int column) { + return columnNames[column]; + } + + @Override + public Class getColumnClass(int columnIndex) { + return columnClasses[columnIndex]; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnClasses[columnIndex] == PrefComponentPane.class; + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + // var properties = tokenTypeMap.get(tokenType); + // var tokenProperty = properties.get(rowIndex); + // switch (columnIndex) { + // case 0 -> tokenProperty.setName((String) aValue); + // case 1 -> tokenProperty.setShortName((String) aValue); + // case 2 -> tokenProperty.setDisplayName((String) aValue); + // case 3 -> tokenProperty.setDefaultValue((String) aValue); + // case 4 -> { + // tokenProperty.setShowOnStatSheet((Boolean) aValue); + // fireTableRowsUpdated(rowIndex, rowIndex); + // } + // case 5 -> tokenProperty.setGMOnly((Boolean) aValue); + // case 6 -> tokenProperty.setOwnerOnly((Boolean) aValue); + // } + } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/theme/Icons.java b/src/main/java/net/rptools/maptool/client/ui/theme/Icons.java index 3dd8099359..af713b63bd 100644 --- a/src/main/java/net/rptools/maptool/client/ui/theme/Icons.java +++ b/src/main/java/net/rptools/maptool/client/ui/theme/Icons.java @@ -30,6 +30,7 @@ public enum Icons { ACTION_PAUSE, ACTION_PREVIOUS, ACTION_PREVIOUS_TOKEN, + ACTION_RECURSIVE, ACTION_RESET, ACTION_RESET_TOKEN_SELECTION, ACTION_SELECT_ALL_TOKENS, @@ -38,6 +39,9 @@ public enum Icons { ACTION_TARGET_ADD, ACTION_TARGET_EDIT, ACTION_TARGET_REMOVE, + ACTION_TEXT_CASE, + ACTION_TEXT_HIGHLIGHT, + ACTION_TEXT_REGEX, ADD_RESSOURCE_LOCAL, ADD_RESSOURCE_RPTOOLS, ADD_RESSOURCE_WEB, @@ -185,6 +189,7 @@ public enum Icons { TOOLBAR_VOLUME_ON, TOOLBAR_ZONE, TOOLBAR_ZONE_NOT_VISIBLE, + WARNING, WINDOW_CAMPAIGN_MACROS, WINDOW_CHAT, WINDOW_CONNECTIONS, diff --git a/src/main/java/net/rptools/maptool/client/ui/theme/RessourceManager.java b/src/main/java/net/rptools/maptool/client/ui/theme/RessourceManager.java index 213f4052fa..89df5735a1 100644 --- a/src/main/java/net/rptools/maptool/client/ui/theme/RessourceManager.java +++ b/src/main/java/net/rptools/maptool/client/ui/theme/RessourceManager.java @@ -30,6 +30,7 @@ public class RessourceManager { private static final String IMAGE_DIR = "net/rptools/maptool/client/image/"; private static final String ICON_DIR = "net/rptools/maptool/client/icons/"; + private static final String REV_ICONS = ICON_DIR + "reverend/"; private static final HashMap classicIcons = new HashMap<>() { { @@ -58,11 +59,15 @@ public class RessourceManager { put(Icons.ACTION_PAUSE, IMAGE_DIR + "arrow_hold.png"); put(Icons.ACTION_PREVIOUS, IMAGE_DIR + "arrow_left.png"); put(Icons.ACTION_PREVIOUS_TOKEN, IMAGE_DIR + "arrow_left.png"); + put(Icons.ACTION_RECURSIVE, REV_ICONS + "recursive.svg"); put(Icons.ACTION_RESET, IMAGE_DIR + "arrow_rotate_clockwise.png"); put(Icons.ACTION_RESET_TOKEN_SELECTION, IMAGE_DIR + "arrow_rotate_clockwise.png"); put(Icons.ACTION_SELECT_ALL_TOKENS, IMAGE_DIR + "arrow_out.png"); put(Icons.ACTION_SELECT_NO_TOKENS, IMAGE_DIR + "arrow_in_red.png"); put(Icons.ACTION_SETTINGS, IMAGE_DIR + "arrow_menu.png"); + put(Icons.ACTION_TEXT_CASE, REV_ICONS + "text_case.svg"); + put(Icons.ACTION_TEXT_HIGHLIGHT, REV_ICONS + "text_highlight.svg"); + put(Icons.ACTION_TEXT_REGEX, REV_ICONS + "regex.svg"); put(Icons.ADD_RESSOURCE_LOCAL, IMAGE_DIR + "folder.png"); put(Icons.ADD_RESSOURCE_RPTOOLS, IMAGE_DIR + "rptools_icon.png"); put(Icons.ADD_RESSOURCE_WEB, IMAGE_DIR + "download.png"); @@ -220,6 +225,7 @@ public class RessourceManager { put(Icons.TOOLBAR_VOLUME_ON, IMAGE_DIR + "audio/volume.png"); put(Icons.TOOLBAR_ZONE, IMAGE_DIR + "tool/btn-world.png"); put(Icons.TOOLBAR_ZONE_NOT_VISIBLE, IMAGE_DIR + "notvisible.png"); + put(Icons.WARNING, REV_ICONS + "warning.svg"); put(Icons.WINDOW_CAMPAIGN_MACROS, IMAGE_DIR + "campaign_panel.png"); put(Icons.WINDOW_CHAT, IMAGE_DIR + "application.png"); put(Icons.WINDOW_CONNECTIONS, IMAGE_DIR + "computer.png"); @@ -304,6 +310,7 @@ public class RessourceManager { put(Icons.ACTION_PAUSE, ROD_ICONS + "initiative/Toggle Hold Initiative.svg"); put(Icons.ACTION_PREVIOUS, ROD_ICONS + "initiative/Previous Initiative.svg"); put(Icons.ACTION_PREVIOUS_TOKEN, ROD_ICONS + "misc/Select Next Token.svg"); + put(Icons.ACTION_RECURSIVE, REV_ICONS + "recursive.svg"); put(Icons.ACTION_RESET, ROD_ICONS + "initiative/Reset Round.svg"); put( Icons.ACTION_RESET_TOKEN_SELECTION, @@ -314,6 +321,9 @@ public class RessourceManager { put(Icons.ACTION_TARGET_ADD, ROD_ICONS + "add target.svg"); put(Icons.ACTION_TARGET_EDIT, ROD_ICONS + "edit target.svg"); put(Icons.ACTION_TARGET_REMOVE, ROD_ICONS + "remove target.svg"); + put(Icons.ACTION_TEXT_CASE, REV_ICONS + "text_case.svg"); + put(Icons.ACTION_TEXT_HIGHLIGHT, REV_ICONS + "text_highlight.svg"); + put(Icons.ACTION_TEXT_REGEX, REV_ICONS + "regex.svg"); put(Icons.ADD_RESSOURCE_LOCAL, ROD_ICONS + "folder.svg"); put(Icons.ASSETPANEL_HEROLABS, ROD_ICONS + "hero-lab-icon.svg"); put(Icons.ASSETPANEL_HEROLABS_FOLDER, ROD_ICONS + "hero_lab_folder.svg"); @@ -359,7 +369,7 @@ public class RessourceManager { put(Icons.GRID_ISOMETRIC, ROD_ICONS + "gridIsometric.svg"); put(Icons.GRID_NONE, ROD_ICONS + "cross.svg"); put(Icons.GRID_SQUARE, ROD_ICONS + "gridSquare.svg"); - put(Icons.MAPTOOL, ROD_ICONS + "maptool_icon.svg"); + put(Icons.MAPTOOL, REV_ICONS + "maptool_icon.svg"); put(Icons.MENU_DOCUMENTATION, ROD_ICONS + "menu/Documentation.svg"); put(Icons.MENU_FORUMS, ROD_ICONS + "menu/Forums.svg"); put(Icons.MENU_FRAMEWORKS, ROD_ICONS + "menu/Frameworks.svg"); @@ -467,6 +477,7 @@ public class RessourceManager { put(Icons.TOOLBAR_VOLUME_ON, ROD_ICONS + "ribbon/Mute - ON.svg"); put(Icons.TOOLBAR_ZONE, ROD_ICONS + "ribbon/Select Map.svg"); put(Icons.TOOLBAR_ZONE_NOT_VISIBLE, ROD_ICONS + "notvisible.svg"); + put(Icons.WARNING, REV_ICONS + "warning.svg"); put(Icons.WINDOW_CAMPAIGN_MACROS, ROD_ICONS + "windows/Campaign Macros.svg"); put(Icons.WINDOW_CHAT, ROD_ICONS + "windows/Chat.svg"); put(Icons.WINDOW_CONNECTIONS, ROD_ICONS + "windows/Connections.svg"); @@ -601,6 +612,9 @@ public static void main(String[] args) { private static void checkMissingIcons( HashMap classicIcons, HashMap rodIcons) { var missing = new TreeSet(); + for (Icons icons : Icons.values()) { + System.out.println(icons); + } for (var key : classicIcons.keySet()) { if (rodIcons.containsKey(key)) { continue; diff --git a/src/main/java/net/rptools/maptool/client/ui/theme/ThemeDialog.java b/src/main/java/net/rptools/maptool/client/ui/theme/ThemeDialog.java new file mode 100644 index 0000000000..05109bc318 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/theme/ThemeDialog.java @@ -0,0 +1,220 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.theme; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Objects; +import java.util.stream.Stream; +import javax.swing.*; +import net.rptools.maptool.client.*; +import net.rptools.maptool.client.events.PreferencesChanged; +import net.rptools.maptool.client.swing.*; +import net.rptools.maptool.events.MapToolEventBus; +import net.rptools.maptool.language.I18N; +import net.rptools.maptool.model.localisedObject.LocalListItem; +import org.apache.commons.io.FilenameUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * A separate dialogue that holds Theme related preferences. preferences. + * + *

This dialog window is modal. + */ +public class ThemeDialog { + /** Logger instance used for logging messages in the PreferencesDialog class. */ + private static final Logger log = LogManager.getLogger(ThemeDialog.class); + + private static final JComponent MAIN = new ThemeDialogForm().getRootComponent(); + private static final AbeillePanel CONTENT = new AbeillePanel<>(MAIN); + private static final AbeillePanel themeFontPreferences = new ThemeFontPreferences(); + + private static final GenericDialogFactory dialogFactory = + GenericDialog.getFactory() + .makeModal(true) + .addButton(ButtonKind.CLOSE) + .setDialogTitle(I18N.getText("Label.themes")); + + /* ComboBoxes */ + private static final JComboBox macroEditorThemeComboSource = + CONTENT.getComboBox("macroEditorThemeCombo"); + private static final JComboBox iconThemeComboSource = CONTENT.getComboBox("iconThemeCombo"); + private static final JComboBox themeFilterComboSource = + CONTENT.getComboBox("themeFilterCombo"); + + /* Lists */ + private static JList themeListSource = (JList) CONTENT.getList("themeList"); + private static ListModel allThemesListModel; + private static ListModel lightThemesListModel; + private static ListModel darkThemesListModel; + + /* Labels */ + private static final JLabel themeImageLabel = (JLabel) CONTENT.getComponent("themeImage"); + private static final JLabel themeNameLabel = (JLabel) CONTENT.getComponent("currentThemeName"); + + /** Checkbox for if the theme should be applied to the chat window. */ + private static final JCheckBox useThemeForChat = CONTENT.getCheckBox("useThemeForChat"); + + private static final LocalListItem[] themeFilterComboItems = + new LocalListItem[] { + new LocalListItem("All", "Preferences.combo.themes.filter.all"), + new LocalListItem("Dark", "Preferences.combo.themes.filter.dark"), + new LocalListItem("Light", "Preferences.combo.themes.filter.light") + }; + + /** Flag indicating if theme has been changed. */ + private static boolean themeChanged = false; + + static { + initComponents(); + dialogFactory + .onBeforeClose( + e -> { + themeChanged = themeChanged | themeFontPreferences.commit(); + new MapToolEventBus().getMainEventBus().post(new PreferencesChanged()); + if (themeChanged || ThemeSupport.needsRestartForNewTheme()) { + MapTool.showMessage( + "themeChangeWarning", "themeChangeWarningTitle", JOptionPane.WARNING_MESSAGE); + } + }) + .setContent(CONTENT); + } + + private static final ThemeDialog instance = new ThemeDialog(); + + public static ThemeDialog getInstance() { + return instance; + } + + private static void initComponents() { + CONTENT.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + CONTENT.replaceComponent("uiFontPrefsContainer", "uiFontPrefs", themeFontPreferences); + + JComboBox iconThemeCombo = new JComboBox(); + iconThemeCombo.setSelectedItem(AppPreferences.iconTheme.get()); + iconThemeCombo.addItemListener( + e -> AppPreferences.iconTheme.set((String) iconThemeCombo.getSelectedItem())); + CONTENT.replaceComponent( + iconThemeComboSource.getParent().getName(), iconThemeComboSource.getName(), iconThemeCombo); + + var lm = new DefaultListModel(); + Arrays.stream(ThemeSupport.THEMES) + .map(ThemeSupport.ThemeDetails::name) + .sorted() + .forEach(lm::addElement); + allThemesListModel = lm; + + lm = new DefaultListModel<>(); + Arrays.stream(ThemeSupport.THEMES) + .filter(ThemeSupport.ThemeDetails::dark) + .map(ThemeSupport.ThemeDetails::name) + .sorted() + .forEach(lm::addElement); + darkThemesListModel = lm; + + lm = new DefaultListModel<>(); + Arrays.stream(ThemeSupport.THEMES) + .filter(t -> !t.dark()) + .map(ThemeSupport.ThemeDetails::name) + .sorted() + .forEach(lm::addElement); + lightThemesListModel = lm; + + JList themeList = new JList<>(); + themeList.setModel(allThemesListModel); + themeList.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION); + themeList.setSelectedValue(ThemeSupport.getThemeName(), true); + SwingUtilities.invokeLater( + () -> { + themeImageLabel.setIcon(ThemeSupport.getExampleImageIcon(themeImageLabel.getSize())); + }); + themeList.addListSelectionListener( + e -> { + if (!e.getValueIsAdjusting()) { + String theme = themeList.getSelectedValue(); + ThemeSupport.setTheme(theme); + themeImageLabel.setIcon( + ThemeSupport.getExampleImageIcon(theme, themeImageLabel.getSize())); + } + }); + + themeNameLabel.setText(ThemeSupport.getThemeName()); + + useThemeForChat.setSelected(ThemeSupport.shouldUseThemeColorsForChat()); + useThemeForChat.addActionListener( + l -> { + ThemeSupport.setUseThemeColorsForChat(useThemeForChat.isSelected()); + }); + + JComboBox macroEditorThemeCombo = new JComboBox<>(); + macroEditorThemeCombo.setModel(new DefaultComboBoxModel<>()); + try (Stream paths = Files.list(AppConstants.THEMES_DIR.toPath())) { + paths + .filter(Files::isRegularFile) + .filter(p -> p.toString().toLowerCase().endsWith(".xml")) + .forEach( + p -> + macroEditorThemeCombo.addItem( + FilenameUtils.removeExtension(p.getFileName().toString()))); + macroEditorThemeCombo.setSelectedItem(AppPreferences.defaultMacroEditorTheme.get()); + } catch (IOException ioe) { + log.warn("Unable to list macro editor themes.", ioe); + macroEditorThemeCombo.addItem("Default"); + } + macroEditorThemeCombo.addItemListener( + e -> + AppPreferences.defaultMacroEditorTheme.set( + (String) macroEditorThemeCombo.getSelectedItem())); + CONTENT.replaceComponent( + macroEditorThemeComboSource.getParent().getName(), + macroEditorThemeComboSource.getName(), + macroEditorThemeCombo); + + themeListSource = themeList; + + JComboBox themeFilterCombo = new JComboBox<>(); + themeFilterCombo.setModel(LocalListItem.getLocalisedComboBoxModel(themeFilterComboItems)); + themeFilterCombo.addItemListener( + e -> { + String filter = + ((LocalListItem) Objects.requireNonNull(themeFilterCombo.getSelectedItem())) + .getValue() + .toString(); + switch (filter) { + case "All": + themeList.setModel(allThemesListModel); + break; + case "Dark": + themeList.setModel(darkThemesListModel); + break; + case "Light": + themeList.setModel(lightThemesListModel); + break; + } + }); + CONTENT.replaceComponent( + themeFilterComboSource.getParent().getName(), + themeFilterComboSource.getName(), + themeFilterCombo); + } + + public void showDialog() { + themeChanged = false; + dialogFactory.display(); + } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/theme/ThemeDialogForm.form b/src/main/java/net/rptools/maptool/client/ui/theme/ThemeDialogForm.form new file mode 100644 index 0000000000..14a0e2ad63 --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/theme/ThemeDialogForm.form @@ -0,0 +1,191 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/net/rptools/maptool/client/ui/theme/ThemeDialogForm.java b/src/main/java/net/rptools/maptool/client/ui/theme/ThemeDialogForm.java new file mode 100644 index 0000000000..e449b1582f --- /dev/null +++ b/src/main/java/net/rptools/maptool/client/ui/theme/ThemeDialogForm.java @@ -0,0 +1,25 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.client.ui.theme; + +import javax.swing.*; + +public class ThemeDialogForm { + private JPanel mainPanel; + + public JComponent getRootComponent() { + return mainPanel; + } +} diff --git a/src/main/java/net/rptools/maptool/client/ui/token/dialog/edit/TokenPropertiesDialog.form b/src/main/java/net/rptools/maptool/client/ui/token/dialog/edit/TokenPropertiesDialog.form index 1a2f1fdff7..a7ce8b1a49 100644 --- a/src/main/java/net/rptools/maptool/client/ui/token/dialog/edit/TokenPropertiesDialog.form +++ b/src/main/java/net/rptools/maptool/client/ui/token/dialog/edit/TokenPropertiesDialog.form @@ -843,7 +843,7 @@ - + @@ -853,7 +853,7 @@ - + @@ -863,7 +863,7 @@ - + @@ -873,7 +873,7 @@ - + @@ -883,7 +883,7 @@ - + @@ -939,7 +939,7 @@ - + @@ -951,7 +951,7 @@ - + diff --git a/src/main/java/net/rptools/maptool/client/ui/zone/ZoneView.java b/src/main/java/net/rptools/maptool/client/ui/zone/ZoneView.java index ef11e69302..8b8ca0280f 100644 --- a/src/main/java/net/rptools/maptool/client/ui/zone/ZoneView.java +++ b/src/main/java/net/rptools/maptool/client/ui/zone/ZoneView.java @@ -25,6 +25,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.Nonnull; +import net.rptools.maptool.client.AppPreferenceEnums; import net.rptools.maptool.client.AppUtil; import net.rptools.maptool.client.MapTool; import net.rptools.maptool.client.ui.zone.Illumination.LumensLevel; @@ -229,7 +230,7 @@ public Area getExposedArea(PlayerView view) { * @return true if the vision of the zone is not of type VisionType.OFF */ public boolean isUsingVision() { - return zone.getVisionType() != Zone.VisionType.OFF; + return zone.getVisionType() != AppPreferenceEnums.VisionType.OFF; } /** @@ -454,7 +455,7 @@ private Illumination getIllumination(IlluminationKey illuminationKey) { // Get the token's sight. final var tokenVisibleArea = getTokenVisibleArea(token); - if (zone.getVisionType() != Zone.VisionType.NIGHT) { + if (zone.getVisionType() != AppPreferenceEnums.VisionType.NIGHT) { // Treat the entire visible area like a light source of minimal lumens. final var contributedLight = createDaylightContribution(tokenVisibleArea); personalLights.add(contributedLight); diff --git a/src/main/java/net/rptools/maptool/client/ui/zone/gdx/GdxRenderer.java b/src/main/java/net/rptools/maptool/client/ui/zone/gdx/GdxRenderer.java index 071704e8e6..e96f89fcb6 100644 --- a/src/main/java/net/rptools/maptool/client/ui/zone/gdx/GdxRenderer.java +++ b/src/main/java/net/rptools/maptool/client/ui/zone/gdx/GdxRenderer.java @@ -1191,7 +1191,7 @@ private void renderLumensOverlay(PlayerView view, float overlayAlpha) { BlendFunction.SRC_ONLY.applyToBatch(batch); // At night, show any uncovered areas as dark. In daylight, show them as light (clear). - if (zoneCache.getZone().getVisionType() == Zone.VisionType.NIGHT) { + if (zoneCache.getZone().getVisionType() == AppPreferenceEnums.VisionType.NIGHT) { ScreenUtils.clear(0, 0, 0, overlayAlpha); } else { ScreenUtils.clear(Color.CLEAR); diff --git a/src/main/java/net/rptools/maptool/client/ui/zone/renderer/LumensRenderer.java b/src/main/java/net/rptools/maptool/client/ui/zone/renderer/LumensRenderer.java index 627a25575c..d51b94954f 100644 --- a/src/main/java/net/rptools/maptool/client/ui/zone/renderer/LumensRenderer.java +++ b/src/main/java/net/rptools/maptool/client/ui/zone/renderer/LumensRenderer.java @@ -20,6 +20,7 @@ import java.awt.Graphics2D; import java.awt.geom.Area; import net.rptools.lib.CodeTimer; +import net.rptools.maptool.client.AppPreferenceEnums; import net.rptools.maptool.client.AppPreferences; import net.rptools.maptool.client.AppState; import net.rptools.maptool.client.ui.zone.PlayerView; @@ -69,7 +70,7 @@ private void renderWorld(Graphics2D worldG, PlayerView view) { worldG.setComposite(AlphaComposite.Src.derive(overlayOpacity)); // At night, show any uncovered areas as dark. In daylight, show them as light (clear). var backgroundFill = - zone.getVisionType() == Zone.VisionType.NIGHT + zone.getVisionType() == AppPreferenceEnums.VisionType.NIGHT ? new Color(0.f, 0.f, 0.f, 1.f) : new Color(0.f, 0.f, 0.f, 0.f); worldG.setPaint(backgroundFill); diff --git a/src/main/java/net/rptools/maptool/model/Zone.java b/src/main/java/net/rptools/maptool/model/Zone.java index 74a434b3d0..a779cabf1b 100644 --- a/src/main/java/net/rptools/maptool/model/Zone.java +++ b/src/main/java/net/rptools/maptool/model/Zone.java @@ -28,6 +28,7 @@ import net.rptools.lib.GeometryUtil; import net.rptools.lib.MD5Key; import net.rptools.lib.StringUtil; +import net.rptools.maptool.client.AppPreferenceEnums; import net.rptools.maptool.client.AppUtil; import net.rptools.maptool.client.MapTool; import net.rptools.maptool.client.tool.drawing.UndoPerZone; @@ -85,24 +86,6 @@ public class Zone { private static final Logger log = LogManager.getLogger(Zone.class); - /** The vision type (OFF, DAY, NIGHT). */ - public enum VisionType { - OFF(), - DAY(), - NIGHT(); - - private final String displayName; - - VisionType() { - displayName = I18N.getString("visionType." + name()); - } - - @Override - public String toString() { - return displayName; - } - } - /** How lights should be rendered into the zone. */ public enum LightingStyle { /** Lights are to be rendered as part of the map's environment, approximation illumination. */ @@ -413,7 +396,7 @@ public enum TopologyType { private boolean isVisible; /** The VisionType of the zone. OFF, DAY or NIGHT. */ - private VisionType visionType = VisionType.OFF; + private AppPreferenceEnums.VisionType visionType = AppPreferenceEnums.VisionType.OFF; private LightingStyle lightingStyle = LightingStyle.OVERTOP; @@ -460,11 +443,11 @@ public int getTokenVisionDistance() { return tokenVisionDistance; } - public VisionType getVisionType() { + public AppPreferenceEnums.VisionType getVisionType() { return visionType; } - public void setVisionType(VisionType visionType) { + public void setVisionType(AppPreferenceEnums.VisionType visionType) { this.visionType = visionType; } @@ -844,7 +827,8 @@ public boolean isPointVisible(ZonePoint point, PlayerView view) { if (!hasFog() || view.isGMView()) { return true; } - if (MapTool.getServerPolicy().isUseIndividualFOW() && getVisionType() != VisionType.OFF) { + if (MapTool.getServerPolicy().isUseIndividualFOW() + && getVisionType() != AppPreferenceEnums.VisionType.OFF) { Area combined = new Area(exposedArea); if (view.isUsingTokenView()) { for (Token tok : view.getTokens()) { // only owned and HasSight tokens are returned @@ -905,7 +889,8 @@ public boolean isTokenVisible(Token token) { Rectangle tokenSize = token.getBounds(this); Area combined = new Area(exposedArea); PlayerView view = MapTool.getFrame().getZoneRenderer(this).getPlayerView(); - if (MapTool.getServerPolicy().isUseIndividualFOW() && getVisionType() != VisionType.OFF) { + if (MapTool.getServerPolicy().isUseIndividualFOW() + && getVisionType() != AppPreferenceEnums.VisionType.OFF) { // Jamz: Lets change the logic a bit looking for ownerships if (view.isUsingTokenView()) { for (Token tok : view.getTokens()) { @@ -941,7 +926,8 @@ public boolean isTokenFootprintVisible(Token token) { Area tokenFootprint = getGrid().getTokenCellArea(tokenSize); Area combined = new Area(exposedArea); PlayerView view = MapTool.getFrame().getZoneRenderer(this).getPlayerView(); - if (MapTool.getServerPolicy().isUseIndividualFOW() && getVisionType() != VisionType.OFF) { + if (MapTool.getServerPolicy().isUseIndividualFOW() + && getVisionType() != AppPreferenceEnums.VisionType.OFF) { if (view.isUsingTokenView()) { // Should this use FindTokenFunctions.OwnedFilter and zone.getTokenList()? for (Token tok : view.getTokens()) { @@ -1189,7 +1175,7 @@ public void exposeArea(Area area, Set selectedToks) { if (area == null || area.isEmpty()) { return; } - if (getVisionType() == VisionType.OFF) { + if (getVisionType() == AppPreferenceEnums.VisionType.OFF) { // Why is this done here and then again below??? // And just because Vision==Off doesn't mean we aren't doing IF... // Jamz: if this exposedArea isn't done then it breaks getExposedTokens when vision is off... @@ -1270,7 +1256,7 @@ public void hideArea(Area area, Set selectedToks) { if (area == null) { return; } - if (getVisionType() == VisionType.OFF) { + if (getVisionType() == AppPreferenceEnums.VisionType.OFF) { exposedArea.subtract(area); } if (selectedToks != null @@ -2096,12 +2082,12 @@ protected Object readResolve() { // 1.3b47 -> 1.3b48 if (visionType == null) { if (getTokensFiltered(Token::hasLightSources).size() > 0) { - visionType = VisionType.NIGHT; + visionType = AppPreferenceEnums.VisionType.NIGHT; } else if (topology != null && !topology.isEmpty()) { - visionType = VisionType.DAY; + visionType = AppPreferenceEnums.VisionType.DAY; } else { - visionType = VisionType.OFF; + visionType = AppPreferenceEnums.VisionType.OFF; } } if (lightingStyle == null) { @@ -2291,7 +2277,7 @@ public static Zone fromDto(ZoneDto dto) { zone.name = dto.getName(); zone.playerAlias = dto.hasPlayerAlias() ? dto.getPlayerAlias().getValue() : null; zone.isVisible = dto.getIsVisible(); - zone.visionType = VisionType.valueOf(dto.getVisionType().name()); + zone.visionType = AppPreferenceEnums.VisionType.valueOf(dto.getVisionType().name()); zone.lightingStyle = LightingStyle.valueOf(dto.getLightingStyle().name()); zone.tokenSelection = TokenSelection.valueOf(dto.getTokenSelection().name()); zone.height = dto.getHeight(); diff --git a/src/main/java/net/rptools/maptool/model/localisedObject/AbstractLocalObject.java b/src/main/java/net/rptools/maptool/model/localisedObject/AbstractLocalObject.java new file mode 100644 index 0000000000..afa73e5cea --- /dev/null +++ b/src/main/java/net/rptools/maptool/model/localisedObject/AbstractLocalObject.java @@ -0,0 +1,83 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.model.localisedObject; + +import java.util.Arrays; +import net.rptools.maptool.language.I18N; +import org.jetbrains.annotations.NotNull; + +/** Stores the localized display name and preference value for list, combo and menu items */ +public abstract class AbstractLocalObject implements LocalObject { + /** The actual value used by the preference. */ + Object value; + + /** The key used to look up the localised display name. */ + String i18nKey = ""; + + /** The localised display name of a menu item or combo box option visible to the user. */ + String displayName; + + /** + * Create a local object without performing the i18n lookup + * + * @param value the value held by the object + * @param displayName the display name presented to users + * @param dummy just here to change the signature so no lookup is performed. + */ + AbstractLocalObject(@NotNull Object value, String displayName, Object dummy) { + this.value = value; + this.displayName = displayName; + } + + /** + * Create a local object and fetches the localised display name + * + * @param value the value held by the object + * @param i18nKeyAndArgs varArgs for the i18n key and any optional arguments to pass with it. + */ + AbstractLocalObject(@NotNull Object value, String... i18nKeyAndArgs) { + this.value = value; + this.i18nKey = i18nKeyAndArgs[0]; + if (i18nKeyAndArgs.length == 1) { + this.displayName = I18N.getText(this.i18nKey); + } else { + this.displayName = + I18N.getText( + this.i18nKey, + (Object) Arrays.copyOfRange(i18nKeyAndArgs, 1, i18nKeyAndArgs.length - 1)); + } + } + + /** + * @return {@link #value} {@inheritDoc} + */ + public Object getValue() { + return this.value; + } + + /** + * @return {@link #i18nKey} {@inheritDoc} + */ + public String getI18nKey() { + return i18nKey; + } + + /** + * @return {@link #displayName} {@inheritDoc} + */ + public @NotNull String getDisplayName() { + return displayName; + } +} diff --git a/src/main/java/net/rptools/maptool/model/localisedObject/LocalEnumListItem.java b/src/main/java/net/rptools/maptool/model/localisedObject/LocalEnumListItem.java new file mode 100644 index 0000000000..cc125eb667 --- /dev/null +++ b/src/main/java/net/rptools/maptool/model/localisedObject/LocalEnumListItem.java @@ -0,0 +1,100 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.model.localisedObject; + +import java.awt.*; +import java.awt.event.ItemEvent; +import java.util.Map; +import javax.swing.*; +import net.rptools.maptool.client.AppPreferenceEnums; +import net.rptools.maptool.client.AppPreferences; +import net.rptools.maptool.client.ui.theme.Icons; +import net.rptools.maptool.client.ui.theme.RessourceManager; +import net.rptools.maptool.util.preferences.Preference; +import org.jetbrains.annotations.NotNull; + +/** + * Stores the localised display name and preference value String for menu items that don't have a + * corresponding enum. + */ +public class LocalEnumListItem> extends LocalListItem implements LocalObject { + /** Stores the localized display name and preference value for list, combo and menu items */ + public interface EnumPreferenceItem> extends LocalObject { + /** + * @return the actual value used by the application. + */ + @Override + @NotNull + E getValue(); + + void updatePreference(Enum newValue); + } + + /** + * Creates a localised item. + * + * @param enumConstant the constant value from the enum. + * @param i18nKey the i18n key to use for the display name. + */ + public LocalEnumListItem(E enumConstant, String i18nKey) { + super(enumConstant, i18nKey); + } + + static Map gridIconMap = + Map.of( + AppPreferenceEnums.GridType.NONE, RessourceManager.getSmallIcon(Icons.GRID_NONE), + AppPreferenceEnums.GridType.HEX_VERT, + RessourceManager.getSmallIcon(Icons.GRID_HEX_VERTICAL), + AppPreferenceEnums.GridType.HEX_HORI, + RessourceManager.getSmallIcon(Icons.GRID_HEX_HORIZONTAL), + AppPreferenceEnums.GridType.ISOMETRIC, + RessourceManager.getSmallIcon(Icons.GRID_ISOMETRIC), + AppPreferenceEnums.GridType.SQUARE, RessourceManager.getSmallIcon(Icons.GRID_SQUARE)); + private static final ListCellRenderer cellRendererWithGridIcon = + new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent( + JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + JLabel lbl = + (JLabel) + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + lbl.setIcon(gridIconMap.get(((AppPreferenceEnums.GridType) value))); + return lbl; + } + }; + + /** Utility method to create and set the selected item for preference enum combo box models. */ + public static JComboBox> createComboBox(Preference p) { + JComboBox> comboBox = new JComboBox<>((Enum[]) p.getValueClass().getEnumConstants()); + if (p.equals(AppPreferences.defaultGridType)) { + comboBox.setRenderer((ListCellRenderer>) cellRendererWithGridIcon); + } + comboBox.setSelectedItem(p.get()); + comboBox.addItemListener( + e -> { + if (e.getStateChange() == ItemEvent.SELECTED) { + try { + if (comboBox.getSelectedItem() + instanceof LocalEnumListItem.EnumPreferenceItem selected) { + selected.updatePreference(selected.getValue()); + } + } catch (Exception ex) { + System.out.println("listener error: " + ex); + } + } + }); + return comboBox; + } +} diff --git a/src/main/java/net/rptools/maptool/model/localisedObject/LocalListItem.java b/src/main/java/net/rptools/maptool/model/localisedObject/LocalListItem.java new file mode 100644 index 0000000000..e3737846bc --- /dev/null +++ b/src/main/java/net/rptools/maptool/model/localisedObject/LocalListItem.java @@ -0,0 +1,78 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.model.localisedObject; + +import java.util.Arrays; +import javax.swing.*; + +/** Stores the preference value and localised display name for list, combo and menu items. */ +public class LocalListItem extends AbstractLocalObject { + /** + * New Local List Item + * + * @param value the value held by the object + * @param i18nKeys varArgs for the i18n key and any optional arguments to pass with it. + */ + public LocalListItem(Object value, String... i18nKeys) { + super(value, i18nKeys); + } + + /** Utility method to create a ListModel from an array o LocalisedListItems. */ + @SuppressWarnings("unused") + public static ListModel getLocalisedListModel(LocalListItem[] items) { + DefaultListModel model = new DefaultListModel<>(); + model.addAll(Arrays.stream(items).toList()); + return model; + } + + /** Utility method to create a ComboBoxModel from an array of LocalisedListItems. */ + @SuppressWarnings("unused") + public static ComboBoxModel getLocalisedComboBoxModel(LocalListItem[] items) { + return new DefaultComboBoxModel<>(items); + } + + /** + * Utility method to create a ComboBoxModel from an array of LocalisedListItems and set the + * selected item. + */ + public static ComboBoxModel getLocalisedSetComboBoxModel( + LocalListItem[] items, String selected) { + ComboBoxModel model = getLocalisedComboBoxModel(items); + + try { + model.setSelectedItem( + Arrays.stream(items) + .filter(localisedListItem -> localisedListItem.getValue().equals(selected)) + .toList() + .getFirst()); + } catch (Exception ignored) { + try { + model.setSelectedItem( + Arrays.stream(items) + .filter( + localisedListItem -> + localisedListItem + .getValue() + .toString() + .replaceAll("[_\\W]", "") + .equalsIgnoreCase(selected.replaceAll("[_\\W]", ""))) + .toList() + .getFirst()); + } catch (Exception ignore) { + } + } + return model; + } +} diff --git a/src/main/java/net/rptools/maptool/model/localisedObject/LocalObject.java b/src/main/java/net/rptools/maptool/model/localisedObject/LocalObject.java new file mode 100644 index 0000000000..e261f8c438 --- /dev/null +++ b/src/main/java/net/rptools/maptool/model/localisedObject/LocalObject.java @@ -0,0 +1,34 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.model.localisedObject; + +/** Stores the localized display name and preference value for list, combo and menu items */ +public interface LocalObject { + + /** + * @return the actual value used by the application. + */ + Object getValue(); + + /** + * @return the key to look up the localised display value + */ + String getI18nKey(); + + /** + * @return the localised display value + */ + String getDisplayName(); +} diff --git a/src/main/java/net/rptools/maptool/model/player/PlayerDatabase.java b/src/main/java/net/rptools/maptool/model/player/PlayerDatabase.java index fae4fea040..808a944f64 100644 --- a/src/main/java/net/rptools/maptool/model/player/PlayerDatabase.java +++ b/src/main/java/net/rptools/maptool/model/player/PlayerDatabase.java @@ -119,8 +119,7 @@ default Set getAllPlayers() { /** * Returns the public key for a player that matches the MD5Key specified. The MD5Key is generated - * based on the text representation of the public key as returned by * {@link - * CipherUtil#getEncodedPublicKeyText()} + * based on the text representation of the public key as returned by ... * * @param player The player to get the public key for. * @param md5key The {@link MD5Key} of the public key. diff --git a/src/main/java/net/rptools/maptool/server/ServerCommand.java b/src/main/java/net/rptools/maptool/server/ServerCommand.java index 36c6418f28..a87b59339e 100644 --- a/src/main/java/net/rptools/maptool/server/ServerCommand.java +++ b/src/main/java/net/rptools/maptool/server/ServerCommand.java @@ -20,8 +20,8 @@ import java.util.Set; import javax.annotation.Nullable; import net.rptools.lib.MD5Key; +import net.rptools.maptool.client.AppPreferenceEnums.VisionType; import net.rptools.maptool.model.*; -import net.rptools.maptool.model.Zone.VisionType; import net.rptools.maptool.model.drawing.Drawable; import net.rptools.maptool.model.drawing.DrawnElement; import net.rptools.maptool.model.drawing.Pen; diff --git a/src/main/java/net/rptools/maptool/server/ServerMessageHandler.java b/src/main/java/net/rptools/maptool/server/ServerMessageHandler.java index 1bb262bcc3..2561f477fe 100644 --- a/src/main/java/net/rptools/maptool/server/ServerMessageHandler.java +++ b/src/main/java/net/rptools/maptool/server/ServerMessageHandler.java @@ -24,6 +24,7 @@ import java.util.stream.Collectors; import net.rptools.clientserver.simple.MessageHandler; import net.rptools.lib.MD5Key; +import net.rptools.maptool.client.AppPreferenceEnums; import net.rptools.maptool.client.ClientMessageHandler; import net.rptools.maptool.client.MapTool; import net.rptools.maptool.client.ServerCommandClientImpl; @@ -33,7 +34,6 @@ import net.rptools.maptool.events.MapToolEventBus; import net.rptools.maptool.model.*; import net.rptools.maptool.model.InitiativeList.TokenInitiative; -import net.rptools.maptool.model.Zone.VisionType; import net.rptools.maptool.model.drawing.Drawable; import net.rptools.maptool.model.drawing.DrawnElement; import net.rptools.maptool.model.drawing.Pen; @@ -438,7 +438,7 @@ private void handle(SetVisionTypeMsg msg) { EventQueue.invokeLater( () -> { Zone zone = server.getCampaign().getZone(GUID.valueOf(msg.getZoneGuid())); - zone.setVisionType(VisionType.valueOf(msg.getVision().name())); + zone.setVisionType(AppPreferenceEnums.VisionType.valueOf(msg.getVision().name())); }); } diff --git a/src/main/java/net/rptools/maptool/util/FunctionUtil.java b/src/main/java/net/rptools/maptool/util/FunctionUtil.java index 2d91ffba55..85012ea4f6 100644 --- a/src/main/java/net/rptools/maptool/util/FunctionUtil.java +++ b/src/main/java/net/rptools/maptool/util/FunctionUtil.java @@ -92,7 +92,7 @@ public static void experimentalWarning( String.format( "", FunctionUtil.class - .getResource("/net/rptools/maptool/client/image/warning.svg") + .getResource("/net/rptools/maptool/client/icons/reverend/warning.svg") .toURI() .toURL()); } catch (MalformedURLException | URISyntaxException ignored) { diff --git a/src/main/java/net/rptools/maptool/util/GraphicsUtil.java b/src/main/java/net/rptools/maptool/util/GraphicsUtil.java index 5a80cf7e42..920ce247b5 100644 --- a/src/main/java/net/rptools/maptool/util/GraphicsUtil.java +++ b/src/main/java/net/rptools/maptool/util/GraphicsUtil.java @@ -14,6 +14,7 @@ */ package net.rptools.maptool.util; +import com.formdev.flatlaf.FlatIconColors; import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; @@ -28,14 +29,13 @@ import java.awt.RenderingHints; import java.awt.Shape; import java.awt.geom.*; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import net.rptools.lib.GeometryUtil; import net.rptools.lib.StringUtil; +import net.rptools.lib.image.ImageUtil; import net.rptools.maptool.client.AppStyle; import net.rptools.maptool.client.MapTool; import net.rptools.maptool.client.swing.ImageLabel; @@ -55,6 +55,80 @@ public class GraphicsUtil { new ImageLabel(RessourceManager.getImage(Images.BOX_BLUE), 4, 4); public static final ImageLabel DARK_GREY_LABEL = new ImageLabel(RessourceManager.getImage(Images.BOX_DARK_GRAY), 4, 4); + public static final Map INVERTED_ICON_COLOURS = + new HashMap<>() { + { + put( + new Color(FlatIconColors.ACTIONS_RED.rgb), + new Color(FlatIconColors.ACTIONS_RED_DARK.rgb)); + put( + new Color(FlatIconColors.ACTIONS_RED_DARK.rgb), + new Color(FlatIconColors.ACTIONS_RED.rgb)); + put( + new Color(FlatIconColors.ACTIONS_YELLOW.rgb), + new Color(FlatIconColors.ACTIONS_YELLOW_DARK.rgb)); + put( + new Color(FlatIconColors.ACTIONS_YELLOW_DARK.rgb), + new Color(FlatIconColors.ACTIONS_YELLOW.rgb)); + put( + new Color(FlatIconColors.ACTIONS_GREEN.rgb), + new Color(FlatIconColors.ACTIONS_GREEN_DARK.rgb)); + put( + new Color(FlatIconColors.ACTIONS_GREEN_DARK.rgb), + new Color(FlatIconColors.ACTIONS_GREEN.rgb)); + put( + new Color(FlatIconColors.ACTIONS_BLUE.rgb), + new Color(FlatIconColors.ACTIONS_BLUE_DARK.rgb)); + put( + new Color(FlatIconColors.ACTIONS_BLUE_DARK.rgb), + new Color(FlatIconColors.ACTIONS_BLUE.rgb)); + put( + new Color(FlatIconColors.ACTIONS_GREY.rgb), + new Color(FlatIconColors.ACTIONS_GREY_DARK.rgb)); + put( + new Color(FlatIconColors.ACTIONS_GREY_DARK.rgb), + new Color(FlatIconColors.ACTIONS_GREY.rgb)); + put( + new Color(FlatIconColors.ACTIONS_GREYINLINE.rgb), + new Color(FlatIconColors.ACTIONS_GREYINLINE_DARK.rgb)); + put( + new Color(FlatIconColors.ACTIONS_GREYINLINE_DARK.rgb), + new Color(FlatIconColors.ACTIONS_GREYINLINE.rgb)); + put( + new Color(FlatIconColors.OBJECTS_YELLOW.rgb), + new Color(FlatIconColors.OBJECTS_YELLOW_DARK.rgb)); + put( + new Color(FlatIconColors.OBJECTS_YELLOW_DARK.rgb), + new Color(FlatIconColors.OBJECTS_YELLOW.rgb)); + put( + new Color(FlatIconColors.OBJECTS_GREY.rgb), + new Color(ImageUtil.negativeColourInt(FlatIconColors.OBJECTS_GREY.rgb))); + put( + new Color(FlatIconColors.OBJECTS_BLUE.rgb), + new Color(ImageUtil.negativeColourInt(FlatIconColors.OBJECTS_BLUE.rgb))); + put( + new Color(FlatIconColors.OBJECTS_GREEN.rgb), + new Color(ImageUtil.negativeColourInt(FlatIconColors.OBJECTS_GREEN.rgb))); + put( + new Color(FlatIconColors.OBJECTS_PURPLE.rgb), + new Color(ImageUtil.negativeColourInt(FlatIconColors.OBJECTS_PURPLE.rgb))); + put( + new Color(FlatIconColors.OBJECTS_PINK.rgb), + new Color(ImageUtil.negativeColourInt(FlatIconColors.OBJECTS_PINK.rgb))); + put( + new Color(FlatIconColors.OBJECTS_RED.rgb), + new Color(ImageUtil.negativeColourInt(FlatIconColors.OBJECTS_RED.rgb))); + put( + new Color(FlatIconColors.OBJECTS_RED_STATUS.rgb), + new Color(ImageUtil.negativeColourInt(FlatIconColors.OBJECTS_RED_STATUS.rgb))); + put( + new Color(FlatIconColors.OBJECTS_GREEN_ANDROID.rgb), + new Color(ImageUtil.negativeColourInt(FlatIconColors.OBJECTS_GREEN_ANDROID.rgb))); + put( + new Color(FlatIconColors.OBJECTS_BLACK_TEXT.rgb), + new Color(ImageUtil.negativeColourInt(FlatIconColors.OBJECTS_BLACK_TEXT.rgb))); + } + }; /** * A multiline text wrapping popup. diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/maptool_cog.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/maptool_cog.svg new file mode 100644 index 0000000000..3f69fea2ef --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/maptool_cog.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/maptool_icon.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/maptool_icon.svg new file mode 100644 index 0000000000..f07c7ea031 --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/maptool_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/maptool_icon_detailed.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/maptool_icon_detailed.svg new file mode 100644 index 0000000000..f09babf44e --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/maptool_icon_detailed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/node_closed.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/node_closed.svg new file mode 100644 index 0000000000..9bbd003a00 --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/node_closed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/node_open.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/node_open.svg new file mode 100644 index 0000000000..9fff336a90 --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/node_open.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/recursive.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/recursive.svg new file mode 100644 index 0000000000..d75b29f306 --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/recursive.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/regex.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/regex.svg new file mode 100644 index 0000000000..b3bea3403c --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/regex.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/scale.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/scale.svg new file mode 100644 index 0000000000..32c8b5fa42 --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/scale.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/scaleHor.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/scaleHor.svg new file mode 100644 index 0000000000..c722aeb276 --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/scaleHor.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/scaleVert.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/scaleVert.svg new file mode 100644 index 0000000000..ff31922842 --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/scaleVert.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/text_case.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/text_case.svg new file mode 100644 index 0000000000..4ff0379ce9 --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/text_case.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/main/resources/net/rptools/maptool/client/icons/reverend/text_highlight.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/text_highlight.svg new file mode 100644 index 0000000000..2dc340b2a6 --- /dev/null +++ b/src/main/resources/net/rptools/maptool/client/icons/reverend/text_highlight.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/net/rptools/maptool/client/image/warning.svg b/src/main/resources/net/rptools/maptool/client/icons/reverend/warning.svg similarity index 100% rename from src/main/resources/net/rptools/maptool/client/image/warning.svg rename to src/main/resources/net/rptools/maptool/client/icons/reverend/warning.svg diff --git a/src/main/resources/net/rptools/maptool/language/i18n.properties b/src/main/resources/net/rptools/maptool/language/i18n.properties index 39c09916bf..07f7854736 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n.properties @@ -262,8 +262,8 @@ Label.objects = Objects Label.token = Token Label.tokens = Tokens Label.backgrounds = Backgrounds -Label.macroeditor = Macro Editor -Label.styletheme = Style Theme +Label.macroEditor = Macro Editor +Label.styleTheme = Style Theme Label.currentTheme = Current Theme Label.filterTheme = Theme Filter Label.useThemeForChat = Use Theme Colors for Chat Window @@ -280,9 +280,9 @@ Label.preferences = Preferences Label.minute = min Label.performance = Performance Label.client = Client -Label.macropanels = Macro Panels +Label.macroPanels = Macro Panels Label.upnp = UPnP -Label.macropermissions = Macro Permissions +Label.macroPermissions = Macro Permissions Label.path = Path: Label.url = URL Label.url2 = URL: @@ -290,16 +290,16 @@ Label.library = RPTools Library Label.progress = Progress Label.about = About Label.dimensions = Dimensions -Label.layer = Layer Label.grid = Grid -Label.tile = Tile -Label.ready = Ready -Label.saved = Saved Label.filesystem = Filesystem ... Label.filesystem2 = Filesystem +Label.layer = Layer Label.roll = Roll: +Label.ready = Ready +Label.saved = Saved Label.table.image = Table Image -Label.blankdefault = (Leave blank for default) +Label.tile = Tile +Label.blankDefault = (Leave blank for default) Label.range = Range Label.image = Image Label.value = Value @@ -309,13 +309,18 @@ Label.table.export = Export Table Label.preview = Preview Label.foreground = Foreground Label.background = Background -Label.showbackground = Show Background +Label.showBackground = Show Background Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Color Label.borderArc = Border Arc Label.fontSize = Font Size -Label.layers = Layers: +Label.fogOfWar = Fog of War +Label.macros = Macros +Label.layers = Layers +Label.notifications = Notifications +Label.trusted = Trusted +Label.sounds Label.view.current = Current View Label.host = Host: Label.location = Location: @@ -323,7 +328,7 @@ Label.advanced = Advanced Label.view = View: Label.board = Board Label.visibility = Visibility -Label.pathfilename = Path/Filename: +Label.pathFilename = Path/Filename: Label.allowURIAccess = Allow URI Access Label.rotation = Rotation #Scale as in ratio @@ -686,6 +691,10 @@ PersistenceUtil.warn.macroWrongFileType = File is not a MapTool macro fi PersistenceUtil.warn.macroSet = a Macro Set PersistenceUtil.warn.macrosetWrongFileType = File is not a MapTool macro set file. File is {0}. +Preference.theme.icon.classic = Classic +Preference.theme.icon.rodTakehara = Rod Takehara + + Preferences.tab.developer = Developer Preferences.tab.developer.warning = These options are not meant for normal use. If you aren't developing or debugging MapTool, don't enable them! Preferences.developer.info.developerOptionsInUse = The following developer options are enabled: @@ -754,14 +763,14 @@ Preferences.combo.tokens.naming.filename = Use Filename Preferences.combo.tokens.naming.creature = Use "{0}" Preferences.label.tokens.dialog = Show Dialog on New Token Preferences.label.tokens.dialog.tooltip = Determines whether the New Token dialog appears when a token is dropped onto the map. -Preferences.label.tokens.statsheet = Statsheet Portrait Size -Preferences.label.tokens.statsheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. +Preferences.label.tokens.statSheet = Statsheet Portrait Size +Preferences.label.tokens.statSheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. Preferences.label.tokens.portrait.mouse = Show Portrait on mouseover Preferences.label.tokens.portrait.mouse.tooltip = Whether to show the portrait when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.mouse = Show statsheet on mouseover -Preferences.label.tokens.statsheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.shift = Stat sheet requires Shift key -Preferences.label.tokens.statsheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. +Preferences.label.tokens.statSheet.mouse = Show statsheet on mouseover +Preferences.label.tokens.statSheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. +Preferences.label.tokens.statSheet.shift = Stat sheet requires Shift key +Preferences.label.tokens.statSheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. Preferences.label.tokens.arrow = Force Token Facing Arrow Preferences.label.tokens.arrow.tooltip = Forces the display of the token facing arrow for Top Down tokens and tokens with image tables. Preferences.label.tokens.drag.snap = Snap Token while dragging @@ -785,7 +794,7 @@ Preferences.label.chat.trusted.background = Trusted Prefix Background Preferences.label.chat.trusted.background.tooltip = Text generated by trusted macros is forced to a particular background color. Preferences.label.chat.trusted.foreground = Trusted Prefix Foreground Preferences.label.chat.trusted.foreground.tooltip = Text generated by trusted macros is forced to a particular foreground color. -Preferences.label.macroeditor.tooltip = Theme of the macro editor. +Preferences.label.macroEditor.tooltip = Theme of the macro editor. Preferences.label.facing.edge = On Edges Preferences.label.facing.edge.tooltip = Causes token facing rotation to snap to edges of the grid cell. Preferences.label.facing.vertices = On Vertices @@ -871,12 +880,12 @@ Preferences.label.light.opacity = Light opacity Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Fog opacity Preferences.label.fog.opacity.tooltip = Measures how opaque the "soft fog" overlay is drawn (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = Auto-expose fog on token movement (personal server) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Fill selection box -Preferences.label.performance.fillselection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. +Preferences.label.performance.fillSelection = Fill selection box +Preferences.label.performance.fillSelection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. Preferences.label.performance.cap = Frame Rate Cap Preferences.label.performance.cap.tooltip = Frame rate cap for map renderer in FPS. Preferences.label.performance.render = Image Scaling Quality @@ -886,16 +895,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Campaign Defaults -Preferences.label.initiative.hidenpc = Hide NPCs from players on new maps -Preferences.label.initiative.hidenpc.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. +Preferences.label.initiative.hideNPC = Hide NPCs from players on new maps +Preferences.label.initiative.hideNPC.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. Preferences.label.initiative.owner = Give Owners Permission in new campaigns Preferences.label.initiative.owner.tooltip = Owner Permission allows players to perform certain actions on their tokens in the Initiative panel. Preferences.label.initiative.lock = Lock Player Movement in new campaigns Preferences.label.initiative.lock.tooltip = When enabled, players will only be able to move their token when that token has initiative. Preferences.label.initiative.msg = Show Initiative Gain Message Preferences.label.initiative.msg.tooltip = When enabled, a message is sent to chat when a token gains initiative. -Preferences.label.client.fitview = Fit GM view -Preferences.label.client.fitview.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? +Preferences.label.client.fitView = Fit GM view +Preferences.label.client.fitView.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? Preferences.label.client.default.username = Default Username Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -910,9 +919,9 @@ Preferences.label.upnp.timeout = Discovery Timeout Preferences.label.upnp.timeout.tooltip = Timeout period in milliseconds to wait when looking for UPnP gateways. Preferences.label.macros.permissions = Enable External Macro Access Preferences.label.macros.permissions.tooltip = Enable macros to call functions that can access your drive and http services. The following functions will be enabled: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Suppress ToolTips for MacroLinks -Preferences.label.chat.macrolinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. -Preference.checkbox.chat.macrolinks.tooltip = Enabled: do not show tooltips for macroLink
Disabled (default): show tooltips for macroLinks +Preferences.label.chat.macroLinks = Suppress ToolTips for MacroLinks +Preferences.label.chat.macroLinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. +Preference.checkbox.chat.macroLinks.tooltip = Enabled: do not show tooltips for macroLink
Disabled (default): show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -921,8 +930,8 @@ Preferences.combo.themes.filter.light = Light Preferences.label.loadMRU = Load last campaign on start Preferences.label.loadMRU.tooltip = Start MapTool with the last campaign you were using -Preferences.label.tokens.stack.hide=Hide Token stack indicator -Preferences.label.tokens.stack.hide.tooltip=Token Layer stack inidicator will be hidden +Preferences.label.tokens.stack.hide = Hide Token stack indicator +Preferences.label.tokens.stack.hide.tooltip = Token Layer stack indicator will be hidden Preferences.tab.experimental = Experimental Preferences.theme.override.checkbox = Override theme font settings @@ -3054,17 +3063,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_cs_CZ.properties b/src/main/resources/net/rptools/maptool/language/i18n_cs_CZ.properties index 216f440a8f..bf38acc3b8 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_cs_CZ.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_cs_CZ.properties @@ -149,8 +149,8 @@ Label.objects = Objekty Label.token = Token Label.tokens = Tokeny Label.backgrounds = Pozadí -Label.macroeditor = Editor makra -Label.styletheme = Styl motivu +Label.macroEditor = Editor makra +Label.styleTheme = Styl motivu Label.currentTheme = Aktuální motiv Label.filterTheme = Theme Filter Label.useThemeForChat = Používat barvy motivu pro okno chatu @@ -167,9 +167,9 @@ Label.save = Uložit Label.minute = min Label.performance = Výkon Label.client = Client -Label.macropanels = Panely makra +Label.macroPanels = Panely makra Label.upnp = UPnP -Label.macropermissions = Oprávnění makra +Label.macroPermissions = Oprávnění makra Label.path = Path\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Filesystem ... Label.filesystem2 = Filesystem Label.roll = Roll\: Label.table.image = Table Image -Label.blankdefault = (Leave blank for default) +Label.blankDefault = (Leave blank for default) Label.range = Range Label.image = Image Label.value = Value @@ -196,7 +196,7 @@ Label.table.export = Export Table Label.preview = Preview Label.foreground = Foreground\: Label.background = Background\: -Label.showbackground = Show Background\: +Label.showBackground = Show Background\: Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Color @@ -210,7 +210,7 @@ Label.advanced = Pokročilé Label.view = View\: Label.board = Board Label.visibility = Viditelnost -Label.pathfilename = Path/Filename\: +Label.pathFilename = Path/Filename\: Label.allowURIAccess = Allow URI Access Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Use Filename Preferences.combo.tokens.naming.creature = Use "{0}" Preferences.label.tokens.dialog = Show Dialog on New Token Preferences.label.tokens.dialog.tooltip = Determines whether the New Token dialog appears when a token is dropped onto the map. -Preferences.label.tokens.statsheet = Statsheet Portrait Size -Preferences.label.tokens.statsheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. +Preferences.label.tokens.statSheet = Statsheet Portrait Size +Preferences.label.tokens.statSheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. Preferences.label.tokens.portrait.mouse = Show Portrait on mouseover Preferences.label.tokens.portrait.mouse.tooltip = Whether to show the portrait when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.mouse = Show statsheet on mouseover -Preferences.label.tokens.statsheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.shift = Stat sheet requires Shift key -Preferences.label.tokens.statsheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. +Preferences.label.tokens.statSheet.mouse = Show statsheet on mouseover +Preferences.label.tokens.statSheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. +Preferences.label.tokens.statSheet.shift = Stat sheet requires Shift key +Preferences.label.tokens.statSheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. Preferences.label.tokens.arrow = Force Token Facing Arrow Preferences.label.tokens.arrow.tooltip = Forces the display of the token facing arrow for Top Down tokens and tokens with image tables. Preferences.label.tokens.drag.snap = Snap Token while dragging @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Trusted Prefix Background Preferences.label.chat.trusted.background.tooltip = Text generated by trusted macros is forced to a particular background color. Preferences.label.chat.trusted.foreground = Trusted Prefix Foreground Preferences.label.chat.trusted.foreground.tooltip = Text generated by trusted macros is forced to a particular foreground color. -Preferences.label.macroeditor.tooltip = Theme of the macro editor. +Preferences.label.macroEditor.tooltip = Theme of the macro editor. Preferences.label.facing.edge = On Edges Preferences.label.facing.edge.tooltip = Causes token facing rotation to snap to edges of the grid cell. Preferences.label.facing.vertices = On Vertices @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Light opacity Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Fog opacity Preferences.label.fog.opacity.tooltip = Measures how opaque the "soft fog" overlay is drawn (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = Auto-expose fog on token movement (personal server) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Fill selection box -Preferences.label.performance.fillselection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. +Preferences.label.performance.fillSelection = Fill selection box +Preferences.label.performance.fillSelection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. Preferences.label.performance.cap = Frame Rate Cap Preferences.label.performance.cap.tooltip = Frame rate cap for map renderer in FPS. Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Campaign Defaults -Preferences.label.initiative.hidenpc = Hide NPCs from players on new maps -Preferences.label.initiative.hidenpc.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. +Preferences.label.initiative.hideNPC = Hide NPCs from players on new maps +Preferences.label.initiative.hideNPC.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. Preferences.label.initiative.owner = Give Owners Permission in new campaigns Preferences.label.initiative.owner.tooltip = Owner Permission allows players to perform certain actions on their tokens in the Initiative panel. Preferences.label.initiative.lock = Lock Player Movement in new campaigns Preferences.label.initiative.lock.tooltip = When enabled, players will only be able to move their token when that token has initiative. Preferences.label.initiative.msg = Show Initiative Gain Message Preferences.label.initiative.msg.tooltip = When enabled, a message is sent to chat when a token gains initiative. -Preferences.label.client.fitview = Fit GM view -Preferences.label.client.fitview.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? +Preferences.label.client.fitView = Fit GM view +Preferences.label.client.fitView.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? Preferences.label.client.default.username = Default Username Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Discovery Timeout Preferences.label.upnp.timeout.tooltip = Timeout period in milliseconds to wait when looking for UPnP gateways. Preferences.label.macros.permissions = Enable External Macro Access Preferences.label.macros.permissions.tooltip = Enable macros to call functions that can access your drive and http services. The following functions will be enabled\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Suppress ToolTips for MacroLinks -Preferences.label.chat.macrolinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = Suppress ToolTips for MacroLinks +Preferences.label.chat.macroLinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_da_DK.properties b/src/main/resources/net/rptools/maptool/language/i18n_da_DK.properties index a715842d6b..e3079c8ab9 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_da_DK.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_da_DK.properties @@ -149,8 +149,8 @@ Label.objects = Objekter Label.token = Polet Label.tokens = Poletter Label.backgrounds = Baggrunde -Label.macroeditor = Makroeditor -Label.styletheme = Stil Tema +Label.macroEditor = Makroeditor +Label.styleTheme = Stil Tema Label.currentTheme = Nuværende tema Label.filterTheme = Thema filter Label.useThemeForChat = Brug temafarver til chatvindue @@ -167,9 +167,9 @@ Label.save = Gem Label.minute = min. Label.performance = Ydelse Label.client = Klient -Label.macropanels = Makropaneler +Label.macroPanels = Makropaneler Label.upnp = UPnP -Label.macropermissions = Makrotilladelser +Label.macroPermissions = Makrotilladelser Label.path = Sti\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Filsystem ... Label.filesystem2 = Filsystem Label.roll = Slag\: Label.table.image = Tabel billede -Label.blankdefault = (Lad stå tomt for standardværdi) +Label.blankDefault = (Lad stå tomt for standardværdi) Label.range = Afstand Label.image = Billede Label.value = Værdi @@ -196,7 +196,7 @@ Label.table.export = Eksporter tabel Label.preview = Forhåndsvisning Label.foreground = Forgrund Label.background = Baggrund -Label.showbackground = Vis baggrund +Label.showBackground = Vis baggrund Label.showBorder = Vis kant Label.borderWidth = Kant bredde Label.border.color = Kant farve @@ -210,7 +210,7 @@ Label.advanced = Avanceret Label.view = Vis\: Label.board = Bræt Label.visibility = Synlighed -Label.pathfilename = Sti/filnavn\: +Label.pathFilename = Sti/filnavn\: Label.allowURIAccess = Tillad URI adgang Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Brug Filnavn Preferences.combo.tokens.naming.creature = Brug "{0}" Preferences.label.tokens.dialog = Vis dialog ved ny polet Preferences.label.tokens.dialog.tooltip = Determines whether the New Token dialog appears when a token is dropped onto the map. -Preferences.label.tokens.statsheet = Statsheet Portrait Size -Preferences.label.tokens.statsheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. +Preferences.label.tokens.statSheet = Statsheet Portrait Size +Preferences.label.tokens.statSheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. Preferences.label.tokens.portrait.mouse = Vis portræt ved mouseover Preferences.label.tokens.portrait.mouse.tooltip = Whether to show the portrait when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.mouse = Show statsheet on mouseover -Preferences.label.tokens.statsheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.shift = Stat sheet requires Shift key -Preferences.label.tokens.statsheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. +Preferences.label.tokens.statSheet.mouse = Show statsheet on mouseover +Preferences.label.tokens.statSheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. +Preferences.label.tokens.statSheet.shift = Stat sheet requires Shift key +Preferences.label.tokens.statSheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. Preferences.label.tokens.arrow = Force Token Facing Arrow Preferences.label.tokens.arrow.tooltip = Forces the display of the token facing arrow for Top Down tokens and tokens with image tables. Preferences.label.tokens.drag.snap = Snap Token while dragging @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Trusted Prefix Background Preferences.label.chat.trusted.background.tooltip = Text generated by trusted macros is forced to a particular background color. Preferences.label.chat.trusted.foreground = Trusted Prefix Foreground Preferences.label.chat.trusted.foreground.tooltip = Text generated by trusted macros is forced to a particular foreground color. -Preferences.label.macroeditor.tooltip = Tema for makro editoren. +Preferences.label.macroEditor.tooltip = Tema for makro editoren. Preferences.label.facing.edge = På kanter Preferences.label.facing.edge.tooltip = Causes token facing rotation to snap to edges of the grid cell. Preferences.label.facing.vertices = På hjørner @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Lys gennemsigtighed Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Tåge gennemsigtighed Preferences.label.fog.opacity.tooltip = Measures how opaque the "soft fog" overlay is drawn (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = Afslør automatisk tåge ved polet bevægelser (personlig server) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Fill selection box -Preferences.label.performance.fillselection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. +Preferences.label.performance.fillSelection = Fill selection box +Preferences.label.performance.fillSelection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. Preferences.label.performance.cap = Billedhastighed loft Preferences.label.performance.cap.tooltip = Frame rate cap for map renderer in FPS. Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Kampagne standard indstillinger -Preferences.label.initiative.hidenpc = Hide NPCs from players on new maps -Preferences.label.initiative.hidenpc.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. +Preferences.label.initiative.hideNPC = Hide NPCs from players on new maps +Preferences.label.initiative.hideNPC.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. Preferences.label.initiative.owner = Give Owners Permission in new campaigns Preferences.label.initiative.owner.tooltip = Owner Permission allows players to perform certain actions on their tokens in the Initiative panel. Preferences.label.initiative.lock = Lock Player Movement in new campaigns Preferences.label.initiative.lock.tooltip = When enabled, players will only be able to move their token when that token has initiative. Preferences.label.initiative.msg = Show Initiative Gain Message Preferences.label.initiative.msg.tooltip = When enabled, a message is sent to chat when a token gains initiative. -Preferences.label.client.fitview = Følg spilleder udsyn -Preferences.label.client.fitview.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? +Preferences.label.client.fitView = Følg spilleder udsyn +Preferences.label.client.fitView.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? Preferences.label.client.default.username = Standard brugernavn Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Timeout for auto-opdagelse Preferences.label.upnp.timeout.tooltip = Timeout period in milliseconds to wait when looking for UPnP gateways. Preferences.label.macros.permissions = Enable External Macro Access Preferences.label.macros.permissions.tooltip = Enable macros to call functions that can access your drive and http services. The following functions will be enabled\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Suppress ToolTips for MacroLinks -Preferences.label.chat.macrolinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = Suppress ToolTips for MacroLinks +Preferences.label.chat.macroLinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Fejl ved import af spildata. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_de_DE.properties b/src/main/resources/net/rptools/maptool/language/i18n_de_DE.properties index 39efee0aef..ec9900ac32 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_de_DE.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_de_DE.properties @@ -149,8 +149,8 @@ Label.objects = Objekte Label.token = Spielmarke Label.tokens = Spielmarken Label.backgrounds = Hintergründe -Label.macroeditor = Makro-Editor -Label.styletheme = Designstil +Label.macroEditor = Makro-Editor +Label.styleTheme = Designstil Label.currentTheme = Aktuelles Design Label.filterTheme = Design-Filter Label.useThemeForChat = Verwende Farben des Designs fürs Chatfenster @@ -167,9 +167,9 @@ Label.save = Speichern Label.minute = min Label.performance = Leistung Label.client = Client -Label.macropanels = Makrotafeln +Label.macroPanels = Makrotafeln Label.upnp = UPnP -Label.macropermissions = Makro-Berechtigungen +Label.macroPermissions = Makro-Berechtigungen Label.path = Pfad\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Dateisystem ... Label.filesystem2 = Dateisystem Label.roll = Würfelwurf\: Label.table.image = Tabellenbild -Label.blankdefault = (Leer lassen im Standardfall) +Label.blankDefault = (Leer lassen im Standardfall) Label.range = Bereich Label.image = Bild Label.value = Wert @@ -196,7 +196,7 @@ Label.table.export = Tabelle exportieren Label.preview = Vorschau Label.foreground = Vordergrund\: Label.background = Hintergrund\: -Label.showbackground = Hintergrund anzeigen\: +Label.showBackground = Hintergrund anzeigen\: Label.showBorder = Rahmen anzeigen Label.borderWidth = Rahmenbreite Label.border.color = Rahmenfarbe @@ -210,7 +210,7 @@ Label.advanced = Fortgeschritten Label.view = Perspektive\: Label.board = Spielbrett Label.visibility = Sichtbarkeit -Label.pathfilename = Pfad/Dateiname\: +Label.pathFilename = Pfad/Dateiname\: Label.allowURIAccess = URI Zugang gewähren Label.rotation = Drehung #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Dateinamen verwenden Preferences.combo.tokens.naming.creature = Benutze {0} Preferences.label.tokens.dialog = Dialog über neue Spielmarke anzeigen Preferences.label.tokens.dialog.tooltip = Legt fest, ob der Dialog Neue Spielmarke erscheint, wenn eine Spielmarke auf die Karte verschoben wird. -Preferences.label.tokens.statsheet = Porträtgröße des Werteblatts -Preferences.label.tokens.statsheet.tooltip = Größe des Bildes, das neben dem Werteblatt erscheint. Setze Null um Porträts zu deaktivieren. +Preferences.label.tokens.statSheet = Porträtgröße des Werteblatts +Preferences.label.tokens.statSheet.tooltip = Größe des Bildes, das neben dem Werteblatt erscheint. Setze Null um Porträts zu deaktivieren. Preferences.label.tokens.portrait.mouse = Portrait beim Darüberfahren mit der Maus anzeigen Preferences.label.tokens.portrait.mouse.tooltip = Gibt an, ob das Porträt angezeigt werden soll, wenn die Maus über eine Spielmarke fährt. -Preferences.label.tokens.statsheet.mouse = Zeige Werteblatt beim Darüberfahren mit der Maus -Preferences.label.tokens.statsheet.mouse.tooltip = Gibt an, ob das Werteblatt angezeigt werden soll, wenn die Maus über eine Spielmarke fährt. -Preferences.label.tokens.statsheet.shift = Werteblatt erfordert Umschalttaste -Preferences.label.tokens.statsheet.shift.tooltip = Das Werteblatt wird nur angezeigt, wenn die Maus über eine Spielmarke fährt und wenn die Umschalt-Taste ebenfalls gedrückt wird. Andernfalls wird die Umschalt-Taste das Werteblatt beim Darüberfahren der Maus ausblenden. +Preferences.label.tokens.statSheet.mouse = Zeige Werteblatt beim Darüberfahren mit der Maus +Preferences.label.tokens.statSheet.mouse.tooltip = Gibt an, ob das Werteblatt angezeigt werden soll, wenn die Maus über eine Spielmarke fährt. +Preferences.label.tokens.statSheet.shift = Werteblatt erfordert Umschalttaste +Preferences.label.tokens.statSheet.shift.tooltip = Das Werteblatt wird nur angezeigt, wenn die Maus über eine Spielmarke fährt und wenn die Umschalt-Taste ebenfalls gedrückt wird. Andernfalls wird die Umschalt-Taste das Werteblatt beim Darüberfahren der Maus ausblenden. Preferences.label.tokens.arrow = Erzwinge Blickrichtungspfeil für Spielmarken Preferences.label.tokens.arrow.tooltip = Erzwingt die Anzeige des Blickrichtungspfeils für Draufsichtspielmarken und Bildtabellenspielmarken. Preferences.label.tokens.drag.snap = Spielmarken beim Ziehen einrasten @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Hintergrund des vertrauensw Preferences.label.chat.trusted.background.tooltip = Text, der von vertrauenswürdigen Makros erzeugt wird, erzwingt eine bestimmte Hintergrundfarbe. Preferences.label.chat.trusted.foreground = Vordergrund des vertrauenswürdigen Präfixes Preferences.label.chat.trusted.foreground.tooltip = Text, der von vertrauenswürdigen Makros erzeugt wird, erzwingt eine bestimmte Vordergrundfarbe. -Preferences.label.macroeditor.tooltip = Makroeditordesign. +Preferences.label.macroEditor.tooltip = Makroeditordesign. Preferences.label.facing.edge = Auf Kanten Preferences.label.facing.edge.tooltip = Bewirkt, dass die Spielmarkenblickrichtungsdrehung auf die Kanten der Gitterzelle einrasten soll. Preferences.label.facing.vertices = Auf Ecken @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Lichtdeckkraft Preferences.label.light.opacity.tooltip = Misst, wie undurchsichtig das Lichtoverlay ist (0-255). Hat keine Auswirkung auf Karten mit Umweltlichtern. Preferences.label.fog.opacity = Nebeldeckkraft Preferences.label.fog.opacity.tooltip = Legt die Deckkraft des "weichen Nebels" fest (0-255). -Preferences.label.fog.mapvisibilitywarning = Warnung 'Karte für Spieler nicht sichtbar' ausblenden -Preferences.label.fog.mapvisibilitywarning.tooltip= Warnung, dass Karte nicht sichtbar ist, für Spieler ausblenden. +Preferences.label.fog.mapVisibilityWarning = Warnung 'Karte für Spieler nicht sichtbar' ausblenden +Preferences.label.fog.mapVisibilityWarning.tooltip= Warnung, dass Karte nicht sichtbar ist, für Spieler ausblenden. Preferences.label.fog.autoexpose = \ Nebel bei Spielmarkenbewegung automatisch aufdecken (pers. Server) Preferences.label.fog.autoexpose.tooltip = Falls aktiviert, wird der Kriegsnebel automatisch aufgedeckt, wenn sich eine Spielmarke auf gerasterten Karten bewegt. Bei Serverausführung wird diese Einstellung zugunsten der Einstellungen im 'Server starten' Dialog ignoriert. -Preferences.label.performance.fillselection = Füllauswahlbox -Preferences.label.performance.fillselection.tooltip = Wenn aktiviert, wird beim Ziehen der Maus ein schattierter Bereich verwendet, um mehrere Spielmarken auszuwählen. +Preferences.label.performance.fillSelection = Füllauswahlbox +Preferences.label.performance.fillSelection.tooltip = Wenn aktiviert, wird beim Ziehen der Maus ein schattierter Bereich verwendet, um mehrere Spielmarken auszuwählen. Preferences.label.performance.cap = Kappungsgrenze der Bildrate Preferences.label.performance.cap.tooltip = Kappungsgrenze der Bildrate der Kartendarstellung in FPS. Preferences.label.performance.render = Bildskalierungsqualität @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixelbild Preferences.combo.render.medium = Mittel Preferences.combo.render.high = Hoch (Am langsamsten) Preferences.label.initiative.defaults = Kampagnen-Standards -Preferences.label.initiative.hidenpc = Auf neuen Karten NSCs vor Spielern verbergen -Preferences.label.initiative.hidenpc.tooltip = Wenn aktiviert, werden NSCs in den Spieleransichten der Initiativetafel nicht angezeigt. +Preferences.label.initiative.hideNPC = Auf neuen Karten NSCs vor Spielern verbergen +Preferences.label.initiative.hideNPC.tooltip = Wenn aktiviert, werden NSCs in den Spieleransichten der Initiativetafel nicht angezeigt. Preferences.label.initiative.owner = Eigentümern Rechte in neuen Kampagnen geben Preferences.label.initiative.owner.tooltip = Die Eigentümerberechtigung erlaubt es Spielern, bestimmte Aktionen auf ihren Spielmarken auf der Initiativetafel auszuführen. Preferences.label.initiative.lock = Bewegungen der Spieler in neuen Kampagnen sperren Preferences.label.initiative.lock.tooltip = Wenn aktiviert, können Spieler ihre Spielmarke nur dann verschieben, wenn diese Marke die Initiative hat. Preferences.label.initiative.msg = Zeige "Initiative bekommen" Nachricht Preferences.label.initiative.msg.tooltip = Wenn aktiviert, wird eine Nachricht an den Chat gesendet, sobald eine Spielmarke die Initiative bekommt. -Preferences.label.client.fitview = Auf SL-Ansicht anpassen -Preferences.label.client.fitview.tooltip = Wenn Spieler zur Ansicht des SLs gezwungen werden, sollte die Kartengröße des Spielers so eingestellt werden, dass der Bildschirm mindestens den gleichen Inhalt wie der Bildschirm des SLs anzeigt? +Preferences.label.client.fitView = Auf SL-Ansicht anpassen +Preferences.label.client.fitView.tooltip = Wenn Spieler zur Ansicht des SLs gezwungen werden, sollte die Kartengröße des Spielers so eingestellt werden, dass der Bildschirm mindestens den gleichen Inhalt wie der Bildschirm des SLs anzeigt? Preferences.label.client.default.username = Standard-Benutzername Preferences.label.client.default.username.tooltip = Der Standard-Benutzername, der in der MapTool-Werkzeugleiste dargestellt wird. Preferences.label.installDir = Installationsverzeichnis @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Discovery Timeout Preferences.label.upnp.timeout.tooltip = Wartezeit in Millisekunden, wenn nach UPnP Gateways gesucht wird. Preferences.label.macros.permissions = Externen Makrozugriff zulassen Preferences.label.macros.permissions.tooltip = Erlaube Makros den Aufruf von Funktionen, die auf Ihr Laufwerk und Http. Dienste zugreifen können. Die folgenden Funktionen werden aktiviert\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Hilfetexte für Makrolinks unterdrücken -Preferences.label.chat.macrolinks.tooltip = MacroLinks zeigen normalerweise Hilfetext mit Informationen über das Link-Ziel an. Dies ist ein Betrugsvermeidungsmechanismus. Mit dieser Option können Sie diese Hilfetexte aus ästhetischen Gründen deaktivieren. -Preference.checkbox.chat.macrolinks.tooltip = Aktiviert\: Zeige keinen Hilfetext für macroLink
Deaktiviert (Standard)\: Zeige Hilfetext für Makrolinks +Preferences.label.chat.macroLinks = Hilfetexte für Makrolinks unterdrücken +Preferences.label.chat.macroLinks.tooltip = MacroLinks zeigen normalerweise Hilfetext mit Informationen über das Link-Ziel an. Dies ist ein Betrugsvermeidungsmechanismus. Mit dieser Option können Sie diese Hilfetexte aus ästhetischen Gründen deaktivieren. +Preference.checkbox.chat.macroLinks.tooltip = Aktiviert\: Zeige keinen Hilfetext für macroLink
Deaktiviert (Standard)\: Zeige Hilfetext für Makrolinks PreferencesDialog.themeChangeWarning = Das Ändern des Designs erfordert, um wirksam zu werden, einen Maptoolneustart. PreferencesDialog.themeChangeWarningTitle = Designänderung. Preferences.combo.themes.filter.all = Alle @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Fehler beim Empfang des Spieldaten-Updates. data.error.importGameData = Fehler beim Importieren der Spieldaten. data.error.clearingNamespace = Fehler beim Löschen des Daten-Namensraums {0} vom Typ {1}. data.error.removingData = Fehlerdaten vom Typ\: {0}, Namensraum\: {1}, Name\: {2}. -Label.icontheme=Icon-Design -Preferences.label.icontheme.tooltip=Das Design für Applikations-Icons. -Label.theme.macroeditor=Makroeditordesign +Label.iconTheme=Icon-Design +Preferences.label.iconTheme.tooltip=Das Design für Applikations-Icons. +Label.theme.macroEditor=Makroeditordesign TEXT_TYPE=Text-Typ -EditTokenDialog.button.movevbltoggle.tooltip=Beim Verschieben oder Kopieren Wälle-Vision-Blocking-Layer (Wall VBL) einbeziehen -EditTokenDialog.button.movembltoggle.tooltip=Beim Verschieben oder Kopieren Bewegungshindernisebene (MBL) einbeziehen -EditTokenDialog.button.movehbltoggle.tooltip=Beim Verschieben oder Kopieren Hügel-Vision-Blocking-Layer (Hill VBL) einbeziehen -EditTokenDialog.button.movepbltoggle.tooltip=Beim Verschieben oder Kopieren Gruben-Vision-Blocking-Layer (Pit VBL) einbeziehen -EditTokenDialog.button.movecbltoggle.tooltip=Beim Verschieben oder Kopieren Deck-Vision-Blocking-Layer (Cover VBL) einbeziehen -EditTokenDialog.button.movefrommap.tooltip=Markierte Blocklayer von Karte verschieben oder kopieren -EditTokenDialog.button.movetomap.tooltip=Markierte Blocklayer auf Karte verschieben oder kopieren +EditTokenDialog.button.moveVBToggle.tooltip=Beim Verschieben oder Kopieren Wälle-Vision-Blocking-Layer (Wall VBL) einbeziehen +EditTokenDialog.button.moveMBToggle.tooltip=Beim Verschieben oder Kopieren Bewegungshindernisebene (MBL) einbeziehen +EditTokenDialog.button.moveHBToggle.tooltip=Beim Verschieben oder Kopieren Hügel-Vision-Blocking-Layer (Hill VBL) einbeziehen +EditTokenDialog.button.movePBToggle.tooltip=Beim Verschieben oder Kopieren Gruben-Vision-Blocking-Layer (Pit VBL) einbeziehen +EditTokenDialog.button.moveCBToggle.tooltip=Beim Verschieben oder Kopieren Deck-Vision-Blocking-Layer (Cover VBL) einbeziehen +EditTokenDialog.button.moveFromMap.tooltip=Markierte Blocklayer von Karte verschieben oder kopieren +EditTokenDialog.button.moveToMap.tooltip=Markierte Blocklayer auf Karte verschieben oder kopieren Label.label=Bezeichnung\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_en_AU.properties b/src/main/resources/net/rptools/maptool/language/i18n_en_AU.properties index 46a6fc399f..950a67d8b8 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_en_AU.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_en_AU.properties @@ -149,8 +149,8 @@ Label.objects = Objects Label.token = Token Label.tokens = Tokens Label.backgrounds = Backgrounds -Label.macroeditor = Macro Editor -Label.styletheme = Style Theme +Label.macroEditor = Macro Editor +Label.styleTheme = Style Theme Label.currentTheme = Current Theme Label.filterTheme = Theme Filter Label.useThemeForChat = Use Theme Colours for Chat Window @@ -167,9 +167,9 @@ Label.save = Save Label.minute = min Label.performance = Performance Label.client = Client -Label.macropanels = Macro Panels +Label.macroPanels = Macro Panels Label.upnp = UPnP -Label.macropermissions = Macro Permissions +Label.macroPermissions = Macro Permissions Label.path = Path\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Filesystem ... Label.filesystem2 = Filesystem Label.roll = Roll\: Label.table.image = Table Image -Label.blankdefault = (Leave blank for default) +Label.blankDefault = (Leave blank for default) Label.range = Range Label.image = Image Label.value = Value @@ -196,7 +196,7 @@ Label.table.export = Export Table Label.preview = Preview Label.foreground = Foreground Label.background = Background -Label.showbackground = Show Background +Label.showBackground = Show Background Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Colour @@ -210,7 +210,7 @@ Label.advanced = Advanced Label.view = View\: Label.board = Board Label.visibility = Visibility -Label.pathfilename = Path/Filename\: +Label.pathFilename = Path/Filename\: Label.allowURIAccess = Allow URI Access Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Use Filename Preferences.combo.tokens.naming.creature = Use "{0}" Preferences.label.tokens.dialog = Show Dialog on New Token Preferences.label.tokens.dialog.tooltip = Determines whether the New Token dialog appears when a token is dropped onto the map. -Preferences.label.tokens.statsheet = Statsheet Portrait Size -Preferences.label.tokens.statsheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. +Preferences.label.tokens.statSheet = Statsheet Portrait Size +Preferences.label.tokens.statSheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. Preferences.label.tokens.portrait.mouse = Show Portrait on mouseover Preferences.label.tokens.portrait.mouse.tooltip = Whether to show the portrait when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.mouse = Show statsheet on mouseover -Preferences.label.tokens.statsheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.shift = Stat sheet requires Shift key -Preferences.label.tokens.statsheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. +Preferences.label.tokens.statSheet.mouse = Show statsheet on mouseover +Preferences.label.tokens.statSheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. +Preferences.label.tokens.statSheet.shift = Stat sheet requires Shift key +Preferences.label.tokens.statSheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. Preferences.label.tokens.arrow = Force Token Facing Arrow Preferences.label.tokens.arrow.tooltip = Forces the display of the token facing arrow for Top Down tokens and tokens with image tables. Preferences.label.tokens.drag.snap = Snap Token while dragging @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Trusted Prefix Background Preferences.label.chat.trusted.background.tooltip = Text generated by trusted macros is forced to a particular background colour. Preferences.label.chat.trusted.foreground = Trusted Prefix Foreground Preferences.label.chat.trusted.foreground.tooltip = Text generated by trusted macros is forced to a particular foreground colour. -Preferences.label.macroeditor.tooltip = Theme of the macro editor. +Preferences.label.macroEditor.tooltip = Theme of the macro editor. Preferences.label.facing.edge = On Edges Preferences.label.facing.edge.tooltip = Causes token facing rotation to snap to edges of the grid cell. Preferences.label.facing.vertices = On Vertices @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Light opacity Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Fog opacity Preferences.label.fog.opacity.tooltip = Measures how opaque the "soft fog" overlay is drawn (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = Auto-expose fog on token movement (personal server) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. Gridless maps cannot auto-expose fog. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Fill selection box -Preferences.label.performance.fillselection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. +Preferences.label.performance.fillSelection = Fill selection box +Preferences.label.performance.fillSelection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. Preferences.label.performance.cap = Frame Rate Cap Preferences.label.performance.cap.tooltip = Frame rate cap for map renderer in FPS. Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Campaign Defaults -Preferences.label.initiative.hidenpc = Hide NPCs from players on new maps -Preferences.label.initiative.hidenpc.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. +Preferences.label.initiative.hideNPC = Hide NPCs from players on new maps +Preferences.label.initiative.hideNPC.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. Preferences.label.initiative.owner = Give Owners Permission in new campaigns Preferences.label.initiative.owner.tooltip = Owner Permission allows players to perform certain actions on their tokens in the Initiative panel. Preferences.label.initiative.lock = Lock Player Movement in new campaigns Preferences.label.initiative.lock.tooltip = When enabled, players will only be able to move their token when that token has initiative. Preferences.label.initiative.msg = Show Initiative Gain Message Preferences.label.initiative.msg.tooltip = When enabled, a message is sent to chat when a token gains initiative. -Preferences.label.client.fitview = Fit GM view -Preferences.label.client.fitview.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? +Preferences.label.client.fitView = Fit GM view +Preferences.label.client.fitView.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? Preferences.label.client.default.username = Default Username Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Discovery Timeout Preferences.label.upnp.timeout.tooltip = Timeout period in milliseconds to wait when looking for UPnP gateways. Preferences.label.macros.permissions = Enable External Macro Access Preferences.label.macros.permissions.tooltip = Enable macros to call functions that can access your drive and http services. The following functions will be enabled\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Suppress ToolTips for MacroLinks -Preferences.label.chat.macrolinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = Suppress ToolTips for MacroLinks +Preferences.label.chat.macroLinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Blocking Layer (VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Move Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Blocking Layer (HillVBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Blocking Layer (PitVBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking (Cover VB) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Blocking Layer (VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Move Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Blocking Layer (HillVBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Blocking Layer (PitVBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking (Cover VB) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_en_GB.properties b/src/main/resources/net/rptools/maptool/language/i18n_en_GB.properties index f5c1da5a4a..2be7a8531c 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_en_GB.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_en_GB.properties @@ -149,8 +149,8 @@ Label.objects = Objects Label.token = Token Label.tokens = Tokens Label.backgrounds = Backgrounds -Label.macroeditor = Macro Editor -Label.styletheme = Style Theme +Label.macroEditor = Macro Editor +Label.styleTheme = Style Theme Label.currentTheme = Current Theme Label.filterTheme = Theme Filter Label.useThemeForChat = Use Theme Colors for Chat Window @@ -167,9 +167,9 @@ Label.save = Save Label.minute = min Label.performance = Performance Label.client = Client -Label.macropanels = Macro Panels +Label.macroPanels = Macro Panels Label.upnp = UPnP -Label.macropermissions = Macro Permissions +Label.macroPermissions = Macro Permissions Label.path = Path\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Filesystem ... Label.filesystem2 = Filesystem Label.roll = Roll\: Label.table.image = Table Image -Label.blankdefault = (Leave blank for default) +Label.blankDefault = (Leave blank for default) Label.range = Range Label.image = Image Label.value = Value @@ -196,7 +196,7 @@ Label.table.export = Export Table Label.preview = Preview Label.foreground = Foreground Label.background = Background -Label.showbackground = Show Background +Label.showBackground = Show Background Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Colour @@ -210,7 +210,7 @@ Label.advanced = Advanced Label.view = View\: Label.board = Board Label.visibility = Visibility -Label.pathfilename = Path/Filename\: +Label.pathFilename = Path/Filename\: Label.allowURIAccess = Allow URI Access Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Use Filename Preferences.combo.tokens.naming.creature = Use "{0}" Preferences.label.tokens.dialog = Show Dialog on New Token Preferences.label.tokens.dialog.tooltip = Determines whether the New Token dialog appears when a token is dropped onto the map. -Preferences.label.tokens.statsheet = Statsheet Portrait Size -Preferences.label.tokens.statsheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. +Preferences.label.tokens.statSheet = Statsheet Portrait Size +Preferences.label.tokens.statSheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. Preferences.label.tokens.portrait.mouse = Show Portrait on mouseover Preferences.label.tokens.portrait.mouse.tooltip = Whether to show the portrait when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.mouse = Show statsheet on mouseover -Preferences.label.tokens.statsheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.shift = Stat sheet requires Shift key -Preferences.label.tokens.statsheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. +Preferences.label.tokens.statSheet.mouse = Show statsheet on mouseover +Preferences.label.tokens.statSheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. +Preferences.label.tokens.statSheet.shift = Stat sheet requires Shift key +Preferences.label.tokens.statSheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. Preferences.label.tokens.arrow = Force Token Facing Arrow Preferences.label.tokens.arrow.tooltip = Forces the display of the token facing arrow for Top Down tokens and tokens with image tables. Preferences.label.tokens.drag.snap = Snap Token while dragging @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Trusted Prefix Background Preferences.label.chat.trusted.background.tooltip = Text generated by trusted macros is forced to a particular background color. Preferences.label.chat.trusted.foreground = Trusted Prefix Foreground Preferences.label.chat.trusted.foreground.tooltip = Text generated by trusted macros is forced to a particular foreground color. -Preferences.label.macroeditor.tooltip = Theme of the macro editor. +Preferences.label.macroEditor.tooltip = Theme of the macro editor. Preferences.label.facing.edge = On Edges Preferences.label.facing.edge.tooltip = Causes token facing rotation to snap to edges of the grid cell. Preferences.label.facing.vertices = On Vertices @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Light opacity Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Fog opacity Preferences.label.fog.opacity.tooltip = Measures how opaque the "soft fog" overlay is drawn (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = Auto-expose fog on token movement (personal server) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Fill selection box -Preferences.label.performance.fillselection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. +Preferences.label.performance.fillSelection = Fill selection box +Preferences.label.performance.fillSelection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. Preferences.label.performance.cap = Frame Rate Cap Preferences.label.performance.cap.tooltip = Frame rate cap for map renderer in FPS. Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Campaign Defaults -Preferences.label.initiative.hidenpc = Hide NPCs from players on new maps -Preferences.label.initiative.hidenpc.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. +Preferences.label.initiative.hideNPC = Hide NPCs from players on new maps +Preferences.label.initiative.hideNPC.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. Preferences.label.initiative.owner = Give Owners Permission in new campaigns Preferences.label.initiative.owner.tooltip = Owner Permission allows players to perform certain actions on their tokens in the Initiative panel. Preferences.label.initiative.lock = Lock Player Movement in new campaigns Preferences.label.initiative.lock.tooltip = When enabled, players will only be able to move their token when that token has initiative. Preferences.label.initiative.msg = Show Initiative Gain Message Preferences.label.initiative.msg.tooltip = When enabled, a message is sent to chat when a token gains initiative. -Preferences.label.client.fitview = Fit GM view -Preferences.label.client.fitview.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? +Preferences.label.client.fitView = Fit GM view +Preferences.label.client.fitView.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? Preferences.label.client.default.username = Default Username Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Discovery Timeout Preferences.label.upnp.timeout.tooltip = Timeout period in milliseconds to wait when looking for UPnP gateways. Preferences.label.macros.permissions = Enable External Macro Access Preferences.label.macros.permissions.tooltip = Enable macros to call functions that can access your drive and http services. The following functions will be enabled\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Suppress ToolTips for MacroLinks -Preferences.label.chat.macrolinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = Suppress ToolTips for MacroLinks +Preferences.label.chat.macroLinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Blocking (VB) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Move Blocking (MB) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking (Hill VB) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking (Pit VB) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking (Cover VB) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Blocking (VB) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Move Blocking (MB) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking (Hill VB) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking (Pit VB) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking (Cover VB) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_es_ES.properties b/src/main/resources/net/rptools/maptool/language/i18n_es_ES.properties index 57b4bb2a62..543d5bd91e 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_es_ES.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_es_ES.properties @@ -149,8 +149,8 @@ Label.objects = Objects Label.token = Token Label.tokens = Tokens Label.backgrounds = Backgrounds -Label.macroeditor = Macro Editor -Label.styletheme = Style Theme +Label.macroEditor = Macro Editor +Label.styleTheme = Style Theme Label.currentTheme = Current Theme Label.filterTheme = Theme Filter Label.useThemeForChat = Use Theme Colors for Chat Window @@ -167,9 +167,9 @@ Label.save = Save Label.minute = min Label.performance = Performance Label.client = Client -Label.macropanels = Macro Panels +Label.macroPanels = Macro Panels Label.upnp = UPnP -Label.macropermissions = Macro Permissions +Label.macroPermissions = Macro Permissions Label.path = Path\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Filesystem ... Label.filesystem2 = Filesystem Label.roll = Roll\: Label.table.image = Table Image -Label.blankdefault = (Leave blank for default) +Label.blankDefault = (Leave blank for default) Label.range = Range Label.image = Image Label.value = Value @@ -196,7 +196,7 @@ Label.table.export = Export Table Label.preview = Preview Label.foreground = Foreground\: Label.background = Background\: -Label.showbackground = Show Background\: +Label.showBackground = Show Background\: Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Color @@ -210,7 +210,7 @@ Label.advanced = Advanced Label.view = View\: Label.board = Board Label.visibility = Visibility -Label.pathfilename = Path/Filename\: +Label.pathFilename = Path/Filename\: Label.allowURIAccess = Allow URI Access Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Use Filename Preferences.combo.tokens.naming.creature = Use "{0}" Preferences.label.tokens.dialog = Show Dialog on New Token Preferences.label.tokens.dialog.tooltip = Determines whether the New Token dialog appears when a token is dropped onto the map. -Preferences.label.tokens.statsheet = Statsheet Portrait Size -Preferences.label.tokens.statsheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. +Preferences.label.tokens.statSheet = Statsheet Portrait Size +Preferences.label.tokens.statSheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. Preferences.label.tokens.portrait.mouse = Show Portrait on mouseover Preferences.label.tokens.portrait.mouse.tooltip = Whether to show the portrait when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.mouse = Show statsheet on mouseover -Preferences.label.tokens.statsheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.shift = Stat sheet requires Shift key -Preferences.label.tokens.statsheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. +Preferences.label.tokens.statSheet.mouse = Show statsheet on mouseover +Preferences.label.tokens.statSheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. +Preferences.label.tokens.statSheet.shift = Stat sheet requires Shift key +Preferences.label.tokens.statSheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. Preferences.label.tokens.arrow = Force Token Facing Arrow Preferences.label.tokens.arrow.tooltip = Forces the display of the token facing arrow for Top Down tokens and tokens with image tables. Preferences.label.tokens.drag.snap = Snap Token while dragging @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Trusted Prefix Background Preferences.label.chat.trusted.background.tooltip = Text generated by trusted macros is forced to a particular background color. Preferences.label.chat.trusted.foreground = Trusted Prefix Foreground Preferences.label.chat.trusted.foreground.tooltip = Text generated by trusted macros is forced to a particular foreground color. -Preferences.label.macroeditor.tooltip = Theme of the macro editor. +Preferences.label.macroEditor.tooltip = Theme of the macro editor. Preferences.label.facing.edge = On Edges Preferences.label.facing.edge.tooltip = Causes token facing rotation to snap to edges of the grid cell. Preferences.label.facing.vertices = On Vertices @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Light opacity Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Fog opacity Preferences.label.fog.opacity.tooltip = Measures how opaque the "soft fog" overlay is drawn (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = Auto-expose fog on token movement (personal server) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Fill selection box -Preferences.label.performance.fillselection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. +Preferences.label.performance.fillSelection = Fill selection box +Preferences.label.performance.fillSelection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. Preferences.label.performance.cap = Frame Rate Cap Preferences.label.performance.cap.tooltip = Frame rate cap for map renderer in FPS. Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Campaign Defaults -Preferences.label.initiative.hidenpc = Hide NPCs from players on new maps -Preferences.label.initiative.hidenpc.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. +Preferences.label.initiative.hideNPC = Hide NPCs from players on new maps +Preferences.label.initiative.hideNPC.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. Preferences.label.initiative.owner = Give Owners Permission in new campaigns Preferences.label.initiative.owner.tooltip = Owner Permission allows players to perform certain actions on their tokens in the Initiative panel. Preferences.label.initiative.lock = Lock Player Movement in new campaigns Preferences.label.initiative.lock.tooltip = When enabled, players will only be able to move their token when that token has initiative. Preferences.label.initiative.msg = Show Initiative Gain Message Preferences.label.initiative.msg.tooltip = When enabled, a message is sent to chat when a token gains initiative. -Preferences.label.client.fitview = Fit GM view -Preferences.label.client.fitview.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? +Preferences.label.client.fitView = Fit GM view +Preferences.label.client.fitView.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? Preferences.label.client.default.username = Default Username Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Discovery Timeout Preferences.label.upnp.timeout.tooltip = Timeout period in milliseconds to wait when looking for UPnP gateways. Preferences.label.macros.permissions = Enable External Macro Access Preferences.label.macros.permissions.tooltip = Enable macros to call functions that can access your drive and http services. The following functions will be enabled\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Suppress ToolTips for MacroLinks -Preferences.label.chat.macrolinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = Suppress ToolTips for MacroLinks +Preferences.label.chat.macroLinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_fr_FR.properties b/src/main/resources/net/rptools/maptool/language/i18n_fr_FR.properties index 20ea55fa72..ec0d9c46ea 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_fr_FR.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_fr_FR.properties @@ -149,8 +149,8 @@ Label.objects = Objets Label.token = Pion Label.tokens = Pions Label.backgrounds = Arrière-plan -Label.macroeditor = Éditeur de macro -Label.styletheme = Thème de style +Label.macroEditor = Éditeur de macro +Label.styleTheme = Thème de style Label.currentTheme = Current Theme Label.filterTheme = Theme Filter Label.useThemeForChat = Use Theme Colors for Chat Window @@ -167,9 +167,9 @@ Label.save = Enregistrer Label.minute = minutes Label.performance = Performance Label.client = Client -Label.macropanels = Panneaux Macro +Label.macroPanels = Panneaux Macro Label.upnp = UPnP -Label.macropermissions = Permissions macro +Label.macroPermissions = Permissions macro Label.path = Chemin\: Label.url = URL Label.url2 = URL \: @@ -186,7 +186,7 @@ Label.filesystem = Système de fichiers... Label.filesystem2 = Système de fichiers Label.roll = Lancer\: Label.table.image = Image tableau -Label.blankdefault = (Laisser vide pour les valeurs par défaut) +Label.blankDefault = (Laisser vide pour les valeurs par défaut) Label.range = Distance Label.image = Image Label.value = Valeur @@ -196,7 +196,7 @@ Label.table.export = Exporter la table Label.preview = Aperçu  Label.foreground = Premier plan\: Label.background = Background\: -Label.showbackground = Afficher l'arrière-plan\: +Label.showBackground = Afficher l'arrière-plan\: Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Color @@ -210,7 +210,7 @@ Label.advanced = Avancé Label.view = Vue\: Label.board = Tableau Label.visibility = Visibilité -Label.pathfilename = Chemin d'accès / nom de fichier \: +Label.pathFilename = Chemin d'accès / nom de fichier \: Label.allowURIAccess = Allow URI Access Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Use Filename Preferences.combo.tokens.naming.creature = Use "{0}" Preferences.label.tokens.dialog = Boîte de dialogue lors de la création de pions Preferences.label.tokens.dialog.tooltip = Détermine si la boîte de dialogue Nouveau pion apparaît lorsqu'un pion est déposé sur la carte. -Preferences.label.tokens.statsheet = Taille de la feuille de stats -Preferences.label.tokens.statsheet.tooltip = Taille de l'image qui apparaît à côté de la feuille de stats lors du survole de la souris. Réglez sur zéro pour désactiver les portraits. +Preferences.label.tokens.statSheet = Taille de la feuille de stats +Preferences.label.tokens.statSheet.tooltip = Taille de l'image qui apparaît à côté de la feuille de stats lors du survole de la souris. Réglez sur zéro pour désactiver les portraits. Preferences.label.tokens.portrait.mouse = Afficher le portrait en survol de souris Preferences.label.tokens.portrait.mouse.tooltip = Afficher/Masquer le portrait lorsque la souris survole un pion. -Preferences.label.tokens.statsheet.mouse = Afficher la feuille de stats en survol de souris -Preferences.label.tokens.statsheet.mouse.tooltip = Afficher/Masquer la feuille de statistiques lorsque la souris survole un pion. -Preferences.label.tokens.statsheet.shift = Touche Maj pour feuille stats -Preferences.label.tokens.statsheet.shift.tooltip = La feuille de statistiques ne s'affiche que lorsque la souris passe au-dessus d'un jeton si la touche Maj est maintenue enfoncée. Sinon, la touche Maj masquera la feuille de statistiques au survol de la souris. +Preferences.label.tokens.statSheet.mouse = Afficher la feuille de stats en survol de souris +Preferences.label.tokens.statSheet.mouse.tooltip = Afficher/Masquer la feuille de statistiques lorsque la souris survole un pion. +Preferences.label.tokens.statSheet.shift = Touche Maj pour feuille stats +Preferences.label.tokens.statSheet.shift.tooltip = La feuille de statistiques ne s'affiche que lorsque la souris passe au-dessus d'un jeton si la touche Maj est maintenue enfoncée. Sinon, la touche Maj masquera la feuille de statistiques au survol de la souris. Preferences.label.tokens.arrow = Forcer la flèche d'orientation Preferences.label.tokens.arrow.tooltip = Force l'affichage de la flèche d'orientation pour les pions Top Down et les pions avec une table d'images. Preferences.label.tokens.drag.snap = Aligner le jeton en faisant glisser @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Arrière-plan du préfixe fi Preferences.label.chat.trusted.background.tooltip = Le texte généré par des macros de confiance est forcé à une couleur d'arrière-plan particulière. Preferences.label.chat.trusted.foreground = Premier plan du préfixe fiable Preferences.label.chat.trusted.foreground.tooltip = Le texte généré par des macros de confiance est forcé à une couleur de premier plan particulière. -Preferences.label.macroeditor.tooltip = Thème de l'éditeur de macro. +Preferences.label.macroEditor.tooltip = Thème de l'éditeur de macro. Preferences.label.facing.edge = Sur l'arête Preferences.label.facing.edge.tooltip = La rotation du pion s'accroche aux bords de la cellule de la grille. Preferences.label.facing.vertices = Sur les sommets @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Opacité lumière Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Opacité brouillard Preferences.label.fog.opacity.tooltip = Mesure à quel point le brouillard léger est dessiné (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = Auto-exposer le brouillard sur mouvement (serveur personnel) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Remplir la sélection -Preferences.label.performance.fillselection.tooltip = Si activé, une zone ombragée est utilisée lorsque vous faites glisser la souris pour sélectionner plusieurs pions. +Preferences.label.performance.fillSelection = Remplir la sélection +Preferences.label.performance.fillSelection.tooltip = Si activé, une zone ombragée est utilisée lorsque vous faites glisser la souris pour sélectionner plusieurs pions. Preferences.label.performance.cap = Limite IPS Preferences.label.performance.cap.tooltip = Limite de fréquence d'images par secondes (IPS) pour le moteur de rendu de carte. Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Valeurs par défaut de campagne -Preferences.label.initiative.hidenpc = Cacher les PNJ aux joueurs sur les nouvelles cartes -Preferences.label.initiative.hidenpc.tooltip = Si activé, les PNJ n'apparaîtront pas dans les vues des joueurs du panneau d'initiative. +Preferences.label.initiative.hideNPC = Cacher les PNJ aux joueurs sur les nouvelles cartes +Preferences.label.initiative.hideNPC.tooltip = Si activé, les PNJ n'apparaîtront pas dans les vues des joueurs du panneau d'initiative. Preferences.label.initiative.owner = Donner la permission aux propriétaires Preferences.label.initiative.owner.tooltip = La permission du propriétaire permet aux joueurs d'effectuer certaines actions sur leurs pions dans le panneau d'initiative. Preferences.label.initiative.lock = Verrouiller le mouvement du joueur Preferences.label.initiative.lock.tooltip = Lorsque cette option est activée, les joueurs ne pourront déplacer leur pion que lorsque ce pion aura l'initiative. Preferences.label.initiative.msg = Message de gain d'initiative Preferences.label.initiative.msg.tooltip = Lorsqu'il est activé, un message est envoyé au chat lorsqu'un pion acquiert l'initiative. -Preferences.label.client.fitview = Ajuster à la vue GM -Preferences.label.client.fitview.tooltip = En forçant les joueurs à la vue du MJ, doit-on zoomer la carte du joueur de telle sorte que son écran affiche au moins le même contenu que l'écran du MJ? +Preferences.label.client.fitView = Ajuster à la vue GM +Preferences.label.client.fitView.tooltip = En forçant les joueurs à la vue du MJ, doit-on zoomer la carte du joueur de telle sorte que son écran affiche au moins le même contenu que l'écran du MJ? Preferences.label.client.default.username = Default Username Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Délai de découverte Preferences.label.upnp.timeout.tooltip = Période d'attente en millisecondes à attendre lors de la recherche de passerelles UPnP. Preferences.label.macros.permissions = Accès aux macros externes Preferences.label.macros.permissions.tooltip = Permettre aux macros d'appeler des fonctions qui peuvent accéder à votre lecteur et aux services http. Les fonctions suivantes seront activées \: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Réprimer les infobulles pour les MacroLinks -Preferences.label.chat.macrolinks.tooltip = Les MacroLinks montrent normalement des infobulles qui affichent des informations sur la cible du lien. Ceci est un dispositif anti-triche. Cette option vous permet de désactiver ces infobulles pour des raisons esthétiques. -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = Réprimer les infobulles pour les MacroLinks +Preferences.label.chat.macroLinks.tooltip = Les MacroLinks montrent normalement des infobulles qui affichent des informations sur la cible du lien. Ceci est un dispositif anti-triche. Cette option vous permet de désactiver ces infobulles pour des raisons esthétiques. +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_it_IT.properties b/src/main/resources/net/rptools/maptool/language/i18n_it_IT.properties index 38141f2655..03076c0263 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_it_IT.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_it_IT.properties @@ -149,8 +149,8 @@ Label.objects = Oggetti Label.token = Token Label.tokens = Token Label.backgrounds = Sfondi -Label.macroeditor = Editor Macro -Label.styletheme = Stile Tema +Label.macroEditor = Editor Macro +Label.styleTheme = Stile Tema Label.currentTheme = Tema Attuale Label.filterTheme = Filtro Tema Label.useThemeForChat = Usa i colori del tema per la finestra di chat @@ -167,9 +167,9 @@ Label.save = Salva Label.minute = min Label.performance = Performance Label.client = Client -Label.macropanels = Pannelli Macro +Label.macroPanels = Pannelli Macro Label.upnp = UPnP -Label.macropermissions = Permessi Macro +Label.macroPermissions = Permessi Macro Label.path = Percorso\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Filesystem ... Label.filesystem2 = Filesystem Label.roll = Dadi\: Label.table.image = Immagine Tabella -Label.blankdefault = (Lasciare vuoto per impostazione predefinita) +Label.blankDefault = (Lasciare vuoto per impostazione predefinita) Label.range = Intervallo Label.image = Immagine Label.value = Valore @@ -196,7 +196,7 @@ Label.table.export = Esporta Tabella Label.preview = Anteprima Label.foreground = Primo Piano\: Label.background = Background\: -Label.showbackground = Mostra Sfondo\: +Label.showBackground = Mostra Sfondo\: Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Color @@ -210,7 +210,7 @@ Label.advanced = Avanzato Label.view = Vista\: Label.board = Tavola Label.visibility = Visibilità -Label.pathfilename = Percorso/Nome File\: +Label.pathFilename = Percorso/Nome File\: Label.allowURIAccess = Consenti Accesso URI Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Usa Nome File Preferences.combo.tokens.naming.creature = Usa "{0}" Preferences.label.tokens.dialog = Mostra la finestra di dialogo sul nuovo token Preferences.label.tokens.dialog.tooltip = Determina se la finestra di dialogo Nuovo Token viene visualizzata quando un token viene trascinato sulla mappa. -Preferences.label.tokens.statsheet = Dimensione ritratti statistiche -Preferences.label.tokens.statsheet.tooltip = Dimensione dell'immagine che appare accanto alle statistiche quando il cursore passa sul token. Impostare a zero per disabilitare i ritratti. +Preferences.label.tokens.statSheet = Dimensione ritratti statistiche +Preferences.label.tokens.statSheet.tooltip = Dimensione dell'immagine che appare accanto alle statistiche quando il cursore passa sul token. Impostare a zero per disabilitare i ritratti. Preferences.label.tokens.portrait.mouse = Mostra ritratto su passaggio del mouse Preferences.label.tokens.portrait.mouse.tooltip = Indica se mostrare il ritratto quando il mouse passa sopra un Token. -Preferences.label.tokens.statsheet.mouse = Mostra statistiche su passaggio del mouse -Preferences.label.tokens.statsheet.mouse.tooltip = Indica se mostrare le statistiche quando il mouse passa sopra un Token. -Preferences.label.tokens.statsheet.shift = Riquadro statistiche richiede il tasto Maiusc -Preferences.label.tokens.statsheet.shift.tooltip = Le statistiche verranno mostrate quando il mouse passa sopra un token se anche il tasto Maiusc viene premuto. Altrimenti, il tasto Maiusc nasconderà le statistiche al passaggio del mouse. +Preferences.label.tokens.statSheet.mouse = Mostra statistiche su passaggio del mouse +Preferences.label.tokens.statSheet.mouse.tooltip = Indica se mostrare le statistiche quando il mouse passa sopra un Token. +Preferences.label.tokens.statSheet.shift = Riquadro statistiche richiede il tasto Maiusc +Preferences.label.tokens.statSheet.shift.tooltip = Le statistiche verranno mostrate quando il mouse passa sopra un token se anche il tasto Maiusc viene premuto. Altrimenti, il tasto Maiusc nasconderà le statistiche al passaggio del mouse. Preferences.label.tokens.arrow = Forza freccia direzione token Preferences.label.tokens.arrow.tooltip = Forza la visualizzazione della freccia di orientamento dei token con visualizzazione Top Down (dall'alto) e token con tabelle di immagini. Preferences.label.tokens.drag.snap = Aggancia Token durante il trascinamento @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Sfondo prefisso affidabile Preferences.label.chat.trusted.background.tooltip = Il testo generato da macro fidate è forzato ad un colore di sfondo particolare. Preferences.label.chat.trusted.foreground = Primo piano prefisso fidato Preferences.label.chat.trusted.foreground.tooltip = Il testo generato da macro fidate è forzato ad un colore di primo piano particolare. -Preferences.label.macroeditor.tooltip = Tema dell'editor macro. +Preferences.label.macroEditor.tooltip = Tema dell'editor macro. Preferences.label.facing.edge = Sui Bordi Preferences.label.facing.edge.tooltip = Fa comparire la direzione di orientamento dei token sui bordi della cella. Preferences.label.facing.vertices = Sugli Angoli @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Opacità Luce Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Opacità Nebbia Preferences.label.fog.opacity.tooltip = Misura l'opacità della "nebbia leggera" disegnata (0-255). -Preferences.label.fog.mapvisibilitywarning = Nascondi avviso "Mappa non visibile ai giocatori" -Preferences.label.fog.mapvisibilitywarning.tooltip= Nasconde l'avviso di mappa non visibile ai giocatori. +Preferences.label.fog.mapVisibilityWarning = Nascondi avviso "Mappa non visibile ai giocatori" +Preferences.label.fog.mapVisibilityWarning.tooltip= Nasconde l'avviso di mappa non visibile ai giocatori. Preferences.label.fog.autoexpose = Scopri automaticamente la nebbia al movimento dei token (server personale) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Riempi la casella di selezione -Preferences.label.performance.fillselection.tooltip = Se abilitata, viene utilizzata un'area ombreggiata quando si trascina il mouse per selezionare più token. +Preferences.label.performance.fillSelection = Riempi la casella di selezione +Preferences.label.performance.fillSelection.tooltip = Se abilitata, viene utilizzata un'area ombreggiata quando si trascina il mouse per selezionare più token. Preferences.label.performance.cap = Limite Frame Rate Preferences.label.performance.cap.tooltip = Limite della frequenza dei fotogrammi (FPS) per il rendering della mappa. Preferences.label.performance.render = Qualità Scala Immagine @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medio Preferences.combo.render.high = Alto (più lento) Preferences.label.initiative.defaults = Predefiniti Campagna -Preferences.label.initiative.hidenpc = Nascondi gli NPC dai giocatori sulle nuove mappe -Preferences.label.initiative.hidenpc.tooltip = Se abilitato, gli NPC non appariranno nei pannelli di iniziativa dei giocatori. +Preferences.label.initiative.hideNPC = Nascondi gli NPC dai giocatori sulle nuove mappe +Preferences.label.initiative.hideNPC.tooltip = Se abilitato, gli NPC non appariranno nei pannelli di iniziativa dei giocatori. Preferences.label.initiative.owner = Dare ai proprietari il permesso in nuove campagne Preferences.label.initiative.owner.tooltip = Consente ai giocatori di eseguire determinate azioni sui loro token nel pannello di iniziativa. Preferences.label.initiative.lock = Blocca il movimento dei giocatori nelle nuove campagne Preferences.label.initiative.lock.tooltip = Se abilitato, i giocatori saranno in grado di spostare il loro token solo quando quel token ha iniziativa. Preferences.label.initiative.msg = Mostra Messaggio Di Guadagno Iniziativa Preferences.label.initiative.msg.tooltip = Se abilitato, un messaggio viene inviato in chat quando un token guadagna iniziativa. -Preferences.label.client.fitview = Adatta vista GM -Preferences.label.client.fitview.tooltip = Quando si forzano i giocatori alla vista del GM, la mappa del giocatore dovrebbe essere ingrandita in modo che lo schermo mostri almeno lo stesso contenuto dello schermo del GM? +Preferences.label.client.fitView = Adatta vista GM +Preferences.label.client.fitView.tooltip = Quando si forzano i giocatori alla vista del GM, la mappa del giocatore dovrebbe essere ingrandita in modo che lo schermo mostri almeno lo stesso contenuto dello schermo del GM? Preferences.label.client.default.username = Nome Utente Predefinito Preferences.label.client.default.username.tooltip = Il nome utente predefinito che appare nella barra degli strumenti di MapTool. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Timeout Di Scoperta Preferences.label.upnp.timeout.tooltip = Periodo di tempo in millisecondi da aspettare quando si cercano gateway UPnP. Preferences.label.macros.permissions = Abilita Accesso Macro Esterno Preferences.label.macros.permissions.tooltip = Consente alle macro di chiamare funzioni che possono accedere al disco e ai servizi http. Verranno abilitate le seguenti funzioni\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Sopprimi ToolTips per MacroLinks -Preferences.label.chat.macrolinks.tooltip = Le MacroLinks mostrano normalmente i suggerimenti che indicano le informazioni sull'obiettivo del collegamento. Questo è un dispositivo anti-imbroglio. Questa opzione ti permette di disattivare questo tooltips per ragioni estetiche. -Preference.checkbox.chat.macrolinks.tooltip = Abilitato\: non mostrare i suggerimenti per macroLink
Disabilitato (predefinito)\: mostra i suggerimenti per macroLinks +Preferences.label.chat.macroLinks = Sopprimi ToolTips per MacroLinks +Preferences.label.chat.macroLinks.tooltip = Le MacroLinks mostrano normalmente i suggerimenti che indicano le informazioni sull'obiettivo del collegamento. Questo è un dispositivo anti-imbroglio. Questa opzione ti permette di disattivare questo tooltips per ragioni estetiche. +Preference.checkbox.chat.macroLinks.tooltip = Abilitato\: non mostrare i suggerimenti per macroLink
Disabilitato (predefinito)\: mostra i suggerimenti per macroLinks PreferencesDialog.themeChangeWarning = Cambiare il tema richiede un riavvio di MapTool per avere effetto. PreferencesDialog.themeChangeWarningTitle = Cambio Tema. Preferences.combo.themes.filter.all = Tutti @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Errore nel ricevere l'aggiornamento dei dati data.error.importGameData = Errore nell'importazione dei dati di gioco. data.error.clearingNamespace = Errore nel cancellare lo spazio dei nomi {0} dal tipo {1}. data.error.removingData = Errore nei dati da {0} spazio dei nomi {1} dal tipo {2}. -Label.icontheme=Tema icone -Preferences.label.icontheme.tooltip=Tema usato dalle icone dell'applicazione. -Label.theme.macroeditor=Tema editor macro +Label.iconTheme=Tema icone +Preferences.label.iconTheme.tooltip=Tema usato dalle icone dell'applicazione. +Label.theme.macroEditor=Tema editor macro TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_ja_JP.properties b/src/main/resources/net/rptools/maptool/language/i18n_ja_JP.properties index 13e24bec83..3a2bab051e 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_ja_JP.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_ja_JP.properties @@ -149,8 +149,8 @@ Label.objects = 物体 Label.token = トークン Label.tokens = トークン Label.backgrounds = 背景 -Label.macroeditor = マクロ編集 -Label.styletheme = 書式テーマ +Label.macroEditor = マクロ編集 +Label.styleTheme = 書式テーマ Label.currentTheme = 現在のテーマ Label.filterTheme = テーマの絞込み Label.useThemeForChat = チャットウインドウにテーマの色を使用する @@ -167,9 +167,9 @@ Label.save = 保存 Label.minute = 分 Label.performance = 実行効率 Label.client = クライアント -Label.macropanels = マクロパネル +Label.macroPanels = マクロパネル Label.upnp = UPnP -Label.macropermissions = マクロ権限 +Label.macroPermissions = マクロ権限 Label.path = パス: Label.url = URL Label.url2 = URL: @@ -186,7 +186,7 @@ Label.filesystem = ファイルから選択... Label.filesystem2 = ファイルを選択 Label.roll = ロール: Label.table.image = ロール表画像 -Label.blankdefault = (初期値は空欄) +Label.blankDefault = (初期値は空欄) Label.range = 範囲 Label.image = 画像 Label.value = 値 @@ -196,7 +196,7 @@ Label.table.export = ロール表を書き出す Label.preview = プレビュー Label.foreground = 前面 Label.background = 背面 -Label.showbackground = 背景を表示 +Label.showBackground = 背景を表示 Label.showBorder = 枠線を表示 Label.borderWidth = 枠線の幅 Label.border.color = 枠線の色 @@ -210,7 +210,7 @@ Label.advanced = 上級 Label.view = 表示: Label.board = ボード Label.visibility = 可視性 -Label.pathfilename = パス/ファイ名: +Label.pathFilename = パス/ファイ名: Label.allowURIAccess = URIによる接続を許可 Label.rotation = 回転 #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = ファイル名を使用 Preferences.combo.tokens.naming.creature = 『{0}』を使用 Preferences.label.tokens.dialog = 新規トークン用ダイアログを表示 Preferences.label.tokens.dialog.tooltip = 地図上にトークンを配置したときに新規トークンダイアログを表示するかどうか。 -Preferences.label.tokens.statsheet = データ欄の肖像画像サイズ -Preferences.label.tokens.statsheet.tooltip = マウスをかざしたときにデータ欄の隣に表示される画像の大きさ。0を設定すると肖像画像の表示が無効になる。 +Preferences.label.tokens.statSheet = データ欄の肖像画像サイズ +Preferences.label.tokens.statSheet.tooltip = マウスをかざしたときにデータ欄の隣に表示される画像の大きさ。0を設定すると肖像画像の表示が無効になる。 Preferences.label.tokens.portrait.mouse = マウスをかざすことで肖像画像を表示 Preferences.label.tokens.portrait.mouse.tooltip = トークン上にマウスをかざしたときに肖像画像を表示するかどうか。 -Preferences.label.tokens.statsheet.mouse = マウスをかざすことでデータ欄を表示 -Preferences.label.tokens.statsheet.mouse.tooltip = トークン上にマウスをかざしたときにデータ欄を表示するかどうか。 -Preferences.label.tokens.statsheet.shift = データ欄表示にはSHIFTキーが必要 -Preferences.label.tokens.statsheet.shift.tooltip = SHIFTキーを押した状態でマウスをかざしたときにのみデータ欄を表示するようにする。そうしない場合、SHIFTキーはマウスをかざしたときにデータ欄を非表示にする。 +Preferences.label.tokens.statSheet.mouse = マウスをかざすことでデータ欄を表示 +Preferences.label.tokens.statSheet.mouse.tooltip = トークン上にマウスをかざしたときにデータ欄を表示するかどうか。 +Preferences.label.tokens.statSheet.shift = データ欄表示にはSHIFTキーが必要 +Preferences.label.tokens.statSheet.shift.tooltip = SHIFTキーを押した状態でマウスをかざしたときにのみデータ欄を表示するようにする。そうしない場合、SHIFTキーはマウスをかざしたときにデータ欄を非表示にする。 Preferences.label.tokens.arrow = トークンの方向矢印を強制 Preferences.label.tokens.arrow.tooltip = 見下ろしトークンや画像ロール表を用いたトークンにおいて方向を示す矢印を強制的に表示する。 Preferences.label.tokens.drag.snap = ドラッグ時にトークンを吸着 @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = 信頼済みマクロの背 Preferences.label.chat.trusted.background.tooltip = 信頼済みマクロが生成する文字には強制的に指定した背景色が表示される。 Preferences.label.chat.trusted.foreground = 信頼済みマクロの文字色 Preferences.label.chat.trusted.foreground.tooltip = 信頼済みマクロが生成する文字には強制的に指定した文字色になる。 -Preferences.label.macroeditor.tooltip = マクロ編集のテーマ。 +Preferences.label.macroEditor.tooltip = マクロ編集のテーマ。 Preferences.label.facing.edge = 角に沿って表示 Preferences.label.facing.edge.tooltip = トークン方向はマス目の角に沿って循環する。 Preferences.label.facing.vertices = 辺に沿って表示 @@ -758,12 +758,12 @@ Preferences.label.light.opacity = 照明の不透明度 Preferences.label.light.opacity.tooltip = 照度描写の透明度を指定する(0~255)。環境光を持つ地図では影響を与えない。 Preferences.label.fog.opacity = 不明領域の不透明度 Preferences.label.fog.opacity.tooltip = 『半不明領域』の着色の不透明度を指定する(0~255)。 -Preferences.label.fog.mapvisibilitywarning = 『この地図はプレイヤーに非表示中』の警告を表示しない -Preferences.label.fog.mapvisibilitywarning.tooltip= プレイヤーに対して地図が非表示であることを伝える警告を非表示にする。 +Preferences.label.fog.mapVisibilityWarning = 『この地図はプレイヤーに非表示中』の警告を表示しない +Preferences.label.fog.mapVisibilityWarning.tooltip= プレイヤーに対して地図が非表示であることを伝える警告を非表示にする。 Preferences.label.fog.autoexpose = トークンの移動時に自動的に不明領域を公開(個人サーバー) Preferences.label.fog.autoexpose.tooltip = 有効にした場合、不明領域はマス目のある地図上でのトークンの移動時に自動的に公開されるようになる。サーバー実行時、『サーバー起動』ダイアログの中で、嗜好に合わせこの設定を無効にすることができる。 -Preferences.label.performance.fillselection = 範囲選択ボックス内の影 -Preferences.label.performance.fillselection.tooltip = 有効にした場合、マウスをドラッグして複数のトークンを選択する際、半透明の影を使用する。 +Preferences.label.performance.fillSelection = 範囲選択ボックス内の影 +Preferences.label.performance.fillSelection.tooltip = 有効にした場合、マウスをドラッグして複数のトークンを選択する際、半透明の影を使用する。 Preferences.label.performance.cap = フレームレート上限 Preferences.label.performance.cap.tooltip = 地図描画のフレームレート上限をFPS(コマ/秒)で指定。 Preferences.label.performance.render = 画像拡縮品質 @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = ピクセル画 Preferences.combo.render.medium = 中画質 Preferences.combo.render.high = 高画質(低速) Preferences.label.initiative.defaults = キャンペーンの標準設定 -Preferences.label.initiative.hidenpc = 新規地図において、NPCはプレイヤーに非表示 -Preferences.label.initiative.hidenpc.tooltip = 有効にした場合、プレイヤー画面のイニシアチブパネルにNPCは表示されない。 +Preferences.label.initiative.hideNPC = 新規地図において、NPCはプレイヤーに非表示 +Preferences.label.initiative.hideNPC.tooltip = 有効にした場合、プレイヤー画面のイニシアチブパネルにNPCは表示されない。 Preferences.label.initiative.owner = 新規キャンペーンにおいて、所有者権限を与える Preferences.label.initiative.owner.tooltip = 所有者権限はイニシアチブパネル上のトークンに対して特定の操作をプレイヤーが行えるようにする。 Preferences.label.initiative.lock = 新規キャンペーンでは、プレイヤーの移動操作を制限 Preferences.label.initiative.lock.tooltip = 有効にした場合、プレイヤーはトークンがイニシアチブを得ている時のみ移動操作を行える。 Preferences.label.initiative.msg = イニシアチブ獲得メッセージを表示 Preferences.label.initiative.msg.tooltip = 有効にした場合、トークンがイニシアチブを得たときにチャットにメッセージを表示する。 -Preferences.label.client.fitview = GM表示に合わせる -Preferences.label.client.fitview.tooltip = プレイヤーにGM表示を強制する場合、GMの画面に表示されている内容が全て見えるようにプレイヤーの地図表示の拡大率を調整する。 +Preferences.label.client.fitView = GM表示に合わせる +Preferences.label.client.fitView.tooltip = プレイヤーにGM表示を強制する場合、GMの画面に表示されている内容が全て見えるようにプレイヤーの地図表示の拡大率を調整する。 Preferences.label.client.default.username = ユーザー名の初期値 Preferences.label.client.default.username.tooltip = MapToolのツールバーに表示されるユーザー名の初期値。 Preferences.label.installDir = インストール先ディレクトリ @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = 探索の継続時間 Preferences.label.upnp.timeout.tooltip = UPnPゲートウェイを探す際に、探索を継続する時間をミリ秒で指定する。 Preferences.label.macros.permissions = 外部接続マクロを有効にする Preferences.label.macros.permissions.tooltip = パソコンのドライブやHTTPサービスに接続可能な関数を呼び出すマクロを有効にする。次の関数が有効となる:getRequest、postRequest、exportData、getEnvironmentVariable。 -Preferences.label.chat.macrolinks = マクロリンクのツールチップを抑制 -Preferences.label.chat.macrolinks.tooltip = マクロリンクは通常であればリンク先の情報を表示するツールチップを表示する。これはイカサマを防ぐ機構である。この設定項目は美学に則りツールチップを非表示する機能を提供する。 -Preference.checkbox.chat.macrolinks.tooltip = 有効:マクロリンクにツールチップを表示しない
無効(初期値):マクロリンクにツールチップを表示する。 +Preferences.label.chat.macroLinks = マクロリンクのツールチップを抑制 +Preferences.label.chat.macroLinks.tooltip = マクロリンクは通常であればリンク先の情報を表示するツールチップを表示する。これはイカサマを防ぐ機構である。この設定項目は美学に則りツールチップを非表示する機能を提供する。 +Preference.checkbox.chat.macroLinks.tooltip = 有効:マクロリンクにツールチップを表示しない
無効(初期値):マクロリンクにツールチップを表示する。 PreferencesDialog.themeChangeWarning = テーマ変更の効果を得るには MapTool を再起動する必要があります。 PreferencesDialog.themeChangeWarningTitle = テーマの変更。 Preferences.combo.themes.filter.all = 全て @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = ゲームデータの更新を受信中にエ data.error.importGameData = ゲームデータの取り込み中にエラーが発生しました。 data.error.clearingNamespace = 型 {1} の名前空間 {0} の除去中にエラーが発生しました。 data.error.removingData = 型 {2} の名前空間 {1} のデータ {0} にエラーが発生しました。 -Label.icontheme=アイコンテーマ -Preferences.label.icontheme.tooltip=使用するアプリケーションアイコンのテーマ。 -Label.theme.macroeditor=マクロエディターのテーマ +Label.iconTheme=アイコンテーマ +Preferences.label.iconTheme.tooltip=使用するアプリケーションアイコンのテーマ。 +Label.theme.macroEditor=マクロエディターのテーマ TEXT_TYPE=テキスト種別 -EditTokenDialog.button.movevbltoggle.tooltip=移動または複製時に壁遮光レイヤーを含む -EditTokenDialog.button.movembltoggle.tooltip=移動または複製時に障壁レイヤーを含む -EditTokenDialog.button.movehbltoggle.tooltip=移動または複製時に丘遮光レイヤーを含む -EditTokenDialog.button.movepbltoggle.tooltip=移動または複製時に穴遮光レイヤーを含む -EditTokenDialog.button.movecbltoggle.tooltip=移動または複製時に覆い遮光レイヤーを含む -EditTokenDialog.button.movefrommap.tooltip=選択した障壁レイヤーを地図から移動または複製する -EditTokenDialog.button.movetomap.tooltip=選択した障壁レイヤーを地図へ移動または複製する +EditTokenDialog.button.moveVBToggle.tooltip=移動または複製時に壁遮光レイヤーを含む +EditTokenDialog.button.moveMBToggle.tooltip=移動または複製時に障壁レイヤーを含む +EditTokenDialog.button.moveHBToggle.tooltip=移動または複製時に丘遮光レイヤーを含む +EditTokenDialog.button.movePBToggle.tooltip=移動または複製時に穴遮光レイヤーを含む +EditTokenDialog.button.moveCBToggle.tooltip=移動または複製時に覆い遮光レイヤーを含む +EditTokenDialog.button.moveFromMap.tooltip=選択した障壁レイヤーを地図から移動または複製する +EditTokenDialog.button.moveToMap.tooltip=選択した障壁レイヤーを地図へ移動または複製する Label.label=ラベル: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_nl_NL.properties b/src/main/resources/net/rptools/maptool/language/i18n_nl_NL.properties index 025390098d..fa2fd0d0e2 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_nl_NL.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_nl_NL.properties @@ -149,8 +149,8 @@ Label.objects = Objecten Label.token = Token Label.tokens = Tokens Label.backgrounds = Achtergronden -Label.macroeditor = Macro Editor -Label.styletheme = Stijl Thema +Label.macroEditor = Macro Editor +Label.styleTheme = Stijl Thema Label.currentTheme = Huidig Thema Label.filterTheme = Thema Filter Label.useThemeForChat = Gebruik thema kleuren voor chatvenster @@ -167,9 +167,9 @@ Label.save = Opslaan Label.minute = min. Label.performance = Prestaties Label.client = Client -Label.macropanels = Macropanelen +Label.macroPanels = Macropanelen Label.upnp = UPnP -Label.macropermissions = Macro rechten +Label.macroPermissions = Macro rechten Label.path = Bestandspad\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Bestandssysteem ... Label.filesystem2 = Bestandssysteem Label.roll = Rol\: Label.table.image = Tabel afbeelding -Label.blankdefault = (Laat leeg voor de standaardwaarde) +Label.blankDefault = (Laat leeg voor de standaardwaarde) Label.range = Bereik Label.image = Afbeelding Label.value = Waarde @@ -196,7 +196,7 @@ Label.table.export = Exporteer tabel Label.preview = Voorbeeld Label.foreground = Voorgrond Label.background = Achtergrond -Label.showbackground = Achtergrond tonen +Label.showBackground = Achtergrond tonen Label.showBorder = Toon rand Label.borderWidth = Rand dikte Label.border.color = Rand kleur @@ -210,7 +210,7 @@ Label.advanced = Geavanceerd Label.view = Weergave\: Label.board = Bord Label.visibility = Zichtbaarheid -Label.pathfilename = Pad/Bestandsnaam\: +Label.pathFilename = Pad/Bestandsnaam\: Label.allowURIAccess = URI toegang toestaan Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Bestandsnaam gebruiken Preferences.combo.tokens.naming.creature = Gebruik "{0}" Preferences.label.tokens.dialog = Dialoogvenster weergeven bij Nieuw Token Preferences.label.tokens.dialog.tooltip = Bepaalt of het Nieuw Token dialoogvenster wordt weergegeven wanneer een token op de kaart wordt geplaatst. -Preferences.label.tokens.statsheet = Statsheet Portrait Size -Preferences.label.tokens.statsheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. +Preferences.label.tokens.statSheet = Statsheet Portrait Size +Preferences.label.tokens.statSheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. Preferences.label.tokens.portrait.mouse = Toon portret bij mouseover Preferences.label.tokens.portrait.mouse.tooltip = Whether to show the portrait when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.mouse = Toon statsheet bij mouseover -Preferences.label.tokens.statsheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.shift = Stat sheet requires Shift key -Preferences.label.tokens.statsheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. +Preferences.label.tokens.statSheet.mouse = Toon statsheet bij mouseover +Preferences.label.tokens.statSheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. +Preferences.label.tokens.statSheet.shift = Stat sheet requires Shift key +Preferences.label.tokens.statSheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. Preferences.label.tokens.arrow = Force Token Facing Arrow Preferences.label.tokens.arrow.tooltip = Forces the display of the token facing arrow for Top Down tokens and tokens with image tables. Preferences.label.tokens.drag.snap = Snap Token while dragging @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Trusted Prefix Background Preferences.label.chat.trusted.background.tooltip = Text generated by trusted macros is forced to a particular background color. Preferences.label.chat.trusted.foreground = Trusted Prefix Foreground Preferences.label.chat.trusted.foreground.tooltip = Text generated by trusted macros is forced to a particular foreground color. -Preferences.label.macroeditor.tooltip = Theme of the macro editor. +Preferences.label.macroEditor.tooltip = Theme of the macro editor. Preferences.label.facing.edge = Op de randen Preferences.label.facing.edge.tooltip = Tokenrotatie zal zich aan de randen van de rooster cellen vast klikken. Preferences.label.facing.vertices = Op hoeken @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Licht ondoorzichtigheid Preferences.label.light.opacity.tooltip = Bepaalt hoe ondoorzichtig de licht overlay getekend wordt (0-255). Heeft geen effect op kaarten met 'environmental' licht. Preferences.label.fog.opacity = Mist ondoorzichtigheid Preferences.label.fog.opacity.tooltip = Bepaalt hoe ondoorzichtig de "zachte mist" getekend wordt (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = Automatisch verwijderen van mist bij token beweging (persoonlijke server) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Fill selection box -Preferences.label.performance.fillselection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. +Preferences.label.performance.fillSelection = Fill selection box +Preferences.label.performance.fillSelection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. Preferences.label.performance.cap = Frame Rate Cap Preferences.label.performance.cap.tooltip = Frame rate cap for map renderer in FPS. Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Campaign Defaults -Preferences.label.initiative.hidenpc = Hide NPCs from players on new maps -Preferences.label.initiative.hidenpc.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. +Preferences.label.initiative.hideNPC = Hide NPCs from players on new maps +Preferences.label.initiative.hideNPC.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. Preferences.label.initiative.owner = Give Owners Permission in new campaigns Preferences.label.initiative.owner.tooltip = Owner Permission allows players to perform certain actions on their tokens in the Initiative panel. Preferences.label.initiative.lock = Lock Player Movement in new campaigns Preferences.label.initiative.lock.tooltip = When enabled, players will only be able to move their token when that token has initiative. Preferences.label.initiative.msg = Show Initiative Gain Message Preferences.label.initiative.msg.tooltip = When enabled, a message is sent to chat when a token gains initiative. -Preferences.label.client.fitview = Fit GM view -Preferences.label.client.fitview.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? +Preferences.label.client.fitView = Fit GM view +Preferences.label.client.fitView.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? Preferences.label.client.default.username = Default Username Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Timeout op verbinding Preferences.label.upnp.timeout.tooltip = Time-out periode in milliseconden om te wachten bij het zoeken naar UPnP poorten. Preferences.label.macros.permissions = Externe Macro toegang inschakelen Preferences.label.macros.permissions.tooltip = Geef macro's toegang tot je schijf en http diensten. De volgende functies worden ingeschakeld\: getRequest, postRequest, exportdata en getEnvironmentVariable. -Preferences.label.chat.macrolinks = Onderdruk ToolTips voor MacroLinks -Preferences.label.chat.macrolinks.tooltip = MacroLinks laten normaal tooltips zien met informatie over het resultaat. Dit is om valsspelen te voorkomen. Met deze optie kunt u deze tooltips uitschakelen om esthetische redenen. -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = Onderdruk ToolTips voor MacroLinks +Preferences.label.chat.macroLinks.tooltip = MacroLinks laten normaal tooltips zien met informatie over het resultaat. Dit is om valsspelen te voorkomen. Met deze optie kunt u deze tooltips uitschakelen om esthetische redenen. +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_pl_PL.properties b/src/main/resources/net/rptools/maptool/language/i18n_pl_PL.properties index 9419db0b02..0f1a7fd930 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_pl_PL.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_pl_PL.properties @@ -149,8 +149,8 @@ Label.objects = Obiekty Label.token = Żeton Label.tokens = Żetony Label.backgrounds = Tła -Label.macroeditor = Edytor makr -Label.styletheme = Motyw stylu +Label.macroEditor = Edytor makr +Label.styleTheme = Motyw stylu Label.currentTheme = Bieżący motyw Label.filterTheme = Filtr motywu Label.useThemeForChat = Użyj kolorów motywu dla okna czatu @@ -167,9 +167,9 @@ Label.save = Zapisz Label.minute = min Label.performance = Wydajność Label.client = Klient -Label.macropanels = Panele makr +Label.macroPanels = Panele makr Label.upnp = UPnP -Label.macropermissions = Uprawnienia makra +Label.macroPermissions = Uprawnienia makra Label.path = Ścieżka\: Label.url = URL Label.url2 = Adres\: @@ -186,7 +186,7 @@ Label.filesystem = System plików... Label.filesystem2 = System plików Label.roll = Rzut\: Label.table.image = Obraz tabeli -Label.blankdefault = (Puste ustawia domyślny) +Label.blankDefault = (Puste ustawia domyślny) Label.range = Zakres Label.image = Obraz Label.value = Wartość @@ -196,7 +196,7 @@ Label.table.export = Eksport Tabeli Label.preview = Podgląd Label.foreground = Na pierwszym planie\: Label.background = Background\: -Label.showbackground = Pokaż Tło\: +Label.showBackground = Pokaż Tło\: Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Color @@ -210,7 +210,7 @@ Label.advanced = Zaawansowane Label.view = Widok\: Label.board = Plansza Label.visibility = Widoczność -Label.pathfilename = Ścieżka/plik\: +Label.pathFilename = Ścieżka/plik\: Label.allowURIAccess = Zezwalaj na dostęp URI Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Użyj nazwy pliku Preferences.combo.tokens.naming.creature = Użyj "{0}" Preferences.label.tokens.dialog = Pokaż okno dialogowe w nowym tokenie Preferences.label.tokens.dialog.tooltip = Określa, czy okno dialogowe nowego tokenu pojawia się kiedy token zostanie upuszczony na mapę. -Preferences.label.tokens.statsheet = Rozmiar portretu na karcie statystyk -Preferences.label.tokens.statsheet.tooltip = Rozmiar obrazka, który pojawia się obok arkusza statystyk na myszki. Ustaw na zero, aby wyłączyć portrety. +Preferences.label.tokens.statSheet = Rozmiar portretu na karcie statystyk +Preferences.label.tokens.statSheet.tooltip = Rozmiar obrazka, który pojawia się obok arkusza statystyk na myszki. Ustaw na zero, aby wyłączyć portrety. Preferences.label.tokens.portrait.mouse = Pokaż portret po najechaniu myszką Preferences.label.tokens.portrait.mouse.tooltip = Określa, czy pokazać portret kiedy kursor myszy znajduje się nad tokenem. -Preferences.label.tokens.statsheet.mouse = Pokaż arkusz statystyk po najechaniu myszką -Preferences.label.tokens.statsheet.mouse.tooltip = Określa, czy pokazać arkusz statytyk kiedy kursor myszy znajduje się nad tokenem. -Preferences.label.tokens.statsheet.shift = Arkusz statystyk wymaga klawisza Shift -Preferences.label.tokens.statsheet.shift.tooltip = Arkusz statystyk pokaże się tylko wtedy, gdy kursor myszy znajduje się nad tokenem i jest również przytrzymany klawisz Shift. W przeciwnym razie klawisz Shift ukryje arkusz statystyk po najechaniu kursorem myszy. +Preferences.label.tokens.statSheet.mouse = Pokaż arkusz statystyk po najechaniu myszką +Preferences.label.tokens.statSheet.mouse.tooltip = Określa, czy pokazać arkusz statytyk kiedy kursor myszy znajduje się nad tokenem. +Preferences.label.tokens.statSheet.shift = Arkusz statystyk wymaga klawisza Shift +Preferences.label.tokens.statSheet.shift.tooltip = Arkusz statystyk pokaże się tylko wtedy, gdy kursor myszy znajduje się nad tokenem i jest również przytrzymany klawisz Shift. W przeciwnym razie klawisz Shift ukryje arkusz statystyk po najechaniu kursorem myszy. Preferences.label.tokens.arrow = Wymuś kierunek patrzenia tokena Preferences.label.tokens.arrow.tooltip = Wymusza wyświetlanie kierunku patrzenia dla tokenów górnych i tokenów z tabelami obrazków. Preferences.label.tokens.drag.snap = Przyciągnij token podczas przeciągania @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Tło Trusted Prefix Preferences.label.chat.trusted.background.tooltip = Tekst generowany przez zaufane makra jest wymuszane do konkretnego koloru tła. Preferences.label.chat.trusted.foreground = Pierwszy plan Trusted Prefix Preferences.label.chat.trusted.foreground.tooltip = Tekst generowany przez zaufane makra jest wymuszane do określonego koloru pierwszoplanowego. -Preferences.label.macroeditor.tooltip = Motyw makro edytora. +Preferences.label.macroEditor.tooltip = Motyw makro edytora. Preferences.label.facing.edge = Na krawędziach Preferences.label.facing.edge.tooltip = Powoduje rotację tokenu do kierunku ruchu i przyciąga do krawędzi siatki. Preferences.label.facing.vertices = Na wierzchołkach @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Przeroczystość światła Preferences.label.light.opacity.tooltip = Mierzy, jak nieprzezroczysta jest nakładka światła (0-255). Nie ma wpływu na mapy z oświetleniem środowiskowym. Preferences.label.fog.opacity = Przeroczystość mgły Preferences.label.fog.opacity.tooltip = Określ poziom przeroczystości mgły (0-255). -Preferences.label.fog.mapvisibilitywarning = Ukryj ostrzeżenie 'Mapa niewidoczna dla graczy' -Preferences.label.fog.mapvisibilitywarning.tooltip= Ukryj ostrzeżenie od graczy mówiące, że mapa nie jest widoczna. +Preferences.label.fog.mapVisibilityWarning = Ukryj ostrzeżenie 'Mapa niewidoczna dla graczy' +Preferences.label.fog.mapVisibilityWarning.tooltip= Ukryj ostrzeżenie od graczy mówiące, że mapa nie jest widoczna. Preferences.label.fog.autoexpose = Autoujawnianie mgły podczas ruchu tokenów (prywatny serwer) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Wypełnij pole wyboru -Preferences.label.performance.fillselection.tooltip = Jeśli włączone, przy przeciąganiu myszy używany jest obszar zacieniowany, do wyboru wielu tokenów. +Preferences.label.performance.fillSelection = Wypełnij pole wyboru +Preferences.label.performance.fillSelection.tooltip = Jeśli włączone, przy przeciąganiu myszy używany jest obszar zacieniowany, do wyboru wielu tokenów. Preferences.label.performance.cap = Ograniczenie FPS Preferences.label.performance.cap.tooltip = Limit klatek dla renderowania map w FPS. Preferences.label.performance.render = Jakość skalowania obrazu @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Średni Preferences.combo.render.high = Wysoki (najniższy) Preferences.label.initiative.defaults = Domyślne Kampanie -Preferences.label.initiative.hidenpc = Ukryj NPC przed graczami na nowych mapach -Preferences.label.initiative.hidenpc.tooltip = Jeśli włączone, NPC nie pojawią się w widokach graczy w panelu inicjatywy. +Preferences.label.initiative.hideNPC = Ukryj NPC przed graczami na nowych mapach +Preferences.label.initiative.hideNPC.tooltip = Jeśli włączone, NPC nie pojawią się w widokach graczy w panelu inicjatywy. Preferences.label.initiative.owner = Daj właścicielom uprawnienia w nowych kampaniach Preferences.label.initiative.owner.tooltip = Uprawnienia właściciela umożliwiają graczom wykonywanie określonych czynności w ich tokenach w panelu inicjatywy. Preferences.label.initiative.lock = Zablokuj ruch gracza w nowych kampaniach Preferences.label.initiative.lock.tooltip = Gdy włączone, gracze będą mogli ruszyć swój żeton tylko wtedy, gdy ten żeton ma inicjatywę. Preferences.label.initiative.msg = Pokaż wiadomość wzmocnienia inicjatywy Preferences.label.initiative.msg.tooltip = Gdy włączone, wiadomość jest wysyłana na czat w momencie inicjatywy tokena. -Preferences.label.client.fitview = Dopasuj widok GM -Preferences.label.client.fitview.tooltip = Podczas wymuszania widoku GM'a określa, czy mapa gracza powinna być powiększona tak, aby ich ekran pokazywał co najmniej taką samą zawartość jak ekran GMa. +Preferences.label.client.fitView = Dopasuj widok GM +Preferences.label.client.fitView.tooltip = Podczas wymuszania widoku GM'a określa, czy mapa gracza powinna być powiększona tak, aby ich ekran pokazywał co najmniej taką samą zawartość jak ekran GMa. Preferences.label.client.default.username = Domyślna nazwa użytkownika Preferences.label.client.default.username.tooltip = Domyślna nazwa użytkownika, która pojawia się na pasku narzędzi MapTool. Preferences.label.installDir = Ścieżka instalacji @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Limit czasu odkrywania Preferences.label.upnp.timeout.tooltip = Przekroczono czas oczekiwania w milisekundach podczas szukania bramek UPnP. Preferences.label.macros.permissions = Włącz dostęp do zewnętrznych makr Preferences.label.macros.permissions.tooltip = Włącz makro, aby wywoływać funkcje, które mogą uzyskać dostęp do usług http. Następujące funkcje zostaną włączone\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Usuń podpowiedzi dla Makrolinków -Preferences.label.chat.macrolinks.tooltip = MacroLinks pokazuje zwykle wskazówki, które podają informacje o celu linku. To jest urządzenie zapobiegające oszustwie. Ta opcja pozwala wyłączyć te podpowiedzi ze względów estetycznych. -Preference.checkbox.chat.macrolinks.tooltip = Włączone\: nie pokazuj podpowiedzi dla Makrolinkó
Wyłączone (domyślnie)\: pokaż podpowiedzi dla Makrolinków +Preferences.label.chat.macroLinks = Usuń podpowiedzi dla Makrolinków +Preferences.label.chat.macroLinks.tooltip = MacroLinks pokazuje zwykle wskazówki, które podają informacje o celu linku. To jest urządzenie zapobiegające oszustwie. Ta opcja pozwala wyłączyć te podpowiedzi ze względów estetycznych. +Preference.checkbox.chat.macroLinks.tooltip = Włączone\: nie pokazuj podpowiedzi dla Makrolinkó
Wyłączone (domyślnie)\: pokaż podpowiedzi dla Makrolinków PreferencesDialog.themeChangeWarning = Zmiana motywu wymaga ponownego uruchomienia MapTool. PreferencesDialog.themeChangeWarningTitle = Zmiana motywu. Preferences.combo.themes.filter.all = Wszystko @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Błąd podczas otrzymywania aktualizacji dany data.error.importGameData = Błąd podczas importowania danych gry. data.error.clearingNamespace = Błąd czyszczenia przestrzeni nazw danych {0} z typu {1}. data.error.removingData = Błąd danych z {0} przestrzeni nazw {1} z typu {2}. -Label.icontheme=Zestaw ikon -Preferences.label.icontheme.tooltip=Używane ikony aplikacji motywu. -Label.theme.macroeditor=Motyw edytora makro +Label.iconTheme=Zestaw ikon +Preferences.label.iconTheme.tooltip=Używane ikony aplikacji motywu. +Label.theme.macroEditor=Motyw edytora makro TEXT_TYPE=Typ tekstu -EditTokenDialog.button.movevbltoggle.tooltip=Dołącz warstwę blokującą wizję ściany (Wall VBL) podczas przenoszenia lub kopiowania. -EditTokenDialog.button.movembltoggle.tooltip=Dołączanie warstwy blokowania ruchu (MBL) podczas przenoszenia lub kopiowania -EditTokenDialog.button.movehbltoggle.tooltip=Dołącz warstwę blokującą widzenie wzgórza (Hill Vision Blocking Layer - Hill VBL) podczas przenoszenia lub kopiowania. -EditTokenDialog.button.movepbltoggle.tooltip=Dołącz warstwę blokującą wizję szybu (Pit VBL) podczas przenoszenia lub kopiowania. -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Przenieś lub skopiuj wybraną warstwę blokowania z mapy -EditTokenDialog.button.movetomap.tooltip=Przenieś lub skopiuj wybraną warstwę blokowania do mapy +EditTokenDialog.button.moveVBToggle.tooltip=Dołącz warstwę blokującą wizję ściany (Wall VBL) podczas przenoszenia lub kopiowania. +EditTokenDialog.button.moveMBToggle.tooltip=Dołączanie warstwy blokowania ruchu (MBL) podczas przenoszenia lub kopiowania +EditTokenDialog.button.moveHBToggle.tooltip=Dołącz warstwę blokującą widzenie wzgórza (Hill Vision Blocking Layer - Hill VBL) podczas przenoszenia lub kopiowania. +EditTokenDialog.button.movePBToggle.tooltip=Dołącz warstwę blokującą wizję szybu (Pit VBL) podczas przenoszenia lub kopiowania. +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Przenieś lub skopiuj wybraną warstwę blokowania z mapy +EditTokenDialog.button.moveToMap.tooltip=Przenieś lub skopiuj wybraną warstwę blokowania do mapy Label.label=Etykieta\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_pt_BR.properties b/src/main/resources/net/rptools/maptool/language/i18n_pt_BR.properties index c61bef7abc..6cd312548a 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_pt_BR.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_pt_BR.properties @@ -149,8 +149,8 @@ Label.objects = Objetos Label.token = Token Label.tokens = Tokens Label.backgrounds = Planos de fundo -Label.macroeditor = Editor de Macro -Label.styletheme = Tema de estilo +Label.macroEditor = Editor de Macro +Label.styleTheme = Tema de estilo Label.currentTheme = Tema Atual Label.filterTheme = Filtro do tema Label.useThemeForChat = Use Theme Colors for Chat Window @@ -167,9 +167,9 @@ Label.save = Salvar Label.minute = minuto Label.performance = Desempenho Label.client = Cliente -Label.macropanels = Painéis Macro +Label.macroPanels = Painéis Macro Label.upnp = UPnP -Label.macropermissions = Permissões de Macro +Label.macroPermissions = Permissões de Macro Label.path = Caminho\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Sistema de arquivos... Label.filesystem2 = Sistema de arquivos Label.roll = Rolar\: Label.table.image = Imagem da tabela -Label.blankdefault = (Deixar em branco por padrão) +Label.blankDefault = (Deixar em branco por padrão) Label.range = Distância Label.image = Imagem Label.value = Valor @@ -196,7 +196,7 @@ Label.table.export = Exportar tabela Label.preview = Pré-visualização Label.foreground = Primeiro plano Label.background = Background\: -Label.showbackground = Mostrar Fundo +Label.showBackground = Mostrar Fundo Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Color @@ -210,7 +210,7 @@ Label.advanced = Avançado Label.view = Visualizar\: Label.board = Tabuleiro Label.visibility = Visibilidade -Label.pathfilename = Caminho/Arquivo\: +Label.pathFilename = Caminho/Arquivo\: Label.allowURIAccess = Allow URI Access Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Usar o Nome do Arquivo Preferences.combo.tokens.naming.creature = Usar "{0}" Preferences.label.tokens.dialog = Mostrar Diálogo ao adicionar Novo Token Preferences.label.tokens.dialog.tooltip = Determina se a caixa de diálogo de Novo Token aparece quando um token é arrastado até o mapa. -Preferences.label.tokens.statsheet = Tamanho do retrato da folha de status -Preferences.label.tokens.statsheet.tooltip = Defina o tamanho da imagem que aparece ao lado da folha de status quando ocorrer o mouseover. Coloque pra 0 pra desativar os retratos. +Preferences.label.tokens.statSheet = Tamanho do retrato da folha de status +Preferences.label.tokens.statSheet.tooltip = Defina o tamanho da imagem que aparece ao lado da folha de status quando ocorrer o mouseover. Coloque pra 0 pra desativar os retratos. Preferences.label.tokens.portrait.mouse = Mostrar Retrato quando o mouse estiver por cima Preferences.label.tokens.portrait.mouse.tooltip = Se deve mostrar o retrato quando o mouse estiver por cima de um Token. -Preferences.label.tokens.statsheet.mouse = Exibir a folha de status ao mouseover -Preferences.label.tokens.statsheet.mouse.tooltip = Se deve mostrar a folha de status quando o mouse estiver por cima de um Token. -Preferences.label.tokens.statsheet.shift = Stat sheet requires Shift key -Preferences.label.tokens.statsheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. +Preferences.label.tokens.statSheet.mouse = Exibir a folha de status ao mouseover +Preferences.label.tokens.statSheet.mouse.tooltip = Se deve mostrar a folha de status quando o mouse estiver por cima de um Token. +Preferences.label.tokens.statSheet.shift = Stat sheet requires Shift key +Preferences.label.tokens.statSheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. Preferences.label.tokens.arrow = Force Token Facing Arrow Preferences.label.tokens.arrow.tooltip = Forces the display of the token facing arrow for Top Down tokens and tokens with image tables. Preferences.label.tokens.drag.snap = Alinhar Token enquanto o arrasta @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Trusted Prefix Background Preferences.label.chat.trusted.background.tooltip = Text generated by trusted macros is forced to a particular background color. Preferences.label.chat.trusted.foreground = Trusted Prefix Foreground Preferences.label.chat.trusted.foreground.tooltip = Text generated by trusted macros is forced to a particular foreground color. -Preferences.label.macroeditor.tooltip = Tema do editor de macros. +Preferences.label.macroEditor.tooltip = Tema do editor de macros. Preferences.label.facing.edge = Nas Arestas Preferences.label.facing.edge.tooltip = Faz com que a direção do token seja rotacionado para encaixar nas arestas da célula. Preferences.label.facing.vertices = Em Vértices @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Opacidade da luz Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Opacidade da Névoa Preferences.label.fog.opacity.tooltip = Measures how opaque the "soft fog" overlay is drawn (0-255). -Preferences.label.fog.mapvisibilitywarning = Ocultar o aviso 'Mapa não visível para os jogadores' -Preferences.label.fog.mapvisibilitywarning.tooltip= Oculta a mensagem de em que o mapa não está visível para os jogadores. +Preferences.label.fog.mapVisibilityWarning = Ocultar o aviso 'Mapa não visível para os jogadores' +Preferences.label.fog.mapVisibilityWarning.tooltip= Oculta a mensagem de em que o mapa não está visível para os jogadores. Preferences.label.fog.autoexpose = Auto-expose fog on token movement (personal server) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Fill selection box -Preferences.label.performance.fillselection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. +Preferences.label.performance.fillSelection = Fill selection box +Preferences.label.performance.fillSelection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. Preferences.label.performance.cap = Limite da Taxa de Quadros Preferences.label.performance.cap.tooltip = Limite da taxa de quadros para o renderizador de mapas em FPS. Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Padrões da Campanha -Preferences.label.initiative.hidenpc = Ocultar NPCs dos jogadores em novos mapas -Preferences.label.initiative.hidenpc.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. +Preferences.label.initiative.hideNPC = Ocultar NPCs dos jogadores em novos mapas +Preferences.label.initiative.hideNPC.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. Preferences.label.initiative.owner = Dar Permissão aos Proprietários em novas campanhas Preferences.label.initiative.owner.tooltip = Permissão de Proprietário permite que jogadores executem certas ações em seus tokens no painel de Iniciativa. Preferences.label.initiative.lock = Bloquear Movimento do Jogador em novas campanhas Preferences.label.initiative.lock.tooltip = Quando ativado, os jogadores só poderão mover seu token quando este token tiver iniciativa. Preferences.label.initiative.msg = Show Initiative Gain Message Preferences.label.initiative.msg.tooltip = When enabled, a message is sent to chat when a token gains initiative. -Preferences.label.client.fitview = Fit GM view -Preferences.label.client.fitview.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? +Preferences.label.client.fitView = Fit GM view +Preferences.label.client.fitView.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? Preferences.label.client.default.username = Nome Padrão do Usuário Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Discovery Timeout Preferences.label.upnp.timeout.tooltip = Período de tempo limite em milissegundos para esperar ao procurar por gateways UPnP. Preferences.label.macros.permissions = Habilitar Acesso a Macros Externas Preferences.label.macros.permissions.tooltip = Habilite macros para chamar funções que podem acessar sua unidade de disco e serviços http. As seguintes funções serão habilitadas\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Suppress ToolTips for MacroLinks -Preferences.label.chat.macrolinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = Suppress ToolTips for MacroLinks +Preferences.label.chat.macroLinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_ru_RU.properties b/src/main/resources/net/rptools/maptool/language/i18n_ru_RU.properties index cd07819269..77920cc35c 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_ru_RU.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_ru_RU.properties @@ -149,8 +149,8 @@ Label.objects = Объекты Label.token = Токен Label.tokens = Токены Label.backgrounds = Фоны -Label.macroeditor = Редактор макросов -Label.styletheme = Стиль темы +Label.macroEditor = Редактор макросов +Label.styleTheme = Стиль темы Label.currentTheme = Текущее оформление Label.filterTheme = Фильтр оформлений Label.useThemeForChat = Применять настройки цвета к чату @@ -167,9 +167,9 @@ Label.save = Сохранение Label.minute = мин Label.performance = Производительность Label.client = Опции при подключении к серверу -Label.macropanels = Панель макросов +Label.macroPanels = Панель макросов Label.upnp = UPnP -Label.macropermissions = Разрешения макросов +Label.macroPermissions = Разрешения макросов Label.path = Путь\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Проводник... Label.filesystem2 = Проводник Label.roll = Бросок\: Label.table.image = Иконка таблицы -Label.blankdefault = (Оставьте пустым для значения по умолчанию) +Label.blankDefault = (Оставьте пустым для значения по умолчанию) Label.range = Диапазон Label.image = Изображение Label.value = Значение @@ -196,7 +196,7 @@ Label.table.export = Экспорт таблицы Label.preview = Предпросмотр Label.foreground = Передний план Label.background = Задний план -Label.showbackground = Показать фон +Label.showBackground = Показать фон Label.showBorder = Отображать рамку Label.borderWidth = Толщина рамки Label.border.color = Цвет рамки @@ -210,7 +210,7 @@ Label.advanced = Расширенные Label.view = Вид\: Label.board = Доска Label.visibility = Видимость -Label.pathfilename = Путь/Имя файла\: +Label.pathFilename = Путь/Имя файла\: Label.allowURIAccess = Разрешить доступ по URI Label.rotation = Поворот #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Имя файла Preferences.combo.tokens.naming.creature = Всегда "{0}" Preferences.label.tokens.dialog = Открывать настройки для новых токенов Preferences.label.tokens.dialog.tooltip = Должно ли при добавлении нового токена открываться диалоговое окно для задания его базовых параметров. -Preferences.label.tokens.statsheet = Размер портрета в блоке параметров -Preferences.label.tokens.statsheet.tooltip = Размер изображения, отображаемого в блоке параметров при наведении курсора на токен. Значение 0 отключит отображение портретов. +Preferences.label.tokens.statSheet = Размер портрета в блоке параметров +Preferences.label.tokens.statSheet.tooltip = Размер изображения, отображаемого в блоке параметров при наведении курсора на токен. Значение 0 отключит отображение портретов. Preferences.label.tokens.portrait.mouse = Отображать портрет при наведении курсора Preferences.label.tokens.portrait.mouse.tooltip = Нужно ли отображать портрет при наведении курсора мыши на токен. -Preferences.label.tokens.statsheet.mouse = Отображать блок параметров при наведении курсора -Preferences.label.tokens.statsheet.mouse.tooltip = Нужно ли отображать блок параметров при наведении курсора на токен. -Preferences.label.tokens.statsheet.shift = Блок параметров отображается по Shift -Preferences.label.tokens.statsheet.shift.tooltip = Блок параметров будет отображаться только при наведении курсора с зажатой клавишей Shift. Если это опция выключена, зажатие Shift будет, наоборот, отключать отображение блоков параметров. +Preferences.label.tokens.statSheet.mouse = Отображать блок параметров при наведении курсора +Preferences.label.tokens.statSheet.mouse.tooltip = Нужно ли отображать блок параметров при наведении курсора на токен. +Preferences.label.tokens.statSheet.shift = Блок параметров отображается по Shift +Preferences.label.tokens.statSheet.shift.tooltip = Блок параметров будет отображаться только при наведении курсора с зажатой клавишей Shift. Если это опция выключена, зажатие Shift будет, наоборот, отключать отображение блоков параметров. Preferences.label.tokens.arrow = Всегда отображать направление взгляда у токена Preferences.label.tokens.arrow.tooltip = Для токенов с видом сверху и токенов с таблицей изображений всегда отображается стрелка, указывающая направление взгляда. Preferences.label.tokens.drag.snap = Привязка токена к конечной точке пути @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Цвет фона вывод Preferences.label.chat.trusted.background.tooltip = Текст, сгенерированный надёжными макросами, будет иметь указанный цвет фона. Preferences.label.chat.trusted.foreground = Цвет шрифта вывода надёжных макросов Preferences.label.chat.trusted.foreground.tooltip = Текст, сгенерированный надёжными макросами, будет иметь указанный цвет шрифта. -Preferences.label.macroeditor.tooltip = Оформление редактора макросов +Preferences.label.macroEditor.tooltip = Оформление редактора макросов Preferences.label.facing.edge = К границам сетки Preferences.label.facing.edge.tooltip = Направление взгляда токена привязывается к границам ячеек сетки. Preferences.label.facing.vertices = К узлам сетки @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Непрозрачность Preferences.label.light.opacity.tooltip = Задаёт степень непрозрачности при отрисовке освещения (0-255). Не используется на картах с пространственным освещением. Preferences.label.fog.opacity = Непрозрачность тумана войны Preferences.label.fog.opacity.tooltip = Задаёт степень непрозрачности "серого тумана войны" на раскрытых до этого участках (0-255). -Preferences.label.fog.mapvisibilitywarning = Скрыть уведомление о том, что карта не видна игрокам -Preferences.label.fog.mapvisibilitywarning.tooltip= Убирает отображаемое на картах предупреждение в случае если эта карта не видна игрокам. +Preferences.label.fog.mapVisibilityWarning = Скрыть уведомление о том, что карта не видна игрокам +Preferences.label.fog.mapVisibilityWarning.tooltip= Убирает отображаемое на картах предупреждение в случае если эта карта не видна игрокам. Preferences.label.fog.autoexpose = Автораскрытие тумана при перемещении токена (при локальной игре) Preferences.label.fog.autoexpose.tooltip = Если опция активна, туман войны автоматически раскрывается при продвижении токена по карте.
На сервере эта опция игнорируется\: используются настройки, заданные при запуске сервера. -Preferences.label.performance.fillselection = Закрашивать область выделения -Preferences.label.performance.fillselection.tooltip = Если опция активна, область выделения будет затеняться. +Preferences.label.performance.fillSelection = Закрашивать область выделения +Preferences.label.performance.fillSelection.tooltip = Если опция активна, область выделения будет затеняться. Preferences.label.performance.cap = Ограничение частоты кадров Preferences.label.performance.cap.tooltip = Ограничение частоты кадров в секунду при рендере карты. Preferences.label.performance.render = Качество изображений @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Пиксель-арт Preferences.combo.render.medium = Среднее Preferences.combo.render.high = Высокое (медленнее) Preferences.label.initiative.defaults = Настройки кампании по умолчанию -Preferences.label.initiative.hidenpc = Скрывать НИПов на новых картах -Preferences.label.initiative.hidenpc.tooltip = Если активно, НИПы не будут отображаться у игроков в панели инициативы. +Preferences.label.initiative.hideNPC = Скрывать НИПов на новых картах +Preferences.label.initiative.hideNPC.tooltip = Если активно, НИПы не будут отображаться у игроков в панели инициативы. Preferences.label.initiative.owner = Давать права владельца в новых кампаниях Preferences.label.initiative.owner.tooltip = Права владельца позволят игрокам выполнять определённые действия со своими токенами на панели инициативы. Preferences.label.initiative.lock = Блокировать передвижение игроков в новых кампаниях Preferences.label.initiative.lock.tooltip = Если активно, игроки смогут перемещать свои токены только тогда, когда они получают инициативу. Preferences.label.initiative.msg = Отображать уведомление о получении инициативы Preferences.label.initiative.msg.tooltip = Если активно, в чат отправляется сообщение о том, что токен получает инициативу. -Preferences.label.client.fitview = Подстраиваться под видимое ГМу -Preferences.label.client.fitview.tooltip = Когда игроков насильно центрируют на область, видимую ГМу, нужно ли масштабировать их отображение карты так, чтобы они на своём экране видели по крайней мере то же, что и ГМ? +Preferences.label.client.fitView = Подстраиваться под видимое ГМу +Preferences.label.client.fitView.tooltip = Когда игроков насильно центрируют на область, видимую ГМу, нужно ли масштабировать их отображение карты так, чтобы они на своём экране видели по крайней мере то же, что и ГМ? Preferences.label.client.default.username = Имя пользователя по умолчанию Preferences.label.client.default.username.tooltip = Имя пользователя по умолчанию, отображаемое на панели инструментов. Preferences.label.installDir = Папка установки @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Время обнаруже Preferences.label.upnp.timeout.tooltip = Время ожидания в миллисекундах при поиске UPnP шлюзов. Preferences.label.macros.permissions = Разрешить макросы, использующие внешние данные Preferences.label.macros.permissions.tooltip = Разрешить макросам использовать функции, обращающимся к файлам на диске или выполняющим http-запросы. Станут доступными следующие функции\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Отключить подсказки у MacroLinks -Preferences.label.chat.macrolinks.tooltip = Обычно подсказки для MacroLinks показывают информацию об исполняемом макросе и передаваемых аргументах. Это своего рода античит.
С помощью этой опции можно отключить подсказки из эстетических соображений. -Preference.checkbox.chat.macrolinks.tooltip = Включено\: не отображать подсказки для macroLink
Отключено (по умолчанию)\: отображать подсказки для macroLinks +Preferences.label.chat.macroLinks = Отключить подсказки у MacroLinks +Preferences.label.chat.macroLinks.tooltip = Обычно подсказки для MacroLinks показывают информацию об исполняемом макросе и передаваемых аргументах. Это своего рода античит.
С помощью этой опции можно отключить подсказки из эстетических соображений. +Preference.checkbox.chat.macroLinks.tooltip = Включено\: не отображать подсказки для macroLink
Отключено (по умолчанию)\: отображать подсказки для macroLinks PreferencesDialog.themeChangeWarning = Чтобы изменение оформления вступило в силу, перезапустите MapTool. PreferencesDialog.themeChangeWarningTitle = Изменение оформления. Preferences.combo.themes.filter.all = Все @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Ошибка при получении обн data.error.importGameData = Ошибка при импорте данных игры. data.error.clearingNamespace = Ошибка при очистке пространства имён {0} данных из типа {1}. data.error.removingData = Ошибка при удалении данных {0} из пространства имён {1} из типа {2}. -Label.icontheme=Оформление иконок -Preferences.label.icontheme.tooltip=Используемое оформление для иконок приложения. -Label.theme.macroeditor=Оформление редактора макросов +Label.iconTheme=Оформление иконок +Preferences.label.iconTheme.tooltip=Используемое оформление для иконок приложения. +Label.theme.macroEditor=Оформление редактора макросов TEXT_TYPE=Разметка текста -EditTokenDialog.button.movevbltoggle.tooltip=Учитывать СБВ стен при переносе или копировании -EditTokenDialog.button.movembltoggle.tooltip=Учитывать СБП при переносе или копировании -EditTokenDialog.button.movehbltoggle.tooltip=Учитывать СБВ холмов при переносе или копировании -EditTokenDialog.button.movepbltoggle.tooltip=Учитывать СБВ ям при переносе или копировании -EditTokenDialog.button.movecbltoggle.tooltip=Учитывать СБВ укрытий при переносе или копировании -EditTokenDialog.button.movefrommap.tooltip=Перенести или скопировать выделенные блокирующие слои с карты -EditTokenDialog.button.movetomap.tooltip=Перенести или скопировать выделенные блокирующие слои на карту +EditTokenDialog.button.moveVBToggle.tooltip=Учитывать СБВ стен при переносе или копировании +EditTokenDialog.button.moveMBToggle.tooltip=Учитывать СБП при переносе или копировании +EditTokenDialog.button.moveHBToggle.tooltip=Учитывать СБВ холмов при переносе или копировании +EditTokenDialog.button.movePBToggle.tooltip=Учитывать СБВ ям при переносе или копировании +EditTokenDialog.button.moveCBToggle.tooltip=Учитывать СБВ укрытий при переносе или копировании +EditTokenDialog.button.moveFromMap.tooltip=Перенести или скопировать выделенные блокирующие слои с карты +EditTokenDialog.button.moveToMap.tooltip=Перенести или скопировать выделенные блокирующие слои на карту Label.label=Метка\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_si_LK.properties b/src/main/resources/net/rptools/maptool/language/i18n_si_LK.properties index 1361d70c5d..b5d8fced41 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_si_LK.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_si_LK.properties @@ -149,8 +149,8 @@ Label.objects = Objects Label.token = Token Label.tokens = Tokens Label.backgrounds = Backgrounds -Label.macroeditor = Macro Editor -Label.styletheme = Style Theme +Label.macroEditor = Macro Editor +Label.styleTheme = Style Theme Label.currentTheme = Current Theme Label.filterTheme = Theme Filter Label.useThemeForChat = Use Theme Colors for Chat Window @@ -167,9 +167,9 @@ Label.save = Save Label.minute = min Label.performance = Performance Label.client = Client -Label.macropanels = Macro Panels +Label.macroPanels = Macro Panels Label.upnp = UPnP -Label.macropermissions = Macro Permissions +Label.macroPermissions = Macro Permissions Label.path = Path\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Filesystem ... Label.filesystem2 = Filesystem Label.roll = Roll\: Label.table.image = Table Image -Label.blankdefault = (Leave blank for default) +Label.blankDefault = (Leave blank for default) Label.range = Range Label.image = Image Label.value = Value @@ -196,7 +196,7 @@ Label.table.export = Export Table Label.preview = Preview Label.foreground = Foreground\: Label.background = Background\: -Label.showbackground = Show Background\: +Label.showBackground = Show Background\: Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Color @@ -210,7 +210,7 @@ Label.advanced = Advanced Label.view = View\: Label.board = Board Label.visibility = Visibility -Label.pathfilename = Path/Filename\: +Label.pathFilename = Path/Filename\: Label.allowURIAccess = Allow URI Access Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Use Filename Preferences.combo.tokens.naming.creature = Use "{0}" Preferences.label.tokens.dialog = Show Dialog on New Token Preferences.label.tokens.dialog.tooltip = Determines whether the New Token dialog appears when a token is dropped onto the map. -Preferences.label.tokens.statsheet = Statsheet Portrait Size -Preferences.label.tokens.statsheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. +Preferences.label.tokens.statSheet = Statsheet Portrait Size +Preferences.label.tokens.statSheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. Preferences.label.tokens.portrait.mouse = Show Portrait on mouseover Preferences.label.tokens.portrait.mouse.tooltip = Whether to show the portrait when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.mouse = Show statsheet on mouseover -Preferences.label.tokens.statsheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.shift = Stat sheet requires Shift key -Preferences.label.tokens.statsheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. +Preferences.label.tokens.statSheet.mouse = Show statsheet on mouseover +Preferences.label.tokens.statSheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. +Preferences.label.tokens.statSheet.shift = Stat sheet requires Shift key +Preferences.label.tokens.statSheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. Preferences.label.tokens.arrow = Force Token Facing Arrow Preferences.label.tokens.arrow.tooltip = Forces the display of the token facing arrow for Top Down tokens and tokens with image tables. Preferences.label.tokens.drag.snap = Snap Token while dragging @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Trusted Prefix Background Preferences.label.chat.trusted.background.tooltip = Text generated by trusted macros is forced to a particular background color. Preferences.label.chat.trusted.foreground = Trusted Prefix Foreground Preferences.label.chat.trusted.foreground.tooltip = Text generated by trusted macros is forced to a particular foreground color. -Preferences.label.macroeditor.tooltip = Theme of the macro editor. +Preferences.label.macroEditor.tooltip = Theme of the macro editor. Preferences.label.facing.edge = On Edges Preferences.label.facing.edge.tooltip = Causes token facing rotation to snap to edges of the grid cell. Preferences.label.facing.vertices = On Vertices @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Light opacity Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Fog opacity Preferences.label.fog.opacity.tooltip = Measures how opaque the "soft fog" overlay is drawn (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = Auto-expose fog on token movement (personal server) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Fill selection box -Preferences.label.performance.fillselection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. +Preferences.label.performance.fillSelection = Fill selection box +Preferences.label.performance.fillSelection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. Preferences.label.performance.cap = Frame Rate Cap Preferences.label.performance.cap.tooltip = Frame rate cap for map renderer in FPS. Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Campaign Defaults -Preferences.label.initiative.hidenpc = Hide NPCs from players on new maps -Preferences.label.initiative.hidenpc.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. +Preferences.label.initiative.hideNPC = Hide NPCs from players on new maps +Preferences.label.initiative.hideNPC.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. Preferences.label.initiative.owner = Give Owners Permission in new campaigns Preferences.label.initiative.owner.tooltip = Owner Permission allows players to perform certain actions on their tokens in the Initiative panel. Preferences.label.initiative.lock = Lock Player Movement in new campaigns Preferences.label.initiative.lock.tooltip = When enabled, players will only be able to move their token when that token has initiative. Preferences.label.initiative.msg = Show Initiative Gain Message Preferences.label.initiative.msg.tooltip = When enabled, a message is sent to chat when a token gains initiative. -Preferences.label.client.fitview = Fit GM view -Preferences.label.client.fitview.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? +Preferences.label.client.fitView = Fit GM view +Preferences.label.client.fitView.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? Preferences.label.client.default.username = Default Username Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Discovery Timeout Preferences.label.upnp.timeout.tooltip = Timeout period in milliseconds to wait when looking for UPnP gateways. Preferences.label.macros.permissions = Enable External Macro Access Preferences.label.macros.permissions.tooltip = Enable macros to call functions that can access your drive and http services. The following functions will be enabled\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Suppress ToolTips for MacroLinks -Preferences.label.chat.macrolinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = Suppress ToolTips for MacroLinks +Preferences.label.chat.macroLinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking (Wall VB) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking (MB) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking (Hill VB) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking (Pit VB) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking (Cover VB) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking (Wall VB) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking (MB) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking (Hill VB) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking (Pit VB) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking (Cover VB) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_sv_SE.properties b/src/main/resources/net/rptools/maptool/language/i18n_sv_SE.properties index 79965ed84f..5439e0a3de 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_sv_SE.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_sv_SE.properties @@ -149,8 +149,8 @@ Label.objects = Objekt Label.token = Token Label.tokens = Tokens Label.backgrounds = Bakgrunder -Label.macroeditor = Makro Editor -Label.styletheme = Stil tema +Label.macroEditor = Makro Editor +Label.styleTheme = Stil tema Label.currentTheme = Current Theme Label.filterTheme = Theme Filter Label.useThemeForChat = Use Theme Colors for Chat Window @@ -167,9 +167,9 @@ Label.save = Spara Label.minute = min Label.performance = Prestanda Label.client = Klient -Label.macropanels = Makropaneler +Label.macroPanels = Makropaneler Label.upnp = UPnP -Label.macropermissions = Makrobehörigheter +Label.macroPermissions = Makrobehörigheter Label.path = Sökväg\: Label.url = URL Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Filsystem ... Label.filesystem2 = Filsystem Label.roll = Tärningsslag\: Label.table.image = Tabellbild -Label.blankdefault = (Lämna tomt för standardvärde) +Label.blankDefault = (Lämna tomt för standardvärde) Label.range = Intervall Label.image = Bild Label.value = Värde @@ -196,7 +196,7 @@ Label.table.export = Exportera tabell Label.preview = Förhandsgranska Label.foreground = Förgrund Label.background = Background\: -Label.showbackground = Visa bakgrund +Label.showBackground = Visa bakgrund Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Color @@ -210,7 +210,7 @@ Label.advanced = Avancerat Label.view = Vy\: Label.board = Bräde Label.visibility = Synlighet -Label.pathfilename = Sökväg/filnamn\: +Label.pathFilename = Sökväg/filnamn\: Label.allowURIAccess = Allow URI Access Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Använd filnamn Preferences.combo.tokens.naming.creature = Använd "{0}" Preferences.label.tokens.dialog = Visa dialog på ny token Preferences.label.tokens.dialog.tooltip = Avgör om 'Ny token'-dialogen visas när en token släpps på kartan. -Preferences.label.tokens.statsheet = Statsheet Portrait Size -Preferences.label.tokens.statsheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. +Preferences.label.tokens.statSheet = Statsheet Portrait Size +Preferences.label.tokens.statSheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. Preferences.label.tokens.portrait.mouse = Visa porträtt på mouseover Preferences.label.tokens.portrait.mouse.tooltip = Om du vill visa porträttet när musen svävar över en Token. -Preferences.label.tokens.statsheet.mouse = Show statsheet on mouseover -Preferences.label.tokens.statsheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.shift = Statistikblad kräver att shift är nertryckt -Preferences.label.tokens.statsheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. +Preferences.label.tokens.statSheet.mouse = Show statsheet on mouseover +Preferences.label.tokens.statSheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. +Preferences.label.tokens.statSheet.shift = Statistikblad kräver att shift är nertryckt +Preferences.label.tokens.statSheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. Preferences.label.tokens.arrow = Tvinga riktningspil för spelpjäser Preferences.label.tokens.arrow.tooltip = Tvingar visning av riktningspil för spelpjäser som visas uppifrån och spelpjäser med bildtabeller. Preferences.label.tokens.drag.snap = Fäst spelpjäser mot rutor när de dras @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Trusted Prefix Background Preferences.label.chat.trusted.background.tooltip = Text som genereras av betrodda makron tvingas till en viss bakgrundsfärg. Preferences.label.chat.trusted.foreground = Trusted Prefix Foreground Preferences.label.chat.trusted.foreground.tooltip = Text som genereras av betrodda makron tvingas till en viss förgrundsfärg. -Preferences.label.macroeditor.tooltip = Tema för makroeditorn. +Preferences.label.macroEditor.tooltip = Tema för makroeditorn. Preferences.label.facing.edge = På kanter Preferences.label.facing.edge.tooltip = Causes token facing rotation to snap to edges of the grid cell. Preferences.label.facing.vertices = På hörn @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Opacitet för ljus Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Opacitet för dimma Preferences.label.fog.opacity.tooltip = Measures how opaque the "soft fog" overlay is drawn (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = Auto-expose fog on token movement (personal server) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Fyll markeringsruta -Preferences.label.performance.fillselection.tooltip = Om aktiverad så används ett skuggat område när du drar musen för att välja flera tokens. +Preferences.label.performance.fillSelection = Fyll markeringsruta +Preferences.label.performance.fillSelection.tooltip = Om aktiverad så används ett skuggat område när du drar musen för att välja flera tokens. Preferences.label.performance.cap = Tak för bildfrekvens Preferences.label.performance.cap.tooltip = Bildfrekvenstak för kartrenderaren, i bilder per sekund. Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Standardvärden för Kampanj -Preferences.label.initiative.hidenpc = Dölj NPC\:er för spelare på nya kartor -Preferences.label.initiative.hidenpc.tooltip = Om aktiverad, kommer NPC\:er inte att visas för spelarna på initiativpanelen. +Preferences.label.initiative.hideNPC = Dölj NPC\:er för spelare på nya kartor +Preferences.label.initiative.hideNPC.tooltip = Om aktiverad, kommer NPC\:er inte att visas för spelarna på initiativpanelen. Preferences.label.initiative.owner = Give Owners Permission in new campaigns Preferences.label.initiative.owner.tooltip = Ägare tillstånd tillåter spelare att utföra vissa åtgärder på sina tokens i Initiativ-panelen. Preferences.label.initiative.lock = Lås spelarrörelse i nya kampanjer Preferences.label.initiative.lock.tooltip = När detta är aktiverat kommer spelare bara att kunna flytta sin token när den token har initiativ. Preferences.label.initiative.msg = Visa meddelande när initiativ tilldelas Preferences.label.initiative.msg.tooltip = När detta är aktiverat, skickas ett meddelande till chatten när en token får initiativ. -Preferences.label.client.fitview = Passa GM-vy -Preferences.label.client.fitview.tooltip = När du tvingar spelare så de ser det spelledaren ser, ska spelarens karta zoomas så att deras skärm visar minst samma innehåll som spelledar-skärmen? +Preferences.label.client.fitView = Passa GM-vy +Preferences.label.client.fitView.tooltip = När du tvingar spelare så de ser det spelledaren ser, ska spelarens karta zoomas så att deras skärm visar minst samma innehåll som spelledar-skärmen? Preferences.label.client.default.username = Default Username Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Tidsgräns för upptäckt Preferences.label.upnp.timeout.tooltip = Timeout period i millisekunder vid sökning efter UPnP gateways. Preferences.label.macros.permissions = Aktivera extern makroåtkomst Preferences.label.macros.permissions.tooltip = Enable macros to call functions that can access your drive and http services. The following functions will be enabled\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Visa ej verktygstips för makrolänkar -Preferences.label.chat.macrolinks.tooltip = MacroLinks visar normalt verktygstips som anger information om länkmålet. Detta är för att motverka fusk. Detta alternativ låter dig inaktivera detta verktygstips av estetiska skäl. -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = Visa ej verktygstips för makrolänkar +Preferences.label.chat.macroLinks.tooltip = MacroLinks visar normalt verktygstips som anger information om länkmålet. Detta är för att motverka fusk. Detta alternativ låter dig inaktivera detta verktygstips av estetiska skäl. +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_uk_UA.properties b/src/main/resources/net/rptools/maptool/language/i18n_uk_UA.properties index 4a811b9d2b..b0f9d1e6a6 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_uk_UA.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_uk_UA.properties @@ -149,8 +149,8 @@ Label.objects = Об'єкти Label.token = Токен Label.tokens = Токени Label.backgrounds = Тло -Label.macroeditor = Редактор макросу -Label.styletheme = Стиль теми +Label.macroEditor = Редактор макросу +Label.styleTheme = Стиль теми Label.currentTheme = Current Theme Label.filterTheme = Theme Filter Label.useThemeForChat = Use Theme Colors for Chat Window @@ -167,9 +167,9 @@ Label.save = Зберегти Label.minute = хв. Label.performance = Ефективність Label.client = Клієнт -Label.macropanels = Панель макросу +Label.macroPanels = Панель макросу Label.upnp = UPnP -Label.macropermissions = Дозволи для макросу +Label.macroPermissions = Дозволи для макросу Label.path = Шлях\: Label.url = URL-адреса Label.url2 = URL\: @@ -186,7 +186,7 @@ Label.filesystem = Файлова система... Label.filesystem2 = Файлова система Label.roll = Кинути кістки\: Label.table.image = Зображення таблиці -Label.blankdefault = (Залиште пустим за замовчуванням) +Label.blankDefault = (Залиште пустим за замовчуванням) Label.range = Відстань Label.image = Зображення Label.value = Значення @@ -196,7 +196,7 @@ Label.table.export = Експортувати таблицю Label.preview = Попередній перегляд Label.foreground = Активні Label.background = Background\: -Label.showbackground = Показувати тло +Label.showBackground = Показувати тло Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Color @@ -210,7 +210,7 @@ Label.advanced = Розширені Label.view = Вид\: Label.board = Дошка Label.visibility = Видимість -Label.pathfilename = Шлях/Ім'я файлу\: +Label.pathFilename = Шлях/Ім'я файлу\: Label.allowURIAccess = Allow URI Access Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = Використовуват Preferences.combo.tokens.naming.creature = Використати "{0}" Preferences.label.tokens.dialog = Показати діалогове вікно на новому маркері Preferences.label.tokens.dialog.tooltip = Determines whether the New Token dialog appears when a token is dropped onto the map. -Preferences.label.tokens.statsheet = Statsheet Portrait Size -Preferences.label.tokens.statsheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. +Preferences.label.tokens.statSheet = Statsheet Portrait Size +Preferences.label.tokens.statSheet.tooltip = Size of the image that appears next to the statsheet on mouseover. Set to zero to disable portraits. Preferences.label.tokens.portrait.mouse = Show Portrait on mouseover Preferences.label.tokens.portrait.mouse.tooltip = Whether to show the portrait when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.mouse = Show statsheet on mouseover -Preferences.label.tokens.statsheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. -Preferences.label.tokens.statsheet.shift = Stat sheet requires Shift key -Preferences.label.tokens.statsheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. +Preferences.label.tokens.statSheet.mouse = Show statsheet on mouseover +Preferences.label.tokens.statSheet.mouse.tooltip = Whether to show the statsheet when the mouse hovers over a Token. +Preferences.label.tokens.statSheet.shift = Stat sheet requires Shift key +Preferences.label.tokens.statSheet.shift.tooltip = The stat sheet will only show when the mouse hovers over a Token if the Shift key is also held down. Otherwise, Shift key will hide stat sheet on mouse hovers. Preferences.label.tokens.arrow = Force Token Facing Arrow Preferences.label.tokens.arrow.tooltip = Forces the display of the token facing arrow for Top Down tokens and tokens with image tables. Preferences.label.tokens.drag.snap = Snap Token while dragging @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = Trusted Prefix Background Preferences.label.chat.trusted.background.tooltip = Text generated by trusted macros is forced to a particular background color. Preferences.label.chat.trusted.foreground = Trusted Prefix Foreground Preferences.label.chat.trusted.foreground.tooltip = Text generated by trusted macros is forced to a particular foreground color. -Preferences.label.macroeditor.tooltip = Theme of the macro editor. +Preferences.label.macroEditor.tooltip = Theme of the macro editor. Preferences.label.facing.edge = On Edges Preferences.label.facing.edge.tooltip = Causes token facing rotation to snap to edges of the grid cell. Preferences.label.facing.vertices = On Vertices @@ -758,12 +758,12 @@ Preferences.label.light.opacity = Light opacity Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = Fog opacity Preferences.label.fog.opacity.tooltip = Measures how opaque the "soft fog" overlay is drawn (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = Auto-expose fog on token movement (personal server) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = Fill selection box -Preferences.label.performance.fillselection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. +Preferences.label.performance.fillSelection = Fill selection box +Preferences.label.performance.fillSelection.tooltip = If enabled, a shaded area is used when dragging the mouse to select multiple tokens. Preferences.label.performance.cap = Frame Rate Cap Preferences.label.performance.cap.tooltip = Frame rate cap for map renderer in FPS. Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = Campaign Defaults -Preferences.label.initiative.hidenpc = Hide NPCs from players on new maps -Preferences.label.initiative.hidenpc.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. +Preferences.label.initiative.hideNPC = Hide NPCs from players on new maps +Preferences.label.initiative.hideNPC.tooltip = If enabled, NPCs will not appear in the players views of the Initiative panel. Preferences.label.initiative.owner = Give Owners Permission in new campaigns Preferences.label.initiative.owner.tooltip = Owner Permission allows players to perform certain actions on their tokens in the Initiative panel. Preferences.label.initiative.lock = Lock Player Movement in new campaigns Preferences.label.initiative.lock.tooltip = When enabled, players will only be able to move their token when that token has initiative. Preferences.label.initiative.msg = Show Initiative Gain Message Preferences.label.initiative.msg.tooltip = When enabled, a message is sent to chat when a token gains initiative. -Preferences.label.client.fitview = Fit GM view -Preferences.label.client.fitview.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? +Preferences.label.client.fitView = Fit GM view +Preferences.label.client.fitView.tooltip = When forcing players to the GM's view, should the player's map be zoomed such that their screen shows at least the same content as the GM's screen? Preferences.label.client.default.username = Default Username Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = Discovery Timeout Preferences.label.upnp.timeout.tooltip = Timeout period in milliseconds to wait when looking for UPnP gateways. Preferences.label.macros.permissions = Enable External Macro Access Preferences.label.macros.permissions.tooltip = Enable macros to call functions that can access your drive and http services. The following functions will be enabled\: getRequest, postRequest, exportData, getEnvironmentVariable. -Preferences.label.chat.macrolinks = Suppress ToolTips for MacroLinks -Preferences.label.chat.macrolinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = Suppress ToolTips for MacroLinks +Preferences.label.chat.macroLinks.tooltip = MacroLinks show normally tooltips that state informations about the link target. This is a anti cheating device. This options let you disable this tooltips for aesthetic reasons. +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label\: # StatSheet diff --git a/src/main/resources/net/rptools/maptool/language/i18n_zh_CN.properties b/src/main/resources/net/rptools/maptool/language/i18n_zh_CN.properties index 372513738e..b90ef72827 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n_zh_CN.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n_zh_CN.properties @@ -149,8 +149,8 @@ Label.objects = 对象 Label.token = 指示物 Label.tokens = 指示物 Label.backgrounds = 背景 -Label.macroeditor = 宏编辑器 -Label.styletheme = 主题样式 +Label.macroEditor = 宏编辑器 +Label.styleTheme = 主题样式 Label.currentTheme = Current Theme Label.filterTheme = Theme Filter Label.useThemeForChat = Use Theme Colors for Chat Window @@ -167,9 +167,9 @@ Label.save = 保存 Label.minute = 分钟 Label.performance = 性能 Label.client = 客户端: -Label.macropanels = 宏面板 +Label.macroPanels = 宏面板 Label.upnp = UPnP -Label.macropermissions = 宏权限 +Label.macroPermissions = 宏权限 Label.path = 路径: Label.url = 网址 Label.url2 = 网址\: @@ -186,7 +186,7 @@ Label.filesystem = 文件系统... Label.filesystem2 = 文件系统 Label.roll = 掷骰: Label.table.image = 表图像 -Label.blankdefault = (留空为默认值) +Label.blankDefault = (留空为默认值) Label.range = 范围 Label.image = 图像 Label.value = 值 @@ -196,7 +196,7 @@ Label.table.export = 导出表 Label.preview = 预览 Label.foreground = 前景 Label.background = Background\: -Label.showbackground = 显示背景 +Label.showBackground = 显示背景 Label.showBorder = Show Border Label.borderWidth = Border Width Label.border.color = Border Color @@ -210,7 +210,7 @@ Label.advanced = 高级 Label.view = 视图\: Label.board = 板块 Label.visibility = 可见性 -Label.pathfilename = 路径/文件名: +Label.pathFilename = 路径/文件名: Label.allowURIAccess = 允许 URI 访问 Label.rotation = Rotation #Scale as in ratio @@ -641,14 +641,14 @@ Preferences.combo.tokens.naming.filename = 使用文件名 Preferences.combo.tokens.naming.creature = 使用 "{0}" Preferences.label.tokens.dialog = 在新指示物上显示对话框 Preferences.label.tokens.dialog.tooltip = 确定当将指示物拖到地图上时,是否会出现新指示物对话框。 -Preferences.label.tokens.statsheet = 状态表肖像大小 -Preferences.label.tokens.statsheet.tooltip = 鼠标划过时显示的状态表中图像的大小。设置为0时禁用肖像。 +Preferences.label.tokens.statSheet = 状态表肖像大小 +Preferences.label.tokens.statSheet.tooltip = 鼠标划过时显示的状态表中图像的大小。设置为0时禁用肖像。 Preferences.label.tokens.portrait.mouse = 鼠标悬停时显示肖像 Preferences.label.tokens.portrait.mouse.tooltip = 鼠标悬停在指示物上时是否显示肖像。 -Preferences.label.tokens.statsheet.mouse = 鼠标悬停时显示状态表 -Preferences.label.tokens.statsheet.mouse.tooltip = 鼠标悬停在指示物上时是否显示状态表。 -Preferences.label.tokens.statsheet.shift = 显示状态表需要按住SHIFT -Preferences.label.tokens.statsheet.shift.tooltip = 勾选后,当按住SHIFT键并且鼠标悬停在指示物上时,才会显示状态表。未勾选时,按住SHIFT键并且鼠标悬停在指示物上时,隐藏状态表。 +Preferences.label.tokens.statSheet.mouse = 鼠标悬停时显示状态表 +Preferences.label.tokens.statSheet.mouse.tooltip = 鼠标悬停在指示物上时是否显示状态表。 +Preferences.label.tokens.statSheet.shift = 显示状态表需要按住SHIFT +Preferences.label.tokens.statSheet.shift.tooltip = 勾选后,当按住SHIFT键并且鼠标悬停在指示物上时,才会显示状态表。未勾选时,按住SHIFT键并且鼠标悬停在指示物上时,隐藏状态表。 Preferences.label.tokens.arrow = 强制显示面向箭头 Preferences.label.tokens.arrow.tooltip = 强制使用图像表显示俯视角指示物的面向箭头。 Preferences.label.tokens.drag.snap = 拖动时吸附指示物 @@ -672,7 +672,7 @@ Preferences.label.chat.trusted.background = 信任宏文本背景色 Preferences.label.chat.trusted.background.tooltip = 信任宏生成的文本强制使用特定的背景颜色。 Preferences.label.chat.trusted.foreground = 信任宏文本前景色 Preferences.label.chat.trusted.foreground.tooltip = 信任宏生成的文本强制使用特定的前景颜色。 -Preferences.label.macroeditor.tooltip = 宏编辑器的主题。 +Preferences.label.macroEditor.tooltip = 宏编辑器的主题。 Preferences.label.facing.edge = 在边缘 Preferences.label.facing.edge.tooltip = 旋转指示物面向时,吸附到单元格边缘。 Preferences.label.facing.vertices = 在顶点 @@ -758,12 +758,12 @@ Preferences.label.light.opacity = 光源不透明度 Preferences.label.light.opacity.tooltip = Measures how opaque the light overlay is drawn (0-255). Has no effect on maps with environmental lighting. Preferences.label.fog.opacity = 迷雾不透明度 Preferences.label.fog.opacity.tooltip = Measures how opaque the "soft fog" overlay is drawn (0-255). -Preferences.label.fog.mapvisibilitywarning = Hide 'Map not visible to players' Warning -Preferences.label.fog.mapvisibilitywarning.tooltip= Hide warning from players telling that map is not visible. +Preferences.label.fog.mapVisibilityWarning = Hide 'Map not visible to players' Warning +Preferences.label.fog.mapVisibilityWarning.tooltip= Hide warning from players telling that map is not visible. Preferences.label.fog.autoexpose = 指示物移动时自动探索迷雾(个人服务器) Preferences.label.fog.autoexpose.tooltip = If enabled, the fog of war is automatically exposed as a token moves on maps with a grid. When running a server, this setting is ignored in favor of the settings in the 'Start Server' dialog. -Preferences.label.performance.fillselection = 填充选择框 -Preferences.label.performance.fillselection.tooltip = 若启用,拖动鼠标选择多个指示物时的选框将显示半透明阴影。 +Preferences.label.performance.fillSelection = 填充选择框 +Preferences.label.performance.fillSelection.tooltip = 若启用,拖动鼠标选择多个指示物时的选框将显示半透明阴影。 Preferences.label.performance.cap = 帧速率 Preferences.label.performance.cap.tooltip = 渲染地图时候所使用的帧速率上限。 Preferences.label.performance.render = Image Scaling Quality @@ -773,16 +773,16 @@ Preferences.combo.render.pixel = Pixel Art Preferences.combo.render.medium = Medium Preferences.combo.render.high = High (Slowest) Preferences.label.initiative.defaults = 战役默认值 -Preferences.label.initiative.hidenpc = 隐藏新地图上的NPC -Preferences.label.initiative.hidenpc.tooltip = 若启用,NPC 将不会出现在玩家的先攻板中。 +Preferences.label.initiative.hideNPC = 隐藏新地图上的NPC +Preferences.label.initiative.hideNPC.tooltip = 若启用,NPC 将不会出现在玩家的先攻板中。 Preferences.label.initiative.owner = 在新战役中给予所有者权限 Preferences.label.initiative.owner.tooltip = 所有者权限允许玩家在先攻面板中根据他们的指示物执行某些操作。 Preferences.label.initiative.lock = 在新战役中锁定玩家移动 Preferences.label.initiative.lock.tooltip = 若启用,玩家只能在指示物拥有先攻时移动。 Preferences.label.initiative.msg = 显示先攻消息 Preferences.label.initiative.msg.tooltip = 若启用,当指示物获得先攻时发送信息到聊天窗口。 -Preferences.label.client.fitview = 适应GM视图 -Preferences.label.client.fitview.tooltip = 当使用“强制玩家显示GM视图”时,玩家地图是否缩放至与GM屏幕相同。 +Preferences.label.client.fitView = 适应GM视图 +Preferences.label.client.fitView.tooltip = 当使用“强制玩家显示GM视图”时,玩家地图是否缩放至与GM屏幕相同。 Preferences.label.client.default.username = 默认用户名 Preferences.label.client.default.username.tooltip = The default username that appears in the MapTool toolbar. Preferences.label.installDir = Installation Directory @@ -797,9 +797,9 @@ Preferences.label.upnp.timeout = 发现超时 Preferences.label.upnp.timeout.tooltip = 寻找UPnP网关时的等待超时时间,以毫秒为单位。 Preferences.label.macros.permissions = 启用外部宏访问 Preferences.label.macros.permissions.tooltip = 启用宏来调用能够访问您的驱动器和 http 服务的函数。以下函数将被启用:getRequest、postRequest、exportData、getEnvironmentVariable。 -Preferences.label.chat.macrolinks = 取消宏链接的工具提示 -Preferences.label.chat.macrolinks.tooltip = 宏链接通常会在工具提示中显示链接目标,这是一种防作弊装置。 出于美观考虑,你可以关闭工具提示。 -Preference.checkbox.chat.macrolinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks +Preferences.label.chat.macroLinks = 取消宏链接的工具提示 +Preferences.label.chat.macroLinks.tooltip = 宏链接通常会在工具提示中显示链接目标,这是一种防作弊装置。 出于美观考虑,你可以关闭工具提示。 +Preference.checkbox.chat.macroLinks.tooltip = Enabled\: do not show tooltips for macroLink
Disabled (default)\: show tooltips for macroLinks PreferencesDialog.themeChangeWarning = Changing the theme requires a restart of MapTool to take effect. PreferencesDialog.themeChangeWarningTitle = Theme Change. Preferences.combo.themes.filter.all = All @@ -2916,17 +2916,17 @@ data.error.receivingUpdate = Error receiving game data update. data.error.importGameData = Error importing game data. data.error.clearingNamespace = Error clearing data namespace {0} from type {1}. data.error.removingData = Error data data from {0} namespace {1} from type {2}. -Label.icontheme=Icon theme -Preferences.label.icontheme.tooltip=The theme aplication icons use. -Label.theme.macroeditor=Macro editor theme +Label.iconTheme=Icon theme +Preferences.label.iconTheme.tooltip=The theme aplication icons use. +Label.theme.macroEditor=Macro editor theme TEXT_TYPE=Text type -EditTokenDialog.button.movevbltoggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy -EditTokenDialog.button.movembltoggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy -EditTokenDialog.button.movehbltoggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy -EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy -EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy -EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map -EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map +EditTokenDialog.button.moveVBToggle.tooltip=Include Wall Vision Blocking Layer (Wall VBL) during move or copy +EditTokenDialog.button.moveMBToggle.tooltip=Include Movement Blocking Layer (MBL) during move or copy +EditTokenDialog.button.moveHBToggle.tooltip=Include Hill Vision Blocking Layer (Hill VBL) during move or copy +EditTokenDialog.button.movePBToggle.tooltip=Include Pit Vision Blocking Layer (Pit VBL) during move or copy +EditTokenDialog.button.moveCBToggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy +EditTokenDialog.button.moveFromMap.tooltip=Move or Copy selected blocking layer from Map +EditTokenDialog.button.moveToMap.tooltip=Move or Copy selected blocking layer to Map Label.label=Label\: # StatSheet