From 1b43dc651868f6f5d78496e203523ce652fdeca7 Mon Sep 17 00:00:00 2001
From: rptools-automation
<47437651+rptools-automation@users.noreply.github.com>
Date: Sat, 22 Feb 2020 00:01:12 +1030
Subject: [PATCH 01/15] New translations i18n.properties (Japanese)
---
.../net/rptools/maptool/language/i18n_ja.properties | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/main/resources/net/rptools/maptool/language/i18n_ja.properties b/src/main/resources/net/rptools/maptool/language/i18n_ja.properties
index 9392095512..6f8487693d 100644
--- a/src/main/resources/net/rptools/maptool/language/i18n_ja.properties
+++ b/src/main/resources/net/rptools/maptool/language/i18n_ja.properties
@@ -1113,7 +1113,7 @@ msg.error.mtprops.light.arc = 照明:{0,number}行:不当
msg.error.mtprops.light.distance = 照明:{0,number}行:不当な照明の距離「{1}」
msg.error.mtprops.light.gmOrOwner = 照明:{0,number}行:GMと所有者のみがオーラを指定可能。
msg.error.mtprops.light.ioexception = 照明の定義文の読み込み中にエラー発生。そんなはずは無いのだが...
-msg.error.mtprops.light.lumens = Light\:line {0,number}\:unrecognizable lumens "{1}"
+msg.error.mtprops.light.lumens = 光源:{0,number}行目:『{1}』は光量として解釈できません
msg.error.mtprops.properties.duplicate = 「{0}」のプロパティ名を「{1}」に複製します。
msg.error.mtprops.properties.duplicateComment = 「{0}」の行はコメントと思われるが、この警告を抑止するには「{1}」を複製し、一意になるようにしなければならない。
msg.error.mtprops.properties.ending = 編集モードに戻ります。
@@ -1147,12 +1147,12 @@ msg.error.unableToCreateClientIdFile = クライアントIDファイル
msg.error.unableToCreateDataDir = データ・フォルダー ''{0}'' を作成できません。環境変数「MAPTOOL_DATADIR」に手動でデータ・フォルダーを設定してみてください。
msg.error.unableToReadClientIdFile = クライアントIDファイルを読み込むことができません。
msg.error.unknownHost = 未知のホスト
-msg.error.unknownJavaVersion = Cannot determine Java version?\! Will attempt to continue anyway...
+msg.error.unknownJavaVersion = Javaのバージョンを特定出ません?! とりあえず処理の続行を試みます…
msg.error.unusableDataDir = 危険な文字が含まれている恐れがあるため、データ・ディレクトリー「{0}」を使用できません。環境変数「MAPTOOL_DATADIR」を使用し、手動でデータディレクトリを指定してください。
msg.error.unusableDir = ディレクトリー「{0}」は危険な文字を含んでいる恐れがあり、使用されません。
msg.error.versionFile = バージョンファイルが見つかりません:{0}
-msg.error.unableToGetThemeList = Error fetching theme list.
-msg.error.wrongJavaVersion = You are running MapTool using a version of Java too old to be 100% compatible with some of the third-party libraries used. If you continue to use MapTool, you may experience unexpected crashes do to this incompatibility. Do you want to continue?
+msg.error.unableToGetThemeList = テーマの一覧を取得する際にエラーが発生しました。
+msg.error.wrongJavaVersion = MapTool が使用する一部のサードパーティ製ライブラリーと100%の互換性がない古いバージョンの Java を使用して MapTool を実行しています。 MapTool の使用を続けた場合、この非互換により予期せぬ障害に見舞われる可能性があります。このまま実行を続けますか?
msg.info.action.disableFoW = 不明領域は無効です。
msg.info.action.disableRevealFogAtWaypoints = FoW will now expose at all cell points along the path.
msg.info.action.enableFoW = 不明領域は有効です。
From 1c39cc3b4d9876b01d4397e21e51a9febc959f8f Mon Sep 17 00:00:00 2001
From: rptools-automation
<47437651+rptools-automation@users.noreply.github.com>
Date: Sat, 22 Feb 2020 03:11:23 +1030
Subject: [PATCH 02/15] New translations i18n.properties (Japanese)
---
.../maptool/language/i18n_ja.properties | 42 +++++++++----------
1 file changed, 21 insertions(+), 21 deletions(-)
diff --git a/src/main/resources/net/rptools/maptool/language/i18n_ja.properties b/src/main/resources/net/rptools/maptool/language/i18n_ja.properties
index 6f8487693d..0ee1c51977 100644
--- a/src/main/resources/net/rptools/maptool/language/i18n_ja.properties
+++ b/src/main/resources/net/rptools/maptool/language/i18n_ja.properties
@@ -1154,7 +1154,7 @@ msg.error.versionFile = バージョンファイルが
msg.error.unableToGetThemeList = テーマの一覧を取得する際にエラーが発生しました。
msg.error.wrongJavaVersion = MapTool が使用する一部のサードパーティ製ライブラリーと100%の互換性がない古いバージョンの Java を使用して MapTool を実行しています。 MapTool の使用を続けた場合、この非互換により予期せぬ障害に見舞われる可能性があります。このまま実行を続けますか?
msg.info.action.disableFoW = 不明領域は無効です。
-msg.info.action.disableRevealFogAtWaypoints = FoW will now expose at all cell points along the path.
+msg.info.action.disableRevealFogAtWaypoints = 不明領域は移動経路に沿う全てのマス目で公開されます。
msg.info.action.enableFoW = 不明領域は有効です。
msg.info.action.enableRevealFogAtWaypoints = 不明領域は経由地点でのみ公開されるようになりました。
msg.info.action.FoWDisabled = 不明領域が無効化されました。
@@ -1164,7 +1164,7 @@ msg.info.campaignSaving = キャンペーンを保存中
msg.info.connecting = 接続中
msg.info.disconnected = サーバーから切断しました。
msg.info.heartbeat.registryFailure = マップツール登録所に対する接続の更新に失敗しました(これまで計{2}回の失敗)。登録サーバーは、今後のクライアントの接続が困難になるため、定期手に記録を破棄します。この状況が持続する場合、クライアントにサーバー情報を提供する必要があるでしょう(IPアドレス『{0}』とポート番号『{1}』)。
-msg.info.heartbeat.registrySuccess = Connection refresh to the MapTool registry succeeded (after {0} past failures). As long as success is maintained, you will not see this message again.
+msg.info.heartbeat.registrySuccess = MapTool 登録所への接続の更新に接続しました({0}回の失敗の後)。接続の成功を維持している限り、このメッセージが表示されることはありません。
msg.info.macro.exportCancel =
マクロのエクスポートを中止しました。
msg.info.macro.exportSuccess = マクロのエクスポートを完了しました。
msg.info.mapLoading = マップの読み込み中
@@ -1174,17 +1174,17 @@ msg.info.playerBooted = {0}を切断しました。
msg.info.playerConnected = {0}が接続しました。
msg.info.playerDisconnected = {0}が切断しました。
msg.info.restoreLayout = レイアウトを復帰
-msg.info.restoreLayout.description = Restore the MapTool user interface to the default layout.
+msg.info.restoreLayout.description = MapToolのユーザーインターフェースのレイアウトを初期状態に復元します。
msg.info.screenshotSaved = スクリーンショットを保存しました。
msg.info.screenshotSaving = スクリーンショットを保存中...
msg.info.server.forumNFAQ_URL = http\://forums.rptools.net/viewtopic.php?f\=22&t\=3370
msg.info.server.networkingHelp = MapToolサーバーの稼働には適切なネットワーク設定が必要です。 設定の手順を説明したフォーラムの記事を読んでみますか?
msg.info.showTransferWindow = 転送ウィンドウを表示
-msg.info.showTransferWindow.description = Open a window showing the pending asset transfers.
+msg.info.showTransferWindow.description = 転送保留中の素材を表示するウインドウを開きます。
msg.info.startServer = サーバーを開始しました。
# Some of these don't have the "..." appended to them because the
# code adds that, if appropriate, based on the situation.
-msg.info.versionFile = CAN'T FIND VERSION FILE
+msg.info.versionFile = バージョンファイルが見つかりません
msg.title.exportMacro = マクロのエクスポート
msg.title.exportMacroSet = マクロ・セットのエクスポート
msg.title.exportProperties = プロパティのエクスポート
@@ -1214,7 +1214,7 @@ msg.warn.failedAutoSavingMessageHistory = メッセージ履歴を自動
msg.warning.macro.playerChangesNotAllowed = このマクロを変更することは、GMに禁止されています。
msg.warning.macro.willNotExport = マクロ「{0}」はエクスポートされませんでした。GMによりプレイヤーが編集することを禁止されているか、元のアイテムの所有権がないかのどちらかです。
-msg.asset.error.invalidAsset = An invalid asset has been selected. If you get this message please report it on the MapTool forums or Discord server.
+msg.asset.error.invalidAsset = 不正な素材が選択されています。このメッセージが表示された場合、MapTool のフォーラムまたは Discord サーバーに報告をお願いします。
ooc.description = キャラクター外発言を行う。
@@ -1222,19 +1222,19 @@ panel.Asset.ImageModel.checkbox.searchSubDir1 = サブディレクトリーを
panel.Asset.ImageModel.checkbox.searchSubDir2 = 結果
panel.Asset.ImageModel.slider.toolTip = スライドは、プレビューサムネールのサイズを調整するために...
panel.Campaign = キャンペーン
-panel.Campaign.description = Dockable window for Campaign macros.
+panel.Campaign.description = キャンペーンマクロ用のドッキングウインドウ。
panel.Gm = GM
-panel.Gm.description = Dockable window for GM-visible macros
+panel.Gm.description = GMだけに表示されるマクロ用のドッキングウインドウ
panel.Chat = チャット
-panel.Chat.description = Dockable chat window.
+panel.Chat.description = チャットのドッキングウインドウ
# These are not currently used. Ideally, they would be the titles
# placed on the various dockable panels used by MapTool, but there are
# complications. See the definition of 'MTFrame' in the MapToolFrame
# class if you're interested in the programming issues.
panel.Connections = 接続
-panel.Connections.description = Dockable window showing connected clients.
+panel.Connections.description = 接続中クライアントを表示するドッキングウインドウ。
panel.DrawExplorer = 描画エクスプローラー
-panel.DrawExplorer.description = Dockable window for managing drawings.
+panel.DrawExplorer.description = 描画管理用のドッキングウインドウ。
panel.DrawExplorer.LineSegment.Line = points({0}) pen width({1})
panel.DrawExplorer.ShapeDrawable.Area = width({0}) height({1})
panel.DrawExplorer.ShapeDrawable.Float = width({0}) height({1})
@@ -1251,16 +1251,16 @@ panel.DrawExplorer.Template.WallTemplate = 壁({0})
# DrawExplorer panel
panel.DrawExplorer.Unknown.Shape = 不明な形状({0})
panel.Global = 全体
-panel.Global.description = Dockable window showing macros stored on the local computer.
+panel.Global.description = 自分のコンピューターに保存されているマクロを表示するドッキングウインドウ。
panel.Impersonate = 発言主に設定
-panel.Impersonate.description = Dockable window showing the macros stored on the currently impersonated token.
+panel.Impersonate.description = 現在発言対象となっているトークン上に保持されているマクロを表示するドッキングウインドウ。
panel.Impersonate.button.impersonateSelected = 選択トークンを発言主に
panel.Initiative = イニシアチブ
-panel.Initiative.description = Dockable window for managing combat initiative.
+panel.Initiative.description = 戦闘イニシアチブを管理するドッキングウインドウ。
panel.Library = ライブラリ
-panel.Library.description = Dockable window to access assets in your Resource Library.
+panel.Library.description = あなたの素材管理ライブラリー上の素材を扱うためのドッキングウインドウ。
panel.MapExplorer = マップ管理
-panel.MapExplorer.description = Dockable window showing the tokens and other assets on the current map.
+panel.MapExplorer.description = 現在の地図上のトークンや他の素材を表示するドッキングウインドウ。
panel.MapExplorer.View.BACKGROUND = 背景
panel.MapExplorer.View.CLIPBOARD = クリップボード
panel.MapExplorer.View.GM = 非表示
@@ -1272,19 +1272,19 @@ panel.MapExplorer.View.PLAYERS = プレイヤー
# panel, not the title or the string used internally to reference the panel.
panel.MapExplorer.View.TOKENS = トークン
panel.Selected = 選択中
-panel.Selected.description = Dockable window showing the macros on the currently selected token(s).
+panel.Selected.description = 現在選択中のトークン(複数可)上に保持されているマクロを表示するドッキングウインドウ。
panel.Selected.tooltip.deslectAll = 全選択解除
panel.Selected.tooltip.next = 次のトークンを選択
panel.Selected.tooltip.previous = 前のトークンを選択
panel.Selected.tooltip.revertToPrevious = 直前の選択状態に戻す
panel.Selected.tooltip.selectAll = マップ上の全トークンを選択
panel.Tables = テーブル
-panel.Tables.description = Dockable window for managing the tables in the current campaign.
+panel.Tables.description = 現在のキャンペーンの表を管理するドッキングウインドウ。
-prefs.language.override.tooltip = Select a language for the MapTool interface.
+prefs.language.override.tooltip = MapTool の操作に用いる言語を選択する。
-prefs.jvm.advanced.enableAssertions.tooltip = Enables Java language assertions in the MapTool code.
-prefs.jvm.advanced.direct3d.tooltip = Disable the use of Direct3D pipeline for problem video cards/drivers.
+prefs.jvm.advanced.enableAssertions.tooltip = MapTool のコード内の Java 言語アサーションを有効にする。
+prefs.jvm.advanced.direct3d.tooltip = グラフィックカードまたはドライバーによる不具合のため、Direct3D機能の使用を無効にする。
prefs.jvm.advanced.opengl.tooltip = OpenGLパイプラインを有効にする。
prefs.jvm.advanced.initAWTbeforeJFX.tooltip = JavaFxより前にAWTを有効にする。これはMacOS固有の問題に対する者です。
From 2dc630a4431d084b252f5999e6388d9256d50a0c Mon Sep 17 00:00:00 2001
From: Marco Bizzarri
Date: Fri, 21 Feb 2020 22:19:35 +0000
Subject: [PATCH 03/15] Proof of concept fix for long loading times
Refers to #126
---
src/main/java/net/rptools/maptool/util/SysInfo.java | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/main/java/net/rptools/maptool/util/SysInfo.java b/src/main/java/net/rptools/maptool/util/SysInfo.java
index 7dd789a15d..1532519606 100644
--- a/src/main/java/net/rptools/maptool/util/SysInfo.java
+++ b/src/main/java/net/rptools/maptool/util/SysInfo.java
@@ -85,7 +85,6 @@ public JsonObject getSysInfoJSON() {
JsonObject os = new JsonObject();
Properties p = System.getProperties();
- Map env = System.getenv();
// maptool info
mt.addProperty("version", MapTool.getVersion());
@@ -213,8 +212,7 @@ private static String getEncoding() {
final byte[] bytes = {'D'};
final InputStream inputStream = new ByteArrayInputStream(bytes);
final InputStreamReader reader = new InputStreamReader(inputStream);
- final String encoding = reader.getEncoding();
- return encoding;
+ return reader.getEncoding();
}
private void getNetworkInterfaces() {
@@ -347,7 +345,8 @@ private Container createContentPane() {
contentPane.add(this.scrollPane, "Center");
- getInfo();
+ new Thread(this::getInfo).start();
+
return contentPane;
}
From fd08842d7ae58f04f0b2f5465ac9a68ecc14158d Mon Sep 17 00:00:00 2001
From: Marco Bizzarri
Date: Sat, 22 Feb 2020 12:55:33 +0000
Subject: [PATCH 04/15] Fixes the problem introduced in #1215
getFileAsInputStream was using a try with resources, so it was always returning a closed InputStream.
Also, added a couple of unit tests as a starting point for properly testing this class.
Refers to #1215
---
.gitignore | 3 +
.../java/net/rptools/lib/io/PackedFile.java | 13 ++---
.../net/rptools/lib/io/PackedFileTest.java | 56 +++++++++++++++++++
3 files changed, 65 insertions(+), 7 deletions(-)
create mode 100644 src/test/java/net/rptools/lib/swing/preference/net/rptools/lib/io/PackedFileTest.java
diff --git a/.gitignore b/.gitignore
index 7eb5c7d274..d463487c9e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,3 +46,6 @@ workbench.xmi
# Keystore
build-resources/rptools-keystore
+/log.html
+/report.html
+/output.xml
diff --git a/src/main/java/net/rptools/lib/io/PackedFile.java b/src/main/java/net/rptools/lib/io/PackedFile.java
index 709906352a..3d1491d297 100644
--- a/src/main/java/net/rptools/lib/io/PackedFile.java
+++ b/src/main/java/net/rptools/lib/io/PackedFile.java
@@ -603,13 +603,12 @@ public InputStream getFileAsInputStream(String path) throws IOException {
ZipEntry entry = new ZipEntry(path);
ZipFile zipFile = getZipFile();
- try (InputStream in = zipFile.getInputStream(entry)) {
- if (in == null) throw new FileNotFoundException(path);
- String type = FileUtil.getContentType(in);
- if (log.isDebugEnabled() && type != null)
- log.debug("FileUtil.getContentType() returned " + type);
- return in;
- }
+ InputStream in = zipFile.getInputStream(entry);
+ if (in == null) throw new FileNotFoundException(path);
+ String type = FileUtil.getContentType(in);
+ if (log.isDebugEnabled() && type != null)
+ log.debug("FileUtil.getContentType() returned " + type);
+ return in;
}
public void close() {
diff --git a/src/test/java/net/rptools/lib/swing/preference/net/rptools/lib/io/PackedFileTest.java b/src/test/java/net/rptools/lib/swing/preference/net/rptools/lib/io/PackedFileTest.java
new file mode 100644
index 0000000000..dd0e73f308
--- /dev/null
+++ b/src/test/java/net/rptools/lib/swing/preference/net/rptools/lib/io/PackedFileTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.lib.swing.preference.net.rptools.lib.io;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import net.rptools.lib.io.PackedFile;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+public class PackedFileTest {
+
+ public static final String A_PATH_TXT = "a_path.txt";
+ public static final String PACKED_TEST_FILE = "packedTestFile";
+ private static int counter = 1;
+
+ @Test
+ public void emptySave(@TempDir File tempDir) throws IOException {
+ File f = new File(tempDir, PACKED_TEST_FILE);
+ PackedFile pf = new PackedFile(f);
+ pf.save();
+ assertTrue(f.exists());
+ }
+
+ @Test
+ public void saveWithOneResource(@TempDir File tempDir) throws IOException {
+ File f = new File(tempDir, PACKED_TEST_FILE);
+ String test_content = "some content";
+ try (PackedFile pf = new PackedFile(f)) {
+ pf.putFile(A_PATH_TXT, test_content.getBytes());
+ pf.save();
+ }
+
+ try (PackedFile loaded = new PackedFile(f)) {
+ InputStream is = loaded.getFileAsInputStream(A_PATH_TXT);
+ String s = new String(is.readAllBytes());
+ assertEquals(test_content, s);
+ }
+ }
+}
From 17504f174842750e1fa7954da8b2dd6b45c5efef Mon Sep 17 00:00:00 2001
From: Marco Bizzarri
Date: Sat, 22 Feb 2020 16:13:45 +0000
Subject: [PATCH 05/15] Points to the latest version of maptool-resources with
the additional maps
Refers to #1309
---
build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build.gradle b/build.gradle
index 571410b62d..b176c21776 100644
--- a/build.gradle
+++ b/build.gradle
@@ -182,7 +182,7 @@ dependencies {
implementation 'net.rptools.decktool:decktool:1.0.b1'
- implementation 'net.rptools.maptool.resource:maptool.resource:1.0.b18'
+ implementation 'net.rptools.maptool-resources:maptool-resources:1.4.0.1'
implementation 'com.github.RPTools:parser:1.5.5'
implementation 'jide-common:jide-common:3.2.3'
From ea4d95bd1a60b5faac43b8d105702442ed3f7dea Mon Sep 17 00:00:00 2001
From: rptools-automation
<47437651+rptools-automation@users.noreply.github.com>
Date: Mon, 24 Feb 2020 01:04:34 +1030
Subject: [PATCH 06/15] New translations i18n.properties (Danish)
---
.../maptool/language/i18n_da.properties | 1517 +++++++++++++++++
1 file changed, 1517 insertions(+)
create mode 100644 src/main/resources/net/rptools/maptool/language/i18n_da.properties
diff --git a/src/main/resources/net/rptools/maptool/language/i18n_da.properties b/src/main/resources/net/rptools/maptool/language/i18n_da.properties
new file mode 100644
index 0000000000..0a49368e51
--- /dev/null
+++ b/src/main/resources/net/rptools/maptool/language/i18n_da.properties
@@ -0,0 +1,1517 @@
+
+#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
+# This software copyright by various authors including the RPTools.net
+# development team, and licensed under the LGPL Version 3 or, at your
+# option, any later version.
+#
+# Portions of this software were originally covered under the Apache
+# Software License, Version 1.1 or Version 2.0.
+#
+# See the file LICENSE elsewhere in this distribution for license details.
+#_____________________________________________________________________
+#
+# This is the English translation file for MapTool 1.3. If you are
+# translating MapTool to another language and leave out a translation
+# for any key that appears here (the "key" is the text before the "=")
+# then the values in this file will be used.
+#
+# Please submit all translations using the UTF-8 encoding! If you MUST
+# use a different encoding, please document it INSIDE your translation
+# file. I use an automated technique to detect the encoding and convert
+# the file to the Unicode format that Java needs. (For those who are
+# interested, it involves the "native2ascii" program which is part of
+# the Java Software Development Kit.)
+#
+# Some of the keys used in this file are not consistent. :( For example,
+# the NewMap menu option has the key "action.newMap" but the QuickMap
+# menu option is "menu.QuickMap". IMO this should be fixed, but MapTool
+# 1.4 will likely have a completely different (i.e. consistent) set of
+# keys, so we're not going to bother for 1.3.
+#
+# In all cases in this file, any accelerator keystroke will automatically
+# have the 'menuShortcut' key added to it. For Windows this is the Ctrl
+# key, on the Mac it's the Command (Cmd) key. Other platforms may have yet
+# other keys.
+#
+# IMPORTANT: Do not add the platform-dependent menu modifier key to this
+# file! If you add "ctrl", for example, the modifier will be ignored
+# on Windows but will require Mac users to use Cmd-Ctrl-C for a copy
+# operation. This is an ugly situation and we should find some way to
+# define a menuShortcutKey (such as "menu") and then be able to use
+# that in our definition strings. I expect that MapTool 1.4 will have
+# a user interface for changing these keystrokes so perhaps it's all
+# moot anyway.
+#
+# Note that the accelerator keys are not case-sensitive. So if you
+# specify "F" as the accelerator, that means lowercase "F". If you
+# want an uppercase "F", add the word "shift": "shift F" or "shift f".
+# There are a lot of examples of this throughout the file.
+#
+# Check the javadoc for the 'MessageFormat' class for more details on
+# the formatting of text in this file, as you'll see below (basically
+# anything with braces):
+# http://download.oracle.com/javase/7/docs/api/java/text/MessageFormat.html
+# Localization contributed by David Herman ("aku" on forums.rptools.net)
+ActivityMonitorPanel.colorDefinition = Grøn\: Sender, Rød\: Modtager
+
+AppHomeDiskSpaceStatusBar.toolTip = Nuværende ledig plads i brugerens hjemme mappe.
+
+AssetCacheStatusBar.toolTip = Nuværende størrelse af aktiver cache mappe. Dobbelt-klik for a rydde denne cache.
+
+AssetViewerDialog.leftDragMove = Venstre muse-knap træk for at flytte
+AssetViewerDialog.rightDragResize = Højre muse-knap træk for at ændre størrelse
+
+AutoSaveManager.failed = Autosave failed\:
+AutoSaveManager.failed_badState = Autosave failed\:\nBad application state?\! Please report this\!
+AutoSaveManager.status.autoSaveComplete = Autosave complete. Elapsed time (ms)\: {0,number}
+AutoSaveManager.status.autoSaving = Autosaving campaign...
+
+CampaignProperties.error.initLightSources = Cannot initialize light sources.
+CampaignProperties.error.noGenericLight = Can't get light source "Generic \: 5"?\!
+
+ChatAutoSave.status.chatAutosave = Autosaving chat log...
+
+Color.aqua = aqua
+Color.black = black
+Color.blue = blue
+Color.cyan = cyan
+Color.darkgray = dark gray
+Color.fuchsia = fuchsia
+Color.gray = gray
+Color.gray25 = 25% gray
+Color.gray50 = 50% gray
+Color.gray75 = 75% gray
+Color.green = green
+Color.lightgray = light gray
+Color.lime = lime
+Color.magenta = magenta
+Color.maroon = maroon
+Color.navy = navy
+Color.orange = orange
+Color.pink = pink
+Color.purple = purple
+Color.red = red
+Color.silver = silver
+Color.teal = teal
+Color.white = white
+Color.yellow = yellow
+
+ConnectToServerDialog.msg.headingServer = Server Name
+ConnectToServerDialog.msg.headingVersion = Version
+ConnectToServerDialog.msg.title = Connect to Server
+# This next string will use the results of looking up 'menu.file' for {0} and the lookup of 'action.showConnectionInfo' for {1}.
+ConnectToServerDialog.warning.doNotUseExternalAddress = It is unlikely that using your own external IP address will work.
Use your local address or localhost.
To see the current values, use the {1} option of the {0} menu.
Attempt connection anyway?
+
+ConnectionStatusPanel.notConnected = Not connected
+ConnectionStatusPanel.runningServer = Running a Server
+ConnectionStatusPanel.serverConnected = Connected to Server
+
+CoordinateStatusBar.mapCoordinates = Map Coordinates
+
+EditLookupTablePanel.error.badRange = Table "{0}" contains bad range "{1}" on row {2,number}.
+EditLookupTablePanel.error.invalidSize = Table "{0}" must have at least one row.
+EditLookupTablePanel.error.noName = Table must have a name.
+EditLookupTablePanel.error.sameName = Table name "{0}" duplicates existing table.
+EditLookupTablePanel.tooltip.allowLookup = Selecting this box allows players to execute a lookup against this table (i.e. double-click the table, use /table, or macro functions).
+EditLookupTablePanel.tooltip.visible = Selecting this box allows players to see this table in their Tables panel.
+
+EditTokenDialog.confirm.clearSpeech = Are you sure you want to clear all speech for this token?
+EditTokenDialog.confirm.vbl.autoGenerate = Are you sure you want to reset all VBL \n and automatically generate VBL for this token?
+EditTokenDialog.confirm.vbl.clearVBL = Are you sure you want to clear all VBL for this token?
+# These "generic" entries are currently not used; they're supposed to be
+# overridden with specific entries in the code. So if they show up,
+# it's a software bug. ;-)
+EditTokenDialog.msg.generic.colKey = Key (Bug\!)
+EditTokenDialog.msg.generic.colValue = Value (Bug\!)
+EditTokenDialog.msg.speech.colID = ID
+EditTokenDialog.msg.speech.colSpeechText = Speech Text
+EditTokenDialog.msg.title = Edit Token
+EditTokenDialog.msg.wrap = Wrap
+
+GridlessGrid.error.notLoaded = Could not load gridless grid footprints.
+
+Handshake.msg.duplicateName = Someone is already using that player name. Please choose another name and try again.
+Handshake.msg.wrongPassword = You entered the wrong password. Please try again.
+Handshake.msg.wrongVersion = The versions used do not match. You are trying to connect a client running version {0} to a server running version {1}. Please update your client to the correct version.
+
+ImageCacheStatusBar.toolTip = Current size of Image thumbs cache directory, Double-Click to clear this cache.
+
+# {0} is the table name to be deleted.
+LookupTablePanel.confirm.delete = Delete table "{0}"?
+LookupTablePanel.confirm.export = Export table "{0}"?
+LookupTablePanel.confirm.import = Import table "{0}"?
+LookupTablePanel.confirm.overwrite = Overwrite table "{0}"?
+LookupTablePanel.error.loadFailed = Could not load table.
+LookupTablePanel.error.saveFailed = Could not save table "{0}".
+LookupTablePanel.info.saved = Table saved as "{0}".
+LookupTablePanel.msg.titleEdit = Edit Table
+LookupTablePanel.msg.titleNew = New Table
+
+# Unfortunately, the Details button has not been localized yet. :(
+MapToolEventQueue.details = Click the Details... button to see more information. Please copy/paste the contents to a forum post when reporting errors.
+MapToolEventQueue.stackOverflow = A stack overflow has occurred.
This is commonly because a macro being used has exceeded the stack space specified when MapTool was executed. Please run MapTool again and specify a larger stack size.
+MapToolEventQueue.stackOverflow.title = Error\: Stack Overflow
+MapToolEventQueue.unexpectedError = An unexpected error has occurred.
+MapToolEventQueue.warning.title = Warning
+
+PersistenceUtil.error.campaignPropertiesLegacy = This campaign properties file is not a legacy format file readable by this version of MapTool.
+PersistenceUtil.error.campaignPropertiesVersion = This campaign properties file is not readable by this version of MapTool.
+PersistenceUtil.error.campaignPropertiesRead = Error while reading campaign properties data from file.
+PersistenceUtil.warn.campaignProperties.importWrongFileType = File is not a MapTool campaign properties file. File is {0}.
+
+PersistenceUtil.error.campaignRead = Error while reading campaign file.
+PersistenceUtil.error.campaignVersion = This campaign file is not readable by this version of MapTool. We will attempt to load using the legacy format...
+# The keys ending with "Read" are for reporting IOExceptions.
+# The ones ending with "Version" are for reporting ConversionExceptions (from XStream).
+PersistenceUtil.error.macroRead = Error while reading macro button data from file.
+PersistenceUtil.error.macroVersion = This macro button file is not readable by this version of MapTool.
+PersistenceUtil.error.macrosetVersion = This macroset file is not readable by this version of MapTool.
+PersistenceUtil.error.mapRead = Error while reading map data from file.
+PersistenceUtil.error.mapVersion = This map file is not readable by this version of MapTool.
+PersistenceUtil.error.tableRead = Error while reading table data from file.
+PersistenceUtil.error.tableVersion = This table file is not readable by this version of MapTool.
+PersistenceUtil.warn.campaignNotLoaded = Cannot determine campaign file format; not loaded.
+PersistenceUtil.warn.campaignWrongFileType = File is not a MapTool campaign file. File is {0}.
+PersistenceUtil.warn.importWrongFileType = File is not a MapTool map file. File is {0}.
+
+ServerDialog.error.port = You must enter a numeric port.
+ServerDialog.error.portNumberException = Port from RPTools registry is not numeric?\! Web server bug?
+ServerDialog.error.server = You must enter a server name or IP address.
+ServerDialog.error.serverNotFound = Server "{0}" not found.
+ServerDialog.error.username = A username must be provided.
+# The connection test has been disabled so these are not currently used.
+ServerDialog.msg.test1 = Setting Up For Connection Test...
+ServerDialog.msg.test2 = Performing connection test. Success is usually quick; failure often takes longer...
+ServerDialog.msg.test3 = Success\! I successfully connected to your computer from the Internet.
+# Yes, I know these are similar. But I wanted *some* difference so the
+# programmer can easily locate specific areas of the code.
+ServerDialog.msg.test4 = Could not see your computer from the Internet.
It could be a port forwarding issue. Visit the RPTools forum (Tools -> MapTool -> HOWTO) to find the Networking FAQ.
+ServerDialog.msg.test5 = Unable to see your computer from the Internet.
It could be a port forwarding issue. Visit the RPTools forum (Tools -> MapTool -> HOWTO) to find the Networking FAQ.
+ServerDialog.msg.test6 = Communication error during test...
+ServerDialog.msg.test7 = Unknown or unexpected exception during test.
+ServerDialog.msg.title = Start Server
+
+SquareGrid.error.pathhighlightingNotLoaded = Could not load path highlighting image.
+SquareGrid.error.squareGridNotLoaded = Could not load square grid footprints.
+
+Token.dropped.byPlayer = Tokens dropped onto map "{0}" by player {1}
+Token.error.unableToPaste = Failed to paste token(s) with duplicate name(s)\: {0}
+Token.error.unableToRename = Cannot rename token to "{0}" as there is already another token with this name on the map. Only the GM can create multiple tokens with the same name\!
+
+ToolbarPanel.manualFogActivated = Modifying the fog-of-war manually without a server running affects only the global exposed area (i.e. the entire map), even if one or more tokens are selected. If you want your changes to apply to individual tokens, start a MapTool server with Individual Fog enabled (you can leave the Alias field empty to make an anonymous server, if you wish).
This warning will not appear again for this campaign.
+
+TransferableHelper.error.ioException = I/O error during drag/drop operation.
+TransferableHelper.error.unrecognizedAsset = Could not retrieve drag/drop asset.
+TransferableHelper.error.unsupportedFlavorException = Unsupported data type during drag/drop operation.
+TransferableHelper.error.urlFlavor = Cannot read URL_FLAVOR.
+TransferableHelper.warning.badObject = Unable to obtain data from dropped object. Likely causes are an empty object due to a network error (such as proxy settings or missing authentication) or possibly an incompatible object was dropped (such as an invalid file type).
+TransferableHelper.warning.tokensAddedAndExcluded = Added {0,number} tokens. There were {1,number} tokens that could not be added because they were missing names or images.
+
+VisionDialog.error.EmptyDistance = Distance Text Field is empty, enter a distance.
+VisionDialog.error.numericDistanceOnly = Distance must be numeric.
+# These are for a first cut at a true vision UI but the code is
+# currently not accessible by the user.
+VisionDialog.msg.title = Vision
+
+# This message appears when a campaign is loaded and MapTool is scanning
+# the maps and optimizing their memory footprint by collapsing
+# drawables, if possible.
+Zone.status.optimizing = Optimizing map\: "{0}"
+
+action.addDefaultTables = Add Default Tables...
+action.addDefaultTables.description = Adds several dice image and card tables to the campaign.
+action.addIconSelector = Add Resource to &Library...
+action.addIconSelector.description = Opens a dialog to add local and remote content to your Resource Library.
+action.adjustBoard = Adjust Map Board...
+action.adjustBoard.description = Open dialog to adjust the position of the embedded map image.
+action.adjustGrid = &Adjust Grid...
+action.adjustGrid.accel = shift A
+action.adjustGrid.description = Open dialog to adjust the grid settings.
+action.autohideNewIcons = Autohide New Tokens
+action.autohideNewIcons.description = New tokens start invisible to players.
+action.autohideNewMaps = Autohide New Maps
+action.autohideNewMaps.description = New maps start invisible to players.
+# Other actions which are not necessarily on the top menu but may
+# appear on a context (i.e. right-click) menu or be connected to
+# an editable field on a dialog. NOTE: MapTool 1.3 does not properly
+# localize dialog labels yet! Only one or two dialogs have the
+# necessary code for localization.
+action.bootConnectedPlayer = Boot...
+action.campaignProperties = Campaign Properties...
+action.campaignProperties.description = Opens dialog for setting Campaign Properties.
+action.cancelCommand = Not used (action.cancelCommand)
+action.clearDrawing = Clear All Drawings
+action.clearDrawing.accel = shift D
+action.clearDrawing.description = Clear will clear all drawings from the active layer and clear all drawing undo history.
+action.clientConnect = Connect to Server...
+action.clientConnect.description = Connect as a client to a server.
+action.clientDisconnect = Disconnect from Server...
+action.clientDisconnect.description = Disconnect from or shutdown the server.
+action.collectPerformanceData = Collect Performance Data
+action.collectPerformanceData.description = Opens a floating panel that reports various performance statistics.
+action.commandPanel = Command Panel
+# These next two are used internally but never appear on a menu item.
+# In order to prevent I18N from warning that they don't exist these
+# lines have been added.
+action.commitCommand = Not used (action.commitCommand)
+action.copyTokens = Copy
+action.copyTokens.accel = C
+action.copyTokens.description = Copy selected tokens to an internal clipboard.
+action.copyZone = Copy...
+action.copyZone.description = Make a copy of the current map.
+action.cutTokens = Cut
+action.cutTokens.accel = X
+action.cutTokens.description = Cut selected tokens to an internal clipboard.
+action.debug.duplicateLastIcon = Duplicate Last Icon (debug)
+action.editMap = Edit Map...
+action.editMap.description = Open a dialog to edit settings for the current map.
+# Is this accelerator a bad choice on OSX? The Mac uses Cmd-W to mean
+# "close focused window"... Even if we answer "yes", should we change this?
+# I hate to start putting os-specific settings into the properties file. :(
+# Unless we add the "os.name" field as a prefix to all properties
+# as a way to override what's here. For example, adding a property named
+# mac os x.action.enabledFogOfWar.accel=f
+# to indicate a platform-specific change to the accelerator...?
+# With MapTool 1.4 expected to allow users to define their own accelerators
+# this probably doesn't matter much.
+action.enableFogOfWar = Fog-of-&War
+action.enableFogOfWar.accel = W
+action.enableFogOfWar.description = Enable the fog of war for the current map.
+action.enforceNotification = Enforce Typing Notifications
+action.enforceNotification.description = Enforce Typing Notifications.
+action.enforceView = &Center Players on Current View
+action.enforceView.accel = F
+action.enforceView.description = Causes all clients to zoom to your current view.
+action.enforceZone = &Enforce Players to Current Map
+action.enforceZone.accel = E
+action.enforceZone.description = Causes all clients to change to the map you are on.
+action.error.noMapBoard = There is no map image. Use "Edit Map..." to add one.
+# Not used on the Mac, as the application menu will have 'Quit' added to
+# it instead and Meta-Q set as the accelerator. Kind of ugly that it is
+# hard-coded in the application, but that's OSX for you. ;-)
+action.exit = E&xit
+action.exit.description = Exit out of MapTool.
+action.exportCampaignAs = Campaign As...
+action.exportCampaignAs.description = Export current campaign to a version compatible with older MapTool releases.
+action.exportScreenShot = Screenshot
+action.exportScreenShot.accel = shift S
+action.exportScreenShot.description = Export an image of the current map. Use Export Screenshot As first.
+action.exportScreenShotAs = Screenshot As...
+action.exportScreenShotAs.description = Opens a dialog to export an image of the current map.
+action.fullscreen = Fullscreen Mode
+action.fullscreen.accel = alt ENTER
+action.fullscreen.description = Change to full screen mode hiding everything else but the map view.
+action.gatherDebugInfo = Gather Debug Information...
+action.gatherDebugInfo.description = Collects information about your system to aid in troubleshooting or reporting bugs.
+action.gridSize = Grid &Line Width
+# These are url menu actions. Each item consists of three keys. The first key is
+# action.url.## which contains the displayed string. The second key is
+# action.url.##.description which contains the url to load when the action is
+# executed. The last key is action.url.##.icon which contains the image embedded
+# inside the MapTool JAR file which appears on the menu item.
+action.helpurl.01 = Documentation
+action.helpurl.01.description = https\://www.rptools.net/toolbox/maptool/
+action.helpurl.01.icon = net/rptools/maptool/client/image/book_open.png
+action.helpurl.02 = Tutorials
+action.helpurl.02.description = https\://www.rptools.net/tutorials/
+action.helpurl.02.icon = net/rptools/maptool/client/image/tutorial.jpg
+action.helpurl.03 = Forums
+action.helpurl.03.description = http\://forums.rptools.net/
+action.helpurl.03.icon = net/rptools/maptool/client/image/marker.png
+action.helpurl.04 = Networking Setup (forum thread)
+action.helpurl.04.description = http\://forums.rptools.net/viewtopic.php?f\=22&t\=3370
+action.helpurl.04.icon = net/rptools/maptool/client/image/download.png
+action.helpurl.05 = Macro Scripting
+action.helpurl.05.description = http\://lmwcs.com/rptools/wiki/Main_Page
+action.helpurl.05.icon = net/rptools/maptool/client/image/pencil.png
+action.hideMap = &Player Visible
+action.hideMap.accel = H
+action.hideMap.description = Toggle visibility of map for the players.
+action.linkPlayerView = Center Players on Current View (Continuous)
+action.linkPlayerView.accel = shift F
+action.linkPlayerView.description = Causes all clients to continuously track your view.
+action.loadCampaign = &Open Campaign...
+action.loadCampaign.accel = O
+action.loadCampaign.description = Load a previously saved campaign.
+action.loadMap = &Import Map...
+action.loadMap.description = Load a previously saved map.
+action.loadMap.warning1 = This is an experimental feature. Save your campaign before using this feature (you are a GM logged in remotely).
+action.loadMap.warning2 = Help opens a browser to the forum thread discussion and aborts this import.
+action.loadMap.warning3 = Yes acknowledges the issues and proceeds to import the map.
+action.loadMap.warning4 = No closes this panel and aborts the import.
+action.loadSaveDialog = DEBUG LOAD/SAVE
+action.loadSaveDialog.accel = F5
+action.macro.addNewToSelected = Add New to Selected
+action.macro.clearGroup = Clear Group...
+action.macro.clearPanel = Clear Panel...
+action.macro.delete = Delete...
+action.macro.deleteFromCommon = Delete from Common...
+action.macro.duplicate = Duplicate
+action.macro.duplicateOnSelected = Duplicate Macro on Selected
+action.macro.edit = Edit...
+action.macro.export = Export...
+action.macro.exportCommon = Export Common Macro...
+action.macro.exportCommonSet = Export Common Macro Set...
+action.macro.exportSet = Export Macro Set...
+action.macro.import = Import...
+action.macro.importSet = Import Macro Set...
+action.macro.importSetToSelected = Import Macro Set to Selected...
+action.macro.importToSelected = Import Macro to Selected...
+action.macro.new = Add New Macro
+action.macro.reset = Reset
+action.macro.runForEachSelected = Run for Each Selected
+action.macroEditor.gotoLine = &Go to Line...
+action.macroEditor.gotoLine.accel = L
+action.macroEditor.searchFind = &Find...
+action.macroEditor.searchFind.accel = F
+action.macroEditor.searchReplace = &Replace...
+action.macroEditor.searchReplace.accel = H
+action.macroEditor.showFindSearchBar = Show Find Search Bar
+action.macroEditor.showFindSearchBar.accel = shift F
+action.macroEditor.showReplaceSearchBar = Show Replace Search Bar
+action.macroEditor.showReplaceSearchBar.accel = shift H
+# File Menu
+action.newCampaign = &New Campaign
+action.newCampaign.description = Discards current campaign and creates a new campaign with a single Grasslands map.
+# Map Menu
+action.newMap = New Map...
+action.newMap.accel = N
+action.newMap.description = Opens a dialog to add a new map to the current campaign.
+action.newToken = New Token...
+action.newUnboundedMap = New Tiled Map...
+action.newUnboundedMap.accel = shift n
+action.openLogConsole = Open Log Console
+action.openLogConsole.title = Log Console
+action.openLogConsole.description = Opens the Log Console to display the log output.
+action.pasteTokens = Paste
+action.pasteTokens.accel = V
+action.pasteTokens.description = Paste internal clipboard to the current mouse location.
+action.preferences = Preferences...
+action.preferences.description = Opens Preferences dialog.
+action.redoDrawing = Redo Drawing
+action.redoDrawing.accel = R
+action.redoDrawing.description = Redo the most recent drawing in the undo history.
+action.refresh = Refresh
+action.refresh.accel = F5
+action.removeAssetRoot = Remove...
+action.removeZone = Delete...
+action.removeZone.description = Delete the current map from the campaign.
+action.renameMap = Rename...
+action.renameMap.description = Rename the current map.
+action.rescanNode = Rescan...
+action.restoreDefaultImages = Restore &Default Images...
+action.restoreDefaultImages.description = Restores the default tokens, textures, dice and other images to the Resource Library.
+action.restoreFogOfWar = Restore Fog-of-&War
+action.restoreFogOfWar.accel = shift R
+action.restoreFogOfWar.description = Restore the fog of war for the current map (erase all revealed FoW).
+action.revealFogAtWaypoints.description = Reveal Fog-of-War only at start and end points, as well as set way points.
+action.revealFogAtWaypoints = FoW\: Expose only at way points
+action.revealFogAtWaypoints.accel = shift W
+action.runMacro = &Run Macro
+action.runMacro.accel = typed /
+action.runMacro.description = Makes the chat window active and begins the line with a slash(/).
+action.saveCampaign = &Save Campaign
+action.saveCampaign.accel = S
+action.saveCampaign.description = Save all resources (maps, tokens, tables, etc) in a single file.
+action.saveCampaignAs = Save Campaign &As...
+action.saveCampaignAs.accel = A
+action.saveCampaignAs.description = Save all resources (maps, tokens, tables, etc) in a single file.
+action.saveMapAs = &Export Map...
+action.saveMapAs.description = Save a map to an external file.
+action.saveMessageHistory = Save Chat Log &History...
+action.saveMessageHistory.description = Save the contents of your chat log, including whispers.
+# Tool
+action.sendChat = C&hat
+action.sendChat.accel = ENTER
+#action.addIconSelector.accel=ctrl shift i
+action.serverStart = Start Server...
+action.serverStart.description = Start a server so that other MapTool clients can connect to you.
+action.setZoneGridColor = Set Grid Color...
+# Help
+action.showAboutDialog = &About...
+action.showAboutDialog.description = Show information about MapTool.
+action.showConnectionInfo = &Connection Information...
+action.showConnectionInfo.description = Opens window displaying the Local and External IP addresses of your connection as well as the Port being used.
+action.showCoordinates = Show &Coordinates
+action.showCoordinates.description = Display row/column coordinates. For square grids only.
+action.showGrid = Show &Grid
+action.showGrid.accel = G
+action.showGrid.description = Toggles display of the grid on and off.
+action.showLightRadius = Show Token &Lights
+action.showLightRadius.accel = L
+action.showLightRadius.description = Causes light overlays to be enabled for all tokens that have a light source.
+action.showLightSources = Show Light Sources
+action.showLightSources.accel = K
+action.showLightSources.description = Displays a light bulb icon on all tokens with a Light Source. GM Only
+# Currently unused but the code is in place which searches for this key, so...
+action.showMapSelector = &MiniMap
+action.showMapSelector.accel = M
+action.showMovementMeasures = Show Movement &Distances
+action.showMovementMeasures.accel = D
+action.showTextLabels = Show Text Labels
+action.showMovementMeasures.description = Show the distance traveled by a token while dragging it.
+action.showNames = Show &Token Names
+action.showNames.accel = T
+action.showNames.description = Displays names below tokens. Visible NPC\: White on Blue Visible PC\: Black on Grey Not Visible\: White on Dark Grey.
+action.showPlayerView = Show As Player
+action.showPlayerView.accel = shift P
+action.showPlayerView.description = Causes your view to (mostly) show what a player would see.
+action.toggleDoubleWide = &Straight Line Width Doubled
+action.toggleDoubleWide.description = When selected the line template will draw straight lines at double width.
+action.toggleDrawMeasurements = Display Drawing &Distances
+action.toggleDrawMeasurements.description = When selected the drawing tools will display distances during drawing.
+action.toggleMovementLock = &Lock Player Movement
+action.toggleMovementLock.accel = shift L
+action.toggleMovementLock.description = Locks movement for player-owned tokens.
+action.toggleNewZonesHaveFOW = New Maps have Fog of War
+action.toggleTokensStartSnapToGrid = Tokens Start Snap to Grid
+# Edit Menu
+action.undoDrawing = Undo Drawing
+action.undoDrawing.accel = Z
+action.undoDrawing.description = Removes the last drawing placing it in the undo history.
+action.useAlphaFog = Toggle Translucent Fog
+action.zoom100 = Zoom 1\:1
+action.zoom100.accel = typed +
+# View
+action.zoomIn = Zoom &In
+action.zoomIn.accel = typed \=
+action.zoomLock = Lock Zoom
+action.zoomOut = Zoom &Out
+action.zoomOut.accel = typed -
+
+addtokenstate.added = Token state "{0}" was added
+# Slash command info
+addtokenstate.description = Add a new token state that can be set on tokens.
+addtokenstate.exists = A token state with the name "{0}" already exists.
+addtokenstate.invalidColor = An invalid color "{0}" was passed as a parameter. Valid values are hex or integer numbers or the name of a common color (black, blue, cyan, darkgray, gray, green, lightgray, magenta, orange, pink, red, white, yellow).
+addtokenstate.invalidCorner = An invalid corner name "{0}" was passed as a parameter. Valid values are nw, ne, sw, se.
+addtokenstate.invalidNumber = An invalid number "{0}" was passed as a parameter.
+addtokenstate.noOverlyType = There is no overlay type with the name "{0}". Valid types are "dot, circle, shade, X, cross, diamond, yield or triangle".
+addtokenstate.param = A token state name and overlay name are required.
+
+admin.exportCampaignRepo = Campaign Repository File...
+admin.exportCampaignRepo.description = Export a campaign repository file.
+admin.updateCampaignRepo = Update Campaign Repository...
+
+alias.added = Alias "{0}" added.
+alias.commandHeader = Command
+alias.description = Create an alias.
+alias.header = Alias
+alias.removed = Alias "{0}" removed.
+
+changecolor.description = Change your chat text color via macros. Color must be in hexadecimal format. Example\: /cc \#ff0099
+
+clear.description = Clear the message panel.
+
+clearaliases.description = Clear all aliases.
+clearaliases.prompt = Clear all aliases?
+
+color.olive = olive
+
+component.areaGroup.macro.commonMacros = Common Macros
+component.areaGroup.macro.noMacros = No Macros
+component.dialogTitle.macro.macroID = Macro ID
+component.label.macro.allowPlayerEdits = Allow Players to Edit Macro
+component.label.macro.applyToSelected = Apply to Selected Tokens
+component.label.macro.autoExecute = Auto Execute
+component.label.macro.buttonColor = Button Color
+component.label.macro.command = Command
+component.label.macro.compareApplyToSelected = Use Apply to Selected Tokens
+component.label.macro.compareUseAutoExecute = Use Auto Execute
+component.label.macro.compareUseCommand = Use Command
+component.label.macro.compareUseGroup = Use Group
+component.label.macro.compareUseIncludeLabel = Use Include Label
+component.label.macro.compareUseSortPrefix = Use Sort Prefix
+component.label.macro.displayHotKey = Display Hot Key?
+component.label.macro.fontColor = Font Color
+component.label.macro.fontSize = Font Size
+component.label.macro.group = Group
+component.label.macro.hotKey = Hot Key
+component.label.macro.includeLabel = Include Label
+component.label.macro.label = Label
+component.label.macro.macroCommonality = Macro Commonality
+component.label.macro.maxWidth = Max Width
+component.label.macro.minWidth = Min Width
+component.label.macro.sortPrefix = Sort Prefix
+component.label.macro.toolTip = Tooltip
+component.tab.macro.details = Details
+component.tab.macro.editor = Editor
+component.tab.macro.options = Options
+component.tooltip.macro.allowPlayerEdits = Select this to allow players to edit this macro.
+component.tooltip.macro.applyToSelected = Check here to run this macro against the currently selected tokens. Uncheck to run this macro outside of the context of any selected tokens. If this macro references one or more token properties, it should be checked.
+component.tooltip.macro.autoExecute = Check to run the macro as soon as its button is pressed. Uncheck to impersonate (if applicable) and prepare the macro command in the command box.
+#TODO: Write tooltip for this.
+component.tooltip.macro.buttonColor = Select the color of the face of this macro's button.
+component.tooltip.macro.compareUseApplyToSelected = Check here to consider this macro's Use Apply to Selected Tokens state when determining its commonality with other macros.
+component.tooltip.macro.compareUseAutoExecute = Check here to consider this macro's Auto Execute state when determining its commonality with other macros.
+component.tooltip.macro.compareUseCommand = Check here to consider this macro's Command when determining its commonality with other macros.
+component.tooltip.macro.compareUseGroup = Check here to consider this macro's Group when determining its commonality with other macros.
+component.tooltip.macro.compareUseIncludeLabel = Check here to consider this macro's Include Label state when determining its commonality with other macros.
+component.tooltip.macro.compareUseSortPrefix = Check here to consider this macro's Sort Prefix when determining its commonality with other macros.
+component.tooltip.macro.displayHotKey = Display or Hide the Hot Key on the macro button.
+component.tooltip.macro.fontColor = Select the color in which the label for this macro's button will appear in the macro button panels.
+component.tooltip.macro.fontSize = Selected the size of the font in which the label for this macro's button will appear in the macro button panels.
+component.tooltip.macro.group = This is the group in the macro button panel in which this macro will appear. If the group does not already exist, it will be created.
+component.tooltip.macro.hotKey = This sets a hot key for this macro. These hot keys are common across all macro panels.
+component.tooltip.macro.includeLabel = Check here to include the macro's label with the macro output in chat. Uncheck to only have the macro output appear in chat.
+# These really should use the ".description" style that is used by the menu
+# selections, above. We'll convert these to new names later on and when
+# we do, we'll convert all translation files at the same time.
+component.tooltip.macro.label = This is the name that will appear on the macro button.
+component.tooltip.macro.maxWidth = Specify the maximum width this macro button should fill in a macro button panel. If the label for the macro button exceeds this width, the label will be cut off. Leaving this field blank will let the button auto-fit to the label length.
+component.tooltip.macro.minWidth = Specify the minimum width this macro button should fill in a macro button panel. If the label for the macro button exceeds this width, the button will grow to accommodate it. Leaving this filed blank will allow the button to shrink to auto-fit smaller labels.
+component.tooltip.macro.sortPrefix = This determines the order within its group that this macro will appear.
+component.tooltip.macro.tooltip = Enter a tool tip for the macro button to display here.
+
+# The IP address in these next two messages comes from the results of the ConnectionInfoDialog contacting the RPTools Registry and asking for it.
+# It's obviously possible that this will fail. In those cases the string returned will be "Unknown". The first line is for the confirmation dialog and the
+# other two appear as output in the chat window.
+confirm.info.heartbeat.registryFailure =
Connection refresh to the MapTool registry failed.
The registry server will purge records periodically, making it difficult for future clients to connect. If this persists, you will need to provide clients with your contact information directly (IP address "{0}" and port {1}).
+confirm.macro.allowPlayerEdits =
Are you sure you wish to allow players to edit any macro common to this one?
Select "Yes" to continue with the change. Select "No" to revert.
+confirm.macro.checkComparisons = Do you want to check comparison criteria for each common macro before adding it to the export list?
If you select "No", MapTool will not prompt you if any of a particular macro's commonality criteria are deselected. A macro with deselected macro criteria may be exported with missing information. For example, if a macro with "Command" comparison deselected is added to the export list, that macro will be exported without a command.
+confirm.macro.clearGroup = You are about to clear the {0} macro group. Are you sure you want to continue?
+confirm.macro.clearPanel = You are about to clear the {0} macro panel. Are you sure you want to continue?
+confirm.macro.commonSelectionLocation = within the common selection macros
+# The only parameter for *most* translation strings is the
+# player's name (as it appears in the Connection panel). Some
+# strings, particularly the ones dealing with macro messages, have
+# multiple parameters. It's usually pretty obvious what type of
+# value is being used as a parameter, but some messages have a comment
+# directly above them to clarify, if appropriate.
+#
+# Valid patterns used to express parameters are:
+# {num} replace the parameter with a string
+# {num,type,size}
+# type can be 'time' or 'date' (for java.util.Date objects),
+# 'number' to indicate a numeric type,
+# and size can be
+# 'short', 'int', or 'long' for numeric arguments of the same type.
+#
+# Check the javadoc for the 'MessageFormat' class for more details on the
+# formatting of values in this file (the time and date ones are particularly
+# tricky, but thankfully aren't used much in MapTool). The URL is in the
+# comments at the top of this file.
+# General confirmation-type messages
+confirm.macro.delete = You are about to delete the {0} macro.
Do you wish to continue?
+confirm.macro.disallowPlayerEdits = Are you sure you wish to prevent players from editing any macro common to this one?
Select "Yes" to continue with the change. Select "No" to revert.
+confirm.macro.exportInto = You are about to export the {0} macro.
Do you wish to continue?
+confirm.macro.exportOverwrite = You are about to overwrite an existing macro file.
Do you wish to continue?
+confirm.macro.exportSetInto = You are about to export the current macro set.
Do you wish to continue?
+confirm.macro.exportSetOverwrite = You are about to overwrite an existing macro set file.
Do you wish to continue?
+confirm.macro.failComparison = Macro {0} has the following comparison criteria deselected\:
{1}
Do you wish to add this macro to the export list?
Selecting "Yes" will result in the macro being exported without the information listed.
+confirm.macro.import = The import macro {0} appears to match a macro that already exists {1}. Do you wish to import the macro again?
Select "Yes" to import the macro anyway. Select "No" to cancel import of the macro.
If you believe the macros are not the same, select "No" and verify the commonality criteria of the existing macro on the "Options" tab of its edit dialog.
+# {0} is the name of the frame that contains the macro: Global, Campaign, etc.
+confirm.macro.panelLocation = within the {0} panel
+confirm.macro.reset = You are about to reset all fields of the {0} macro.
Do you wish to continue?
+# {0} is the token's Name field
+confirm.macro.tokenLocation = on {0}
+
+defaultTool.barMenu = Bar
+defaultTool.ownerMenu = Owner
+defaultTool.stateAction.AFK = Away From Keyboard
+defaultTool.stateAction.AFK.accel = typed Pause
+defaultTool.stateAction.StableHP = Stabilized
+defaultTool.stateAction.clear = Clear State
+# My campaign has the following states. Putting their descriptions
+# here is decidedly obscure. :) There should be fields on the Campaign
+# Properties' States tab for this instead. Although it's questionable
+# whether user-defined states need to be translated anyway!
+# AFK Dead Fly Other4 Song
+# Bless Deafened Haste Paralyzed StableHP
+# Blind Disabled Hidden Poisoned Staggered
+# Bloody25 Dying Incapacitated Prayer Stunned
+# Bloody50 EnergyDrained Levitate PrayerFOE Turned
+# Bloody75 Enraged Marked Prone Unconscious
+# Bloody100 Entangled Other Shield Update
+# Confused Fatigued Other2 Sickened
+# Dazed Fear Other3 Slowed
+defaultTool.stateAction.light = Light...
+defaultTool.stateMenu = &State
+defaultTool.visionMenu = Vision
+
+dialog.addresource.downloading = Downloading List ...
+dialog.addresource.errorDownloading = Error downloading list.
+dialog.addresource.warn.badpath = Invalid path
+dialog.addresource.warn.couldnotload = Error while downloading library
+dialog.addresource.warn.directoryrequired = Must be a directory
+dialog.addresource.warn.filenotfound = Could not find resource "{0}"
+dialog.addresource.warn.invalidurl = Invalid URL\: {0}
+dialog.addresource.warn.musthavename = Must supply a name for the library
+dialog.addresource.warn.mustselectone = Must select at least one library to download
+dialog.addresource.warn.badresourceid = Bad resource identifier\: {0}. Report error to MapTool team.
+dialog.campaignExport.notes.version.1.4.0.0 = Exporting to this version will strip out any drawables and any campaign settings for Lumens. Tokens with VBL will loose this functionality as well as any Always Visible values. Merged Drawings will still be present but their label in Draw Explorer will not show as normal.
Note\: Macros will remain unchanged, so any reference to newer functionality not availiable in this version will cause normal errors when ran.
+dialog.campaignExport.notes.version.1.4.0.1 = Exporting to this version will strip out any campaign settings for Lumens. Tokens with VBL will loose this functionality as well as any Always Visible values. Merged Drawings will still be present but their label in Draw Explorer will not show as normal.
Note\: Macros will remain unchanged, so any reference to newer functionality not availiable in this version will cause normal errors when ran.
+dialog.campaignExport.notes.version.1.4.1..1.5.0 = Exporting to this version will make sure the former format of the content.xml inside the campaign file is kept and the unitsPerCell value for zones/maps is an integer (vs. double in the newer versions).
+dialog.campaignExport.notes.version.1.5.1 = Exporting to this version will make sure the former format of the content.xml inside the campaign file is kept.
+dialog.campaignexport.error.invalidversion = Unable to export, an invalid version number was detected.
+dialog.resizeStamp.checkbox.horizontal.anchor = Adjust Horizontal Anchor?
+dialog.resizeStamp.checkbox.vertical.anchor = Adjust Vertical Anchor?
+dialog.resizeStamp.label.height = Height\:
+dialog.resizeStamp.label.height.selected = Number of Vertical Cells Selected\:
+dialog.resizeStamp.label.px = px
+dialog.resizeStamp.label.stampDimensions = Stamp Dimensions
+dialog.resizeStamp.label.width = Width\:
+dialog.resizeStamp.label.width.selected = Number of Horizontal Cells Selected\:
+dialog.resizeStamp.toolTip = Adjust the Anchor point so when snapping to grid, the grid aligns. Useful when the left edge of the stamp has a partial cell.
+dialog.screenshot.error.failedExportingImage = Failed to export image.
+dialog.screenshot.error.failedImageGeneration = Failed to generate image.
+dialog.screenshot.error.invalidDialogSettings = Invalid dialog settings... Please report bug\!
+dialog.screenshot.error.mustSelectView = Must select a view.
+dialog.screenshot.error.negativeFogExtents = Error computing fog extents... Please send campaign for debugging.
+dialog.screenshot.error.noArea = Screenshot has no area.
+dialog.screenshot.layer.button.uiImplementationError = Enums in class do not match Abeille form variables. Please report bug.
+dialog.screenshot.msg.GeneratingScreenshot = Generating screenshot.
+dialog.screenshot.msg.screenshotSaved = Screenshot saved
+dialog.screenshot.msg.screenshotSaving = Screenshot saving
+dialog.screenshot.msg.screenshotStreaming = Screenshot streaming
+dialog.screenshot.radio.button.uiImplementationError = Enums in class do not match Abeille form variables. Please report bug.
+dialog.stampTool.error.badSelection = Please create a larger selection area.
+dialog.stampTool.error.noSelection = Please select an area that starts and stops over the token.
+
+emit.description = Broadcast text to all connected players without indicating who sent it (GM only command).
+
+emote.description = Broadcast an emote to all connected players.
+
+emoteplural.description = Broadcast plural emote to all connected players.
+
+experiments.description = Start experimental features.
+# Experimental features
+experiments.listTitle = Experimental Features (use at own risk).
+
+# Filename extension descriptions
+# (These should be more consistent. Maybe in 1.4. Sigh.)
+file.ext.cmpgn = MapTool Campaign
+file.ext.mtmacro = MapTool Macro
+file.ext.mtmacset = MapTool Macro Set
+file.ext.mtprops = MapTool Campaign Properties
+file.ext.mttable = MapTool Table
+file.ext.rpmap = MapTool Map
+file.ext.rptok = MapTool Token
+
+goto.description = Goto location or token. /goto X,Y or /goto tokenname.
+
+help.description = Display list of available commands.
+help.header.aliases = Aliases
+# Next three are for the titles generated in the table of commands in /help
+help.header.command = Slash Command
+help.header.description = Description
+
+impersonate.description = Speak as if you were something/one else.
+impersonate.mustOwn = Only {0}''s owners can impersonate or run macros on it.
+
+initPanel.addAll = Add All
+initPanel.addPCs = Add PCs
+initPanel.center = Center On Map
+initPanel.clearInitState = Clear Initiative
+initPanel.displayMessage = {0} has received initiative.
+initPanel.enterState = Enter the initiative for {0}\:
+initPanel.enterStateMany = Enter the initiative for the selected tokens\:
+initPanel.initStateSecondLine = Initiative on Line 2
+initPanel.makeCurrent = Make Current
+initPanel.menuButton = Next
+initPanel.moveDown = Move Down
+initPanel.moveUp = Move Up
+initPanel.prev = Previous
+initPanel.remove = Remove Token
+initPanel.removeAll = Remove All
+# Initiative Panel
+initPanel.round = Round\:
+initPanel.round.description = Reset the Round counter and clear current initiative.
+initPanel.setInitState = Set Initiative...
+initPanel.showInitStates = Show Initiative
+initPanel.showTokenStates = Show Token States
+initPanel.showTokens = Show Tokens
+initPanel.sort = Sort
+initPanel.toggleHideNPCs = Hide NPCs
+initPanel.toggleHold = Toggle Hold
+initPanel.toggleMovementLock = Lock Movement
+initPanel.toggleOwnerPermissions = Owner Permissions
+
+# Initiative menu on the token popup.
+initiative.menu = Initiative
+initiative.menu.add = Add
+initiative.menu.addToInitiative = Add To Initiative
+initiative.menu.clearState = Clear Initiative
+initiative.menu.enterState = Set the initiative for selected tokens\:
+initiative.menu.hold = Hold
+initiative.menu.remove = Remove
+initiative.menu.resume = Resume
+initiative.menu.setState = Set Initiative...
+
+lightDialog.cancel = &Cancel
+lightDialog.off = O&ff
+lightDialog.ok = &OK
+
+lineParser.atTokenNotFound = Macro not found\: "{0}@token".
+lineParser.badOptionFound = Bad option found\! Options String \= "{0}", Roll String \= "{1}".
+# {0} is the roll options string.
+lineParser.badRollOpt = Bad Roll option "{0}".
+lineParser.countNonNeg = Count option requires a non negative number, got {0}.
+# {0} = token name or gm name.
+# Notice there are no double quotes around {0}.
+lineParser.dialogTitle = Input Value for {0}.
+lineParser.dialogTitleNoToken = Input Value.
+lineParser.dialogValueFor = Value For
+lineParser.duplicateLibTokens = Duplicate "{0}" tokens found.
+lineParser.emptyTokenName = Cannot assign a blank or empty string to the variable token.name
+lineParser.errorBodyRoll = Error in body of roll.
+# {0} = the error, {1} = the expression
+lineParser.errorExecutingExpression = {0} error executing expression {1}.
+# {0} = the option (e.g. FOR, COUNT), {1} = error message.
+# Notice that {1} doesn't have quotes around it.
+lineParser.errorProcessingOpt = Error processing "{0}" option\: {1}.
+lineParser.errorStmtBody = Statement Body
+lineParser.errorStmtBodyFirst200 = Statement Body (first 200 characters)
+lineParser.errorStmtOpts = Statement options (if any)
+lineParser.forNoZeroStep = Step size for FOR loop cannot be zero.
+lineParser.forVarMissing = FOR\: variable missing.
+lineParser.foreachVarMissing = FOREACH\: variable missing.
+lineParser.ifError = Error in roll for IF option.
+lineParser.invalidCondition = Invalid condition in {0}({1}) roll option.
+lineParser.invalidExpr = Invalid expression\: {0}.
+lineParser.invalidIfCond = Invalid IF condition\: {0}, evaluates to\: {1}.
+lineParser.invalidMacroLoc = Must specify a location for the macro "{0}" to be run from.
+lineParser.invalidWhile = Invalid condition in WHILE({0}) roll option.
+lineParser.libUnableToExec = Unable to execute macro from "{0}"\: not visible to player.
+# MapToolLineParser errors
+# Note that many of the errors detected by the line parser will include
+# single and/or double quotes. That means we don't want to add any here
+# unless we are absolutely sure that they should always be printed and
+# will be useful to the user. Don't change these without testing...
+lineParser.maxRecursion = Maximum recurse limit reached.
+lineParser.nonDefLoopSep = To specify a non-default loop separator, you must use the format "FOR(var,start,end,step,separator)"
+lineParser.notALibToken = Macros from other tokens are only available if the token name starts with "Lib\:".
+lineParser.notValidNumber = "{0}" is not a valid number.
+lineParser.notValidVariableName = "{0}" is not a valid variable name.
+# Map Tool Variable Resolver
+lineParser.onlyGMCanGet = Only GM can get "{0}".
+lineParser.onlyGMCanSet = Only GM can set "{0}".
+lineParser.optBadParam = Roll option "{0}"\: bad option parameters {1}.
+lineParser.optRequiresParam = Roll option "{0}" requires a list of no more than {1} parameters in parentheses.
+lineParser.optWrongParam = Roll option "{0}" must have between {1} and {2} parameters; found {3}\: parameter list \= "{4}"
+lineParser.rollOptionComma = Roll option list can't end with a comma.
+lineParser.switchError = Error in roll for SWITCH option.
+lineParser.switchNoMatch = SWITCH option found no match for "{0}".
+lineParser.tooManyLoops = Too many loop iterations (possible infinite loop?)
+lineParser.unknownCampaignMacro = Unknown campaign macro "{0}".
+lineParser.unknownGlobalMacro = Unknown global macro "{0}".
+lineParser.unknownLibToken = Unknown library token "{0}".
+lineParser.unknownMacro = Unknown macro "{0}".
+lineParser.unknownOptionName = Unknown option name "{0}".
+lineParser.unresolvedValue = Unresolved value "{0}".
+
+# Notice that the error messages don't have double quotes around them...
+#
+# {0} is the file name
+loadaliases.cantFindFile = Could not find alias file\: "{0}"
+# {0} is the error message
+loadaliases.couldNotLoad = Could not load alias file\: {0}
+loadaliases.description = Load a file that contains aliases, one per line, with a \: between the name and the value (just as if you were typing it in).
+loadaliases.dialogTitle = Load Aliases
+loadaliases.ignoring = Ignoring alias "{0}"
+loadaliases.loading = Loading aliases\:
+
+# {0} is the file name
+loadtokenstates.cantFindFile = Could not find token states file\: "{0}"
+# {0} is the error message
+loadtokenstates.couldNotLoad = Could not load token states file\: {0}
+loadtokenstates.description = Load all of the token states from a file.
+loadtokenstates.dialogTitle = Load Token States
+# {0} is the number of states loaded
+# Note that this numeric value is declared as such. This is to provide
+# for localization support, i.e. in English adding a comma in the thousands
+# position and a period for the decimal separator (it's a whole number though,
+# so there will never be a decimal point).
+loadtokenstates.loaded = There were {0,number} token states loaded.
+
+lookuptable.couldNotPerform = Could not do table lookup\: "{0}"
+lookuptable.description = Run a table lookup. Usage\: /tbl [value to lookup, can be a dice roll]
+lookuptable.specifyTable = Must specify a table
+
+macro.function.LookupTableFunctions.invalidSize = Invalid image size in function "{0}".
+macro.function.LookupTableFunctions.noImage = No Image available in function "{0}" for table "{1}".
+# LookupTableFunctions
+macro.function.LookupTableFunctions.unknownTable = Unknown table name "{1}" in function "{0}".
+macro.function.MacroFunctions.missingCommand = "{0}"\: Missing command.
+macro.function.MacroFunctions.missingLabel = "{0}"\: Missing label.
+macro.function.MacroFunctions.noPerm = "{0}"\: You do not have permissions to edit macro button at index {1} on token {2}.
+macro.function.MacroFunctions.noPermOther = "{0}"\: You do not have permissions to edit macro button {1} at index {2} on token {3}.
+macro.function.MacroFunctions.noPermCommand = "{0}"\: You do not have permissions to change the command of macro button at index {1} on token {2}.
+macro.function.MacroFunctions.noPermEditable = "{0}"\: You do not have permissions to change the player editable status of macro button at index {1} on token {2}.
+macro.function.MacroFunctions.outOfRange = "{0}"\: Macro at index {1} does not exist for token {2}.
+macro.function.TokenInit.notOnList = The token is not in the initiative list.
+# TokenInitFunctions
+macro.function.TokenInit.notOnListSet = The token is not in the initiative list so no value can be set.
+# abort Function
+# Note that I'm leaving off the double quotes on this one. I think it
+# will look better that way.
+macro.function.abortFunction.messge = {0} function called.
+# addAllToInitiativeFunction
+macro.function.addAllToInitiativeFunction.mustBeGM = Only the GM has the permission to execute the "{0}" function.
+# MacroArgsFunctions
+macro.function.args.incorrectParam = Function "{0}" must be called with exactly 1 numeric parameter.
+macro.function.args.outOfRange = Argument index {1} out of range (max of {2}) in function "{0}".
+# assert Function
+# {0} is the error message specified when calling assert() for message.
+# Note that I'm leaving off the double quotes on this one, too. I think it
+# will look better that way.
+macro.function.assert.message = Macro-defined error\: {0}
+macro.function.assert.mustBeString = Second argument to "{0}"\: "{1}" must be of type String.
+macro.function.defineFunction.functionDefined = "{0}" function defined.
+# DefineMacroFunctions
+macro.function.defineFunction.notEnoughParam = Not enough parameters for "defineFunction".
+# FindTokenFunctions
+macro.function.findTokenFunctions.offsetArray = Offset array for Area must contain JSON object with (x,y) coordinates in function "{0}".
+macro.function.findTokenFunctions.unknownEnum = Program error\: unknown enum "{1}" in switch block in function "{0}".
+macro.function.general.accessDenied = Access is denied for the "{0}" function. Enable access via Preferences option.
+macro.function.general.argumentKeyTypeA = Argument key "{1}" to function "{0}" must be a JSON Array.
+macro.function.general.argumentKeyTypeD = Argument key "{1}" to function "{0}" must be an number.
+macro.function.general.argumentKeyTypeG = Argument key "{1}" to function "{0}" must be a GUID.
+macro.function.general.argumentKeyTypeI = Argument key "{1}" to function "{0}" must be an integer.
+macro.function.general.argumentTypeA = Argument number {1} to function "{0}" must be a JSON Array.
+macro.function.general.argumentTypeI = Argument number {1} "{2}" to function "{0}" must be an integer.
+macro.function.general.argumentTypeInvalid = Argument number {1} invalid argument type for function "{0}".
+macro.function.general.argumentTypeJ = Argument number {1} to function "{0}" must be a JSON Array or Object.
+macro.function.general.argumentTypeN = Argument number {1} "{2}" to function "{0}" must be a number.
+macro.function.general.argumentTypeO = Argument number {1} to function "{0}" must be a JSON Object.
+macro.function.general.argumentTypeS = Argument number {1} to function "{0}" must be a string.
+# {0} = function name, {1} = argument number, {2} = content of argument {1}
+macro.function.general.argumentTypeT = Argument number {1} to function "{0}" must be a Token id or name.
+macro.function.general.noImpersonated = Error executing "{0}"\: there is no impersonated token.
+# Externalized strings for Macro Functions errors
+#
+# Unless otherwise specified {0} is the name of the function that was called
+#
+# General messages used in several functions.
+# You'll see {1} and {2} used as numbers, below. Technically they
+# should actually be {1,number} and {2,number}. However, there's no
+# reason to localize these values as they will always be whole numbers
+# so the decimal separator is not needed, and they will always be small
+# enough that no thousands separator will be needed either. So leaving
+# off the ",number" means they'll be treated as strings and simply
+# output as-is. Which is fine. :)
+macro.function.general.noPerm = You do not have permission to call the "{0}" function.
+macro.function.general.noPermOther = You do not have permission to access another token in the "{0}" function.
+macro.function.general.notEnoughParam = Function "{0}" requires at least {1} parameters; {2} were provided.
+macro.function.general.onlyGM = Only the GM can call the "{0}" function.
+macro.function.general.tooManyParam = Function "{0}" requires no more than {1} parameters; {2} were provided.
+macro.function.general.unknownFunction = Unknown function name "{0}".
+macro.function.general.unknownToken = Error executing "{0}"\: the token name or id "{1}" is unknown.
+macro.function.general.unknownTokenOnMap = Error executing "{0}"\: the token name or id "{1}" is unknown on map "{2}".
+macro.function.general.wrongNumParam = Function "{0}" requires exactly {1} parameters; {2} were provided.
+# Token Distance functions
+# I.e. ONE_TWO_ONE or ONE_ONE_ONE
+macro.function.getDistance.invalidMetric = Invalid metric type "{0}".
+#getInfo function {0} is the value that was passed in
+macro.function.getInfo.invalidArg = Invalid value "{0}" for getInfo().
+# InitiativeRoundFunctions
+macro.function.getInitiativeRound.mustBeGM = Only the GM can set the round.
+# ExecFunction
+macro.function.execFunction.incorrectName = Error executing "{0}"\: the function name "{1}" is unknown.
+# Token Halo functions {0} is the color
+macro.function.haloFunctions.invalidColor = Invalid halo color "{0}".
+macro.function.herolab.null = HeroLab data does not exist for this token.
+# Initiative functions general errors
+macro.function.initiative.gmOnly = Only the GM can perform "{0}".
+macro.function.initiative.gmOrOwner = Only the GM or owner can perform "{0}".
+macro.function.initiative.noImpersonated = Error executing initiative function\: there is no impersonated token.
+macro.function.initiative.oneParam = Must call "{0}" with one parameter.
+macro.function.initiative.unknownToken = Unknown token id "{0}" on map "{1}".
+macro.function.input.illegalArgumentType = Illegal argument type "{0}", expecting "{1}".
+macro.function.parse.enum.illegalArgumentType = Error executing "{0}"\: Illegal argument type "{1}", expecting one of "{2}".
+# {0} = the option key, {1} = the option value, {2} = the option type, {3} = the option specifier
+macro.function.input.invalidOptionType = The option "{0}\={1}" is invalid for input type "{2}" in specifier "{3}".
+#input function
+macro.function.input.invalidSpecifier = Empty variable name in the specifier string "{0}".
+macro.function.input.invalidTAB = To use inputType of TAB in input(), the first entry must have the TAB type.
+macro.function.input.invalidType = Invalid input type "{0}" in the specifier string "{1}".
+macro.function.json.append.onlyArray = You can only append to the end of JSON Arrays.
+macro.function.json.arrayMustContainObjects = Fields specified for json.sort but not all items in array are JSON objects; found "{0}".
+macro.function.json.getInvalidEndIndex = Invalid end index "{1}" for array (size of {2}) in function "{0}".
+macro.function.json.getInvalidStartIndex = Invalid start index "{1}" for array (size of {2}) in function "{0}".
+macro.function.json.matchingArrayOrRoll = The 3rd argument must be a string containing a roll or a JSON array the same size as the 2nd argument.
+macro.function.json.notAllContainKey = Not all objects contain field "{0}" in json.sort.
+macro.function.json.arrayArgMustBeNumber = Argument number {2} to {1} must be a number for JSON Arrays.
+macro.function.json.indentMustBeNumeric = Indentation value passed to {0} must be numeric
+# General JSON macro function errors
+macro.function.json.onlyArray = Got {0} but "{1}" only accepts JSON Arrays.
+macro.function.json.onlyJSON = Got {0} but "{1}" only accepts JSON Arrays or Objects.
+macro.function.json.onlyObject = Got {0} but "{1}" only accepts JSON Objects.
+macro.function.json.setNoMatchingValue = No matching value for key in "{0}".
+macro.function.json.unknownType = Unknown JSON type "{0}" in function "{1}".
+macro.function.json.path = Error with function "{0}"\: {1}
+macro.function.macroLink.arguments = Arguments
+# Informational messages for Macro functions.
+macro.function.macroLink.autoExecToolTip = Auto Execute Macro Link
+# {0} is the error message
+macro.function.macroLink.errorRunning = Error Running Macro Link\: "{0}"
+macro.function.macroLink.executeOn = Execute On
+macro.function.macroLink.impersonated = Impersonated Tokens
+# MacroLinkFunctions
+macro.function.macroLink.missingName = Missing macro name in function "{0}".
+macro.function.macroLink.selected = Selected Tokens
+macro.function.macroLink.unknown = Unknown
+# {0} is the function name
+macro.function.moveTokenMap.alreadyThere = Can not use "{0}" to move tokens to a map that they are already on\!
+# {0} is the token name/id, {1} is the map it's moved to.
+macro.function.moveTokenMap.movedToken = Moved Token "{0}" to map "{1}" from map "{2}".
+# moveTokenToMap/moveTokenFromMap, {0} is the function name, {1} is the
+# map name or token id
+macro.function.moveTokenMap.unknownMap = Can not find map "{1}" in function "{0}".
+macro.function.moveTokenMap.unknownToken = Can not find token "{1}" in function "{0}".
+# number function
+macro.function.number.invalid = Invalid number format "{1}" in "{0}".
+# RESTful Function Errors
+macro.function.rest.error.response = Unable to process function "{0}", HTTP Status Code\: {1}
+macro.function.rest.error.unknown = Unable to process function "{0}", An Exception has occurred\: {1}
+macro.function.rest.syrinscape.error = Unable to launch Syrinscape. Check that Syrinscape is installed and a proper URI was passed.
+# [token():...] roll option
+macro.function.roll.noPerm = You do not have enough permissions to run the [token(...)\: ...] roll command.
+macro.function.stateImage.notImage = State "{1}" is not an image state in function "{0}".
+# StateImageFunction {1} is the state name
+macro.function.stateImage.unknownState = Unknown state "{1}" in function "{0}".
+macro.function.strLst.incorrectParam = "{0}" requires between {1} and {2} parameters.
+# String List
+macro.function.strLst.incorrectParamExact = "{0}" requires exactly {1} parameters.
+# {0} = function name, {1} = argument number, {2} = expected type,
+# {3} = value user passed, {4} = type of the value user passed.
+macro.function.strLst.incorrectParamType = Argument number {1} to function "{0}" must be type "{2}", but was passed "{3}" of type "{4}".
+macro.function.strPropFromVar.wrongArgs = strPropFromVars second parameter "{0}" is invalid.
+macro.function.sound.illegalargument = Error executing "{0}", parameter "{1}" is invalid\: {2}
+macro.function.syrinscape.inactive = This client has not enabled Syrinscape integration in preference.
+# TokenLightFunctions
+macro.function.tokenLight.unknownLightType = Unknown light type "{1}" in function "{0}".
+# name setting functions
+macro.function.tokenName.emptyTokenNameForbidden = Error executing "{0}"\: the token name cannot be empty.
+# TokenPropertyFunctions
+macro.function.tokenProperty.invalidSize = Invalid token size "{1}" in function "{0}".
+macro.function.tokenProperty.unknownLayer = Unknown layer "{1}" in function "{0}".
+macro.function.tokenProperty.unknownLibToken = Unknown Lib\: token "{1}" in function "{0}".
+macro.function.tokenProperty.unknownPropType = Unknown property type "{1}" in function "{0}".
+# TokenStateFunctions
+macro.function.tokenStateFunctions.unknownState = Unknown state "{0}".
+# TokenBarFunction
+macro.function.tokenBarFunction.unknownBar = Error with function "{0}"\: unknown bar "{1}".
+# String Property
+# {0} = value the user passed.
+macro.function.varsFromstrProp.wrongArgs = varsFromStrProp called with 3 arguments, but second argument "{0}" was not one of NONE, SUFFIXED, or UNSUFFIXED.
+
+# Macro Link
+macroLink.error.running = Error running macro link.
+macroLink.error.tooltip.bad.href = Invalid or missing HREF
+
+macromanager.alias.indexNotFound = (error\: "{0}" is not found)
+# {0} is the command, {1} is the exception
+macromanager.couldNotExecute = Could not execute the command\: "{0}", exception \= {1}
+# {0} is the command
+macromanager.tooManyResolves = Too many resolves running "{0}"; perhaps an infinite loop?
+
+menu.QuickMap = Quick Map
+menu.edit = &Edit
+menu.export = Export
+menu.file = &File
+menu.help = &Help
+menu.map = &Map
+menu.recent = &Recent Campaigns
+menu.tools = &Tool
+menu.view = &View
+#action.enableVision=Use Vision
+#action.enableVision.description=Use the Vision Blocking Layer on this map
+menu.vision = Vision
+menu.window = &Window
+menu.zoom = &Zoom
+menu.themes = Themes
+
+
+msg.theme.needrestart = Restart MapTool for selected Theme to take effect.
+msg.button.close = Close
+msg.commandPanel.hasEnteredText = {0} has entered text.
+# Command Panel; {0} is the player name
+msg.commandPanel.liveTyping = {0} is typing...
+msg.confirm.aboutToBeginFTP = About to begin FTP process of {0,number} file(s)...
+msg.confirm.bootPlayer = Are you sure you want to boot {0}?
+msg.confirm.campaignExported = Campaign exported.
+msg.confirm.clearAllDrawings = This will clear all drawings on layer {0} and completely empty the undo queue for ALL layers. This cannot be undone. Are you sure?
+msg.confirm.deleteDraw = Are you sure you want to delete the selected drawings?
+msg.confirm.deleteDraw.removed = This will no longer ask for permission when deleting drawing. If you want to turn this back on look in Preferences.
+msg.confirm.deleteToken = Are you sure you want to delete the selected tokens?
+msg.confirm.deleteToken.removed = This will no longer ask for permission when deleting tokens. If you want to turn this back on look in Preferences.
+msg.confirm.disconnecting = You will be disconnected. Are you sure you want to exit?
+msg.confirm.fileExists = Overwrite existing file?
+msg.confirm.hostingDisconnect = You are hosting a server. Disconnecting will disconnect all connected clients. Are you sure?
+msg.confirm.jvm.options = Some Java JVM startup options for MapTool may have changed. You will need to restart MapTool before these will take affect.
Invalid settings could prevent MapTool from starting, are you sure you wish to save these settings?
+msg.confirm.legacySave = You are saving in an old format -- you may lose some information by doing this. Continue?
+msg.confirm.loseChanges = Changes to your campaign will be lost. Continue?
+msg.confirm.newCampaign = Discard current campaign?
+msg.confirm.newerVersion = You are attempting to load a campaign created by MapTool {1}. There may be loading errors because you are running version {0}.
Are you sure?
+msg.confirm.overwriteExistingCampaign = That file already exists. Overwrite?
+# Notice in this message how {0} is used twice? The first one is a
+# Date object interpreted as a time, and the second one is a Date object
+# interpreted as a date.
+msg.confirm.recoverAutosave = An autosave file created at {0,time} on {0,date} exists. Would you like to retrieve it?
+msg.confirm.removeFacings = Are you sure you want to delete the facing of the selected tokens?
+msg.confirm.removeZone = Removing a map cannot be undone. Are you sure?
+msg.confirm.renameMap = Rename "{0}"?
+msg.confirm.restoreFoW = Map contains exposed areas of fog. Do you want to reset all of the fog?
+msg.confirm.saveCampaign = Would you like to save your campaign before you exit?
+msg.error.alreadyRegistered = That ID is already in use -- server not registered.
+msg.error.alreadyRunningServer = You are already running a server.
+msg.error.browser.cannotStart = Browser could not be started. {0}
+msg.error.browser.notFound = System browser could not be identified. Please specify your system browser in the {0} environment variable.
+msg.error.cantAdjustGridInfMaps = Cannot adjust grid on infinite maps.
+msg.error.cantApplyMacroToSelected = Commonality of this macro is not based on the command field. The macro cannot be applied to the entire selection set.
+msg.error.cantBootGM = You can't boot another GM.
+msg.error.cantBootSelf = You can't boot yourself. Disconnect the server via the File menu.
+msg.error.credits = Unable to load credits or version.
+msg.error.creatingBackupManager = Error creating BackupManager.
+# token naming errors
+msg.error.emptyTokenName = The token name cannot be blank.
+msg.error.evaluatingExpr = Error evaluating expression\: {0}
+msg.error.failedAddingDefaultImages = Could not restore default images.
+msg.error.failedAddingDefaultTables = Could not restore default tables.
+msg.error.failedCannotRegisterServer = Unable to register your server.
+msg.error.failedConnect = Could not connect to server.
+msg.error.failedExportingCampaignRepo = Could not export campaign repository file.
+msg.error.failedExportingImage = Could not export image.
+msg.error.failedLoadCampaign = Could not load campaign.
+msg.error.failedLoadCampaign_Timeout = Could not load campaign; timeout waiting for autosave to complete.
+msg.error.failedLoadMap = Could not load map.
+msg.error.failedSaveCampaign = Could not save campaign.
+msg.error.failedSaveCampaignOOM = Out of memory while saving campaign\!
Try creating a new/empty map and perform the save with that map active.
+msg.error.failedSaveCampaignPreview = Could not save the campaign preview image.
+msg.error.failedSaveMap = Could not save map.
+msg.error.failedSavingNewVersion = Could not save the new version.
+msg.error.fileAlreadyExists = File {0} already exists.
+msg.error.directoryNotWriteable = Directory {0} is not writeable.
+# When the user attempts to save the chat log and we fail, it's an Error.
+# When we try to autosave the chat log and fail, it's a Warning.
+# It's all about the semantics, baby. ;-)
+msg.error.failedSavingMessageHistory = Could not save message history.
+msg.error.failedScreenCapture = Could not get screen capture.
+msg.error.failedStartPersonalServer = Could not restart personal server.
+msg.error.failedToBoot = Boot attempt failed\: player not found.
+msg.error.failedUpdatingCampaignRepo = Could not update campaign repository; I/O error.
+msg.error.fileNotFound = File Not found.
+msg.error.fogexpose = Must be a GM to change the fog of war.
+msg.error.gmRequired = Only GMs can do that.
+msg.error.invalidLocalhost = "localhost" is not a valid address?\! Check your /etc/hosts file.
+# JVM Related
+msg.error.jvm.options = "{0}" is an invalid memory setting.
Be sure to enter a valid Java JVM value that includes a memory size that ends in K, M, or G. e.g. 4M, 6G, 2048M, 1024K, etc.
Warning\: An improper setting could prevent MapTool from starting.
+msg.error.lafSetup = Exception during look and feel setup.
+msg.error.layoutInitial = Could not load the initial layout.
+msg.error.layoutParse = Error parsing the layout file.
+msg.error.loadingIconImage = Could not load icon image.
+msg.error.loadingQuickMaps = Error loading quickmaps.
+msg.error.macro.buttonGroupDnDFail = Drag & Drop problem
+msg.error.macro.buttonPropsAreNull = Button properties are null.
+msg.error.macro.buttonNullToken = Macro {0} cannot be saved; token {1} no longer valid.
+msg.error.macro.exportFail =
Macro could not be exported\:
{0}
+msg.error.macro.exportSetFail = Macro set could not be exported\:
{0}
+msg.error.macro.importFail = Macro could not be imported\:
{0}
+msg.error.macro.importSetFail = Macro set could not be imported\:
{0}
+msg.error.mtprops.light.arc = Light\:line {0,number}\:unrecognizable arc "{1}"
+msg.error.mtprops.light.distance = Light\:line {0,number}\:unrecognizable distance "{1}"
+msg.error.mtprops.light.gmOrOwner = Light\:line {0,number}\:GM and OWNER can only be specified for auras.
+msg.error.mtprops.light.ioexception = Error reading Light definition from string -- shouldn't happen\!
+msg.error.mtprops.light.lumens = Light\:line {0,number}\:unrecognizable lumens "{1}"
+msg.error.mtprops.properties.duplicate = Property name in "{0}" duplicates the one in "{1}".
+msg.error.mtprops.properties.duplicateComment = The line "{0}" appears to be a comment, but duplicates "{1}" and must be unique to prevent this warning.
+msg.error.mtprops.properties.ending = You will be placed back into edit mode.
+msg.error.mtprops.properties.title = The following errors occurred\:
+msg.error.mtprops.sight.arc = Sight\:line {0,number}\:unrecognizable arc "{1}"
+msg.error.mtprops.sight.distance = Sight\:line {0,number}\:unrecognizable distance "{1}"
+msg.error.mtprops.sight.ioexception = Error reading Sight definition from string -- shouldn't happen\!
+# For parsing anything in the Campaign Properties dialog. Each tab
+# should have its own subcategory underneath "msg.error.mtprops"
+# Notice how {0} has the ",number" suffix to denote that a numeric
+# value is being used by the program; that tells the program how to
+# display the result (i.e. this value should be a localized number).
+msg.error.mtprops.sight.multiplier = Sight\:line {0,number}\:unrecognizable multiplier "{1}"
+msg.error.mtprops.sight.offset = Sight\:line {0,number}\:unrecognizable offset "{1}"
+msg.error.mtprops.sight.range = Sight\:line {0,number}\:unrecognizable range "{1}"
+msg.error.mtprops.sight.unknownField = Sight\:line {0,number}\:unknown field name "{1}"
+msg.error.mustDisconnectFirst = You are connected to a server. Please disconnect.
+msg.error.mustSelectAssetGroupFirst = Select an asset group first.
+msg.error.mustSelectPlayerFirst = Select a player first.
+msg.error.mustSelectRootGroup = Must select a root group.
+msg.error.noTokensSelected = No Tokens Selected.
+msg.error.playerNotConnected = Player "{0}" is not connected.
+msg.error.tableAccessProhibited = The GM has disallowed player use of table.
+msg.error.tableDoesNotExist = No such table.
+msg.error.tableUnknown = Unknown table.
+msg.error.toolCannotInstantiate = Could not instantiate tool class\: {0}
+msg.error.toolConstructorFailed = Failed in constructor of tool\: {0}
+msg.error.toolNeedPublicConstructor = Constructor must be public for tool\: {0}
+msg.error.toolNeedValidConstructor = Class must have a public constructor with a Toolbox argument for tool\: {0}
+msg.error.unableToCreateClientIdFile = Can't create the client id file.
+msg.error.unableToCreateDataDir = Can''t create the data directory "{0}". Try manually specifying the data directory by setting the environment variable "MAPTOOL_DATADIR". Search our forums for that name if you need help.
+msg.error.unableToReadClientIdFile = Can't read the client id file.
+msg.error.unknownHost = Unknown host.
+msg.error.unknownJavaVersion = Cannot determine Java version?\! Will attempt to continue anyway...
+msg.error.unusableDataDir = Can''t use the data directory "{0}" because it contains potentially dangerous characters. Try manually specifying the data directory by setting the environment variable "MAPTOOL_DATADIR". Search our forums for that name if you need help.
+msg.error.unusableDir = Directory "{0}" contains potentially dangerous characters and will not be used.
+msg.error.versionFile = Can''t find version file\: {0}
+msg.error.unableToGetThemeList = Error fetching theme list.
+msg.error.wrongJavaVersion = You are running MapTool using a version of Java too old to be 100% compatible with some of the third-party libraries used. If you continue to use MapTool, you may experience unexpected crashes do to this incompatibility. Do you want to continue?
+msg.info.action.disableFoW = FoW disabled.
+msg.info.action.disableRevealFogAtWaypoints = FoW will now expose at all cell points along the path.
+msg.info.action.enableFoW = FoW enabled.
+msg.info.action.enableRevealFogAtWaypoints = FoW will now only expose at designated waypoints.
+msg.info.action.FoWDisabled = FoW is disabled.
+msg.info.campaignLoading = Loading Campaign
+msg.info.campaignSaved = Campaign Saved.
+msg.info.campaignSaving = Saving Campaign
+msg.info.connecting = Connecting
+msg.info.disconnected = You have disconnected.
+msg.info.heartbeat.registryFailure = Connection refresh to the MapTool registry failed (total of {2} failures so far). The registry server will purge records periodically, making it difficult for future clients to connect. If this persists, you will need to provide clients with the server information directly (IP address "{0}" and port {1}).
+msg.info.heartbeat.registrySuccess = Connection refresh to the MapTool registry succeeded (after {0} past failures). As long as success is maintained, you will not see this message again.
+msg.info.macro.exportCancel = Macro export canceled.
+msg.info.macro.exportSuccess = Macro exported successfully.
+msg.info.mapLoading = Loading Map
+msg.info.mapSaved = Map Saved.
+msg.info.noCampaignPreview = No campaign preview available.
+msg.info.playerBooted = {0} has been disconnected.
+msg.info.playerConnected = {0} has connected.
+msg.info.playerDisconnected = {0} is disconnected.
+msg.info.restoreLayout = Restore layout
+msg.info.restoreLayout.description = Restore the MapTool user interface to the default layout.
+msg.info.screenshotSaved = Saved screenshot.
+msg.info.screenshotSaving = Saving screenshot...
+msg.info.server.forumNFAQ_URL = http\://forums.rptools.net/viewtopic.php?f\=22&t\=3370
+msg.info.server.networkingHelp = Hosting a MapTool server involves proper network setup. Do you want to visit the forum post that describes this process?
+msg.info.showTransferWindow = Show Transfer Window
+msg.info.showTransferWindow.description = Open a window showing the pending asset transfers.
+msg.info.startServer = Server started; please wait for map to refresh.
+# Some of these don't have the "..." appended to them because the
+# code adds that, if appropriate, based on the situation.
+msg.info.versionFile = CAN'T FIND VERSION FILE
+msg.title.exportMacro = Export Macro
+msg.title.exportMacroSet = Export Macro Set
+msg.title.exportProperties = Export Properties
+msg.title.importMacro = Import Macro
+msg.title.importMacroSet = Import Macro Set
+msg.title.importProperties = Import Properties
+msg.title.loadAssetTree = Load Asset Tree
+msg.title.loadCampaign = Load Campaign
+# I'm trying to add some consistency to the property names. So...
+# "msg.title.*" are strings used as the titles of dialogs and frames
+# created by the application.
+msg.title.loadMap = Load Map
+msg.title.messageDialog.cancel = &Cancel
+msg.title.messageDialog.dontAskAgain = Yes, and &don't ask me again
+msg.title.messageDialog.no = &No
+msg.title.messageDialog.ok = &Ok
+# Just adding in some choices for s
+msg.title.messageDialog.yes = &Yes
+msg.title.messageDialogConfirm = Confirmation
+msg.title.messageDialogError = Error
+msg.title.messageDialogFeedback = Feedback
+msg.title.messageDialogInfo = Information
+msg.title.messageDialogWarning = Warning
+msg.title.saveCampaign = Save Campaign
+msg.title.saveMessageHistory = Save Message History
+msg.warn.failedAutoSavingMessageHistory = Could not autosave message history.
+msg.warning.macro.playerChangesNotAllowed = The GM has not allowed players to change this macro.
+msg.warning.macro.willNotExport = The macro "{0}" will not be exported. Either it has been flagged by the GM as not player editable or you do not have ownership privileges over the source.
+
+msg.asset.error.invalidAsset = An invalid asset has been selected. If you get this message please report it on the MapTool forums or Discord server.
+
+ooc.description = Out-Of-Character chat
+
+panel.Asset.ImageModel.checkbox.searchSubDir1 = Search subdirectories?
+panel.Asset.ImageModel.checkbox.searchSubDir2 = results
+panel.Asset.ImageModel.slider.toolTip = Slide to adjust the thumbnail preview size...
+panel.Campaign = Campaign
+panel.Campaign.description = Dockable window for Campaign macros.
+panel.Gm = GM
+panel.Gm.description = Dockable window for GM-visible macros
+panel.Chat = Chat
+panel.Chat.description = Dockable chat window.
+# These are not currently used. Ideally, they would be the titles
+# placed on the various dockable panels used by MapTool, but there are
+# complications. See the definition of 'MTFrame' in the MapToolFrame
+# class if you're interested in the programming issues.
+panel.Connections = Connections
+panel.Connections.description = Dockable window showing connected clients.
+panel.DrawExplorer = Draw Explorer
+panel.DrawExplorer.description = Dockable window for managing drawings.
+panel.DrawExplorer.LineSegment.Line = points({0}) pen width({1})
+panel.DrawExplorer.ShapeDrawable.Area = width({0}) height({1})
+panel.DrawExplorer.ShapeDrawable.Float = width({0}) height({1})
+panel.DrawExplorer.ShapeDrawable.Polygon = width({0}) height({1})
+panel.DrawExplorer.ShapeDrawable.Rectangle = width({0}) height({1})
+panel.DrawExplorer.Template.BlastTemplate = Blast ({0})
+panel.DrawExplorer.Template.BurstTemplate = Burst ({0})
+panel.DrawExplorer.Template.ConeTemplate = Cone ({0})
+panel.DrawExplorer.Template.LineTemplate = Line ({0})
+panel.DrawExplorer.Template.LineCellTemplate = Line ({0})
+panel.DrawExplorer.Template.RadiusTemplate = Radius ({0})
+panel.DrawExplorer.Template.RadiusCellTemplate = Radius ({0})
+panel.DrawExplorer.Template.WallTemplate = Wall ({0})
+# DrawExplorer panel
+panel.DrawExplorer.Unknown.Shape = Unknown Shape
+panel.Global = Global
+panel.Global.description = Dockable window showing macros stored on the local computer.
+panel.Impersonate = Impersonate
+panel.Impersonate.description = Dockable window showing the macros stored on the currently impersonated token.
+panel.Impersonate.button.impersonateSelected = Impersonate Selected
+panel.Initiative = Initiative
+panel.Initiative.description = Dockable window for managing combat initiative.
+panel.Library = Library
+panel.Library.description = Dockable window to access assets in your Resource Library.
+panel.MapExplorer = Map Explorer
+panel.MapExplorer.description = Dockable window showing the tokens and other assets on the current map.
+panel.MapExplorer.View.BACKGROUND = Background
+panel.MapExplorer.View.CLIPBOARD = Clipboard
+panel.MapExplorer.View.GM = Hidden
+panel.MapExplorer.View.GROUPS = Groups
+panel.MapExplorer.View.LIGHT_SOURCES = Light Sources
+panel.MapExplorer.View.OBJECTS = Objects
+panel.MapExplorer.View.PLAYERS = Players
+# MapExplorer panel -- these *are* used as they are content within the
+# panel, not the title or the string used internally to reference the panel.
+panel.MapExplorer.View.TOKENS = Tokens
+panel.Selected = Selected
+panel.Selected.description = Dockable window showing the macros on the currently selected token(s).
+panel.Selected.tooltip.deslectAll = Deselect all tokens
+panel.Selected.tooltip.next = Select next token
+panel.Selected.tooltip.previous = Select previous token
+panel.Selected.tooltip.revertToPrevious = Revert to previous selection
+panel.Selected.tooltip.selectAll = Select all tokens on the map
+panel.Tables = Tables
+panel.Tables.description = Dockable window for managing the tables in the current campaign.
+
+prefs.language.override.tooltip = Select a language for the MapTool interface.
+
+prefs.jvm.advanced.enableAssertions.tooltip = Enables Java language assertions in the MapTool code.
+prefs.jvm.advanced.direct3d.tooltip = Disable the use of Direct3D pipeline for problem video cards/drivers.
+prefs.jvm.advanced.opengl.tooltip = Enable the OpenGL pipeline.
+prefs.jvm.advanced.initAWTbeforeJFX.tooltip = Initialize AWT before JavaFx. This is for issues specific to the MacOS.
+
+prefs.jvm.xmx.tooltip = Set the maximum memory (heap size) that MapTool is allowed to use. Input a number followed by either a single letter M or G. Examples\: 4G is 4 Gigabytes, 4096M is 4096 Megabytes and is the same as 4G.
+prefs.jvm.xms.tooltip = Set the initial and minimum memory setting for MapTool. Must be less than or equal to max heap size. Input a number followed by either a single letter M or G.
+prefs.jvm.xss.tooltip = Set the stack size for MapTool program threads. Values between 4M and 12M are recommended. Values too large will cause problems.
+
+roll.description = Roll and broadcast the result to all connected players.
+roll.general.unknown = Unknown roll\: "{0}". Use \#d\#+\#.
+# {0} is the players name, {1} is the roll
+roll.string = {0} rolls\: {1}
+
+rollgm.description = Roll and broadcast the result to all GMs.
+# {0} is the players name, {1} is the roll
+rollgm.gm.string = {0} rolls to you\: {1}
+# {0} is the roll
+rollgm.self.string = You roll to the GMs\: {0}
+
+rollme.description = Roll and show the result only to me.
+# {0} is the roll
+rollme.string = You roll to yourself\: {0}
+
+rollsecret.description = Roll and broadcast the result to only the GMs and hide the result even from yourself.
+# {0} is the sender {1} is the roll
+rollsecret.gm.string = {0} rolls secretly to you\: {1}
+# When the GM does "/rollsecret". {0} is the roll. Easier to use "/self"?
+rollsecret.gmself.string = You roll secretly\: {0}
+rollsecret.self.string = You roll secretly to the GMs.
+
+# {0} is the error message
+savealiases.couldNotSave = Could not save alias file\: {0}
+savealiases.created = MapTool Aliases - created
+savealiases.description = Save all current aliases to a file. See "/loadaliases" to load them back in.
+savealiases.dialogTitle = Save Aliases
+savealiases.saved = Aliases Saved.
+
+# {0} is the error message
+savetokenstates.couldNotSave = Could not save token states file\: {0}
+savetokenstates.description = Save the current set of token states to a file.
+savetokenstates.dialogTitle = Save Token States
+# {0} is the number of token states saved.
+savetokenstates.saved = There were {0,number} token states saved.
+
+say.description = Broadcast a message to all connected players.
+
+self.description = Send a message only to yourself.
+
+settokenproperty.description = Set the property of a token.
+settokenproperty.param = You must specify a token name and an expression, or select token(s) and supply an expression.
+settokenproperty.unknownTokens = Unable to determine which tokens to set the property of.
+
+settokenstate.description = Set a state value on a token.
+# {0} is the token name, {1} is the state name
+settokenstate.marked = Token "{0}" now has {1} set.
+settokenstate.param = A token state name and token name, or a selected token and state name are required.
+settokenstate.unknownState = Unknown state name "{0}".
+settokenstate.unknownTokens = Unable to determine which tokens to set the state of.
+settokenstate.unmarked = Token "{0}" now has {1} reset.
+
+# Texture Noise
+texturenoise.description = Change the noise applied to textures (only works on background tile textures at the moment).
+texturenoise.currentValsOn = Current Values, alpha \= {0}, seed \= {1}.
+texturenoise.currentValsOff = Noise is currently off.
+texturenoise.usage = To change use /texturenoise alpha [seed] or /texturenoise on | off.
+
+# Version slash command
+slashversion.description = Display the MapTool Version in the chat window.
+slashversion.message = MapTool Version {0}.
+
+# About slash command
+slashabout.description = Display the about dialog.
+
+# Slash Command errors
+slash.mustBeGM = You must be a GM to use "/{0}".
+
+tmacro.description = Run the given macro on the currently selected tokens.
+
+togm.description = Send to GMs exclusively.
+# {0} is the name of the sender, what to say is appended internally to
+# close off HTML tags.
+togm.saysToGM = {0} says to the GMs\:
+# {0} is what to say
+togm.self = You say to the GMs\: {0}
+
+token.popup.menu.always.visible = Visible over FoW
+token.popup.menu.autoresize = Auto Resize...
+token.popup.menu.expose = Expose
+token.popup.menu.expose.currentonly = Only currently visible
+token.popup.menu.expose.currentonly.accel = shift O
+token.popup.menu.expose.lastpath = Last path
+token.popup.menu.expose.lastpath.accel = P
+token.popup.menu.expose.visible = Visible area
+token.popup.menu.expose.visible.accel = I
+token.popup.menu.fow = FOW Views
+token.popup.menu.fow.clearselected = Clear Selected's Exposed Area
+token.popup.menu.fow.global = Add From Global Exposed Area
+token.popup.menu.fow.party = Add From Group's Exposed Area
+token.popup.menu.fow.tokens = Token's FOW Views
+token.popup.menu.fow.tokens.view = {0}''s Exposed Area
+# Token Content Menu
+#
+# Note the use of the two single quotes. See the URL at the top of the
+# file for an explanation. (Essentially, a single quote in the output
+# requires two single quotes in the message string.)
+token.popup.menu.halo = Halo
+token.popup.menu.vision.overlay = Vision Overlay
+token.properties.button.transferVblFromMap.copy.text = Copy VBL From Map
+token.properties.button.transferVblFromMap.move.text = Move VBL From Map
+token.properties.button.transferVblToMap.copy.text = Copy VBL To Map
+token.properties.button.transferVblToMap.move.text = Move VBL To Map
+
+tokenspeech.description = Say the given speech on the currently selected tokens.
+
+tool.LineCellTemplate.tooltip = Draw a line template centered on a grid cell.
+# We use LClick to mean "left-click" and RClick to mean "right-click".
+# We use MClick to mean "middle mouse button click".
+# We use LDrag to mean "left-click-and-drag" and ditto for RDrag.
+# We use MWheel to mean "mouse wheel".
+# We add "Shift" or "Ctrl" in front to mean that keystroke.
+tool.blasttemplate.instructions = LClick\: set starting cell, second LClick sets radius and direction; Ctrl\: move origin point
+tool.blasttemplate.tooltip = Draw a blast template.
+#tool.boardtool.instructions=Reposition Background Image
+tool.boardtool.tooltip = Reposition background map image
+tool.bursttemplate.instructions = LClick\: set center cell, second LClick sets radius; Ctrl\: move origin point
+tool.bursttemplate.tooltip = Draw a burst template.
+tool.cone.instructions = LClick\: set initial point, second LClick sets radius and direction; Ctrl\: move origin point
+tool.cone.tooltip = Draw a cone template.
+tool.crosstopology.instructions = LClick\: set initial/final point; Shift LClick\: erase cross; Ctrl snaps to grid
+tool.crosstopology.tooltip = Draw a cross VBL
+tool.diamond.tooltip = Draw a diamond.
+tool.diamondexpose.tooltip = Expose/Hide a diamond on the Fog of War.
+tool.facing.instructions = Unused
+tool.facing.tooltip = Set the token facing.
+tool.filltopology.tooltip = Fill in closed areas of VBL.
+tool.freehand.instructions = LDrag\: draw freehand line, Shift+LDrag\: erase freehand line, Alt (hold)\: Snap to cell center
+tool.freehand.tooltip = Draw freehand lines.
+tool.freehandexpose.instructions = LClick\: lay initial/final point to expose, RClick (while drawing)\: set intermediate point, Shift+LClick (initial)\: hide area
+tool.freehandexpose.tooltip = Expose/Hide a freehand shape on the Fog of War.
+tool.gridtool.instructions = Arrows\: move grid offset, Shift+Arrows\: change grid size, LDrag\: Move grid, MWheel\: scale grid
+tool.gridtool.tooltip = Show/Hide the map grid.
+tool.label.dialogtitle = Edit Label
+tool.label.instructions = LClick\: create a new label, RDrag\: move map, MWheel\: zoom
+tool.label.tooltip = Add text label to map.
+tool.line.instructions = LClick\: lay initial/final point, RClick (while drawing)\: set intermediate point, Shift+LClick (initial)\: erase line, Alt (hold)\: Snap to cell center
+tool.line.tooltip = Draw straight lines.
+tool.linetemplate.instructions = LClick\: set initial point, second LClick determines path, third LClick sets length; Ctrl\: move last point set
+tool.linetemplate.tooltip = Draw a line template.
+tool.measure.instructions = LDrag\: measure cell distance, RDrag\: move map, MWheel\: zoom, MClick and Spacebar\: Toggle waypoint
+tool.measure.tooltip = Measure distance along path.
+tool.oval.instructions = LClick\: set initial/final point, Shift+LClick\: start erase oval; Alt\: origin is centerpoint
+tool.oval.tooltip = Draw an oval.
+tool.ovalexpose.instructions = LClick\: set initial/final point to expose, Shift+LClick\: hide area; Alt\: origin is centerpoint
+tool.ovalexpose.tooltip = Expose/Hide an oval on the Fog of War.
+tool.ovaltopology.instructions = LClick\: set initial/final point, Shift+LClick\: start erase oval
+tool.ovaltopology.tooltip = Draw an oval VBL.
+tool.ovaltopologyhollow.tooltip = Draw a hollow oval VBL.
+tool.pointer.instructions = LClick\: select, LDrag\: move selected, RClick\: menu, RDrag\: move map, MWheel\: zoom, MClick and Spacebar\: Toggle waypoint, Shift+MouseOver\: no statsheet
+tool.pointer.tooltip = Pointer tool
+tool.poly.instructions = LClick\: lay initial/final point, RClick (while drawing)\: set intermediate point, RDrag\: move map, Shift+LClick (initial)\: Erase poly area
+tool.poly.tooltip = Draw closed polygon.
+tool.polyexpose.instructions = LClick\: lay initial/final point to expose, RClick (while drawing)\: set intermediate point, RDrag\: move map, Shift+LClick (initial)\: hide area
+tool.polyexpose.tooltip = Expose/Hide a polygon on the Fog of War.
+tool.polylinetopo.tooltip = Draw poly line VBL.
+tool.polytopo.tooltip = Draw closed polygon VBL.
+tool.radiusCellTemplate.tooltip = Draw a radius template centered on a grid cell.
+tool.radiustemplate.instructions = LClick\: set initial point, second LClick sets radius; Ctrl\: move origin point
+tool.radiustemplate.tooltip = Draw a radius template.
+tool.rect.instructions = LClick\: set initial/final point, Shift+LClick\: erase rectangle; Ctrl\: snap-to-grid, Alt\: origin is centerpoint
+tool.rect.tooltip = Draw a rectangle.
+tool.rectexpose.instructions = LClick\: set initial/final point to expose; Shift+LClick\: hide rectangle; Alt\: origin is centerpoint
+tool.rectexpose.tooltip = Expose/Hide a rectangle on the Fog of War.
+tool.recttopology.instructions = LClick\: set initial/final point, Shift+LClick\: erase rectangle; Ctrl\: snap-to-grid
+tool.recttopology.tooltip = Draw a rectangular VBL.
+tool.recttopologyhollow.tooltip = Draw a hollow rectangular VBL.
+tool.stamp.tooltip = Stamp tool
+tool.walltemplate.instructions = LClick\: set starting cell, move mouse in direction of wall, second LClick to finish wall; Ctrl\: move origin point
+tool.walltemplate.tooltip = Draw a wall template.
+tools.ai_selector.tooltip = Tokens will navigate around MBL, VBL (if selected), and account for tokens with terrain modifiers.
+tools.ignore_vbl_on_move.tooltip = Tokens will navigate around VBL if selected, otherwise they will freely move into VBL.
+tools.draw_topoloy_selection.tooltip = Choose to draw either VBL, MBL, or both VBL & MBL layers at the same time.
+tools.drawing.tooltip = Drawing Tools
+tools.fog.tooltip = Fog of War Tools
+tools.interaction.tooltip = Interaction Tools
+tools.mute.tooltip = Mute system sounds and audio streams
+tools.unmute.tooltip = Unmute system sounds and audio streams
+tools.hidetoolbar.tooltip = Hide the toolbar
+tools.unhidetoolbar.tooltip = Unhide the toolbar
+tools.template.tooltip = Template Tools
+tools.token.fow.all.tooltip = Show FoW for All Tokens you explicitly own or are owned by all.
+tools.token.fow.gm.tooltip = Show FoW for Tokens you explicitly own. IF you are a GM, you will also see any tokens that have no ownership set.
+tools.token.fow.npc.tooltip = Show FoW for NPC Tokens you explicitly own or are owned by all.
+tools.token.fow.pc.tooltip = Show FoW for PC Tokens you explicitly own or are owned by all.
+tools.topo.tooltip = Vision Blocking Layer (VBL) Tools
+tools.zoneselector.tooltip = Select Map
+
+undefinedmacro.unknownCommand = Unknown command\: "{0}". Try /help for a list of commands.
+
+userTerm.GM = GM
+userTerm.Player = Player
+# Note the capitalization on the second one. Some languages might use
+# different capitalization so both are included here...
+#
+# Note that these are not used universally, but as code is modified they
+# will be added. These should not be used by the programmer when user
+# input is involved, for example in a dropdown box or similar. That's
+# because the program is likely hard-coded to look at the text instead
+# of localizing it. As we move forward, we'll write code so that it
+# displays one thing but uses a separate value internally. That allows
+# you to display whatever you want to the user and still have hard-coded
+# values in the program (because it makes the program significantly
+# easier to write and faster at runtime).
+userTerm.player = player
+
+visionType.DAY = Day
+visionType.NIGHT = Night
+visionType.OFF = Off
+
+webapp.serverAlreadyRunning = The webapp server is already running.
+webapp.serverStarted = Webapp server has been started Connect to http\://{0}\:{1}/{2} on your browser/phone/tablet.
+
+whisper.command = Whisper
+whisper.description = Send a message to a specific player.
+whisper.enterText = enter text here
+whisper.noName = Must supply a player name.
+# {0} is the name, {1} is the message
+whisper.string = {0} whispers\: {1}
+whisper.toSelf = Talking to yourself again?
+whisper.you.string = You whisper to {0}\: {1}
+
+whisperreply.description = Reply to the last player to whisper to you.
From 5eb3c42bccdd1b0d07c70a430b996b1ad0aa9e13 Mon Sep 17 00:00:00 2001
From: Marco Bizzarri
Date: Sun, 23 Feb 2020 15:09:48 +0000
Subject: [PATCH 07/15] Refactors the SysInfo, gathering information
asynchronously
The refactoring is actually about splitting the SysInfo class so that the code for handling the GUI
is in one class and the code for dealing with gathering information is in another class.
Also, it creates an interface (SysInfoProvider) so that the GUI depends from that.
The function getInfoFunction, which was also depending on SysInfo, now only depends on
MapToolSysInfoProvider, the concrete implementation of SysInfoProvider. This allows to test
the "debug" function there (added a couple of unit tests to ensure everything still works).
Refers to #126
---
.../rptools/maptool/client/AppActions.java | 4 +-
.../client/functions/getInfoFunction.java | 17 ++-
.../client/swing/MapToolEventQueue.java | 4 +-
.../maptool/client/ui/SysInfoDialog.java | 102 +++++++++++++
...sInfo.java => MapToolSysInfoProvider.java} | 137 ++++--------------
.../rptools/maptool/util/SysInfoProvider.java | 24 +++
.../client/functions/GetInfoFunctionTest.java | 83 +++++++++++
.../net/rptools/maptool/util/SysInfoTest.java | 22 +++
8 files changed, 278 insertions(+), 115 deletions(-)
create mode 100644 src/main/java/net/rptools/maptool/client/ui/SysInfoDialog.java
rename src/main/java/net/rptools/maptool/util/{SysInfo.java => MapToolSysInfoProvider.java} (76%)
create mode 100644 src/main/java/net/rptools/maptool/util/SysInfoProvider.java
create mode 100644 src/test/java/net/rptools/maptool/client/functions/GetInfoFunctionTest.java
create mode 100644 src/test/java/net/rptools/maptool/util/SysInfoTest.java
diff --git a/src/main/java/net/rptools/maptool/client/AppActions.java b/src/main/java/net/rptools/maptool/client/AppActions.java
index 4b349b8c16..6631af3b6b 100644
--- a/src/main/java/net/rptools/maptool/client/AppActions.java
+++ b/src/main/java/net/rptools/maptool/client/AppActions.java
@@ -78,6 +78,7 @@
import net.rptools.maptool.client.ui.StartServerDialog;
import net.rptools.maptool.client.ui.StartServerDialogPreferences;
import net.rptools.maptool.client.ui.StaticMessageDialog;
+import net.rptools.maptool.client.ui.SysInfoDialog;
import net.rptools.maptool.client.ui.assetpanel.AssetPanel;
import net.rptools.maptool.client.ui.assetpanel.Directory;
import net.rptools.maptool.client.ui.campaignproperties.CampaignPropertiesDialog;
@@ -116,7 +117,6 @@
import net.rptools.maptool.util.PersistenceUtil;
import net.rptools.maptool.util.PersistenceUtil.PersistedCampaign;
import net.rptools.maptool.util.PersistenceUtil.PersistedMap;
-import net.rptools.maptool.util.SysInfo;
import net.rptools.maptool.util.UPnPUtil;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
@@ -2968,7 +2968,7 @@ public void run() {
@Override
protected void executeAction(java.awt.event.ActionEvent e) {
- SysInfo.createAndShowGUI((String) getValue(Action.NAME));
+ SysInfoDialog.createAndShowGUI((String) getValue(Action.NAME));
}
};
diff --git a/src/main/java/net/rptools/maptool/client/functions/getInfoFunction.java b/src/main/java/net/rptools/maptool/client/functions/getInfoFunction.java
index 1fa3c461bb..d0b8f5528e 100644
--- a/src/main/java/net/rptools/maptool/client/functions/getInfoFunction.java
+++ b/src/main/java/net/rptools/maptool/client/functions/getInfoFunction.java
@@ -40,7 +40,8 @@
import net.rptools.maptool.model.Token;
import net.rptools.maptool.model.Zone;
import net.rptools.maptool.server.ServerPolicy;
-import net.rptools.maptool.util.SysInfo;
+import net.rptools.maptool.util.MapToolSysInfoProvider;
+import net.rptools.maptool.util.SysInfoProvider;
import net.rptools.parser.Parser;
import net.rptools.parser.ParserException;
import net.rptools.parser.function.AbstractFunction;
@@ -50,8 +51,16 @@ public class getInfoFunction extends AbstractFunction {
/** The singleton instance. */
private static final getInfoFunction instance = new getInfoFunction();
+ private SysInfoProvider sysInfoProvider;
+
private getInfoFunction() {
super(1, 1, "getInfo");
+ sysInfoProvider = new MapToolSysInfoProvider();
+ }
+
+ // the following is here mostly for testing purpose, until we find a better way to inject
+ protected void setSysInfoProvider(SysInfoProvider sysInfoProvider) {
+ this.sysInfoProvider = sysInfoProvider;
}
/**
@@ -212,9 +221,8 @@ private String getIsoTimeDate() {
*/
private JsonObject getServerInfo() {
ServerPolicy sp = MapTool.getServerPolicy();
- JsonObject sinfo = sp.toJSON();
- return (sinfo);
+ return sp.toJSON();
}
/**
@@ -342,7 +350,6 @@ private JsonObject getCampaignInfo() throws ParserException {
* @throws ParserException if an error occurs.
*/
private JsonObject getDebugInfo() throws ParserException {
- SysInfo info = new SysInfo();
- return info.getSysInfoJSON();
+ return sysInfoProvider.getSysInfoJSON();
}
}
diff --git a/src/main/java/net/rptools/maptool/client/swing/MapToolEventQueue.java b/src/main/java/net/rptools/maptool/client/swing/MapToolEventQueue.java
index 6835905adf..d74f48fcd4 100644
--- a/src/main/java/net/rptools/maptool/client/swing/MapToolEventQueue.java
+++ b/src/main/java/net/rptools/maptool/client/swing/MapToolEventQueue.java
@@ -33,7 +33,7 @@
import net.rptools.maptool.client.functions.getInfoFunction;
import net.rptools.maptool.language.I18N;
import net.rptools.maptool.model.Player;
-import net.rptools.maptool.util.SysInfo;
+import net.rptools.maptool.util.MapToolSysInfoProvider;
import net.rptools.parser.ParserException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -191,7 +191,7 @@ private static void reportToSentryIO(Throwable thrown) {
boolean hostingServer = MapTool.isHostingServer();
Sentry.getContext().addTag("hosting", String.valueOf(MapTool.isHostingServer()));
- Sentry.getContext().addExtra("System Info", new SysInfo().getSysInfoJSON());
+ Sentry.getContext().addExtra("System Info", new MapToolSysInfoProvider().getSysInfoJSON());
addGetInfoToSentry("campaign");
diff --git a/src/main/java/net/rptools/maptool/client/ui/SysInfoDialog.java b/src/main/java/net/rptools/maptool/client/ui/SysInfoDialog.java
new file mode 100644
index 0000000000..3271663cc2
--- /dev/null
+++ b/src/main/java/net/rptools/maptool/client/ui/SysInfoDialog.java
@@ -0,0 +1,102 @@
+/*
+ * 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;
+
+import java.awt.*;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import javax.swing.*;
+import net.rptools.lib.image.ImageUtil;
+import net.rptools.maptool.client.MapTool;
+import net.rptools.maptool.util.MapToolSysInfoProvider;
+import net.rptools.maptool.util.SysInfoProvider;
+
+/**
+ * Retrieves certain characteristics of the execution environment for the purposes of problem
+ * determination and diagnostics. This class is invoked via the Help menu, Gather Debug Info... menu
+ * option.
+ *
+ * @author frank
+ */
+public class SysInfoDialog {
+ private static JDialog frame;
+ private JTextArea infoTextArea;
+ private SysInfoProvider sysInfoProvider = new MapToolSysInfoProvider();
+
+ private Container createContentPane() {
+ JPanel contentPane = new JPanel(new BorderLayout());
+ contentPane.setOpaque(true);
+
+ infoTextArea = new JTextArea(5, 30);
+ infoTextArea.setEditable(false);
+ infoTextArea.setLineWrap(true);
+ infoTextArea.setWrapStyleWord(true);
+ infoTextArea.setFont(new Font("Monospaced", Font.PLAIN, 13));
+ infoTextArea.setText("Gathering information, please wait...");
+ EventQueue.invokeLater(new InfoTextSwingWorker());
+
+ JScrollPane scrollPane = new JScrollPane(infoTextArea);
+ scrollPane.setHorizontalScrollBarPolicy(31);
+ scrollPane.setVerticalScrollBarPolicy(22);
+ scrollPane.setViewportView(infoTextArea);
+
+ contentPane.add(scrollPane, "Center");
+ return contentPane;
+ }
+
+ private class InfoTextSwingWorker extends SwingWorker, Void> {
+
+ @Override
+ protected List doInBackground() {
+ return sysInfoProvider.getInfo();
+ }
+
+ @Override
+ protected void done() {
+ try {
+ infoTextArea.setText("");
+ for (String row : get()) {
+ infoTextArea.append(row);
+ }
+ } catch (InterruptedException ignore) {
+ } catch (ExecutionException e) {
+ MapTool.showError("Gathering Debug Information", e);
+ }
+ }
+ }
+
+ public static void createAndShowGUI(String title) {
+ if (frame != null) {
+ frame
+ .dispose(); // This is so that the memory characteristics are queried each time this frame
+ // is displayed.
+ frame = null;
+ }
+ frame = new JDialog(MapTool.getFrame(), title);
+ frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+
+ SysInfoDialog sysInfoDialog = new SysInfoDialog();
+ frame.setContentPane(sysInfoDialog.createContentPane());
+ try {
+ Image img = ImageUtil.getImage("net/rptools/maptool/client/image/maptool_icon.png");
+ frame.setIconImage(img);
+ } catch (Exception ex) {
+ MapTool.showError("While retrieving MapTool logo image?!", ex);
+ }
+ frame.setSize(550, 640);
+ frame.setLocationByPlatform(true);
+ frame.setVisible(true);
+ }
+}
diff --git a/src/main/java/net/rptools/maptool/util/SysInfo.java b/src/main/java/net/rptools/maptool/util/MapToolSysInfoProvider.java
similarity index 76%
rename from src/main/java/net/rptools/maptool/util/SysInfo.java
rename to src/main/java/net/rptools/maptool/util/MapToolSysInfoProvider.java
index 1532519606..2e6f617b4c 100644
--- a/src/main/java/net/rptools/maptool/util/SysInfo.java
+++ b/src/main/java/net/rptools/maptool/util/MapToolSysInfoProvider.java
@@ -15,13 +15,9 @@
package net.rptools.maptool.util;
import com.google.gson.JsonObject;
-import java.awt.BorderLayout;
-import java.awt.Container;
import java.awt.DisplayMode;
-import java.awt.Font;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
-import java.awt.Image;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -33,20 +29,10 @@
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.text.DecimalFormat;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-import java.util.StringTokenizer;
+import java.util.*;
+import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.swing.JDialog;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
-import net.rptools.lib.image.ImageUtil;
import net.rptools.maptool.client.AppUtil;
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.swing.MemoryStatusBar;
@@ -57,24 +43,14 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-/**
- * Retrieves certain characteristics of the execution environment for the purposes of problem
- * determination and diagnostics. This class is invoked via the Help menu, Gather Debug Info... menu
- * option.
- *
- * @author frank
- */
-public class SysInfo {
- private static final Logger log = LogManager.getLogger(SysInfo.class);
- private static final DecimalFormat format = new DecimalFormat("#,##0.#");
+public class MapToolSysInfoProvider implements SysInfoProvider {
+ private static final Logger log = LogManager.getLogger(MapToolSysInfoProvider.class);
- private static JDialog frame;
- private JTextArea infoTextArea;
- private JScrollPane scrollPane;
- private static String os = new String();
- private static String hostIP = new String();
- private static String routerIP = new String();
+ private static final DecimalFormat format = new DecimalFormat("#,##0.#");
+ private static String os = "";
+ private List rows = new ArrayList<>();
+ @Override
public JsonObject getSysInfoJSON() {
JsonObject info = new JsonObject();
@@ -121,7 +97,7 @@ public JsonObject getSysInfoJSON() {
}
private void appendInfo(String s) {
- infoTextArea.append(s + "\n");
+ rows.add(s + "\n");
}
private void getMapToolInfo(Properties p) {
@@ -176,6 +152,7 @@ private void getOsInfo(Properties p) {
appendInfo("OS Name........: " + p.getProperty("os.name"));
appendInfo("OS Version.....: " + p.getProperty("os.version"));
appendInfo("OS Architecture: " + p.getProperty("os.arch"));
+ os = p.getProperty("os.name");
if (os.contains("Windows")) {
appendInfo("Processor......: " + env.get("PROCESSOR_IDENTIFIER"));
}
@@ -190,24 +167,6 @@ private void getOsInfo(Properties p) {
appendInfo("User Dir.: " + p.getProperty("user.dir"));
}
- private void getInfo() {
- clearInfo();
- Properties p = System.getProperties();
-
- getMapToolInfo(p);
- getJavaInfo(p);
- getOsInfo(p);
- getNetworkInterfaces();
- getLocaleInfo();
- getEncodingInfo();
- getDisplayInfo();
- getIGDs();
- }
-
- private void clearInfo() {
- this.infoTextArea.setText("");
- }
-
private static String getEncoding() {
final byte[] bytes = {'D'};
final InputStream inputStream = new ByteArrayInputStream(bytes);
@@ -232,16 +191,18 @@ private void getNetworkInterfaces() {
}
try {
- hostIP = InetAddress.getLocalHost().getHostAddress();
+ String hostIP = InetAddress.getLocalHost().getHostAddress();
appendInfo("Host Address...: " + hostIP);
} catch (UnknownHostException ex) {
appendInfo("Host Address...: failed");
+ log.error(ex);
}
- routerIP = getRouterIP();
+ String routerIP = getRouterIP();
appendInfo("Default Gateway: " + routerIP);
} catch (SocketException se) {
appendInfo("*** Could net get list of network interfaces ***");
+ log.error(se);
}
}
@@ -291,6 +252,7 @@ private static String getRouterIP() {
}
}
} catch (IOException ex) {
+ log.error(ex);
return "Failed";
}
return "Unknown";
@@ -305,6 +267,7 @@ private void getIGDs() {
IGDs = InternetGatewayDevice.getDevices(discoveryTimeout);
} catch (IOException ex) {
appendInfo("\tError scanning for IGDs.");
+ log.error(ex);
}
if (IGDs != null)
@@ -319,65 +282,27 @@ private void getIGDs() {
try {
appendInfo("External IP.: " + igd.getExternalIPAddress());
} catch (UPNPResponseException ex) {
- MapTool.showError("UPNPResponseException", ex);
+ appendInfo("UPNPResponseException" + ex);
+ log.error(ex);
} catch (IOException ex) {
- MapTool.showError("IOException", ex);
+ appendInfo("IOException" + ex);
+ log.error(ex);
}
appendInfo("");
}
else appendInfo("\tNo IGDs Found!");
}
- private Container createContentPane() {
- JPanel contentPane = new JPanel(new BorderLayout());
- contentPane.setOpaque(true);
-
- this.infoTextArea = new JTextArea(5, 30);
- this.infoTextArea.setEditable(false);
- this.infoTextArea.setLineWrap(true);
- this.infoTextArea.setWrapStyleWord(true);
- this.infoTextArea.setFont(new Font("Monospaced", 0, 13));
-
- this.scrollPane = new JScrollPane(this.infoTextArea);
- this.scrollPane.setHorizontalScrollBarPolicy(31);
- this.scrollPane.setVerticalScrollBarPolicy(22);
- this.scrollPane.setViewportView(this.infoTextArea);
-
- contentPane.add(this.scrollPane, "Center");
-
- new Thread(this::getInfo).start();
-
- return contentPane;
- }
-
- public static void createAndShowGUI(String title) {
- if (frame != null) {
- frame
- .dispose(); // This is so that the memory characteristics are queried each time this frame
- // is displayed.
- frame = null;
- }
- frame = new JDialog(MapTool.getFrame(), title);
- frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
-
- SysInfo demo = new SysInfo();
- // frame.setJMenuBar(demo.createMenuBar());
- frame.setContentPane(demo.createContentPane());
- try {
- Image img = ImageUtil.getImage("net/rptools/maptool/client/image/maptool_icon.png");
- frame.setIconImage(img);
- // URL url =
- // MapTool.class.getClassLoader().getResource("net/rptools/maptool/client/image/maptool_icon.png");
- // Toolkit tk = Toolkit.getDefaultToolkit();
- // if (url != null) {
- // Image img = tk.createImage(url);
- // frame.setIconImage(img);
- // }
- } catch (Exception ex) {
- MapTool.showError("While retrieving MapTool logo image?!", ex);
- }
- frame.setSize(550, 640);
- frame.setLocationByPlatform(true);
- frame.setVisible(true);
+ public List getInfo() {
+ Properties p = System.getProperties();
+ getMapToolInfo(p);
+ getJavaInfo(p);
+ getOsInfo(p);
+ getNetworkInterfaces();
+ getLocaleInfo();
+ getEncodingInfo();
+ getDisplayInfo();
+ getIGDs();
+ return rows;
}
}
diff --git a/src/main/java/net/rptools/maptool/util/SysInfoProvider.java b/src/main/java/net/rptools/maptool/util/SysInfoProvider.java
new file mode 100644
index 0000000000..70ffe035d1
--- /dev/null
+++ b/src/main/java/net/rptools/maptool/util/SysInfoProvider.java
@@ -0,0 +1,24 @@
+/*
+ * 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.util;
+
+import com.google.gson.JsonObject;
+import java.util.List;
+
+public interface SysInfoProvider {
+ JsonObject getSysInfoJSON();
+
+ List getInfo();
+}
diff --git a/src/test/java/net/rptools/maptool/client/functions/GetInfoFunctionTest.java b/src/test/java/net/rptools/maptool/client/functions/GetInfoFunctionTest.java
new file mode 100644
index 0000000000..e80d6b45e0
--- /dev/null
+++ b/src/test/java/net/rptools/maptool/client/functions/GetInfoFunctionTest.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.client.functions;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import com.google.gson.JsonObject;
+import java.util.Collections;
+import java.util.List;
+import net.rptools.maptool.util.SysInfoProvider;
+import net.rptools.parser.ParserException;
+import org.jetbrains.annotations.NotNull;
+import org.junit.jupiter.api.Test;
+
+public class GetInfoFunctionTest {
+
+ @Test
+ public void debugInfo() throws ParserException {
+ getInfoFunction function = getInfoFunction.getInstance();
+ List
@@ -303,7 +303,7 @@
- 913
+ 916Notes
@@ -336,7 +336,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1411549683
+ embedded.30168645CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0)FILL:DEFAULT:GROW(1.0)
@@ -385,7 +385,7 @@
- 908
+ 911GM Notes
@@ -449,7 +449,7 @@
truetrue@GMNotes
- 906
+ 909true
@@ -478,7 +478,7 @@
- 204
+ 256
@@ -698,7 +698,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1248512955
+ embedded.1249387361CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE
@@ -748,7 +748,7 @@
propertiesTable
- 913
+ 916propertiesTable
@@ -881,9 +881,9 @@
com.jeta.forms.gui.form.FormComponent
- embedded.469436388
- CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:6DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:6DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,BOTTOM:DEFAULT:GROW(1.0),TOP:DEFAULT:NONE,CENTER:5DLU:NONE
- FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE
+ embedded.635315273
+ CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,BOTTOM:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,TOP:DEFAULT:NONE,CENTER:5DLU:NONE
+ FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE
@@ -893,8 +893,8 @@
2
- 3
- 1
+ 18
+ 31defaultdefault
@@ -904,10 +904,10 @@
com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
- javax.swing.JButton
+ com.jeta.forms.components.line.HorizontalLineComponent
- javax.swing.JButton
+ com.jeta.forms.components.line.HorizontalLineComponent
@@ -930,12 +930,32 @@
- Clear VBL
- clearVblButton
- 129
- Clear Token VBL
- Clear all VBL from token.
- 22
+
+
+
+ lineDefinition
+
+
+
+
+
+ lineStyle
+
+
+ dyncolor
+ constant
+ 0,0,0
+
+
+ 1
+
+
+
+
+
+ 0
+
+
@@ -950,8 +970,85 @@
2
- 5
- 1
+ 28
+ 3
+ 1
+ default
+ default
+ 0,0,0,0
+
+
+ com.jeta.forms.gui.form.StandardComponent
+
+ com.jeta.forms.gui.beans.JETABean
+ com.jeta.forms.components.line.HorizontalLineComponent
+
+
+ com.jeta.forms.components.line.HorizontalLineComponent
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+
+
+
+
+ lineDefinition
+
+
+
+
+
+ lineStyle
+
+
+ dyncolor
+ constant
+ 0,0,0
+
+
+ 1
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 21
+ 31defaultdefault
@@ -987,11 +1084,10 @@
- Generate VBL
- autoGenerateVblButton
- 129
- Generate Token VBL
- This will create VBL based on non-transparent pixels.
+ Clear VBL
+ transferVblToMap
+ 229
+ Move VBL To Map22
@@ -1007,10 +1103,10 @@
2
- 7
- 1
+ 23
+ 31
- center
+ defaultdefault0,0,0,0
@@ -1018,10 +1114,10 @@
com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
- com.jeta.forms.components.label.JETALabel
+ javax.swing.JButton
- com.jeta.forms.components.label.JETALabel
+ javax.swing.JButton
@@ -1044,16 +1140,11 @@
- 2
- 69
-
- VBL Sensitivity
-
-
- fill
-
-
- 14
+ Clear VBL
+ transferVblFromMap
+ 229
+ Move VBL From Map
+ 22
@@ -1068,10 +1159,10 @@
2
- 21
- 1
+ 25
+ 31
- center
+ defaultdefault0,0,0,0
@@ -1107,11 +1198,11 @@
Always Show 0
- alwaysVisibleButton
- 98
- Visible over FoW
+ copyOrMoveCheckbox
+ 229
+ Erase Source VBLtrue
- Always show this token over FoW when in sight of another token. Useful for doors, statues, columns, roofs, etc.
+ Move the VBL vs Copy the VBL16
@@ -1127,10 +1218,10 @@
2
- 23
+ 711
- center
+ defaultdefault0,0,0,0
@@ -1165,9 +1256,9 @@
2
+ ignoreColorLabel87
-
- Visibility Tolerance
+ Ignore Colorfill
@@ -1188,27 +1279,53 @@
2
- 25
+ 911defaultdefault
- 0,10,0,10
+ 0,0,0,0com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
- javax.swing.JSpinner
+ com.jeta.forms.components.label.JETALabel
- javax.swing.JSpinner
+ com.jeta.forms.components.label.JETALabel
- visibilityToleranceSpinner
- 109
- Controls how many of the tokens regions must be seen before showing over FoW, range is 1-9 regions.
- 20
+
+
+
+ border
+
+
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+
+ 2
+ jtsDistanceToleranceLabel
+ 87
+ JTS Distance
+
+
+ fill
+
+
+ 14
@@ -1223,27 +1340,53 @@
2
- 9
+ 1311defaultdefault
- 0,10,0,10
+ 0,0,0,0com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
- javax.swing.JSpinner
+ com.jeta.forms.components.label.JETALabel
- javax.swing.JSpinner
+ com.jeta.forms.components.label.JETALabel
- alphaSensitivitySpinner
- 109
- Adjust the sensitivity to transparency that will be used to generate VBL, values 0-255.
- 20
+
+
+
+ border
+
+
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+
+ 2
+ alphaSensitivityLabel
+ 87
+ Sensitivity
+
+
+ fill
+
+
+ 14
@@ -1258,11 +1401,72 @@
2
- 29
+ 1111
- center
- bottom
+ default
+ default
+ 0,0,0,0
+
+
+ com.jeta.forms.gui.form.StandardComponent
+
+ com.jeta.forms.gui.beans.JETABean
+ com.jeta.forms.components.label.JETALabel
+
+
+ com.jeta.forms.components.label.JETALabel
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+
+ 2
+ jtsDistanceToleranceLabel
+ 87
+ JTS Method
+
+
+ fill
+
+
+ 14
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 38
+ 3
+ 1
+ right
+ default0,0,0,0
@@ -1315,8 +1519,8 @@
2
- 11
- 1
+ 36
+ 31defaultdefault
@@ -1352,7 +1556,7 @@
-
+ lineDefinition
@@ -1392,21 +1596,21 @@
2
- 28
- 1
+ 4
+ 31defaultdefault
- 0,0,5,0
+ 0,0,0,0com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
- com.jeta.forms.components.line.HorizontalLineComponent
+ javax.swing.JButton
- com.jeta.forms.components.line.HorizontalLineComponent
+ javax.swing.JButton
@@ -1429,32 +1633,130 @@
-
-
-
- lineDefinition
-
+ Generate VBL
+ autoGenerateVblButton
+ 229
+ Generate Token VBL
+ This will create VBL based on non-transparent pixels.
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 15
+ 3
+ 1
+ default
+ default
+ 0,0,0,0
+
+
+ com.jeta.forms.gui.form.StandardComponent
+
+ com.jeta.forms.gui.beans.JETABean
+ javax.swing.JButton
+
+
+ javax.swing.JButton
+
+
+
+
+
+ border
+
+
-
- lineStyle
-
-
- dyncolor
- constant
- 0,0,0
-
-
- 1
+
+
+ border
+
- 0
+ Clear VBL
+ clearVblButton
+ 229
+ Clear Token VBL
+ Clear all VBL from token.
+ 22
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 33
+ 1
+ 1
+ default
+ default
+ 0,0,0,0
+
+
+ com.jeta.forms.gui.form.StandardComponent
+
+ com.jeta.forms.gui.beans.JETABean
+ com.jeta.forms.components.label.JETALabel
+
+
+ com.jeta.forms.components.label.JETALabel
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+
+ 2
+
+ 87
+ Visibility Tolerance
+
+
+ fill
+
+
+ 14
@@ -1468,10 +1770,10 @@
- 4
+ 624
- 28
+ 37defaultdefault0,0,0,0
@@ -1479,7 +1781,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.75412152
+ embedded.730933885FILL:DEFAULT:GROW(1.0)FILL:DEFAULT:GROW(1.0)
@@ -1529,14 +1831,14 @@
vblPreview
- 749
+ 652VBL Previewfill
- 464
+ 568
@@ -1630,20 +1932,90 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+ 33
+ 1
+ 1
+ default
+ default
+ 0,0,0,0
+
+
+ com.jeta.forms.gui.form.StandardComponent
+
+ com.jeta.forms.gui.beans.JETABean
+ javax.swing.JSpinner
+
+
+ javax.swing.JSpinner
+
+
+ visibilityToleranceSpinner
+ 122
+ Controls how many of the tokens regions must be seen before showing over FoW, range is 1-9 regions.
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+ 13
+ 1
+ 1
+ default
+ default
+ 0,0,0,0
+
+
+ com.jeta.forms.gui.form.StandardComponent
+
+ com.jeta.forms.gui.beans.JETABean
+ javax.swing.JSpinner
+
+
+ javax.swing.JSpinner
+
+
+ alphaSensitivitySpinner
+ 122
+ Adjust the sensitivity to transparency that will be used to generate VBL, values 0-255.
+ 20
+
+
+
+
@@ -1653,8 +2025,8 @@
- 2
- 19
+ 4
+ 1111default
@@ -1665,10 +2037,10 @@
com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
- com.jeta.forms.components.line.HorizontalLineComponent
+ javax.swing.JComboBox
- com.jeta.forms.components.line.HorizontalLineComponent
+ javax.swing.JComboBox
@@ -1691,32 +2063,98 @@
-
-
-
- lineDefinition
-
+
+
+ listitem
+ Douglas Peucker
+
+
+ false
+
+ 0
+ 0
+
+
+
+
+ jtsMethodComboBox
+ 122
+
+
+ items
+
-
- lineStyle
-
-
- dyncolor
- constant
- 0,0,0
+
+ listitem
+ Douglas Peucker
+
+
+ false
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+ listitem
+ Topology Preserving
+
+
+ false
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+ listitem
+ VW Simplifier
+
+
+ false
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+ listitem
+ No Optimization
+
+
+ false
+
+ 0
+ 0
- 1
- 0
+ 18
+ 4
+ 4
@@ -1730,8 +2168,8 @@
- 2
- 13
+ 4
+ 711default
@@ -1742,37 +2180,15 @@
com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
- javax.swing.JButton
+ com.jeta.forms.components.colors.JETAColorWell
- javax.swing.JButton
+ com.jeta.forms.components.colors.JETAColorWell
-
-
-
- border
-
-
-
-
-
-
-
- border
-
-
-
-
-
-
-
-
- Clear VBL
- transferVblToMap
- 129
- Move VBL To Map
- 22
+ 0,0,0
+ vblIgnoreColorWell
+ 122
@@ -1786,8 +2202,8 @@
- 2
- 15
+ 4
+ 911default
@@ -1798,10 +2214,45 @@
com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
- javax.swing.JButton
+ javax.swing.JSpinner
- javax.swing.JButton
+ javax.swing.JSpinner
+
+
+ jtsDistanceToleranceSpinner
+ 122
+ Sets the distance tolerance for the simplification. All vertices in the simplified geometry will be within this distance of the original geometry. Distance of 0 disables simplification.
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+ 32
+ 3
+ 1
+ default
+ default
+ 0,0,0,0
+
+
+ com.jeta.forms.gui.form.StandardComponent
+
+ com.jeta.forms.gui.beans.JETABean
+ javax.swing.JCheckBox
+
+
+ javax.swing.JCheckBox
@@ -1824,11 +2275,14 @@
- Clear VBL
- transferVblFromMap
- 129
- Move VBL From Map
- 22
+ Always Show
+ 0
+ alwaysVisibleButton
+ 229
+ Visible over FoW
+ true
+ Always show this token over FoW when in sight of another token. Useful for doors, statues, columns, roofs, etc.
+ 16
@@ -1842,8 +2296,8 @@
- 2
- 17
+ 4
+ 611default
@@ -1880,13 +2334,11 @@
- Always Show
- 0
- copyOrMoveCheckbox
- 129
- Erase Source VBL
- true
- Move the VBL vs Copy the VBL
+ Hide Preview
+ inverseVblCheckbox
+ 122
+ Inverse VBL
+ Draw the VBL around the token vs Over the token16
@@ -1912,7 +2364,7 @@
-
+ fill
@@ -1952,96 +2404,123 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2094,7 +2573,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.923727352
+ embedded.256869048CENTER:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE
@@ -2116,7 +2595,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1625401712
+ embedded.1197186307CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE
@@ -2310,7 +2789,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1691340922
+ embedded.394985399CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE
@@ -2360,7 +2839,7 @@
speechTable
- 911
+ 914scollBars
@@ -2413,7 +2892,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1742689551
+ embedded.946954001CENTER:DEFAULT:NONEFILL:DEFAULT:NONE
@@ -2680,7 +3159,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1558788581
+ embedded.567731170CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE
@@ -2731,7 +3210,7 @@
All Players@ownedByAll
- 913
+ 916All Players16
@@ -2786,14 +3265,14 @@
ownershipList
- 913
+ 916ownerShipLabelfill
- 460
+ 564
@@ -2925,7 +3404,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.2105835867
+ embedded.1710314316CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONEFILL:DEFAULT:GROW(1.0)
@@ -2947,7 +3426,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.524762276
+ embedded.2139157763CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,TOP:PREF:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:60DLU:NONE,LEFT:5DLU:NONE,FILL:DEFAULT:NONE,FILL:5DLU:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:NONE
@@ -4758,7 +5237,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1616166872
+ embedded.915148764CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE
@@ -4780,7 +5259,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.581388833
+ embedded.1292827776CENTER:DEFAULT:NONEFILL:DEFAULT:NONE
@@ -4965,7 +5444,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1055635686
+ embedded.1831681646CENTER:DEFAULT:NONEFILL:DEFAULT:NONE
@@ -5150,7 +5629,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.243850797
+ embedded.1921591782CENTER:DEFAULT:NONEFILL:DEFAULT:NONE
@@ -5523,7 +6002,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1989401629
+ embedded.1750618167CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,BOTTOM:DEFAULT:NONE,CENTER:5DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:5DLU:NONEFILL:DEFAULT:NONE,LEFT:DEFAULT:NONE,FILL:5DLU:NONE,LEFT:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:NONE
@@ -5667,7 +6146,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1407942221
+ embedded.872177813CENTER:DEFAULT:GROW(1.0)FILL:DEFAULT:GROW(1.0)
@@ -5718,9 +6197,8 @@
falsetrue
- trueHTMLstatblockTextArea
- 876
+ 986scollBars
@@ -5748,7 +6226,7 @@
- 350
+ 439
@@ -5868,7 +6346,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1798632782
+ embedded.1733399271FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONEFILL:5DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:5DLU:NONE,FILL:DEFAULT:NONE,FILL:5DLU:NONE
@@ -5978,7 +6456,7 @@
xmlStatblockSearchTextField
- 739
+ 742Enter raw text, a regular expression or an xPath expresstion to search the statblock for.20
@@ -6063,39 +6541,6 @@
com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
- org.fife.ui.rtextarea.RTextScrollPane
-
-
- org.fife.ui.rtextarea.RTextScrollPane
-
-
-
-
-
- border
-
-
-
-
-
-
-
- border
-
-
-
-
-
-
-
-
- xmlStatblockRTextScrollPane
- 866
- 320
-
-
-
-
@@ -6220,7 +6665,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.2111910794
+ embedded.1462126441FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONEFILL:5DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:5DLU:NONE,FILL:DEFAULT:NONE,FILL:5DLU:NONE
@@ -6387,7 +6832,7 @@
textStatblockSearchTextField
- 739
+ 742Enter raw text, a regular expression or an xPath expresstion to search the statblock for.20
@@ -6415,39 +6860,6 @@
com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
- org.fife.ui.rtextarea.RTextScrollPane
-
-
- org.fife.ui.rtextarea.RTextScrollPane
-
-
-
-
-
- border
-
-
-
-
-
-
-
- border
-
-
-
-
-
-
-
-
- textStatblockRTextScrollPane
- 866
- 320
-
-
-
-
@@ -6572,7 +6984,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.588356027
+ embedded.1367602810CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE
@@ -6680,7 +7092,7 @@
truetrueheroLabImagesList
- 690
+ 693items
@@ -6713,7 +7125,7 @@
- 322
+ 426
@@ -6945,10 +7357,10 @@
- 913
+ 9164View the statblocks from Hero Lab
- 432
+ 536
@@ -7061,7 +7473,7 @@
summaryText
- 766
+ 769summaryText
@@ -7493,9 +7905,9 @@
- 976
+ 9798
- 604
+ 708
@@ -7520,7 +7932,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1768415394
+ embedded.400561879CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:8DLU:NONE,FILL:DEFAULT:NONE
@@ -7736,7 +8148,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1430032151
+ embedded.1595547965CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE
From a8b49a9880dfb18c93b6f02f8fd22690d993a2ea Mon Sep 17 00:00:00 2001
From: JamzTheMan
Date: Sat, 22 Feb 2020 01:32:05 -0600
Subject: [PATCH 11/15] WIP - Optimized TokenVBL
Signed-off-by: JamzTheMan
---
.../client/ui/token/TokenVblPanel.java | 10 ++++----
.../maptool/client/ui/zone/vbl/TokenVBL.java | 23 ++++++++-----------
2 files changed, 13 insertions(+), 20 deletions(-)
diff --git a/src/main/java/net/rptools/maptool/client/ui/token/TokenVblPanel.java b/src/main/java/net/rptools/maptool/client/ui/token/TokenVblPanel.java
index e8b3ad9e3a..a0e498f9b9 100644
--- a/src/main/java/net/rptools/maptool/client/ui/token/TokenVblPanel.java
+++ b/src/main/java/net/rptools/maptool/client/ui/token/TokenVblPanel.java
@@ -33,7 +33,7 @@
import net.rptools.lib.swing.SwingUtil;
import net.rptools.maptool.client.AppStyle;
import net.rptools.maptool.client.MapTool;
-import net.rptools.maptool.client.ui.zone.vbl.TokenVBL.JTS_SimplifyMethod;
+import net.rptools.maptool.client.ui.zone.vbl.TokenVBL.JTS_SimplifyMethodType;
import net.rptools.maptool.model.Token;
import net.rptools.maptool.model.Token.TokenShape;
import net.rptools.maptool.model.Zone;
@@ -54,7 +54,7 @@ public class TokenVblPanel extends JPanel {
private Color vblIgnoredColor = new Color(0, 0, 0, 0);
private int alphaSensitivity = 1;
private int jtsDistanceTolerance = 10;
- private JTS_SimplifyMethod jtsMethod = JTS_SimplifyMethod.getDefault();
+ private JTS_SimplifyMethodType jtsMethod = JTS_SimplifyMethodType.getDefault();
private int tokenVblOriginalPointCount = 0;
private int tokenVblOptimizedPointCount = 0;
@@ -228,12 +228,12 @@ public void setJtsDistanceTolerance(int value) {
jtsDistanceTolerance = value;
}
- public JTS_SimplifyMethod getJtsMethod() {
+ public JTS_SimplifyMethodType getJtsMethod() {
return jtsMethod;
}
public void setJtsMethod(String method) {
- jtsMethod = JTS_SimplifyMethod.fromString(method);
+ jtsMethod = JTS_SimplifyMethodType.fromString(method);
}
@Override
@@ -299,8 +299,6 @@ protected void paintComponent(Graphics g) {
// Draw the VBL
if (tokenVBL_optimized != null) {
- // double tx = centerPoint.x - deltaX - translateX - (imgSize.width / 2) * scale;
- // double ty = centerPoint.y - deltaY - translateY - (imgSize.height / 2) * scale;
double sx = (imgSize.getWidth() / originalImgSize.getWidth()) * scale;
double sy = (imgSize.getHeight() / originalImgSize.getHeight()) * scale;
diff --git a/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java b/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java
index b8f9afb2cd..ab4d7363cc 100644
--- a/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java
+++ b/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java
@@ -64,7 +64,7 @@ public class TokenVBL {
*/
public static Area createOptimizedVblArea(Token token, int alphaSensitivity) {
final Area vblArea = createVblAreaFromToken(token, alphaSensitivity, false);
- return simplifyArea(vblArea, JTS_SimplifyMethod.getDefault(), 10);
+ return simplifyArea(vblArea, JTS_SimplifyMethodType.getDefault(), 10);
}
public static Area createVblAreaFromToken(Token token, int alphaSensitivity, boolean inverseVbl) {
@@ -73,9 +73,9 @@ public static Area createVblAreaFromToken(Token token, int alphaSensitivity, boo
}
public static Area simplifyArea(
- Area vblArea, JTS_SimplifyMethod simplifyMethod, double distanceTolerance) {
+ Area vblArea, JTS_SimplifyMethodType simplifyMethod, double distanceTolerance) {
- if (simplifyMethod.equals(JTS_SimplifyMethod.NONE)) {
+ if (simplifyMethod.equals(JTS_SimplifyMethodType.NONE)) {
return vblArea;
}
@@ -341,7 +341,7 @@ private static Area createVblArea(BufferedImage image, int alphaSensitivity, boo
}
}
- public enum JTS_SimplifyMethod {
+ public enum JTS_SimplifyMethodType {
DOUGLAS_PEUCKER_SIMPLIFIER("Douglas Peucker"),
TOPOLOGY_PRESERVING_SIMPLIFIER("Topology Preserving"),
VW_SIMPLIFIER("VW Simplifier"),
@@ -349,17 +349,17 @@ public enum JTS_SimplifyMethod {
private final String label;
- JTS_SimplifyMethod(String label) {
+ JTS_SimplifyMethodType(String label) {
this.label = label;
}
- public static JTS_SimplifyMethod getDefault() {
+ public static JTS_SimplifyMethodType getDefault() {
return DOUGLAS_PEUCKER_SIMPLIFIER;
}
- public static JTS_SimplifyMethod fromString(String label) {
- final JTS_SimplifyMethod jts_simplifyMethod =
- Stream.of(JTS_SimplifyMethod.values())
+ public static JTS_SimplifyMethodType fromString(String label) {
+ final JTS_SimplifyMethodType jts_simplifyMethod =
+ Stream.of(JTS_SimplifyMethodType.values())
.filter(e -> e.label.equalsIgnoreCase(label))
.findAny()
.orElse(DOUGLAS_PEUCKER_SIMPLIFIER);
@@ -367,9 +367,4 @@ public static JTS_SimplifyMethod fromString(String label) {
return jts_simplifyMethod;
}
}
-
- public enum TokenVblKeyTypes {
- ORIGINAL,
- OPTIMIZED
- }
}
From 9a1ad054d772e656bed21361297970cba3223367 Mon Sep 17 00:00:00 2001
From: JamzTheMan
Date: Sun, 23 Feb 2020 11:17:45 -0600
Subject: [PATCH 12/15] WIP - Optimized TokenVBL
* No long requires 'valid geometry' which allows for vbl with 'holes'
#needsTesting
Signed-off-by: JamzTheMan
---
.../client/ui/token/EditTokenDialog.java | 2 +-
.../maptool/client/ui/zone/vbl/TokenVBL.java | 34 ++++++++++---------
2 files changed, 19 insertions(+), 17 deletions(-)
diff --git a/src/main/java/net/rptools/maptool/client/ui/token/EditTokenDialog.java b/src/main/java/net/rptools/maptool/client/ui/token/EditTokenDialog.java
index dc01d00797..cc3d6f8e3f 100644
--- a/src/main/java/net/rptools/maptool/client/ui/token/EditTokenDialog.java
+++ b/src/main/java/net/rptools/maptool/client/ui/token/EditTokenDialog.java
@@ -1223,7 +1223,7 @@ public void initVblPreviewPanel() {
updateAutoGeneratedVBL(true);
});
- getJtsDistanceToleranceSpinner().setModel(new SpinnerNumberModel(10, 1, 100, 1));
+ getJtsDistanceToleranceSpinner().setModel(new SpinnerNumberModel(2, 0, 100, 1));
getJtsDistanceToleranceSpinner()
.addChangeListener(
e -> {
diff --git a/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java b/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java
index ab4d7363cc..6e975bf62f 100644
--- a/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java
+++ b/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java
@@ -85,17 +85,14 @@ public static Area simplifyArea(
if (!vblArea.isEmpty()) {
try {
- vblGeometry =
- shapeReader
- .read(vblArea.getPathIterator(null))
- .buffer(1); // .buffer helps creating valid geometry and prevent self-intersecting
- // polygons
+ vblGeometry = shapeReader.read(vblArea.getPathIterator(null));
+ // .buffer(1); // helps creating valid geometry and prevent self-intersecting polygons
if (!vblGeometry.isValid()) {
- log.info(
+ log.debug(
"vblGeometry is invalid! May cause issues. Check for self-intersecting polygons.");
}
} catch (Exception e) {
- log.info("vblGeometry oh oh: ", e);
+ log.error("There is a problem reading vblGeometry: ", e);
}
} else {
return vblArea;
@@ -108,27 +105,32 @@ public static Area simplifyArea(
case DOUGLAS_PEUCKER_SIMPLIFIER:
DouglasPeuckerSimplifier dps = new DouglasPeuckerSimplifier(vblGeometry);
dps.setDistanceTolerance(distanceTolerance);
+ dps.setEnsureValid(false);
simplifiedGeometry = dps.getResultGeometry();
break;
- case VW_SIMPLIFIER:
- VWSimplifier vws = new VWSimplifier(vblGeometry);
- vws.setDistanceTolerance(distanceTolerance);
- simplifiedGeometry = vws.getResultGeometry();
- break;
case TOPOLOGY_PRESERVING_SIMPLIFIER:
TopologyPreservingSimplifier tss = new TopologyPreservingSimplifier(vblGeometry);
tss.setDistanceTolerance(distanceTolerance);
simplifiedGeometry = tss.getResultGeometry();
break;
+ case VW_SIMPLIFIER:
+ VWSimplifier vws = new VWSimplifier(vblGeometry);
+ vws.setDistanceTolerance(distanceTolerance);
+ vws.setEnsureValid(false);
+ simplifiedGeometry = vws.getResultGeometry();
+ break;
default:
throw new IllegalStateException("Unexpected value: " + simplifyMethod);
}
- if (simplifiedGeometry.isValid()) {
- return new Area(sw.toShape(simplifiedGeometry));
- } else {
- return vblArea;
+ final Area simplifiedArea = new Area(sw.toShape(simplifiedGeometry));
+
+ if (!simplifiedGeometry.isValid()) {
+ log.debug(
+ "simplifiedGeometry is invalid! May cause issues. Check for self-intersecting polygons.");
}
+
+ return simplifiedArea;
}
/**
From 5f53a08f324580bd612804c71c3bdfa9af62df45 Mon Sep 17 00:00:00 2001
From: JamzTheMan
Date: Sun, 23 Feb 2020 11:53:47 -0600
Subject: [PATCH 13/15] WIP - Optimized TokenVBL
* No long requires 'valid geometry' which allows for vbl with 'holes'
* Fix tokenPropertiesDialog.xml to use generic label vs RSyntax beans
so they are not needed when using forms designer which just removes
the component if you didn't have forms designer setup properly.
#needsTesting
Signed-off-by: JamzTheMan
---
.../client/ui/forms/tokenPropertiesDialog.xml | 173 +++++++++++++-----
1 file changed, 123 insertions(+), 50 deletions(-)
diff --git a/src/main/resources/net/rptools/maptool/client/ui/forms/tokenPropertiesDialog.xml b/src/main/resources/net/rptools/maptool/client/ui/forms/tokenPropertiesDialog.xml
index a52cd55278..5f43013ffd 100644
--- a/src/main/resources/net/rptools/maptool/client/ui/forms/tokenPropertiesDialog.xml
+++ b/src/main/resources/net/rptools/maptool/client/ui/forms/tokenPropertiesDialog.xml
@@ -169,7 +169,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.190170450
+ embedded.797053446CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE
@@ -222,7 +222,7 @@
truetrue@notes
- 914
+ 1037true
@@ -303,7 +303,7 @@
- 916
+ 1039Notes
@@ -336,7 +336,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.30168645
+ embedded.1999616991CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0)FILL:DEFAULT:GROW(1.0)
@@ -385,7 +385,7 @@
- 911
+ 1034GM Notes
@@ -449,7 +449,7 @@
truetrue@GMNotes
- 909
+ 1032true
@@ -698,7 +698,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1249387361
+ embedded.97499701CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE
@@ -748,7 +748,7 @@
propertiesTable
- 916
+ 1039propertiesTable
@@ -881,7 +881,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.635315273
+ embedded.491772226CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,BOTTOM:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,TOP:DEFAULT:NONE,CENTER:5DLU:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE
@@ -930,7 +930,7 @@
-
+ lineDefinition
@@ -1556,7 +1556,7 @@
-
+ lineDefinition
@@ -1748,8 +1748,8 @@
2
- 87
+ Visibility Tolerance
@@ -1781,7 +1781,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.730933885
+ embedded.982488982FILL:DEFAULT:GROW(1.0)FILL:DEFAULT:GROW(1.0)
@@ -1831,7 +1831,7 @@
vblPreview
- 652
+ 775VBL Preview
@@ -2070,7 +2070,6 @@
false
- 00
@@ -2092,7 +2091,6 @@
false
- 00
@@ -2108,7 +2106,6 @@
false
- 00
@@ -2124,7 +2121,6 @@
false
- 00
@@ -2140,7 +2136,6 @@
false
- 00
@@ -2186,7 +2181,6 @@
com.jeta.forms.components.colors.JETAColorWell
- 0,0,0vblIgnoreColorWell122
@@ -2364,7 +2358,7 @@
-
+ fill
@@ -2573,7 +2567,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.256869048
+ embedded.1372529918CENTER:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE
@@ -2595,7 +2589,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1197186307
+ embedded.1811694014CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE
@@ -2789,7 +2783,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.394985399
+ embedded.750789290CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE
@@ -2839,7 +2833,7 @@
speechTable
- 914
+ 1037scollBars
@@ -2892,7 +2886,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.946954001
+ embedded.825483911CENTER:DEFAULT:NONEFILL:DEFAULT:NONE
@@ -3159,7 +3153,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.567731170
+ embedded.934210232CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE
@@ -3210,7 +3204,7 @@
All Players@ownedByAll
- 916
+ 1039All Players16
@@ -3265,7 +3259,7 @@
ownershipList
- 916
+ 1039ownerShipLabel
@@ -3404,7 +3398,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1710314316
+ embedded.814738697CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONEFILL:DEFAULT:GROW(1.0)
@@ -3426,7 +3420,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.2139157763
+ embedded.1066401878CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,TOP:PREF:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:60DLU:NONE,LEFT:5DLU:NONE,FILL:DEFAULT:NONE,FILL:5DLU:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:NONE
@@ -5237,7 +5231,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.915148764
+ embedded.409114774CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE
@@ -5259,7 +5253,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1292827776
+ embedded.377938403CENTER:DEFAULT:NONEFILL:DEFAULT:NONE
@@ -5444,7 +5438,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1831681646
+ embedded.1107653598CENTER:DEFAULT:NONEFILL:DEFAULT:NONE
@@ -5629,7 +5623,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1921591782
+ embedded.750021695CENTER:DEFAULT:NONEFILL:DEFAULT:NONE
@@ -6002,7 +5996,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1750618167
+ embedded.1567916345CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,BOTTOM:DEFAULT:NONE,CENTER:5DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:5DLU:NONEFILL:DEFAULT:NONE,LEFT:DEFAULT:NONE,FILL:5DLU:NONE,LEFT:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:NONE
@@ -6146,7 +6140,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.872177813
+ embedded.45343470CENTER:DEFAULT:GROW(1.0)FILL:DEFAULT:GROW(1.0)
@@ -6197,8 +6191,9 @@
falsetrue
+ trueHTMLstatblockTextArea
- 986
+ 1002scollBars
@@ -6226,7 +6221,7 @@
- 439
+ 454
@@ -6346,7 +6341,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1733399271
+ embedded.792144252FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONEFILL:5DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:5DLU:NONE,FILL:DEFAULT:NONE,FILL:5DLU:NONE
@@ -6456,7 +6451,7 @@
xmlStatblockSearchTextField
- 742
+ 865Enter raw text, a regular expression or an xPath expresstion to search the statblock for.20
@@ -6541,6 +6536,45 @@
com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
+ com.jeta.forms.components.label.JETALabel
+
+
+ com.jeta.forms.components.label.JETALabel
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+
+ xmlStatblockRTextScrollPane
+ 992
+ xmlStatblockRTextScrollPane
+
+
+ fill
+
+
+ 424
+
+
+
+
@@ -6665,7 +6699,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1462126441
+ embedded.2112748857FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONEFILL:5DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:5DLU:NONE,FILL:DEFAULT:NONE,FILL:5DLU:NONE
@@ -6832,7 +6866,7 @@
textStatblockSearchTextField
- 742
+ 865Enter raw text, a regular expression or an xPath expresstion to search the statblock for.20
@@ -6860,6 +6894,45 @@
com.jeta.forms.gui.form.StandardComponentcom.jeta.forms.gui.beans.JETABean
+ com.jeta.forms.components.label.JETALabel
+
+
+ com.jeta.forms.components.label.JETALabel
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+ border
+
+
+
+
+
+
+
+
+ textStatblockRTextScrollPane
+ 992
+ textStatblockRTextScrollPane
+
+
+ fill
+
+
+ 424
+
+
+
+
@@ -6984,7 +7057,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1367602810
+ embedded.1238703735CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE
@@ -7092,7 +7165,7 @@
truetrueheroLabImagesList
- 693
+ 816items
@@ -7357,7 +7430,7 @@
- 916
+ 10394View the statblocks from Hero Lab536
@@ -7473,7 +7546,7 @@
summaryText
- 769
+ 892summaryText
@@ -7905,7 +7978,7 @@
- 979
+ 11028708
@@ -7932,7 +8005,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.400561879
+ embedded.1898885872CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:8DLU:NONE,FILL:DEFAULT:NONE
@@ -8148,7 +8221,7 @@
com.jeta.forms.gui.form.FormComponent
- embedded.1595547965
+ embedded.684173592CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONEFILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE
From d7648541fa997376b870ed377d6f572b6f17ae29 Mon Sep 17 00:00:00 2001
From: JamzTheMan
Date: Sun, 23 Feb 2020 11:55:41 -0600
Subject: [PATCH 14/15] WIP - Optimized TokenVBL
* No long requires 'valid geometry' which allows for vbl with 'holes'
* Fix tokenPropertiesDialog.xml to use generic label vs RSyntax beans
so they are not needed when using forms designer which just removes
the component if you didn't have forms designer setup properly.
#needsTesting
Signed-off-by: JamzTheMan
---
.../java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java | 4 ----
1 file changed, 4 deletions(-)
diff --git a/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java b/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java
index 6e975bf62f..2b447555b2 100644
--- a/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java
+++ b/src/main/java/net/rptools/maptool/client/ui/zone/vbl/TokenVBL.java
@@ -49,10 +49,6 @@ public class TokenVBL {
/**
* TODO: Used by macro function only, update it.
*
- *