From ed7c52f09f8cfbcd7eeb06166352fd3121553d19 Mon Sep 17 00:00:00 2001 From: unknown <黄昱珲> Date: Thu, 19 Jan 2017 20:33:24 +0800 Subject: [PATCH] Added Gaussion Blur --- HMCL/build.gradle | 10 +- .../launcher/api/PluginManager.java | 2 +- .../core/asset/AssetsMojangLoader.java | 8 +- .../launcher/core/asset/IAssetsHandler.java | 8 +- .../core/asset/MinecraftAssetService.java | 57 ++- .../launcher/core/auth/BestLogin.java | 106 ----- .../core/auth/OfflineAuthenticator.java | 13 +- .../core/auth/SkinmeAuthenticator.java | 123 ----- .../core/auth/UserProfileProvider.java | 27 +- .../core/auth/YggdrasilAuthenticator.java | 19 +- .../core/download/DownloadLibraryJob.java | 18 +- .../launcher/core/download/DownloadType.java | 1 - .../download/MinecraftDownloadService.java | 4 +- .../download/RapidDataDownloadProvider.java | 56 --- .../install/MinecraftInstallerService.java | 2 + .../core/install/PackMinecraftInstaller.java | 6 +- .../core/install/forge/ForgeInstaller.java | 9 +- .../forge/MinecraftForgeVersionList.java | 2 +- .../liteloader/LiteLoaderInstaller.java | 6 +- .../liteloader/LiteLoaderVersionList.java | 25 +- .../install/optifine/OptiFineInstaller.java | 6 +- .../bmcl/OptiFineBMCLVersionList.java | 2 +- .../vanilla/OptiFineDownloadFormatter.java | 4 +- .../optifine/vanilla/OptiFineVersionList.java | 2 +- .../core/launch/AbstractMinecraftLoader.java | 6 +- .../core/launch/DefaultGameLauncher.java | 8 +- .../launcher/core/launch/GameLauncher.java | 67 ++- .../core/launch/LibraryDownloadTask.java | 26 +- .../launcher/core/launch/MinecraftLoader.java | 3 +- .../launcher/core/mod/ModInfo.java | 31 +- .../launcher/core/mod/ModpackManager.java | 10 +- .../core/version/MinecraftLibrary.java | 24 +- .../core/version/MinecraftVersion.java | 21 +- .../core/version/MinecraftVersionManager.java | 11 +- .../launcher/core/version/Rules.java | 2 +- .../hellominecraft/launcher/Main.java | 3 + .../launcher/setting/Config.java | 12 - .../launcher/setting/Settings.java | 2 +- .../launcher/setting/VersionSetting.java | 4 +- .../launcher/ui/AnimatedPanel.java | 124 ----- .../launcher/ui/GameDownloadPanel.java | 7 +- .../launcher/ui/GameSettingsPanel.form | 14 +- .../launcher/ui/GameSettingsPanel.java | 380 +++++++-------- .../launcher/ui/InstallerPanel.java | 22 +- .../launcher/ui/LauncherSettingsPanel.form | 48 +- .../launcher/ui/LauncherSettingsPanel.java | 74 +-- .../launcher/ui/LaunchingUIDaemon.java | 14 +- .../hellominecraft/launcher/ui/MainFrame.java | 75 ++- .../launcher/ui/MainPagePanel.form | 33 +- .../launcher/ui/MainPagePanel.java | 108 +++-- .../hellominecraft/launcher/ui/Page.java | 56 +++ .../ui/modpack/ModpackDescriptionPanel.java | 6 +- .../modpack/ModpackInitializationPanel.java | 6 +- .../launcher/ui/modpack/ModpackWizard.java | 5 +- .../launcher/util/CrashReporter.java | 5 +- .../launcher/util/DefaultPlugin.java | 29 +- .../launcher/util/HMCLMinecraftService.java | 38 +- .../util/upgrade/AppDataUpgrader.java | 8 +- .../util/upgrade/NewFileUpgrader.java | 2 +- .../HelloMinecraftLookAndFeel.java | 19 +- .../lookandfeel/painter/ButtonPainter.java | 68 +-- .../lookandfeel/ui/ComboBoxUI.java | 57 ++- .../lookandfeel/ui/ScrollButton.java | 2 +- HMCSM/build.gradle | 2 +- .../jackhuang/hellominecraft/svrmgr/Main.java | 2 +- .../install/cauldron/ForgeInstaller.java | 21 +- .../svrmgr/server/BackupManager.java | 8 +- .../hellominecraft/svrmgr/server/Server.java | 2 +- .../hellominecraft/svrmgr/ui/MainWindow.java | 46 +- .../svrmgr/ui/PluginInfoDialog.java | 2 +- .../svrmgr/util/FolderOpener.java | 2 +- .../hellominecraft/util/ArrayUtils.java | 47 +- .../hellominecraft/util/CollectionUtils.java | 3 + .../hellominecraft/util/MathUtils.java | 5 +- .../hellominecraft/util/MessageBox.java | 14 +- .../util/MinecraftVersionRequest.java | 63 ++- .../hellominecraft/util/NetUtils.java | 42 +- .../util/OverridableSwingWorker.java | 5 +- .../hellominecraft/util/StrUtils.java | 3 + .../hellominecraft/util/UpdateChecker.java | 6 +- .../jackhuang/hellominecraft/util/Utils.java | 56 +-- .../hellominecraft/util/VersionNumber.java | 27 ++ .../hellominecraft/util/code/Base64.java | 13 +- .../hellominecraft/util/code/Charsets.java | 5 +- .../hellominecraft/util/code/DigestUtils.java | 5 +- .../hellominecraft/util/code/Hex.java | 2 +- .../util/lang/Localization.java | 4 +- .../util/lang/SupportedLocales.java | 6 +- .../util/logging/AppenderControl.java | 4 +- .../logging/layout/AbstractStringLayout.java | 3 +- .../util/logging/logger/SimpleLogger.java | 2 +- .../util/logging/message/ObjectMessage.java | 2 +- ...{Compressor.java => CompressingUtils.java} | 5 +- .../hellominecraft/util/system/FileUtils.java | 25 +- .../hellominecraft/util/system/IOUtils.java | 70 ++- .../hellominecraft/util/system/Java.java | 22 +- .../util/system/JdkVersion.java | 11 +- .../hellominecraft/util/system/OS.java | 57 ++- .../util/system/ProcessThread.java | 3 +- .../hellominecraft/util/system/ZipEngine.java | 26 +- .../util/tasks/DecompressTask.java | 6 +- .../util/tasks/DeleteFileTask.java | 5 +- .../hellominecraft/util/tasks/DoubleTask.java | 4 +- .../util/tasks/ParallelTask.java | 2 +- .../hellominecraft/util/tasks/Task.java | 38 +- .../hellominecraft/util/tasks/TaskList.java | 40 +- .../util/tasks/TaskRunnable.java | 2 +- .../hellominecraft/util/tasks/TaskWindow.java | 91 ++-- .../DefaultPreviousResult.java | 2 +- .../PreviousResult.java | 2 +- .../PreviousResultRegistrar.java | 2 +- .../tasks/download/ContentGetAndShowTask.java | 15 +- .../util/tasks/download/FileDownloadTask.java | 12 +- .../util/tasks/download/HTTPGetTask.java | 15 +- .../util/ui/AbstractFilter.java | 34 -- .../hellominecraft/util/ui/BasicColors.java | 10 +- .../util/ui/DropShadowBorder.java | 17 +- .../util/ui/FastBlurFilter.java | 14 +- .../hellominecraft/util/ui/GraphicsUtils.java | 78 ++++ .../hellominecraft/util/ui/LogWindow.java | 40 +- .../util/ui/LogWindowOutputStream.java | 12 +- .../hellominecraft/util/ui/SwingUtils.java | 9 +- .../api/displayer/NavButtonManager.java | 5 + .../ui/wizard/api/displayer/NavProgress.java | 7 + .../api/displayer/WizardDisplayerImpl.java | 97 ++-- .../wizard/modules/InstructionsPanelImpl.java | 100 ++-- .../util/ui/wizard/modules/MergeMap.java | 13 +- .../util/ui/wizard/spi/BranchingWizard.java | 70 ++- .../util/ui/wizard/spi/SimpleWizard.java | 39 +- .../util/ui/wizard/spi/SimpleWizardInfo.java | 11 +- .../util/ui/wizard/spi/Util.java | 44 +- .../util/ui/wizard/spi/WizardPage.java | 440 +++++++++--------- .../jackhuang/hellominecraft/lang/I18N.lang | 2 +- .../hellominecraft/lang/I18N.properties | 2 +- .../hellominecraft/lang/I18N_en.lang | 2 +- .../hellominecraft/lang/I18N_en.properties | 2 +- .../hellominecraft/lang/I18N_zh_TW.lang | 2 +- .../hellominecraft/lang/I18N_zh_TW.properties | 2 +- 138 files changed, 1792 insertions(+), 2063 deletions(-) delete mode 100755 HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/BestLogin.java delete mode 100755 HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/SkinmeAuthenticator.java delete mode 100755 HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/RapidDataDownloadProvider.java delete mode 100755 HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/AnimatedPanel.java create mode 100755 HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Page.java rename HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/{Compressor.java => CompressingUtils.java} (99%) rename HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/{communication => comm}/DefaultPreviousResult.java (94%) rename HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/{communication => comm}/PreviousResult.java (93%) rename HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/{communication => comm}/PreviousResultRegistrar.java (94%) diff --git a/HMCL/build.gradle b/HMCL/build.gradle index 6bc999f7d..7b4412499 100755 --- a/HMCL/build.gradle +++ b/HMCL/build.gradle @@ -19,14 +19,10 @@ buildscript { repositories { mavenCentral(); - maven { - url "https://libraries.minecraft.net" - } - dependencies { classpath 'net.sf.proguard:proguard-gradle:4.10' classpath 'edu.sc.seis.gradle:launch4j:1.0.6' - classpath 'me.tatarka:gradle-retrolambda:3.1.0' + classpath 'me.tatarka:gradle-retrolambda:3.4.0' } } } @@ -50,11 +46,11 @@ def buildnumber = System.getenv("TRAVIS_BUILD_NUMBER") if (buildnumber == null) buildnumber = System.getenv("BUILD_NUMBER") if (buildnumber == null) - buildnumber = "233" + buildnumber = "0" def versionroot = System.getenv("VERSION_ROOT") if (versionroot == null) - versionroot = "2.4.1" + versionroot = "2.6.0" String mavenGroupId = 'HMCL' String mavenVersion = versionroot + '.' + buildnumber diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/api/PluginManager.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/api/PluginManager.java index 3468dbb22..68e2e957b 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/api/PluginManager.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/api/PluginManager.java @@ -38,7 +38,7 @@ public class PluginManager { try { IPlugin p = (IPlugin) cls.newInstance(); NOW_PLUGIN = p; - } catch (Exception e) { + } catch (IllegalAccessException | InstantiationException e) { HMCLog.err("Failed to new instance"); } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java index ad24a5015..284511aff 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Map; +import java.util.Objects; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftAssetService; @@ -32,7 +33,6 @@ import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.launcher.core.download.IDownloadProvider; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; -import org.jackhuang.hellominecraft.util.Utils; import org.jackhuang.hellominecraft.util.VersionNumber; import org.jackhuang.hellominecraft.util.tasks.TaskInfo; @@ -48,7 +48,7 @@ public class AssetsMojangLoader extends IAssetsHandler { @Override public Task getList(final MinecraftVersion mv, final IMinecraftAssetService mp) { - Utils.requireNonNull(mv); + Objects.requireNonNull(mv); String assetsId = mv.getAssetsIndex().getId(); File assets = mp.getAssets(); HMCLog.log("Gathering asset index: " + assetsId); @@ -63,7 +63,7 @@ public class AssetsMojangLoader extends IAssetsHandler { } @Override - public void executeTask() throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Throwable { if (!areDependTasksSucceeded) throw new IllegalStateException("Failed to get asset index"); String result = FileUtils.read(f); @@ -72,7 +72,6 @@ public class AssetsMojangLoader extends IAssetsHandler { AssetsIndex o = C.GSON.fromJson(result, AssetsIndex.class); assetsDownloadURLs = new ArrayList<>(); assetsLocalNames = new ArrayList<>(); - ArrayList al = new ArrayList<>(); contents = new ArrayList<>(); HashSet loadedHashes = new HashSet<>(); int pgs = 0; @@ -88,7 +87,6 @@ public class AssetsMojangLoader extends IAssetsHandler { contents.add(c); assetsDownloadURLs.add(c.key); assetsLocalNames.add(new File(assets, "objects" + File.separator + c.key.replace("/", File.separator))); - al.add(e.getKey()); if (ppl != null) ppl.setProgress(this, ++pgs, o.getFileMap().size()); } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java index 7302fba16..69d71a730 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/IAssetsHandler.java @@ -32,8 +32,6 @@ import org.jackhuang.hellominecraft.util.tasks.Task; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; import org.jackhuang.hellominecraft.util.code.DigestUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; -import org.jackhuang.hellominecraft.util.NetUtils; -import org.jackhuang.hellominecraft.util.OverridableSwingWorker; import org.jackhuang.hellominecraft.util.tasks.TaskInfo; /** @@ -72,7 +70,7 @@ public abstract class IAssetsHandler { * * @param mv The version that needs assets * @param mp Asset Service - * @param x finished event + * @return just run it! */ public abstract Task getList(MinecraftVersion mv, IMinecraftAssetService mp); @@ -98,7 +96,7 @@ public abstract class IAssetsHandler { } @Override - public void executeTask() { + public void executeTask(boolean areDependTasksSucceeded) { if (assetsDownloadURLs == null || assetsLocalNames == null || contents == null) throw new IllegalStateException(C.i18n("assets.not_refreshed")); int max = assetsDownloadURLs.size(); @@ -116,7 +114,7 @@ public abstract class IAssetsHandler { try { if (location.exists()) { FileInputStream fis = new FileInputStream(location); - String sha = DigestUtils.sha1Hex(NetUtils.getBytesFromStream(fis)); + String sha = DigestUtils.sha1Hex(IOUtils.getBytesFromStream(fis)); IOUtils.closeQuietly(fis); if (contents.get(i).geteTag().equals(sha)) { ++hasDownloaded; diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java index 626dbe7cf..e511c4370 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java @@ -68,14 +68,14 @@ public class MinecraftAssetService extends IMinecraftAssetService { } @Override - public Task downloadMinecraftAssetsIndex(AssetIndexDownloadInfo assets) { + public Task downloadMinecraftAssetsIndex(AssetIndexDownloadInfo assetIndex) { File assetsLocation = getAssets(); if (!assetsLocation.exists() && !assetsLocation.mkdirs()) HMCLog.warn("Failed to make directories: " + assetsLocation); - File assetsIndex = new File(assetsLocation, "indexes/" + assets.getId() + ".json"); + File assetsIndex = getIndexFile(assetIndex.getId()); File renamed = null; if (assetsIndex.exists()) { - renamed = new File(assetsLocation, "indexes/" + assets.getId() + "-renamed.json"); + renamed = new File(assetsLocation, "indexes/" + assetIndex.getId() + "-renamed.json"); if (assetsIndex.renameTo(renamed)) HMCLog.warn("Failed to rename " + assetsIndex + " to " + renamed); } @@ -83,11 +83,11 @@ public class MinecraftAssetService extends IMinecraftAssetService { return new TaskInfo("Download Asset Index") { @Override public Collection getDependTasks() { - return Arrays.asList(new FileDownloadTask(assets.getUrl(service.getDownloadType()), IOUtils.tryGetCanonicalFile(assetsIndex), assets.sha1).setTag(assets.getId() + ".json")); + return Arrays.asList(new FileDownloadTask(assetIndex.getUrl(service.getDownloadType()), IOUtils.tryGetCanonicalFile(assetsIndex), assetIndex.sha1).setTag(assetIndex.getId() + ".json")); } @Override - public void executeTask() throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Throwable { if (areDependTasksSucceeded) { if (renamedFinal != null && !renamedFinal.delete()) HMCLog.warn("Failed to delete " + renamedFinal + ", maybe you should do it."); @@ -98,20 +98,20 @@ public class MinecraftAssetService extends IMinecraftAssetService { } @Override - public boolean downloadMinecraftAssetsIndexAsync(AssetIndexDownloadInfo assets) { - File assetsLocation = getAssets(); - if (!assetsLocation.exists() && !assetsLocation.mkdirs()) - HMCLog.warn("Failed to make directories: " + assetsLocation); - File assetsIndex = new File(assetsLocation, "indexes/" + assets.getId() + ".json"); + public boolean downloadMinecraftAssetsIndexAsync(AssetIndexDownloadInfo assetIndex) { + File assetsDir = getAssets(); + if (!assetsDir.mkdirs() && !assetsDir.isDirectory()) + HMCLog.warn("Failed to make directories: " + assetsDir); + File assetsIndex = getIndexFile(assetIndex.getId()); File renamed = null; if (assetsIndex.exists()) { - renamed = new File(assetsLocation, "indexes/" + assets.getId() + "-renamed.json"); + renamed = new File(assetsDir, "indexes/" + assetIndex.getId() + "-renamed.json"); if (assetsIndex.renameTo(renamed)) HMCLog.warn("Failed to rename " + assetsIndex + " to " + renamed); } if (TaskWindow.factory() - .append(new FileDownloadTask(assets.getUrl(service.getDownloadType()), IOUtils.tryGetCanonicalFile(assetsIndex), assets.sha1).setTag(assets.getId() + ".json")) - .create()) { + .append(new FileDownloadTask(assetIndex.getUrl(service.getDownloadType()), IOUtils.tryGetCanonicalFile(assetsIndex), assetIndex.sha1).setTag(assetIndex.getId() + ".json")) + .execute()) { if (renamed != null && !renamed.delete()) HMCLog.warn("Failed to delete " + renamed + ", maybe you should do it."); return true; @@ -125,30 +125,27 @@ public class MinecraftAssetService extends IMinecraftAssetService { public File getAssets() { return new File(service.baseDirectory(), "assets"); } + + private File getIndexFile(String assetVersion) { + return new File(getAssets(), "indexes/" + assetVersion + ".json"); + } @Override public File getAssetObject(String assetVersion, String name) throws IOException { - File assetsDir = getAssets(); - File indexDir = new File(assetsDir, "indexes"); - File objectsDir = new File(assetsDir, "objects"); - File indexFile = new File(indexDir, assetVersion + ".json"); try { - AssetsIndex index = (AssetsIndex) C.GSON.fromJson(FileUtils.read(indexFile, "UTF-8"), AssetsIndex.class); + AssetsIndex index = (AssetsIndex) C.GSON.fromJson(FileUtils.read(getIndexFile(assetVersion), "UTF-8"), AssetsIndex.class); String hash = ((AssetsObject) index.getFileMap().get(name)).getHash(); - return new File(objectsDir, hash.substring(0, 2) + "/" + hash); + return new File(getAssets(), "objects/" + hash.substring(0, 2) + "/" + hash); } catch (JsonSyntaxException e) { throw new IOException("Assets file format malformed.", e); } } private boolean checkAssetsExistance(AssetIndexDownloadInfo assetIndex) { - File assetsDir = getAssets(); - File indexDir = new File(assetsDir, "indexes"); - File objectDir = new File(assetsDir, "objects"); - File indexFile = new File(indexDir, assetIndex.getId() + ".json"); + File indexFile = getIndexFile(assetIndex.getId()); - if (!assetsDir.exists() || !indexFile.isFile()) + if (!getAssets().exists() || !indexFile.isFile()) return false; try { @@ -158,7 +155,7 @@ public class MinecraftAssetService extends IMinecraftAssetService { if (index == null) return false; for (Map.Entry entry : index.getFileMap().entrySet()) - if (!new File(new File(objectDir, ((AssetsObject) entry.getValue()).getHash().substring(0, 2)), ((AssetsObject) entry.getValue()).getHash()).exists()) + if (!new File(getAssets(), "objects/" + ((AssetsObject) entry.getValue()).getHash().substring(0, 2) + "/" + ((AssetsObject) entry.getValue()).getHash()).exists()) return false; return true; } catch (IOException | JsonSyntaxException e) { @@ -168,10 +165,8 @@ public class MinecraftAssetService extends IMinecraftAssetService { private File reconstructAssets(AssetIndexDownloadInfo assetIndex) { File assetsDir = getAssets(); - File indexDir = new File(assetsDir, "indexes"); - File objectDir = new File(assetsDir, "objects"); String assetVersion = assetIndex.getId(); - File indexFile = new File(indexDir, assetVersion + ".json"); + File indexFile = getIndexFile(assetVersion); File virtualRoot = new File(new File(assetsDir, "virtual"), assetVersion); if (!indexFile.isFile()) { @@ -191,7 +186,7 @@ public class MinecraftAssetService extends IMinecraftAssetService { int tot = index.getFileMap().entrySet().size(); for (Map.Entry entry : index.getFileMap().entrySet()) { File target = new File(virtualRoot, (String) entry.getKey()); - File original = new File(new File(objectDir, ((AssetsObject) entry.getValue()).getHash().substring(0, 2)), ((AssetsObject) entry.getValue()).getHash()); + File original = new File(assetsDir, "objects/" + ((AssetsObject) entry.getValue()).getHash().substring(0, 2) + "/" + ((AssetsObject) entry.getValue()).getHash()); if (original.exists()) { cnt++; if (!target.isFile()) @@ -211,8 +206,8 @@ public class MinecraftAssetService extends IMinecraftAssetService { public final BiFunction ASSET_PROVIDER_IMPL = (t, allow) -> { if (allow && !checkAssetsExistance(t.getAssetsIndex())) - if (MessageBox.Show(C.i18n("assets.no_assets"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) - TaskWindow.execute(downloadAssets(t)); + if (MessageBox.show(C.i18n("assets.no_assets"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) + TaskWindow.factory().execute(downloadAssets(t)); return reconstructAssets(t.getAssetsIndex()).getAbsolutePath(); }; } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/BestLogin.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/BestLogin.java deleted file mode 100755 index 0a5bc8c52..000000000 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/BestLogin.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Hello Minecraft! Launcher. - * Copyright (C) 2013 huangyuhui - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see {http://www.gnu.org/licenses/}. - */ -package org.jackhuang.hellominecraft.launcher.core.auth; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Socket; -import java.nio.charset.Charset; -import org.jackhuang.hellominecraft.util.code.DigestUtils; - -/** - * - * @author huangyuhui - */ -public final class BestLogin extends IAuthenticator { - - public BestLogin(String clientToken) { - super(clientToken); - } - - @Override - public UserProfileProvider login(LoginInfo info) throws AuthenticationException { - try { - String request = "bl:l:" + info.username + ":" + DigestUtils.sha1Hex(info.password); - - Socket socket = new Socket("auth.zhh0000zhh.com", 8); - OutputStream os = socket.getOutputStream(); - os.write(request.length()); - os.write(request.getBytes(Charset.forName("UTF-8"))); - - UserProfileProvider lr = new UserProfileProvider(); - - InputStream is = socket.getInputStream(); - int code = is.read(); - switch (code) { - case -1: - throw new AuthenticationException("internet error."); - case 200: - throw new AuthenticationException("server restarting."); - case 255: - throw new AuthenticationException("unknown error"); - case 3: - throw new AuthenticationException("unregistered."); - case 50: - throw new AuthenticationException("please update your launcher and act your account."); - case 2: - throw new AuthenticationException("wrong password."); - case 100: - throw new AuthenticationException("server reloading."); - case 0: - byte[] b = new byte[64]; - int x = is.read(b, 0, b.length); - if (x != -1) - throw new AuthenticationException("server response does not follow the protocol."); - String[] ss = new String(b, Charset.forName("UTF-8")).split(":"); - lr.setUserName(info.username); - lr.setUserId(ss[1]); - lr.setSession(ss[0]); - lr.setAccessToken(ss[0]); - break; - default: - break; - } - lr.setUserType("Legacy"); - return lr; - } catch (IOException t) { - throw new AuthenticationException(t); - } - } - - @Override - public String id() { - return "best"; - } - - @Override - public String getName() { - return "BestLogin"; - } - - @Override - public UserProfileProvider loginBySettings() { - return null; - } - - @Override - public void logOut() { - } - -} diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/OfflineAuthenticator.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/OfflineAuthenticator.java index 48cfb00ed..a10cc14d4 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/OfflineAuthenticator.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/OfflineAuthenticator.java @@ -56,8 +56,6 @@ public final class OfflineAuthenticator extends IAuthenticator { public UserProfileProvider login(LoginInfo info) throws AuthenticationException { if (StrUtils.isBlank(info.username)) throw new AuthenticationException(C.i18n("login.no_Player007")); - UserProfileProvider result = new UserProfileProvider(); - result.setUserName(info.username); String uuid = getUUIDFromUserName(info.username); if (uuidMap != null && uuidMap.containsKey(uuid)) uuid = uuidMap.get(info.username); @@ -66,11 +64,12 @@ public final class OfflineAuthenticator extends IAuthenticator { uuidMap = new HashMap<>(); uuidMap.put(info.username, uuid); } - result.setSession(uuid); - result.setUserId(uuid); - result.setAccessToken(uuid); - result.setUserType("Legacy"); - return result; + return new UserProfileProvider() + .setUserName(info.username) + .setSession(uuid) + .setUserId(uuid) + .setAccessToken(uuid) + .setUserType("Legacy"); } public static String getUUIDFromUserName(String str) { diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/SkinmeAuthenticator.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/SkinmeAuthenticator.java deleted file mode 100755 index f173bf932..000000000 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/SkinmeAuthenticator.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Hello Minecraft! Launcher. - * Copyright (C) 2013 huangyuhui - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see {http://www.gnu.org/licenses/}. - */ -package org.jackhuang.hellominecraft.launcher.core.auth; - -import org.jackhuang.hellominecraft.util.C; -import org.jackhuang.hellominecraft.util.code.DigestUtils; -import org.jackhuang.hellominecraft.util.NetUtils; -import org.jackhuang.hellominecraft.util.lang.SupportedLocales; -import org.jackhuang.hellominecraft.util.ui.SwingUtils; - -/** - * - * @author huangyuhui - */ -public final class SkinmeAuthenticator extends IAuthenticator { - - public SkinmeAuthenticator(String clientToken) { - super(clientToken); - } - - public String[] parseType1(String s) { - return s.split(","); - } - - public String getCharacter(String user, String hash, String $char) throws Exception { - return NetUtils.get( - "http://www.skinme.cc/api/login.php?user=" + user + "&hash=" + hash + (($char == null) ? "" : ("&char=" + $char))); - } - - @Override - public UserProfileProvider login(LoginInfo info) throws AuthenticationException { - UserProfileProvider req = new UserProfileProvider(); - if (info.username == null || !info.username.contains("@")) - throw new AuthenticationException(C.i18n("login.not_email")); - try { - String usr = info.username.toLowerCase(SupportedLocales.NOW_LOCALE.self); - String pwd = info.password; - - String str = DigestUtils.sha1Hex(usr); - String hashCode = DigestUtils.sha1Hex(DigestUtils.md5Hex(DigestUtils.sha1Hex(pwd) + pwd) + str); - String data = getCharacter(usr, hashCode, null); - String[] sl = data.split(":"); - if (null != sl[0]) - switch (sl[0]) { - case "0": - if (sl[1].contains("No Valid Character")) - sl[1] = C.i18n("login.no_valid_character"); - throw new AuthenticationException(sl[1]); - case "1": - String[] s = parseType1(sl[1]); - req.setUserName(s[0]); - req.setSession(s[1]); - req.setUserId(s[1]); - req.setAccessToken(s[1]); - break; - case "2": - String[] charators = sl[1].split(";"); - int len = charators.length; - String[] $char = new String[len]; - String[] user = new String[len]; - System.out.println(sl[1]); - for (int i = 0; i < len; i++) { - String[] charator = charators[i].split(","); - $char[i] = charator[0]; - user[i] = charator[1]; - } - int index = SwingUtils.select(user, C.i18n("login.choose_charactor")); - if (index == -1) - throw new AuthenticationException(C.i18n("message.cancelled")); - else { - String character = $char[index]; - sl = getCharacter(usr, hashCode, character).split(":"); - String[] s2 = parseType1(sl[1]); - req.setUserName(s2[0]); - req.setSession(s2[1]); - req.setUserId(s2[1]); - req.setAccessToken(s2[1]); - } - break; - } - - req.setUserType("Legacy"); - return req; - } catch (Exception e) { - throw new AuthenticationException(e); - } - } - - @Override - public String id() { - return "skinme"; - } - - @Override - public String getName() { - return "Skinme"; - } - - @Override - public UserProfileProvider loginBySettings() { - return null; - } - - @Override - public void logOut() { - - } -} diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/UserProfileProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/UserProfileProvider.java index 348bb02c2..9009e5e0c 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/UserProfileProvider.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/UserProfileProvider.java @@ -27,74 +27,83 @@ public final class UserProfileProvider { return username; } - public void setUserName(String username) { + public UserProfileProvider setUserName(String username) { this.username = username; + return this; } public String getUserId() { return userId; } - public void setUserId(String userId) { + public UserProfileProvider setUserId(String userId) { this.userId = userId; + return this; } public String getSession() { return session; } - public void setSession(String session) { + public UserProfileProvider setSession(String session) { this.session = session; + return this; } public String getAccessToken() { return accessToken; } - public void setAccessToken(String accessToken) { + public UserProfileProvider setAccessToken(String accessToken) { if (accessToken == null) accessToken = "0"; this.accessToken = accessToken; + return this; } public String getUserProperties() { return userProperties; } - public void setUserProperties(String userProperties) { + public UserProfileProvider setUserProperties(String userProperties) { this.userProperties = userProperties; + return this; } public String getUserPropertyMap() { return userPropertyMap; } - public void setUserPropertyMap(String userPropertyMap) { + public UserProfileProvider setUserPropertyMap(String userPropertyMap) { this.userPropertyMap = userPropertyMap; + return this; } public String getOtherInfo() { return otherInfo; } - public void setOtherInfo(String otherInfo) { + public UserProfileProvider setOtherInfo(String otherInfo) { this.otherInfo = otherInfo; + return this; } public String getClientIdentifier() { return clientIdentifier; } - public void setClientIdentifier(String clientIdentifier) { + public UserProfileProvider setClientIdentifier(String clientIdentifier) { this.clientIdentifier = clientIdentifier; + return this; } public String getUserType() { return userType; } - public void setUserType(String userType) { + public UserProfileProvider setUserType(String userType) { this.userType = userType; + return this; } private String username = ""; diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/YggdrasilAuthenticator.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/YggdrasilAuthenticator.java index b5db2b902..f9f861040 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/YggdrasilAuthenticator.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/auth/YggdrasilAuthenticator.java @@ -45,10 +45,9 @@ public final class YggdrasilAuthenticator extends IAuthenticator { @Override public UserProfileProvider login(LoginInfo info) throws AuthenticationException { UserProfileProvider result = new UserProfileProvider(); - result.setUserType("mojang"); if (ua.canPlayOnline()) { - result.setUserName(info.username); - result.setUserId(UUIDTypeAdapter.fromUUID(ua.getSelectedProfile().id)); + result.setUserName(info.username) + .setUserId(UUIDTypeAdapter.fromUUID(ua.getSelectedProfile().id)); } else { String usr = info.username; if (info.username == null || !info.username.contains("@")) @@ -80,14 +79,14 @@ public final class YggdrasilAuthenticator extends IAuthenticator { username = selectedProfile.name; if (username == null) throw new AuthenticationException("No player"); - result.setUserName(username); - result.setUserId(selectedProfile == null ? OfflineAuthenticator.getUUIDFromUserName(username) : UUIDTypeAdapter.fromUUID(selectedProfile.id)); + result.setUserName(username) + .setUserId(selectedProfile == null ? OfflineAuthenticator.getUUIDFromUserName(username) : UUIDTypeAdapter.fromUUID(selectedProfile.id)); } - result.setUserProperties(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.LegacySerializer()).create().toJson(ua.getUserProperties())); - result.setUserPropertyMap(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer()).create().toJson(ua.getUserProperties())); - result.setAccessToken(ua.getAuthenticatedToken()); - result.setSession(ua.getAuthenticatedToken()); - return result; + return result.setUserType("mojang") + .setUserProperties(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.LegacySerializer()).create().toJson(ua.getUserProperties())) + .setUserPropertyMap(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer()).create().toJson(ua.getUserProperties())) + .setAccessToken(ua.getAuthenticatedToken()) + .setSession(ua.getAuthenticatedToken()); } @Override diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java index 7c5e28592..b596c91d2 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadLibraryJob.java @@ -19,7 +19,6 @@ package org.jackhuang.hellominecraft.launcher.core.download; import java.io.File; import org.jackhuang.hellominecraft.launcher.core.version.IMinecraftLibrary; -import org.jackhuang.hellominecraft.util.system.IOUtils; /** * @@ -34,6 +33,21 @@ public class DownloadLibraryJob { public DownloadLibraryJob(IMinecraftLibrary n, String u, File p) { url = u; lib = n; - path = IOUtils.tryGetCanonicalFile(p); + path = p; + } + + public DownloadLibraryJob parse() { + String name = lib.name; + if (name.startsWith("net.minecraftforge:forge:")) { + String[] s = name.split(":"); + if (s.length == 3) + url = "http://files.minecraftforge.net/maven/net/minecraftforge/forge/" + s[2] + "/forge-" + s[2] + "-universal.jar"; + } + if (name.startsWith("com.mumfrey:liteloader:")) { + String[] s = name.split(":"); + if (s.length == 3 && s[2].length() > 3) + url = "http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + s[2].substring(0, s[2].length() - 3) + "/liteloader-" + s[2] + ".jar"; + } + return this; } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java index 1a7644ef7..61c1e3fb2 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java @@ -28,7 +28,6 @@ public enum DownloadType { Mojang("download.mojang", new MojangDownloadProvider()), BMCL("download.BMCL", new BMCLAPIDownloadProvider()), - //RapidData("download.rapid_data", new RapidDataDownloadProvider()), Curse("Curse CDN", new CurseDownloadProvider()); private final String name; diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java index 478ce10f5..034f2a0f7 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java @@ -75,7 +75,7 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { } @Override - public void executeTask() throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Throwable { File vpath = new File(service.baseDirectory(), "versions/" + id); if (!areDependTasksSucceeded) { FileUtils.deleteDirectory(vpath); @@ -131,7 +131,7 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { public Task downloadMinecraftVersionJson(String id) { return new TaskInfo("Download Minecraft Json") { @Override - public void executeTask() throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Throwable { List versions = MinecraftRemoteVersions.getRemoteVersions(service.getDownloadType()).justDo(); MinecraftRemoteVersion currentVersion = null; for (MinecraftRemoteVersion v : versions) diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/RapidDataDownloadProvider.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/RapidDataDownloadProvider.java deleted file mode 100755 index eb22ccf74..000000000 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/download/RapidDataDownloadProvider.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Hello Minecraft! Launcher. - * Copyright (C) 2013 huangyuhui - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see {http://www.gnu.org/licenses/}. - */ -package org.jackhuang.hellominecraft.launcher.core.download; - -/** - * - * @author huangyuhui - */ -public class RapidDataDownloadProvider extends MojangDownloadProvider { - - @Override - public String getAssetsDownloadURL() { - return "http://mirrors.rapiddata.org/resources.download.minecraft.net/"; - } - - @Override - public String getLibraryDownloadURL() { - return "http://mirrors.rapiddata.org/libraries.minecraft.net"; - } - - @Override - public String getIndexesDownloadURL() { - return "http://mirrors.rapiddata.org/Minecraft.Download/indexes/"; - } - - @Override - public String getVersionsDownloadURL() { - return "http://mirrors.rapiddata.org/Minecraft.Download/versions/"; - } - - @Override - public String getVersionsListDownloadURL() { - return "http://mirrors.rapiddata.org/Minecraft.Download/versions/versions.json"; - } - - @Override - public String getParsedDownloadURL(String str) { - return str == null ? null : str.replace("http://files.minecraftforge.net/maven", "http://mirrors.rapiddata.org/forge/maven"); - } - -} diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java index cca25c86c..634b43905 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java @@ -79,6 +79,8 @@ public final class MinecraftInstallerService extends IMinecraftInstallerService @Override public Task downloadLiteLoader(String installId, InstallerVersion v) { + if (!(v instanceof LiteLoaderVersionList.LiteLoaderInstallerVersion)) + throw new Error("Download lite loader but the version is not ll's."); File filepath = IOUtils.tryGetCanonicalFile("liteloader-universal.jar"); FileDownloadTask task = (FileDownloadTask) new FileDownloadTask(v.universal, filepath).setTag("LiteLoader"); return task.after(new LiteLoaderInstaller(service, installId, (LiteLoaderVersionList.LiteLoaderInstallerVersion) v).registerPreviousResult(task)) diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/PackMinecraftInstaller.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/PackMinecraftInstaller.java index 0730b1366..5b239300c 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/PackMinecraftInstaller.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/PackMinecraftInstaller.java @@ -21,7 +21,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import org.jackhuang.hellominecraft.util.logging.HMCLog; -import org.jackhuang.hellominecraft.util.system.Compressor; +import org.jackhuang.hellominecraft.util.system.CompressingUtils; import org.jackhuang.hellominecraft.util.system.FileUtils; /** @@ -43,8 +43,8 @@ public class PackMinecraftInstaller { if (!file.exists() && !file.mkdirs()) HMCLog.warn("Failed to make directories: " + file); for (String src1 : src) - Compressor.unzip(new File(src1), file); - Compressor.zip(file.getAbsolutePath(), dest.getAbsolutePath()); + CompressingUtils.unzip(new File(src1), file); + CompressingUtils.zip(file.getAbsolutePath(), dest.getAbsolutePath()); FileUtils.deleteDirectory(file); } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/ForgeInstaller.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/ForgeInstaller.java index 7d0d76e11..3c2bf240d 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/ForgeInstaller.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/ForgeInstaller.java @@ -50,16 +50,16 @@ public class ForgeInstaller extends Task { } @Override - public void executeTask() throws Exception { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { HMCLog.log("Extracting install profiles..."); try (ZipFile zipFile = new ZipFile(forgeInstaller)) { ZipEntry entry = zipFile.getEntry("install_profile.json"); - String content = NetUtils.getStreamContent(zipFile.getInputStream(entry)); + String content = IOUtils.getStreamContent(zipFile.getInputStream(entry)); InstallProfile profile = C.GSON.fromJson(content, InstallProfile.class); File from = new File(gameDir, "versions" + File.separator + profile.install.getMinecraft()); if (!from.exists()) - if (MessageBox.Show(C.i18n("install.no_version_if_intall")) == MessageBox.YES_OPTION) { + if (MessageBox.show(C.i18n("install.no_version_if_intall")) == MessageBox.YES_OPTION) { if (!mp.version().install(profile.install.getMinecraft(), null)) throw new IllegalStateException(C.i18n("install.no_version")); } else @@ -67,11 +67,14 @@ public class ForgeInstaller extends Task { File to = new File(gameDir, "versions" + File.separator + profile.install.getTarget()); if (!to.exists() && !to.mkdirs()) HMCLog.warn("Failed to make new version folder " + to); + HMCLog.log("Copying jar..." + profile.install.getMinecraft() + ".jar to " + profile.install.getTarget() + ".jar"); FileUtils.copyFile(new File(from, profile.install.getMinecraft() + ".jar"), new File(to, profile.install.getTarget() + ".jar")); + HMCLog.log("Creating new version profile..." + profile.install.getTarget() + ".json"); FileUtils.write(new File(to, profile.install.getTarget() + ".json"), C.GSON.toJson(profile.versionInfo)); + HMCLog.log("Extracting universal forge pack..." + profile.install.getFilePath()); entry = zipFile.getEntry(profile.install.getFilePath()); InputStream is = zipFile.getInputStream(entry); diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java index 984425ca1..fc7744ab5 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/forge/MinecraftForgeVersionList.java @@ -64,7 +64,7 @@ public class MinecraftForgeVersionList extends InstallerVersionList { } @Override - public void executeTask() throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Throwable { if (!areDependTasksSucceeded) return; String s = task.getResult(); diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderInstaller.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderInstaller.java index f41837570..255a7f775 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderInstaller.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderInstaller.java @@ -24,8 +24,8 @@ import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.util.tasks.Task; -import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResult; -import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResultRegistrar; +import org.jackhuang.hellominecraft.util.tasks.comm.PreviousResult; +import org.jackhuang.hellominecraft.util.tasks.comm.PreviousResultRegistrar; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftLibrary; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; @@ -53,7 +53,7 @@ public class LiteLoaderInstaller extends Task implements PreviousResultRegistrar } @Override - public void executeTask() throws Exception { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { if (installId == null) throw new IllegalStateException(C.i18n("install.no_version")); if (pre.size() != 1 && installer == null) diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderVersionList.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderVersionList.java index b8ab21c0b..34540d7e8 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderVersionList.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/liteloader/LiteLoaderVersionList.java @@ -24,6 +24,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftLibrary; import org.jackhuang.hellominecraft.launcher.core.install.InstallerVersionList; @@ -65,7 +66,7 @@ public class LiteLoaderVersionList extends InstallerVersionList { } @Override - public void executeTask() throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Throwable { if (!areDependTasksSucceeded) return; String s = task.getResult(); @@ -128,6 +129,28 @@ public class LiteLoaderVersionList extends InstallerVersionList { super(selfVersion, mcVersion); } + @Override + public int hashCode() { + int hash = 7; + hash = 13 * hash + Arrays.deepHashCode(this.libraries); + hash = 13 * hash + Objects.hashCode(this.tweakClass); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof LiteLoaderVersionList)) + return false; + if (this == obj) + return true; + final LiteLoaderInstallerVersion other = (LiteLoaderInstallerVersion) obj; + if (!Objects.equals(this.tweakClass, other.tweakClass)) + return false; + return Arrays.deepEquals(this.libraries, other.libraries); + } + + + } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/OptiFineInstaller.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/OptiFineInstaller.java index 4dd27d7a1..6c10f828e 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/OptiFineInstaller.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/OptiFineInstaller.java @@ -24,8 +24,8 @@ import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.launcher.core.install.InstallerVersionList; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.util.tasks.Task; -import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResult; -import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResultRegistrar; +import org.jackhuang.hellominecraft.util.tasks.comm.PreviousResult; +import org.jackhuang.hellominecraft.util.tasks.comm.PreviousResultRegistrar; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftLibrary; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; @@ -54,7 +54,7 @@ public class OptiFineInstaller extends Task implements PreviousResultRegistrar(); diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/vanilla/OptiFineDownloadFormatter.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/vanilla/OptiFineDownloadFormatter.java index 107bacafc..8673f2637 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/vanilla/OptiFineDownloadFormatter.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/install/optifine/vanilla/OptiFineDownloadFormatter.java @@ -21,7 +21,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.tasks.Task; -import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResult; +import org.jackhuang.hellominecraft.util.tasks.comm.PreviousResult; import org.jackhuang.hellominecraft.util.NetUtils; /** @@ -37,7 +37,7 @@ public class OptiFineDownloadFormatter extends Task implements PreviousResult 1024) - MessageBox.Show(C.i18n("launch.too_big_memory_alloc_64bit")); + MessageBox.show(C.i18n("launch.too_big_memory_alloc_64bit")); else { long a = OS.getTotalPhysicalMemory() / 1024 / 1024; HMCLog.log("System Physical Memory: " + a); if (a > 0 && a < mem) - MessageBox.Show(C.i18n("launch.too_big_memory_alloc_free_space_too_low", a)); + MessageBox.show(C.i18n("launch.too_big_memory_alloc_free_space_too_low", a)); } String a = "-Xmx" + options.getMaxMemory(); if (MathUtils.canParseInt(options.getMaxMemory())) diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/DefaultGameLauncher.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/DefaultGameLauncher.java index 8c0e006e5..7383fa2e8 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/DefaultGameLauncher.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/DefaultGameLauncher.java @@ -27,7 +27,7 @@ import org.jackhuang.hellominecraft.launcher.core.download.DownloadLibraryJob; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.util.tasks.ParallelTask; import org.jackhuang.hellominecraft.util.tasks.TaskWindow; -import org.jackhuang.hellominecraft.util.system.Compressor; +import org.jackhuang.hellominecraft.util.system.CompressingUtils; import org.jackhuang.hellominecraft.util.MessageBox; public class DefaultGameLauncher extends GameLauncher { @@ -51,8 +51,8 @@ public class DefaultGameLauncher extends GameLauncher { dw.append(parallelTask); boolean flag = true; if (t.size() > 0) - flag = dw.create(); - if (!flag && MessageBox.Show(C.i18n("launch.not_finished_downloading_libraries"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) + flag = dw.execute(); + if (!flag && MessageBox.show(C.i18n("launch.not_finished_downloading_libraries"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) flag = true; return flag; }); @@ -61,7 +61,7 @@ public class DefaultGameLauncher extends GameLauncher { return false; for (int i = 0; i < value.decompressFiles.length; i++) try { - Compressor.unzip(value.decompressFiles[i], value.getDecompressTo(), value.extractRules[i]::allow, false); + CompressingUtils.unzip(value.decompressFiles[i], value.getDecompressTo(), value.extractRules[i]::allow, false); } catch (IOException ex) { HMCLog.err("Unable to decompress library: " + value.decompressFiles[i] + " to " + value.getDecompressTo(), ex); } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/GameLauncher.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/GameLauncher.java index 14e1f0e66..69a95d4d7 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/GameLauncher.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/GameLauncher.java @@ -17,32 +17,32 @@ */ package org.jackhuang.hellominecraft.launcher.core.launch; -import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftLoader; -import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; import java.util.List; -import org.jackhuang.hellominecraft.util.C; -import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.api.PluginManager; import org.jackhuang.hellominecraft.launcher.core.GameException; +import org.jackhuang.hellominecraft.launcher.core.auth.AuthenticationException; import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator; import org.jackhuang.hellominecraft.launcher.core.auth.LoginInfo; import org.jackhuang.hellominecraft.launcher.core.auth.UserProfileProvider; -import org.jackhuang.hellominecraft.launcher.core.auth.AuthenticationException; import org.jackhuang.hellominecraft.launcher.core.download.DownloadLibraryJob; +import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftLoader; +import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.version.DecompressLibraryJob; +import org.jackhuang.hellominecraft.util.C; +import org.jackhuang.hellominecraft.util.EventHandler; +import org.jackhuang.hellominecraft.util.StrUtils; +import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.system.JavaProcess; -import org.jackhuang.hellominecraft.util.MessageBox; import org.jackhuang.hellominecraft.util.system.OS; -import org.jackhuang.hellominecraft.util.StrUtils; -import org.jackhuang.hellominecraft.util.EventHandler; import org.jackhuang.hellominecraft.util.system.ProcessManager; public class GameLauncher { @@ -117,7 +117,6 @@ public class GameLauncher { * Launch the game "as soon as possible". * * @param str launch command - * * @throws IOException failed creating process */ public void launch(List str) throws IOException { @@ -138,7 +137,7 @@ public class GameLauncher { if (options.getLaunchVersion() == null || service.baseDirectory() == null) throw new Error("Fucking bug!"); builder.redirectErrorStream(true).directory(service.version().getRunDirectory(options.getLaunchVersion())) - .environment().put("APPDATA", service.baseDirectory().getAbsolutePath()); + .environment().put("APPDATA", service.baseDirectory().getAbsolutePath()); JavaProcess jp = new JavaProcess(str, builder.start(), PROCESS_MANAGER); HMCLog.log("Have started the process"); launchEvent.execute(jp); @@ -148,7 +147,7 @@ public class GameLauncher { * According to the name... * * @param launcherName the name of launch bat/sh - * @param str launch command + * @param str launch command * * @return launcher location * @@ -162,33 +161,33 @@ public class GameLauncher { if (!f.exists() && !f.createNewFile()) HMCLog.warn("Failed to create " + f); BufferedWriter writer; - try { - writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), System.getProperty("sun.jnu.encoding", "UTF-8"))); - } catch (UnsupportedEncodingException ex) { - HMCLog.warn("Failed to create writer, will try again.", ex); - writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f))); - } - if (isWin) { - writer.write("@echo off"); - writer.newLine(); - String appdata = IOUtils.tryGetCanonicalFilePath(service.baseDirectory()); - if (appdata != null) { - writer.write("set appdata=" + appdata); + try (FileOutputStream fos = new FileOutputStream(f)) { + try { + writer = new BufferedWriter(new OutputStreamWriter(fos, System.getProperty("sun.jnu.encoding", "UTF-8"))); + } catch (UnsupportedEncodingException ex) { + HMCLog.warn("Failed to create writer, will try again.", ex); + writer = new BufferedWriter(new OutputStreamWriter(fos, Charset.defaultCharset())); + } + if (isWin) { + writer.write("@echo off"); writer.newLine(); - writer.write("cd /D %appdata%"); + String appdata = IOUtils.tryGetCanonicalFilePath(service.baseDirectory()); + if (appdata != null) { + writer.write("set appdata=" + appdata); + writer.newLine(); + writer.write("cd /D %appdata%"); + writer.newLine(); + } + } + if (StrUtils.isNotBlank(options.getPrecalledCommand())) { + writer.write(options.getPrecalledCommand()); writer.newLine(); } + writer.write(StrUtils.makeCommand(str)); + writer.close(); } - if (StrUtils.isNotBlank(options.getPrecalledCommand())) { - writer.write(options.getPrecalledCommand()); - writer.newLine(); - } - writer.write(StrUtils.makeCommand(str)); - writer.close(); - if (!f.setExecutable(true)) { - HMCLog.warn("Failed to give launcher permission."); - MessageBox.Show(C.i18n("launch.failed_sh_permission")); - } + if (!f.setExecutable(true)) + throw new IOException(C.i18n("launch.failed_sh_permission")); HMCLog.log("Command: " + StrUtils.parseParams("", str, " ")); return f; diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java index 3cd1cfbb9..6c82eef8e 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/LibraryDownloadTask.java @@ -17,8 +17,6 @@ */ package org.jackhuang.hellominecraft.launcher.core.launch; -import java.io.File; -import java.net.URL; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.launcher.core.download.DownloadLibraryJob; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; @@ -32,32 +30,10 @@ public class LibraryDownloadTask extends FileDownloadTask { DownloadLibraryJob job; public LibraryDownloadTask(DownloadLibraryJob job) { - super(); + super(job.parse().url, job.path); this.job = job; } - @Override - public void executeTask() throws Throwable { - String name = job.lib.name; - if (name.startsWith("net.minecraftforge:forge:")) { - String[] s = name.split(":"); - if (s.length == 3) - job.url = "http://files.minecraftforge.net/maven/net/minecraftforge/forge/" + s[2] + "/forge-" + s[2] + "-universal.jar"; - } - if (name.startsWith("com.mumfrey:liteloader:")) { - String[] s = name.split(":"); - if (s.length == 3 && s[2].length() > 3) - job.url = "http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + s[2].substring(0, s[2].length() - 3) + "/liteloader-" + s[2] + ".jar"; - } - download(new URL(job.url), job.path); - } - - void download(URL url, File filePath) throws Throwable { - this.url = url; - this.filePath = filePath; - super.executeTask(); - } - @Override public String getInfo() { return C.i18n("download") + ": " + job.lib.name; diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/MinecraftLoader.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/MinecraftLoader.java index 178cd07bd..994c19fda 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/MinecraftLoader.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/launch/MinecraftLoader.java @@ -21,6 +21,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.system.IOUtils; @@ -48,7 +49,7 @@ public class MinecraftLoader extends AbstractMinecraftLoader { ArrayList opt = new ArrayList<>(); for (MinecraftLibrary l : version.libraries) if (l.allow() && !l.isRequiredToUnzip()) { - if (l.name.toLowerCase().contains("optifine")) { + if (l.name.toLowerCase(Locale.US).contains("optifine")) { opt.add(l); continue; } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java index f508b2acc..20e6628b6 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModInfo.java @@ -17,13 +17,15 @@ */ package org.jackhuang.hellominecraft.launcher.core.mod; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import com.google.gson.annotations.SerializedName; import com.google.gson.reflect.TypeToken; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; -import java.lang.reflect.Type; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -60,6 +62,8 @@ public class ModInfo implements Comparable { public String credits; @SerializedName("authorList") public String[] authorList; + @SerializedName("authors") + public String[] authors; public boolean isActive() { return !location.getName().endsWith(".disabled"); @@ -87,6 +91,8 @@ public class ModInfo implements Comparable { public String getAuthor() { if (authorList != null && authorList.length > 0) return StrUtils.parseParams("", authorList, ", "); + else if (authors != null && authors.length > 0) + return StrUtils.parseParams("", authors, ", "); else if (StrUtils.isNotBlank(author)) return author; else @@ -123,17 +129,30 @@ public class ModInfo implements Comparable { return name.endsWith(".zip") || name.endsWith(".jar") || name.endsWith("litemod"); } - private static final Type TYPE = new TypeToken>() { - }.getType(); - - private static ModInfo getForgeModInfo(File f, ZipFile jar, ZipEntry entry) throws IOException { + private static ModInfo getForgeModInfo(File f, ZipFile jar, ZipEntry entry) throws IOException, JsonSyntaxException { ModInfo i = new ModInfo(); i.location = f; - List m = C.GSON.fromJson(new InputStreamReader(jar.getInputStream(entry), "UTF-8"), TYPE); + + InputStreamReader streamReader = new InputStreamReader(jar.getInputStream(entry), "UTF-8"); + + JsonParser parser = new JsonParser(); + JsonElement element = parser.parse(streamReader); + List m = null; + if (element.isJsonArray()) + m = C.GSON.fromJson(element, new TypeToken>() { + }.getType()); + else if (element.isJsonObject()) { + JsonObject modInfo = element.getAsJsonObject(); + if (modInfo.has("modList") && modInfo.get("modList").isJsonArray()) + m = C.GSON.fromJson(modInfo.get("modList"), new TypeToken>() { + }.getType()); + } + if (m != null && m.size() > 0) { i = m.get(0); i.location = f; } + return i; } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java index cdf103558..ec5c5c98e 100644 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java @@ -41,7 +41,7 @@ import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.util.func.BiFunction; import org.jackhuang.hellominecraft.util.func.CallbackIO; -import org.jackhuang.hellominecraft.util.system.Compressor; +import org.jackhuang.hellominecraft.util.system.CompressingUtils; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.system.ZipEngine; import org.jackhuang.hellominecraft.util.tasks.Task; @@ -86,7 +86,7 @@ public final class ModpackManager { Collection c = new ArrayList<>(); @Override - public void executeTask() throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Throwable { String id = idFUCK; String description = C.i18n("modpack.task.install.will"); @@ -150,7 +150,7 @@ public final class ModpackManager { try { final AtomicInteger b = new AtomicInteger(0); HMCLog.log("Decompressing modpack"); - Compressor.unzip(input, versions, t -> { + CompressingUtils.unzip(input, versions, t -> { if (t.equals("minecraft/pack.json")) b.incrementAndGet(); return true; @@ -186,8 +186,8 @@ public final class ModpackManager { } } finally { FileUtils.deleteDirectoryQuietly(oldFile); - if (newFile != null) - newFile.renameTo(oldFile); + if (newFile != null && !newFile.renameTo(oldFile)) + HMCLog.warn("Failed to restore version minecraft"); } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java index 5c6baede3..53aed81e4 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftLibrary.java @@ -79,12 +79,12 @@ public class MinecraftLibrary extends IMinecraftLibrary { private String getNative() { switch (OS.os()) { - case WINDOWS: - return formatArch(natives.windows); - case OSX: - return formatArch(natives.osx); - default: - return formatArch(natives.linux); + case WINDOWS: + return formatArch(natives.windows); + case OSX: + return formatArch(natives.osx); + default: + return formatArch(natives.linux); } } @@ -116,6 +116,7 @@ public class MinecraftLibrary extends IMinecraftLibrary { return extract == null ? new Extract() : extract; } + @Override public LibraryDownloadInfo getDownloadInfo() { if (downloads == null) downloads = new LibrariesDownloadInfo(); @@ -125,12 +126,15 @@ public class MinecraftLibrary extends IMinecraftLibrary { downloads.classifiers = new HashMap<>(); if (!downloads.classifiers.containsKey(getNative())) downloads.classifiers.put(getNative(), info = new LibraryDownloadInfo()); - else + else { info = downloads.classifiers.get(getNative()); - } else if (downloads.artifact == null) - downloads.artifact = info = new LibraryDownloadInfo(); - else + if (info == null) info = new LibraryDownloadInfo(); + } + } else { + if (downloads.artifact == null) + downloads.artifact = new LibraryDownloadInfo(); info = downloads.artifact; + } if (StrUtils.isBlank(info.path)) { info.path = formatName(); if (info.path == null) diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersion.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersion.java index fb781f84f..c5ed69445 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersion.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersion.java @@ -24,6 +24,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.launcher.core.GameException; @@ -176,9 +177,27 @@ public class MinecraftVersion implements Cloneable, Comparable return id.compareTo(o.id); } + @Override + public int hashCode() { + int hash = 7; + hash = 53 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + return Objects.equals(this.id, ((MinecraftVersion) obj).id); + } + + + public AssetIndexDownloadInfo getAssetsIndex() { if (assetIndex == null) - assetIndex = new AssetIndexDownloadInfo((String) Utils.firstNonNull(assets, AssetsIndex.DEFAULT_ASSET_NAME)); + assetIndex = new AssetIndexDownloadInfo(assets == null ? AssetsIndex.DEFAULT_ASSET_NAME : assets); return assetIndex; } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java index d4090e91e..35c26cc6b 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java @@ -100,12 +100,12 @@ public class MinecraftVersionManager extends IMinecraftProvider { } if (ask) { HMCLog.warn("Found not matched filenames version: " + id + ", json: " + jsons[0].getName()); - if (MessageBox.Show(String.format(C.i18n("launcher.versions_json_not_matched"), id, jsons[0].getName()), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) + if (MessageBox.show(String.format(C.i18n("launcher.versions_json_not_matched"), id, jsons[0].getName()), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) if (!jsons[0].renameTo(new File(jsons[0].getParent(), id + ".json"))) HMCLog.warn("Failed to rename version json " + jsons[0]); } if (!jsonFile.exists()) { - if (MessageBox.Show(C.i18n("launcher.versions_json_not_matched_cannot_auto_completion", id), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) + if (MessageBox.show(C.i18n("launcher.versions_json_not_matched_cannot_auto_completion", id), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) FileUtils.deleteDirectoryQuietly(dir); continue; } @@ -114,9 +114,9 @@ public class MinecraftVersionManager extends IMinecraftProvider { mcVersion = C.GSON.fromJson(FileUtils.read(jsonFile), MinecraftVersion.class); if (mcVersion == null) throw new GameException("Wrong json format, got null."); - } catch (Exception e) { + } catch (JsonSyntaxException | IOException | GameException e) { HMCLog.warn("Found wrong format json, try to fix it.", e); - if (MessageBox.Show(C.i18n("launcher.versions_json_not_formatted", id), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) { + if (MessageBox.show(C.i18n("launcher.versions_json_not_formatted", id), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) { service.download().downloadMinecraftVersionJson(id); try { mcVersion = C.GSON.fromJson(FileUtils.read(jsonFile), MinecraftVersion.class); @@ -194,7 +194,7 @@ public class MinecraftVersionManager extends IMinecraftProvider { @Override public boolean install(String id, Consumer callback) { - if (!TaskWindow.factory().append(service.download().downloadMinecraft(id)).create()) + if (!TaskWindow.factory().append(service.download().downloadMinecraft(id)).execute()) return false; if (callback != null) { File mvt = new File(versionRoot(id), id + ".json"); @@ -278,6 +278,5 @@ public class MinecraftVersionManager extends IMinecraftProvider { @Override public void initializeMiencraft() { - } } diff --git a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/Rules.java b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/Rules.java index 1831a0536..9b8e37fc7 100755 --- a/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/Rules.java +++ b/HMCL/src/core/java/org/jackhuang/hellominecraft/launcher/core/version/Rules.java @@ -40,7 +40,7 @@ public class Rules { } public String action() { - return os == null || os != null && os.isCurrentOS() ? action : null; + return os == null || os.isCurrentOS() ? action : null; } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java index a4e8d2689..7dffa763a 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -33,6 +33,7 @@ import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.X509TrustManager; import javax.swing.ImageIcon; +import javax.swing.RepaintManager; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import org.jackhuang.hellominecraft.util.logging.HMCLog; @@ -46,6 +47,7 @@ import org.jackhuang.hellominecraft.util.ui.LogWindow; import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.util.upgrade.IUpgrader; import org.jackhuang.hellominecraft.launcher.ui.MainFrame; +import org.jackhuang.hellominecraft.launcher.ui.MyRepaintManager; import org.jackhuang.hellominecraft.launcher.util.DefaultPlugin; import org.jackhuang.hellominecraft.lookandfeel.HelloMinecraftLookAndFeel; import org.jackhuang.hellominecraft.util.MathUtils; @@ -153,6 +155,7 @@ public final class Main implements Runnable { try { LOOK_AND_FEEL = new HelloMinecraftLookAndFeel(Settings.getInstance().getTheme().settings); UIManager.setLookAndFeel(LOOK_AND_FEEL); + RepaintManager.setCurrentManager(new MyRepaintManager()); } catch (ParseException | UnsupportedLookAndFeelException ex) { HMCLog.warn("Failed to set look and feel...", ex); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java index 1657642f9..3c1f0057b 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java @@ -55,8 +55,6 @@ public final class Config implements Cloneable { private boolean enableShadow; @SerializedName("decorated") private boolean decorated; - @SerializedName("enableAnimation") - private boolean enableAnimation; @SerializedName("theme") private int theme; @SerializedName("java") @@ -131,15 +129,6 @@ public final class Config implements Cloneable { Settings.save(); } - public boolean isEnableAnimation() { - return enableAnimation; - } - - public void setEnableAnimation(boolean enableAnimation) { - this.enableAnimation = enableAnimation; - Settings.save(); - } - public String getClientToken() { return clientToken; } @@ -195,7 +184,6 @@ public final class Config implements Cloneable { clientToken = UUID.randomUUID().toString(); logintype = downloadtype = 0; enableShadow = false; - enableAnimation = true; theme = 4; decorated = OS.os() == OS.LINUX; auth = new HashMap<>(); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java index 2dcdbaccf..e3f9c06fb 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java @@ -151,7 +151,7 @@ public final class Settings { public static boolean delProfile(String ver) { if (DEFAULT_PROFILE.equals(ver)) { - MessageBox.Show(C.i18n("settings.cannot_remove_default_config")); + MessageBox.show(C.i18n("settings.cannot_remove_default_config")); return false; } boolean notify = false; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/VersionSetting.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/VersionSetting.java index e9c69b195..879bc0d45 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/VersionSetting.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/VersionSetting.java @@ -27,10 +27,10 @@ import org.jackhuang.hellominecraft.launcher.core.version.GameDirType; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.EventHandler; import org.jackhuang.hellominecraft.util.StrUtils; -import org.jackhuang.hellominecraft.util.Utils; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.system.Java; import org.jackhuang.hellominecraft.util.system.JdkVersion; +import org.jackhuang.hellominecraft.util.system.OS; /** * @@ -179,7 +179,7 @@ public class VersionSetting { public String getMaxMemory() { if (StrUtils.isBlank(maxMemory)) - return String.valueOf(Utils.getSuggestedMemorySize()); + return String.valueOf(OS.getSuggestedMemorySize()); return maxMemory; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/AnimatedPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/AnimatedPanel.java deleted file mode 100755 index 2cf92cfca..000000000 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/AnimatedPanel.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Hello Minecraft! Launcher. - * Copyright (C) 2013 huangyuhui - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see {http://www.gnu.org/licenses/}. - */ -package org.jackhuang.hellominecraft.launcher.ui; - -import java.awt.AlphaComposite; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.image.BufferedImage; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; -import javax.swing.Timer; -import org.jackhuang.hellominecraft.launcher.setting.Settings; - -/** - * - * @author huangyuhui - */ -public class AnimatedPanel extends JPanel implements Selectable { - - private static final int ANIMATION_LENGTH = 10; - - public AnimatedPanel() { - timer = new Timer(1, (e) -> { - SwingUtilities.invokeLater(() -> { - AnimatedPanel.this.repaint(); - offsetX += 0.15; - if (offsetX >= ANIMATION_LENGTH) { - timer.stop(); - AnimatedPanel.this.repaint(); - } - }); - }); - } - - double offsetX = ANIMATION_LENGTH; - - Timer timer; - - boolean animationEnabled = true; - - public void animate() { - if (Settings.getInstance().isEnableAnimation() && animationEnabled) { - offsetX = 0; - timer.start(); - } - } - - @Override - public void paint(Graphics g) { - if (!(g instanceof Graphics2D)) { - super.paint(g); - return; - } - double pgs = 1 - Math.sin(Math.PI / 2 / ANIMATION_LENGTH * offsetX); - if (Math.abs(ANIMATION_LENGTH - offsetX) < 0.1) { - super.paint(g); - return; - } - if (pgs > 1) - pgs = 1; - if (pgs < 0) - pgs = 0; - Graphics2D gg = (Graphics2D) g; - int width = this.getWidth(); - int height = this.getHeight(); - if (isOpaque()) { - g.setColor(getBackground()); - g.fillRect(0, 0, width, height); - } - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics2D g2d = image.createGraphics(); - g2d.translate((int) (pgs * 50), 0); - super.paint(g2d); - g2d.dispose(); - gg.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, (float) (1 - pgs))); - g.drawImage(image, 0, 0, this); - } - - boolean selected = false; - - @Override - public boolean isSelected() { - return selected; - } - - @Override - public void onSelect() { - if (!selected) - animate(); - selected = true; - } - - @Override - public void onLeave() { - selected = false; - } - - boolean created = false; - - @Override - public void onCreate() { - created = true; - } - - @Override - public boolean isCreated() { - return created; - } -} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.java index f76598cc6..4c0e18790 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.java @@ -18,7 +18,6 @@ package org.jackhuang.hellominecraft.launcher.ui; import javax.swing.table.DefaultTableModel; -import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; import org.jackhuang.hellominecraft.launcher.core.download.MinecraftRemoteVersions; import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.util.C; @@ -31,7 +30,7 @@ import org.jackhuang.hellominecraft.util.ui.SwingUtils; * * @author huangyuhui */ -public class GameDownloadPanel extends AnimatedPanel { +public class GameDownloadPanel extends Page { GameSettingsPanel gsp; @@ -116,11 +115,11 @@ public class GameDownloadPanel extends AnimatedPanel { void downloadMinecraft() { if (lstDownloads.getSelectedRow() < 0) { - MessageBox.Show(C.i18n("gamedownload.not_refreshed")); + MessageBox.show(C.i18n("gamedownload.not_refreshed")); return; } String id = (String) lstDownloads.getModel().getValueAt(lstDownloads.getSelectedRow(), 0); - TaskWindow.execute(Settings.getLastProfile().service().download().downloadMinecraft(id)); + TaskWindow.factory().execute(Settings.getLastProfile().service().download().downloadMinecraft(id)); } // Variables declaration - do not modify//GEN-BEGIN:variables diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form index 84a894241..a55e8e82f 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form @@ -85,9 +85,6 @@ - - - @@ -372,9 +369,6 @@ - - - @@ -566,9 +560,6 @@ - - - @@ -694,9 +685,6 @@ - - - @@ -788,7 +776,7 @@ - + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java index dcd00e1a6..c6b154f38 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java @@ -17,9 +17,9 @@ */ package org.jackhuang.hellominecraft.launcher.ui; -import java.awt.Color; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; @@ -34,7 +34,6 @@ import java.io.File; import java.io.IOException; import java.util.List; import javax.swing.DefaultComboBoxModel; -import javax.swing.JFileChooser; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; @@ -64,13 +63,15 @@ import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.ui.SwingUtils; import org.jackhuang.hellominecraft.util.system.Java; import org.jackhuang.hellominecraft.util.tasks.TaskWindow; +import org.jackhuang.hellominecraft.util.ui.GraphicsUtils; +import org.jackhuang.hellominecraft.util.ui.JSystemFileChooser; import org.jackhuang.hellominecraft.util.ui.LogWindow; /** * * @author huangyuhui */ -public final class GameSettingsPanel extends AnimatedPanel implements DropTargetListener { +public final class GameSettingsPanel extends RepaintPage implements DropTargetListener { boolean isLoading = false; public MinecraftVersionRequest minecraftVersion; @@ -78,19 +79,18 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget final InstallerPanel installerPanels[] = new InstallerPanel[InstallerType.values().length]; - /** - * Creates new form GameSettingsPanel - */ public GameSettingsPanel(MainFrame mf) { mf.actions.put("showGameDownloads", () -> { - MainFrame.INSTANCE.selectTab("game"); - showGameDownloads(); - }); + MainFrame.INSTANCE.selectTab("game"); + showGameDownloads(); + }); + + setRepainter(this); } void initGui() { initComponents(); - setBackground(Color.white); + setBackground(GraphicsUtils.getWebColorWithAlpha("FFFFFF7F")); setOpaque(true); for (int i = 0; i < InstallerType.values().length; i++) @@ -111,6 +111,13 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget Settings.profileChangedEvent.register(onSelectedProfilesChanged); dropTarget = new DropTarget(lstExternalMods, DnDConstants.ACTION_COPY_OR_MOVE, this); + + /*AeroPage pnlAero = new AeroPage(); + pnlAero.setBounds(0, 0, 800, 480); + pnlAero.setLayout(null); + pnlAero.addAeroObject(jPanel1); + pnlAero.setBackgroundImage(MainFrame.INSTANCE.background.getImage()); + add(jPanel1);*/ } void initExplorationMenu() { @@ -163,7 +170,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget ppmManage.add(itm); itm = new JMenuItem(C.i18n("versions.manage.remove")); itm.addActionListener((e) -> { - if (mcVersion != null && MessageBox.Show(C.i18n("versions.manage.remove.confirm") + mcVersion, MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) + if (mcVersion != null && MessageBox.show(C.i18n("versions.manage.remove.confirm") + mcVersion, MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) if (Settings.getLastProfile().service().version().removeVersionFromDisk(mcVersion)) refreshVersions(); }); @@ -231,7 +238,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget public void stateChanged(ChangeEvent e) { if (tabVersionEdit.getSelectedComponent() == pnlAutoInstall && !b) { b = true; - installerPanels[0].refreshVersions(); + TaskWindow.factory().execute(installerPanels[0].refreshVersionsTask()); } } }); @@ -255,7 +262,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget tabVersionEdit = new NewTabPane(); ((NewTabPane)tabVersionEdit).initializing = true; - pnlSettings = new AnimatedPanel(); + pnlSettings = new javax.swing.JPanel(); lblGameDir = new javax.swing.JLabel(); txtGameDir = new javax.swing.JTextField(); lblDimension = new javax.swing.JLabel(); @@ -277,7 +284,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget cboJava = new javax.swing.JComboBox(); btnChoosingGameDir = new javax.swing.JButton(); btnCleanGame = new javax.swing.JButton(); - pnlAdvancedSettings = new AnimatedPanel(); + pnlAdvancedSettings = new javax.swing.JPanel(); lblJavaArgs = new javax.swing.JLabel(); txtJavaArgs = new javax.swing.JTextField(); txtMinecraftArgs = new javax.swing.JTextField(); @@ -292,14 +299,14 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget lblPrecalledCommand1 = new javax.swing.JLabel(); txtWrapperLauncher = new javax.swing.JTextField(); chkDontCheckGame = new javax.swing.JCheckBox(); - pnlModManagement = new AnimatedPanel(); + pnlModManagement = new javax.swing.JPanel(); pnlModManagementContent = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); lstExternalMods = new javax.swing.JTable(); btnAddMod = new javax.swing.JButton(); btnRemoveMod = new javax.swing.JButton(); lblModInfo = new javax.swing.JLabel(); - pnlAutoInstall = new AnimatedPanel(); + pnlAutoInstall = new javax.swing.JPanel(); tabInstallers = new NewTabPane(); pnlTop = new javax.swing.JPanel(); pnlSelection = new javax.swing.JPanel(); @@ -599,9 +606,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addGroup(pnlAdvancedSettingsLayout.createSequentialGroup() .addGroup(pnlAdvancedSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtWrapperLauncher) - .addGroup(pnlAdvancedSettingsLayout.createSequentialGroup() - .addComponent(lblPrecalledCommand1) - .addGap(0, 0, Short.MAX_VALUE)) .addGroup(pnlAdvancedSettingsLayout.createSequentialGroup() .addContainerGap() .addComponent(chkNoJVMArgs) @@ -609,6 +613,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addComponent(chkDontCheckGame)) .addGroup(pnlAdvancedSettingsLayout.createSequentialGroup() .addGroup(pnlAdvancedSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lblPrecalledCommand1) .addComponent(lblPrecalledCommand) .addComponent(lblServerIP)) .addGap(0, 0, Short.MAX_VALUE))) @@ -780,7 +785,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addGroup(pnlSelectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cboVersions, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblVersions)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap(11, Short.MAX_VALUE)) ); btnModify.setText(C.i18n("settings.manage")); // NOI18N @@ -946,22 +951,58 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget ((NewTabPane)tabVersionEdit).initializing = false; }// //GEN-END:initComponents - // - private void cboProfilesItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboProfilesItemStateChanged - if (!isLoading) - Settings.getInstance().setLast((String) cboProfiles.getSelectedItem()); - }//GEN-LAST:event_cboProfilesItemStateChanged + + private void btnIncludeMinecraftActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnIncludeMinecraftActionPerformed + JSystemFileChooser fc = new JSystemFileChooser(new File(".")); + fc.setFileSelectionMode(JSystemFileChooser.DIRECTORIES_ONLY); + if (fc.showOpenDialog(this) == JSystemFileChooser.APPROVE_OPTION) { + File newGameDir = fc.getSelectedFile(); + String name = JOptionPane.showInputDialog(C.i18n("setupwindow.give_a_name")); + if (StrUtils.isBlank(name)) { + MessageBox.show(C.i18n("setupwindow.no_empty_name")); + return; + } + Settings.putProfile(new Profile(name).setGameDir(newGameDir.getAbsolutePath())); + MessageBox.show(C.i18n("setupwindow.find_in_configurations")); + loadProfiles(); + } + }//GEN-LAST:event_btnIncludeMinecraftActionPerformed + + private void btnMakeLaunchScriptActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMakeLaunchScriptActionPerformed + MainFrame.INSTANCE.daemon.makeLaunchScript(Settings.getLastProfile()); + }//GEN-LAST:event_btnMakeLaunchScriptActionPerformed + + private void btnShowLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnShowLogActionPerformed + LogWindow.INSTANCE.setVisible(true); + }//GEN-LAST:event_btnShowLogActionPerformed + + private void btnTestGameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnTestGameActionPerformed + LogWindow.INSTANCE.setVisible(true); + MainFrame.INSTANCE.daemon.runGame(Settings.getLastProfile()); + }//GEN-LAST:event_btnTestGameActionPerformed + + private void btnExploreMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnExploreMouseClicked + ppmExplore.show(evt.getComponent(), evt.getPoint().x, evt.getPoint().y); + }//GEN-LAST:event_btnExploreMouseClicked + + private void btnRemoveProfileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveProfileActionPerformed + if (MessageBox.show(C.i18n("ui.message.sure_remove", Settings.getLastProfile().getName()), MessageBox.YES_NO_OPTION) == MessageBox.NO_OPTION) + return; + Settings.delProfile(Settings.getLastProfile()); + }//GEN-LAST:event_btnRemoveProfileActionPerformed private void btnNewProfileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewProfileActionPerformed new NewProfileWindow(null).setVisible(true); loadProfiles(); }//GEN-LAST:event_btnNewProfileActionPerformed - private void btnRemoveProfileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveProfileActionPerformed - if (MessageBox.Show(C.i18n("ui.message.sure_remove", Settings.getLastProfile().getName()), MessageBox.YES_NO_OPTION) == MessageBox.NO_OPTION) - return; - Settings.delProfile(Settings.getLastProfile()); - }//GEN-LAST:event_btnRemoveProfileActionPerformed + private void btnRefreshVersionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshVersionsActionPerformed + refreshVersions(); + }//GEN-LAST:event_btnRefreshVersionsActionPerformed + + private void btnModifyMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnModifyMouseClicked + ppmManage.show(evt.getComponent(), evt.getPoint().x, evt.getPoint().y); + }//GEN-LAST:event_btnModifyMouseClicked private void cboVersionsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboVersionsItemStateChanged if (isLoading || evt.getStateChange() != ItemEvent.SELECTED || cboVersions.getSelectedIndex() < 0 || StrUtils.isBlank((String) cboVersions.getSelectedItem())) @@ -969,50 +1010,98 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget Settings.getLastProfile().setSelectedMinecraftVersion((String) cboVersions.getSelectedItem()); }//GEN-LAST:event_cboVersionsItemStateChanged - private void btnRefreshVersionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshVersionsActionPerformed - refreshVersions(); - }//GEN-LAST:event_btnRefreshVersionsActionPerformed + // + private void cboProfilesItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboProfilesItemStateChanged + if (!isLoading) + Settings.getInstance().setLast((String) cboProfiles.getSelectedItem()); + }//GEN-LAST:event_cboProfilesItemStateChanged - private void btnExploreMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnExploreMouseClicked - ppmExplore.show(evt.getComponent(), evt.getPoint().x, evt.getPoint().y); - }//GEN-LAST:event_btnExploreMouseClicked + private void lblModInfoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblModInfoMouseClicked + int idx = lstExternalMods.getSelectedRow(); + if (idx > 0 && idx < Settings.getLastProfile().service().mod().getMods(Settings.getLastProfile().getSelectedVersion()).size()) + SwingUtils.openLink(Settings.getLastProfile().service().mod().getMods(Settings.getLastProfile().getSelectedVersion()).get(idx).url); + }//GEN-LAST:event_lblModInfoMouseClicked - private void btnModifyMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnModifyMouseClicked - ppmManage.show(evt.getComponent(), evt.getPoint().x, evt.getPoint().y); - }//GEN-LAST:event_btnModifyMouseClicked + private void btnRemoveModActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveModActionPerformed + Settings.getLastProfile().service().mod().removeMod(Settings.getLastProfile().getSelectedVersion(), SwingUtils.getValueBySelectedRow(lstExternalMods, lstExternalMods.getSelectedRows(), 1)); + reloadMods(); + }//GEN-LAST:event_btnRemoveModActionPerformed - private void btnDownloadAllAssetsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDownloadAllAssetsActionPerformed - if (mcVersion != null) - TaskWindow.execute(Settings.getLastProfile().service().asset().downloadAssets(mcVersion)); - }//GEN-LAST:event_btnDownloadAllAssetsActionPerformed - - private void txtGameDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtGameDirFocusLost - Settings.getLastProfile().setGameDir(txtGameDir.getText()); - loadVersions(); - }//GEN-LAST:event_txtGameDirFocusLost - - private void btnChoosingJavaDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnChoosingJavaDirActionPerformed - if (cboJava.getSelectedIndex() != 1) + private void btnAddModActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAddModActionPerformed + JSystemFileChooser fc = new JSystemFileChooser(); + fc.setFileSelectionMode(JSystemFileChooser.FILES_ONLY); + fc.setDialogTitle(C.i18n("mods.choose_mod")); + fc.setMultiSelectionEnabled(true); + if (fc.showOpenDialog(this) != JSystemFileChooser.APPROVE_OPTION) return; - JFileChooser fc = new JFileChooser(); - fc.setFileSelectionMode(JFileChooser.FILES_ONLY); - fc.setDialogTitle(C.i18n("settings.choose_javapath")); + boolean flag = true; + for (File f : fc.getSelectedFiles()) + flag &= Settings.getLastProfile().service().mod().addMod(Settings.getLastProfile().getSelectedVersion(), f); + reloadMods(); + if (!flag) + MessageBox.show(C.i18n("mods.failed")); + }//GEN-LAST:event_btnAddModActionPerformed + + private void lstExternalModsKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_lstExternalModsKeyPressed + if (evt.getKeyCode() == KeyEvent.VK_DELETE) + btnRemoveModActionPerformed(null); + }//GEN-LAST:event_lstExternalModsKeyPressed + + private void chkDontCheckGameItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkDontCheckGameItemStateChanged + if (!isLoading) + Settings.getLastProfile().getSelectedVersionSetting().setNotCheckGame(chkDontCheckGame.isSelected()); + }//GEN-LAST:event_chkDontCheckGameItemStateChanged + + private void txtWrapperLauncherFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtWrapperLauncherFocusLost + Settings.getLastProfile().getSelectedVersionSetting().setWrapper(txtWrapperLauncher.getText()); + }//GEN-LAST:event_txtWrapperLauncherFocusLost + + private void txtServerIPFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtServerIPFocusLost + Settings.getLastProfile().getSelectedVersionSetting().setServerIp(txtServerIP.getText()); + }//GEN-LAST:event_txtServerIPFocusLost + + private void txtPrecalledCommandFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPrecalledCommandFocusLost + Settings.getLastProfile().getSelectedVersionSetting().setPrecalledCommand(txtPrecalledCommand.getText()); + }//GEN-LAST:event_txtPrecalledCommandFocusLost + + private void chkNoJVMArgsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkNoJVMArgsItemStateChanged + if (!isLoading) + Settings.getLastProfile().getSelectedVersionSetting().setNoJVMArgs(chkNoJVMArgs.isSelected()); + }//GEN-LAST:event_chkNoJVMArgsItemStateChanged + + private void txtPermSizeFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPermSizeFocusLost + Settings.getLastProfile().getSelectedVersionSetting().setPermSize(txtPermSize.getText()); + }//GEN-LAST:event_txtPermSizeFocusLost + + private void txtMinecraftArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMinecraftArgsFocusLost + Settings.getLastProfile().getSelectedVersionSetting().setMinecraftArgs(txtMinecraftArgs.getText()); + }//GEN-LAST:event_txtMinecraftArgsFocusLost + + private void txtJavaArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaArgsFocusLost + Settings.getLastProfile().getSelectedVersionSetting().setJavaArgs(txtJavaArgs.getText()); + }//GEN-LAST:event_txtJavaArgsFocusLost + + private void btnCleanGameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCleanGameActionPerformed + Settings.getLastProfile().service().version().cleanFolder(); + }//GEN-LAST:event_btnCleanGameActionPerformed + + private void btnChoosingGameDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnChoosingGameDirActionPerformed + JSystemFileChooser fc = new JSystemFileChooser(); + fc.setFileSelectionMode(JSystemFileChooser.DIRECTORIES_ONLY); + fc.setDialogTitle(C.i18n("settings.choose_gamedir")); fc.setMultiSelectionEnabled(false); - fc.setFileFilter(new FileNameFilter("javaw.exe")); - fc.addChoosableFileFilter(new FileNameFilter("java.exe")); - fc.addChoosableFileFilter(new FileNameFilter("java")); fc.showOpenDialog(this); if (fc.getSelectedFile() == null) return; try { String path = fc.getSelectedFile().getCanonicalPath(); - txtJavaDir.setText(path); - Settings.getLastProfile().getSelectedVersionSetting().setJavaDir(txtJavaDir.getText()); + txtGameDir.setText(path); + Settings.getLastProfile().setGameDir(path); } catch (IOException e) { - HMCLog.warn("Failed to set java path.", e); - MessageBox.Show(C.i18n("ui.label.failed_set") + e.getMessage()); + HMCLog.warn("Failed to set game dir.", e); + MessageBox.show(C.i18n("ui.label.failed_set") + e.getMessage()); } - }//GEN-LAST:event_btnChoosingJavaDirActionPerformed + }//GEN-LAST:event_btnChoosingGameDirActionPerformed private void cboJavaItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboJavaItemStateChanged if (evt.getStateChange() != ItemEvent.SELECTED || cboJava.getSelectedIndex() < 0 || StrUtils.isBlank((String) cboJava.getSelectedItem())) @@ -1027,87 +1116,28 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget } }//GEN-LAST:event_cboJavaItemStateChanged - private void btnAddModActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAddModActionPerformed - JFileChooser fc = new JFileChooser(); - fc.setFileSelectionMode(JFileChooser.FILES_ONLY); - fc.setDialogTitle(C.i18n("mods.choose_mod")); - fc.setMultiSelectionEnabled(true); - if (fc.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) + private void btnChoosingJavaDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnChoosingJavaDirActionPerformed + if (cboJava.getSelectedIndex() != 1) return; - boolean flag = true; - for (File f : fc.getSelectedFiles()) - flag &= Settings.getLastProfile().service().mod().addMod(Settings.getLastProfile().getSelectedVersion(), f); - reloadMods(); - if (!flag) - MessageBox.Show(C.i18n("mods.failed")); - }//GEN-LAST:event_btnAddModActionPerformed - - private void btnRemoveModActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveModActionPerformed - Settings.getLastProfile().service().mod().removeMod(Settings.getLastProfile().getSelectedVersion(), SwingUtils.getValueBySelectedRow(lstExternalMods, lstExternalMods.getSelectedRows(), 1)); - reloadMods(); - }//GEN-LAST:event_btnRemoveModActionPerformed - - private void lstExternalModsKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_lstExternalModsKeyPressed - if (evt.getKeyCode() == KeyEvent.VK_DELETE) - btnRemoveModActionPerformed(null); - }//GEN-LAST:event_lstExternalModsKeyPressed - - private void lblModInfoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblModInfoMouseClicked - int idx = lstExternalMods.getSelectedRow(); - if (idx > 0 && idx < Settings.getLastProfile().service().mod().getMods(Settings.getLastProfile().getSelectedVersion()).size()) - SwingUtils.openLink(Settings.getLastProfile().service().mod().getMods(Settings.getLastProfile().getSelectedVersion()).get(idx).url); - }//GEN-LAST:event_lblModInfoMouseClicked - - private void btnChoosingGameDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnChoosingGameDirActionPerformed - JFileChooser fc = new JFileChooser(); - fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - fc.setDialogTitle(C.i18n("settings.choose_gamedir")); + JSystemFileChooser fc = new JSystemFileChooser(); + fc.setFileSelectionMode(JSystemFileChooser.FILES_ONLY); + fc.setDialogTitle(C.i18n("settings.choose_javapath")); fc.setMultiSelectionEnabled(false); + fc.setFileFilter(new FileNameFilter("javaw.exe")); + fc.addChoosableFileFilter(new FileNameFilter("java.exe")); + fc.addChoosableFileFilter(new FileNameFilter("java")); fc.showOpenDialog(this); if (fc.getSelectedFile() == null) return; try { String path = fc.getSelectedFile().getCanonicalPath(); - txtGameDir.setText(path); - Settings.getLastProfile().setGameDir(path); + txtJavaDir.setText(path); + Settings.getLastProfile().getSelectedVersionSetting().setJavaDir(txtJavaDir.getText()); } catch (IOException e) { - HMCLog.warn("Failed to set game dir.", e); - MessageBox.Show(C.i18n("ui.label.failed_set") + e.getMessage()); + HMCLog.warn("Failed to set java path.", e); + MessageBox.show(C.i18n("ui.label.failed_set") + e.getMessage()); } - }//GEN-LAST:event_btnChoosingGameDirActionPerformed - - private void btnCleanGameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCleanGameActionPerformed - Settings.getLastProfile().service().version().cleanFolder(); - }//GEN-LAST:event_btnCleanGameActionPerformed - - private void btnTestGameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnTestGameActionPerformed - LogWindow.INSTANCE.setVisible(true); - MainFrame.INSTANCE.daemon.runGame(Settings.getLastProfile()); - }//GEN-LAST:event_btnTestGameActionPerformed - - private void btnShowLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnShowLogActionPerformed - LogWindow.INSTANCE.setVisible(true); - }//GEN-LAST:event_btnShowLogActionPerformed - - private void btnMakeLaunchScriptActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMakeLaunchScriptActionPerformed - MainFrame.INSTANCE.daemon.makeLaunchScript(Settings.getLastProfile()); - }//GEN-LAST:event_btnMakeLaunchScriptActionPerformed - - private void btnIncludeMinecraftActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnIncludeMinecraftActionPerformed - JFileChooser fc = new JFileChooser(new File(".")); - fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { - File newGameDir = fc.getSelectedFile(); - String name = JOptionPane.showInputDialog(C.i18n("setupwindow.give_a_name")); - if (StrUtils.isBlank(name)) { - MessageBox.Show(C.i18n("setupwindow.no_empty_name")); - return; - } - Settings.putProfile(new Profile(name).setGameDir(newGameDir.getAbsolutePath())); - MessageBox.Show(C.i18n("setupwindow.find_in_configurations")); - loadProfiles(); - } - }//GEN-LAST:event_btnIncludeMinecraftActionPerformed + }//GEN-LAST:event_btnChoosingJavaDirActionPerformed private void cboRunDirectoryItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboRunDirectoryItemStateChanged if (!isLoading && cboRunDirectory.getSelectedIndex() >= 0) @@ -1119,60 +1149,36 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget Settings.getLastProfile().getSelectedVersionSetting().setLauncherVisibility(LauncherVisibility.values()[cboLauncherVisibility.getSelectedIndex()]); }//GEN-LAST:event_cboLauncherVisibilityItemStateChanged - private void chkFullscreenItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkFullscreenItemStateChanged - if (!isLoading) - Settings.getLastProfile().getSelectedVersionSetting().setFullscreen(chkFullscreen.isSelected()); - }//GEN-LAST:event_chkFullscreenItemStateChanged - - private void chkNoJVMArgsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkNoJVMArgsItemStateChanged - if (!isLoading) - Settings.getLastProfile().getSelectedVersionSetting().setNoJVMArgs(chkNoJVMArgs.isSelected()); - }//GEN-LAST:event_chkNoJVMArgsItemStateChanged + private void btnDownloadAllAssetsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDownloadAllAssetsActionPerformed + if (mcVersion != null) + TaskWindow.factory().execute(Settings.getLastProfile().service().asset().downloadAssets(mcVersion)); + }//GEN-LAST:event_btnDownloadAllAssetsActionPerformed private void txtMaxMemoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMaxMemoryFocusLost Settings.getLastProfile().getSelectedVersionSetting().setMaxMemory(txtMaxMemory.getText()); }//GEN-LAST:event_txtMaxMemoryFocusLost - private void txtWidthFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtWidthFocusLost - Settings.getLastProfile().getSelectedVersionSetting().setWidth(txtWidth.getText()); - }//GEN-LAST:event_txtWidthFocusLost + private void txtJavaDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaDirFocusLost + Settings.getLastProfile().getSelectedVersionSetting().setJavaDir(txtJavaDir.getText()); + }//GEN-LAST:event_txtJavaDirFocusLost + + private void chkFullscreenItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkFullscreenItemStateChanged + if (!isLoading) + Settings.getLastProfile().getSelectedVersionSetting().setFullscreen(chkFullscreen.isSelected()); + }//GEN-LAST:event_chkFullscreenItemStateChanged private void txtHeightFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtHeightFocusLost Settings.getLastProfile().getSelectedVersionSetting().setHeight(txtHeight.getText()); }//GEN-LAST:event_txtHeightFocusLost - private void txtJavaDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaDirFocusLost - Settings.getLastProfile().getSelectedVersionSetting().setJavaDir(txtJavaDir.getText()); - }//GEN-LAST:event_txtJavaDirFocusLost + private void txtWidthFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtWidthFocusLost + Settings.getLastProfile().getSelectedVersionSetting().setWidth(txtWidth.getText()); + }//GEN-LAST:event_txtWidthFocusLost - private void txtJavaArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtJavaArgsFocusLost - Settings.getLastProfile().getSelectedVersionSetting().setJavaArgs(txtJavaArgs.getText()); - }//GEN-LAST:event_txtJavaArgsFocusLost - - private void txtMinecraftArgsFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMinecraftArgsFocusLost - Settings.getLastProfile().getSelectedVersionSetting().setMinecraftArgs(txtMinecraftArgs.getText()); - }//GEN-LAST:event_txtMinecraftArgsFocusLost - - private void txtPermSizeFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPermSizeFocusLost - Settings.getLastProfile().getSelectedVersionSetting().setPermSize(txtPermSize.getText()); - }//GEN-LAST:event_txtPermSizeFocusLost - - private void txtPrecalledCommandFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPrecalledCommandFocusLost - Settings.getLastProfile().getSelectedVersionSetting().setPrecalledCommand(txtPrecalledCommand.getText()); - }//GEN-LAST:event_txtPrecalledCommandFocusLost - - private void txtServerIPFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtServerIPFocusLost - Settings.getLastProfile().getSelectedVersionSetting().setServerIp(txtServerIP.getText()); - }//GEN-LAST:event_txtServerIPFocusLost - - private void txtWrapperLauncherFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtWrapperLauncherFocusLost - Settings.getLastProfile().getSelectedVersionSetting().setWrapper(txtWrapperLauncher.getText()); - }//GEN-LAST:event_txtWrapperLauncherFocusLost - - private void chkDontCheckGameItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkDontCheckGameItemStateChanged - if (!isLoading) - Settings.getLastProfile().getSelectedVersionSetting().setNotCheckGame(chkDontCheckGame.isSelected()); - }//GEN-LAST:event_chkDontCheckGameItemStateChanged + private void txtGameDirFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtGameDirFocusLost + Settings.getLastProfile().setGameDir(txtGameDir.getText()); + loadVersions(); + }//GEN-LAST:event_txtGameDirFocusLost // // @@ -1224,7 +1230,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget List files = (List) tr.getTransferData(DataFlavor.javaFileListFlavor); for (File file : files) Settings.getLastProfile().service().mod().addMod(Settings.getLastProfile().getSelectedVersion(), file); - } catch (Exception ex) { + } catch (UnsupportedFlavorException | IOException ex) { HMCLog.warn("Failed to drop file.", ex); } } @@ -1260,21 +1266,24 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget return; reloadingMods = true; DefaultTableModel model = SwingUtils.clearDefaultTable(lstExternalMods); - new OverridableSwingWorker>() { - @Override - protected void work() throws Exception { - publish(Settings.getLastProfile().service().mod().recacheMods(Settings.getLastProfile().getSelectedVersion())); - } - }.reg(t -> { + new OverridableSwingWorkerImpl().reg(t -> { synchronized (modLock) { for (ModInfo x : t) - model.addRow(new Object[] { x.isActive(), x, x.version }); + model.addRow(new Object[]{x.isActive(), x, x.version}); reloadingMods = false; } }).execute(); } } + private static class OverridableSwingWorkerImpl extends OverridableSwingWorker> { + + @Override + protected void work() throws Exception { + publish(Settings.getLastProfile().service().mod().recacheMods(Settings.getLastProfile().getSelectedVersion())); + } + } + // void save() { VersionSetting vs = Settings.getLastProfile().getSelectedVersionSetting(); @@ -1306,6 +1315,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget Settings.onProfileLoading(); } + @Override public void onLeave() { super.onLeave(); save(); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java index 26ebaad1b..4c6aa963a 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java @@ -28,13 +28,14 @@ import org.jackhuang.hellominecraft.util.tasks.TaskRunnable; import org.jackhuang.hellominecraft.util.tasks.TaskWindow; import org.jackhuang.hellominecraft.util.MessageBox; import org.jackhuang.hellominecraft.util.StrUtils; +import org.jackhuang.hellominecraft.util.tasks.Task; import org.jackhuang.hellominecraft.util.ui.SwingUtils; /** * * @author huangyuhui */ -public class InstallerPanel extends AnimatedPanel { +public class InstallerPanel extends Page { GameSettingsPanel gsp; @@ -113,16 +114,15 @@ public class InstallerPanel extends AnimatedPanel { }//GEN-LAST:event_btnInstallActionPerformed private void btnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshActionPerformed - refreshVersions(); + TaskWindow.factory().execute(refreshVersionsTask()); }//GEN-LAST:event_btnRefreshActionPerformed transient List versions; - transient InstallerVersionList list; + InstallerVersionList list; InstallerType id; - void refreshVersions() { - if (TaskWindow.execute(list.refresh(new String[] { gsp.getMinecraftVersionFormatted() }))) - loadVersions(); + Task refreshVersionsTask() { + return list.refresh(new String[] { gsp.getMinecraftVersionFormatted() }).after(new TaskRunnable(this::loadVersions)); } public synchronized InstallerVersionList.InstallerVersion getVersion(int idx) { @@ -132,11 +132,13 @@ public class InstallerPanel extends AnimatedPanel { synchronized void downloadSelectedRow() { int idx = lstInstallers.getSelectedRow(); if (versions == null || idx < 0 || idx >= versions.size()) { - MessageBox.Show(C.i18n("install.not_refreshed")); + MessageBox.show(C.i18n("install.not_refreshed")); return; } - TaskWindow.execute(Settings.getLastProfile().service().install().download(Settings.getLastProfile().getSelectedVersion(), getVersion(idx), id), - new TaskRunnable(this::refreshVersions)); + TaskWindow.factory() + .append(Settings.getLastProfile().service().install().download(Settings.getLastProfile().getSelectedVersion(), getVersion(idx), id)) + .append(refreshVersionsTask()) + .execute(); } public void loadVersions() { @@ -159,7 +161,7 @@ public class InstallerPanel extends AnimatedPanel { @Override public void onSelect() { if (!refreshed) { - refreshVersions(); + TaskWindow.factory().execute(refreshVersionsTask()); refreshed = true; } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form index 9eabf0b12..c0c3a6cb8 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form @@ -19,18 +19,6 @@ - - - - - - - - - - - - @@ -71,12 +59,22 @@ + + + + + + + + + + @@ -121,20 +119,19 @@ - + - + - - + - + - + @@ -157,12 +154,9 @@ - + - - - @@ -291,16 +285,6 @@ - - - - - - - - - - diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java index 29203424f..61e95c964 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java @@ -17,10 +17,8 @@ */ package org.jackhuang.hellominecraft.launcher.ui; -import java.awt.Color; import java.io.IOException; import javax.swing.DefaultComboBoxModel; -import javax.swing.JFileChooser; import javax.swing.filechooser.FileNameExtensionFilter; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; @@ -29,22 +27,27 @@ import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.MessageBox; import org.jackhuang.hellominecraft.util.lang.SupportedLocales; +import org.jackhuang.hellominecraft.util.ui.GraphicsUtils; +import org.jackhuang.hellominecraft.util.ui.JSystemFileChooser; import org.jackhuang.hellominecraft.util.ui.SwingUtils; /** * * @author huangyuhui */ -public class LauncherSettingsPanel extends AnimatedPanel { +public class LauncherSettingsPanel extends RepaintPage { /** * Creates new form LancherSettingsPanel */ public LauncherSettingsPanel() { + setRepainter(this); } void initGui() { initComponents(); + setBackground(GraphicsUtils.getWebColorWithAlpha("FFFFFF7F")); + setOpaque(true); DefaultComboBoxModel d = new DefaultComboBoxModel(); for (DownloadType type : DownloadType.values()) @@ -69,11 +72,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { cboDownloadSource.setSelectedIndex(Settings.getInstance().getDownloadType()); cboTheme.setSelectedIndex(Settings.getInstance().getTheme().ordinal()); chkEnableShadow.setSelected(Settings.getInstance().isEnableShadow()); - chkEnableAnimation.setSelected(Settings.getInstance().isEnableAnimation()); chkDecorated.setSelected(Settings.getInstance().isDecorated()); - - setBackground(Color.white); - setOpaque(true); } @Override @@ -110,7 +109,6 @@ public class LauncherSettingsPanel extends AnimatedPanel { txtProxyUsername = new javax.swing.JTextField(); txtProxyPassword = new javax.swing.JTextField(); lblProxyPassword = new javax.swing.JLabel(); - chkEnableAnimation = new javax.swing.JCheckBox(); chkDecorated = new javax.swing.JCheckBox(); lblModpack = new javax.swing.JLabel(); cboLang = new javax.swing.JComboBox(); @@ -125,12 +123,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { }); lblAbout.setText(C.i18n("launcher.about")); // NOI18N - lblAbout.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - lblAbout.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - lblAboutMouseClicked(evt); - } - }); + lblAbout.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); btnSelBackgroundPath.setText(C.i18n("ui.button.explore")); // NOI18N btnSelBackgroundPath.addActionListener(new java.awt.event.ActionListener() { @@ -208,13 +201,6 @@ public class LauncherSettingsPanel extends AnimatedPanel { lblProxyPassword.setText(C.i18n("proxy.password")); // NOI18N - chkEnableAnimation.setText(C.i18n("launcher.enable_animation")); // NOI18N - chkEnableAnimation.addItemListener(new java.awt.event.ItemListener() { - public void itemStateChanged(java.awt.event.ItemEvent evt) { - chkEnableAnimationItemStateChanged(evt); - } - }); - chkDecorated.setText(C.i18n("launcher.decorated")); // NOI18N chkDecorated.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -256,16 +242,6 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(chkEnableShadow) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(chkEnableAnimation)) - .addGroup(layout.createSequentialGroup() - .addComponent(btnCheckUpdate) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnMCBBS) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(chkDecorated)) .addGroup(layout.createSequentialGroup() .addComponent(lblProxy) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) @@ -301,10 +277,18 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addComponent(cboTheme, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(btnCheckUpdate) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnMCBBS)) .addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblRestart)) - .addGap(0, 0, Short.MAX_VALUE))) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addComponent(chkEnableShadow) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(chkDecorated))) .addContainerGap()) ); layout.setVerticalGroup( @@ -341,18 +325,17 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(chkEnableShadow) - .addComponent(chkEnableAnimation)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(chkDecorated)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnCheckUpdate, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(chkDecorated) - .addComponent(btnMCBBS)) + .addComponent(btnMCBBS, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblRestart) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 65, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, 173, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); }// //GEN-END:initComponents @@ -362,8 +345,8 @@ public class LauncherSettingsPanel extends AnimatedPanel { }//GEN-LAST:event_cboDownloadSourceItemStateChanged private void btnSelBackgroundPathActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSelBackgroundPathActionPerformed - JFileChooser fc = new JFileChooser(); - fc.setFileSelectionMode(JFileChooser.FILES_ONLY); + JSystemFileChooser fc = new JSystemFileChooser(); + fc.setFileSelectionMode(JSystemFileChooser.FILES_ONLY); fc.setDialogTitle(C.i18n("launcher.choose_bgpath")); fc.setMultiSelectionEnabled(false); fc.setFileFilter(new FileNameExtensionFilter("*.png", "png")); @@ -379,7 +362,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { MainFrame.INSTANCE.loadBackground(); } catch (IOException e) { HMCLog.warn("Failed to set background path.", e); - MessageBox.Show(C.i18n("ui.label.failed_set") + e.getMessage()); + MessageBox.show(C.i18n("ui.label.failed_set") + e.getMessage()); } }//GEN-LAST:event_btnSelBackgroundPathActionPerformed @@ -413,10 +396,6 @@ public class LauncherSettingsPanel extends AnimatedPanel { Settings.getInstance().setDecorated(chkDecorated.isSelected()); }//GEN-LAST:event_chkDecoratedItemStateChanged - private void chkEnableAnimationItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkEnableAnimationItemStateChanged - Settings.getInstance().setEnableAnimation(chkEnableAnimation.isSelected()); - }//GEN-LAST:event_chkEnableAnimationItemStateChanged - private void txtProxyHostFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtProxyHostFocusLost Settings.getInstance().setProxyHost(txtProxyHost.getText()); }//GEN-LAST:event_txtProxyHostFocusLost @@ -433,10 +412,6 @@ public class LauncherSettingsPanel extends AnimatedPanel { Settings.getInstance().setProxyPassword(txtProxyPassword.getText()); }//GEN-LAST:event_txtProxyPasswordFocusLost - private void lblAboutMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblAboutMouseClicked - SwingUtils.openLink("http://huangyuhui.duapp.com/link.php?type=sponsor"); - }//GEN-LAST:event_lblAboutMouseClicked - private void btnMCBBSActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMCBBSActionPerformed SwingUtils.openLink(C.URL_PUBLISH); }//GEN-LAST:event_btnMCBBSActionPerformed @@ -449,7 +424,6 @@ public class LauncherSettingsPanel extends AnimatedPanel { private javax.swing.JComboBox cboLang; private javax.swing.JComboBox cboTheme; private javax.swing.JCheckBox chkDecorated; - private javax.swing.JCheckBox chkEnableAnimation; private javax.swing.JCheckBox chkEnableShadow; private javax.swing.JLabel lblAbout; private javax.swing.JLabel lblBackground; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LaunchingUIDaemon.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LaunchingUIDaemon.java index 1790f2c06..3d98dd771 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LaunchingUIDaemon.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LaunchingUIDaemon.java @@ -110,19 +110,17 @@ public class LaunchingUIDaemon { String msg = C.i18n("launch.exited_abnormally") + " exit code: " + t; if (errorText != null) msg += ", advice: " + MinecraftCrashAdvicer.getAdvice(FileUtils.readQuietly(new File(errorText))); - MessageBox.Show(msg); WebFrame f = new WebFrame(logs); f.setModal(true); - f.setTitle("Game output"); + f.setTitle(msg); f.setVisible(true); checkExit((LauncherVisibility) obj.getTag()); }); jpm.jvmLaunchFailedEvent.register(t -> { HMCLog.err("Cannot create jvm, exit code: " + t); - MessageBox.Show(C.i18n("launch.cannot_create_jvm") + " exit code: " + t); WebFrame f = new WebFrame(jpm.getJavaProcess().getStdOutLines().toArray(new String[0])); f.setModal(true); - f.setTitle("Game output"); + f.setTitle(C.i18n("launch.cannot_create_jvm") + " exit code: " + t); f.setVisible(true); checkExit((LauncherVisibility) obj.getTag()); }); @@ -138,10 +136,6 @@ public class LaunchingUIDaemon { return true; }; - private static void getCrashReport() { - - } - private static void checkExit(LauncherVisibility v) { if (v != LauncherVisibility.KEEP && !LogWindow.INSTANCE.isVisible()) { HMCLog.log("Launcher will exit now."); @@ -154,10 +148,10 @@ public class LaunchingUIDaemon { try { String s = JOptionPane.showInputDialog(C.i18n("mainwindow.enter_script_name")); if (s != null) - MessageBox.Show(C.i18n("mainwindow.make_launch_succeed") + " " + ((GameLauncher) sender).makeLauncher(s, str).getAbsolutePath()); + MessageBox.show(C.i18n("mainwindow.make_launch_succeed") + " " + ((GameLauncher) sender).makeLauncher(s, str).getAbsolutePath()); flag = true; } catch (IOException ex) { - MessageBox.Show(C.i18n("mainwindow.make_launch_script_failed")); + MessageBox.show(C.i18n("mainwindow.make_launch_script_failed")); HMCLog.err("Failed to create script file.", ex); } MainFrame.INSTANCE.closeMessage(); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java index 8457cba22..bb06d3f13 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java @@ -25,7 +25,9 @@ import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; +import java.awt.Rectangle; import java.awt.Transparency; +import java.awt.Window; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; @@ -33,6 +35,8 @@ import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.image.BufferedImage; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.List; import javax.swing.BorderFactory; @@ -40,35 +44,38 @@ import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; +import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; -import org.jackhuang.hellominecraft.util.C; -import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.Main; -import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator; -import org.jackhuang.hellominecraft.util.ui.GraphicsUtils; +import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.lookandfeel.Theme; +import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.MessageBox; import org.jackhuang.hellominecraft.util.StrUtils; -import org.jackhuang.hellominecraft.util.ui.DropShadowBorder; -import org.jackhuang.hellominecraft.util.ui.TintablePanel; +import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.ui.BasicColors; +import org.jackhuang.hellominecraft.util.ui.DropShadowBorder; +import org.jackhuang.hellominecraft.util.ui.GraphicsUtils; import org.jackhuang.hellominecraft.util.ui.SwingUtils; +import org.jackhuang.hellominecraft.util.ui.TintablePanel; + /** * * @author huangyuhui */ -public final class MainFrame extends DraggableFrame { +public final class MainFrame extends DraggableFrame implements IRepaint { public static final MainFrame INSTANCE = new MainFrame(); TintablePanel centralPanel; JPanel header, infoSwap, realPanel; CardLayout infoLayout; - JLabel backgroundLabel, windowTitle; + JLabel windowTitle; + GaussionPage backgroundLabel; DropShadowBorder border; boolean enableShadow; String defaultTitle; @@ -89,7 +96,7 @@ public final class MainFrame extends DraggableFrame { setContentSize(834, 542); else setContentSize(802, 511); - setDefaultCloseOperation(3); + setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle(Main.makeTitle()); initComponents(); loadBackground(); @@ -152,6 +159,7 @@ public final class MainFrame extends DraggableFrame { } private void initComponents() { + setLayout(null); initBorderColor(Settings.getInstance().getTheme()); realPanel = new JPanel(); @@ -242,14 +250,13 @@ public final class MainFrame extends DraggableFrame { truePanel.setBounds(0, 0, 800, 480); centralPanel.setBounds(0, 30, 800, 480); - setLayout(null); realPanel.setBounds(1, 0, 800, 511); add(realPanel); } - private final ActionListener tabListener = e -> MainFrame.this.selectTab(e.getActionCommand()); + private transient final ActionListener tabListener = e -> MainFrame.this.selectTab(e.getActionCommand()); - private void initializeTab(AnimatedPanel inst, String cmd) { + private void initializeTab(Page inst, String cmd) { HeaderTab tab = new HeaderTab(C.i18n("launcher.title." + cmd)); tab.setActionCommand(cmd); tab.setForeground(BasicColors.COLOR_WHITE_TEXT); @@ -263,11 +270,11 @@ public final class MainFrame extends DraggableFrame { private final List tabHeader = new ArrayList<>(); private JPanel tabWrapper[]; - private final List tabContent = new ArrayList<>(); + private final List tabContent = new ArrayList<>(); public void selectTab(String tabName) { int chosen = -1; - AnimatedPanel onCreate = null, onSelect = null; + Page onCreate = null, onSelect = null; for (int i = 0; i < tabHeader.size(); i++) if (tabName.equalsIgnoreCase(tabHeader.get(i).getActionCommand())) { if (!tabContent.get(i).isCreated()) { @@ -318,14 +325,15 @@ public final class MainFrame extends DraggableFrame { public void loadBackground() { background = SwingUtils.searchBackgroundImage(Main.getIcon(Settings.getInstance().getTheme().settings.get("Customized.MainFrame.background_image")), Settings.getInstance().getBgpath(), 800, 480); - if (background != null) + if (background != null) { if (backgroundLabel == null) { - backgroundLabel = new JLabel(background); + backgroundLabel = new GaussionPage(); + backgroundLabel.addAeroObject(backgroundLabel); backgroundLabel.setBounds(0, 0, 800, 480); centralPanel.add(backgroundLabel, -1); - } else - backgroundLabel.setIcon(background); - else + } + backgroundLabel.setBackgroundImage(background.getImage()); + } else HMCLog.warn("No background image here! The background will be empty!"); } @@ -407,7 +415,7 @@ public final class MainFrame extends DraggableFrame { int contentWidth = width - off - off; int contentHeight = height - off - off; BufferedImage contentImage = new BufferedImage(contentWidth, - contentHeight, Transparency.OPAQUE); + contentHeight, Transparency.OPAQUE); Graphics2D contentG2d = contentImage.createGraphics(); contentG2d.translate(-off, -off); paintImpl(g); @@ -426,6 +434,25 @@ public final class MainFrame extends DraggableFrame { } } + @Override + public JComponent getRepaintComponent() { + return null; + } + + @Override + public Window getRepaintWindow() { + return this; + } + + @Override + public Collection getRepaintRects() { + int off = MainFrame.INSTANCE.enableShadow ? 16 : 0, yoff = MainFrame.INSTANCE.getInsets().top + off, xoff = MainFrame.INSTANCE.getInsets().left + off; + int width = 800, height = MainFrame.INSTANCE.header.getHeight() + 480 - 1; + return Arrays.asList(new Rectangle(xoff, yoff, xoff, height + yoff + 1), + new Rectangle(xoff + width + 1, yoff, xoff + width + 1, height + yoff + 1), + new Rectangle(xoff, height + yoff + 1, xoff + width + 1, height + yoff + 1)); + } + private static class MouseListenerImpl implements MouseListener { public static final MouseListenerImpl INSTANCE = new MouseListenerImpl(); @@ -454,14 +481,12 @@ public final class MainFrame extends DraggableFrame { public void failed(String s) { if (s != null) - MessageBox.Show(s); + MessageBox.show(s); closeMessage(); } - LaunchingUIDaemon daemon = new LaunchingUIDaemon(); - - final HashMap actions = new HashMap<>(); - + transient LaunchingUIDaemon daemon = new LaunchingUIDaemon(); + transient final HashMap actions = new HashMap<>(); void invokeAction(String name) { if (actions.containsKey(name)) actions.get(name).run(); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form index 4a7db3ca7..3f2e3ff62 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form @@ -25,6 +25,10 @@ + + + + @@ -40,19 +44,19 @@ - + - + - + @@ -72,7 +76,7 @@ - + @@ -82,7 +86,7 @@ - + @@ -109,7 +113,7 @@ - + @@ -133,7 +137,7 @@ - + @@ -169,12 +173,15 @@ + + + - + @@ -185,7 +192,7 @@ - + @@ -196,7 +203,7 @@ - + @@ -204,7 +211,7 @@ - + @@ -221,7 +228,7 @@ - + @@ -278,4 +285,4 @@ - + \ No newline at end of file diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java index c621b7ba7..892f6fe05 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java @@ -23,7 +23,6 @@ import java.awt.Font; import java.awt.event.ItemEvent; import java.awt.event.KeyEvent; import javax.swing.DefaultComboBoxModel; -import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.filechooser.FileNameExtensionFilter; @@ -38,12 +37,13 @@ import org.jackhuang.hellominecraft.launcher.core.mod.ModpackManager; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.ui.modpack.ModpackWizard; import org.jackhuang.hellominecraft.launcher.util.HMCLMinecraftService; -import org.jackhuang.hellominecraft.util.ui.GraphicsUtils; import org.jackhuang.hellominecraft.util.Event; import org.jackhuang.hellominecraft.lookandfeel.comp.ConstomButton; import org.jackhuang.hellominecraft.util.func.Consumer; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.tasks.TaskWindow; +import org.jackhuang.hellominecraft.util.ui.GraphicsUtils; +import org.jackhuang.hellominecraft.util.ui.JSystemFileChooser; import org.jackhuang.hellominecraft.util.ui.SwingUtils; import org.jackhuang.hellominecraft.util.ui.wizard.api.WizardDisplayer; @@ -51,11 +51,8 @@ import org.jackhuang.hellominecraft.util.ui.wizard.api.WizardDisplayer; * * @author huangyuhui */ -public class MainPagePanel extends AnimatedPanel { +public class MainPagePanel extends GaussionPage { - /** - * Creates new form MainPagePanel - */ public MainPagePanel() { } @@ -76,7 +73,7 @@ public class MainPagePanel extends AnimatedPanel { btnRun.setFont(newFont); btnRun.addActionListener(e -> MainFrame.INSTANCE.daemon.runGame(Settings.getLastProfile())); - this.add(pnlButtons); + add(pnlButtons); pnlButtons.setBounds(0, 0, w, h); this.setSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT)); @@ -93,7 +90,10 @@ public class MainPagePanel extends AnimatedPanel { prepareAuths(); - animationEnabled = false; + addAeroObject(pnlMore); + setBackgroundImage(MainFrame.INSTANCE.background.getImage()); + + ((RepaintPage) pnlMore).setRepainter(this); } /** @@ -105,20 +105,20 @@ public class MainPagePanel extends AnimatedPanel { // //GEN-BEGIN:initComponents private void initComponents() { - pnlMore = new javax.swing.JPanel(); + pnlMore = new RepaintPage(); txtPlayerName = new javax.swing.JTextField(); - jLabel7 = new javax.swing.JLabel(); + lblLogin = new javax.swing.JLabel(); cboLoginMode = new javax.swing.JComboBox(); lblUserName = new javax.swing.JLabel(); - jLabel10 = new javax.swing.JLabel(); + lblProfile = new javax.swing.JLabel(); cboProfiles = new javax.swing.JComboBox(); lblVersion = new javax.swing.JLabel(); - cboVersions = new javax.swing.JComboBox(); + cboVersions = new WideComboBox(); pnlPassword = new javax.swing.JPanel(); - jPanel1 = new javax.swing.JPanel(); - jLabel9 = new javax.swing.JLabel(); + pnlLogIn = new javax.swing.JPanel(); + lblPassword = new javax.swing.JLabel(); txtPassword = new javax.swing.JPasswordField(); - jPanel3 = new javax.swing.JPanel(); + pnlLogOut = new javax.swing.JPanel(); btnLogout = new javax.swing.JButton(); btnImportModpack = new javax.swing.JButton(); btnExportModpack = new javax.swing.JButton(); @@ -142,7 +142,7 @@ public class MainPagePanel extends AnimatedPanel { } }); - jLabel7.setText(C.i18n("login.type")); // NOI18N + lblLogin.setText(C.i18n("login.type")); // NOI18N cboLoginMode.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -152,7 +152,7 @@ public class MainPagePanel extends AnimatedPanel { lblUserName.setText(C.i18n("login.username")); // NOI18N - jLabel10.setText(C.i18n("ui.label.profile")); // NOI18N + lblProfile.setText(C.i18n("ui.label.profile")); // NOI18N cboProfiles.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -171,7 +171,7 @@ public class MainPagePanel extends AnimatedPanel { pnlPassword.setLayout(new java.awt.CardLayout()); - jLabel9.setText(C.i18n("ui.label.password")); // NOI18N + lblPassword.setText(C.i18n("ui.label.password")); // NOI18N txtPassword.addCaretListener(new javax.swing.event.CaretListener() { public void caretUpdate(javax.swing.event.CaretEvent evt) { @@ -194,25 +194,25 @@ public class MainPagePanel extends AnimatedPanel { } }); - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); - jPanel1.setLayout(jPanel1Layout); - jPanel1Layout.setHorizontalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(jLabel9) + javax.swing.GroupLayout pnlLogInLayout = new javax.swing.GroupLayout(pnlLogIn); + pnlLogIn.setLayout(pnlLogInLayout); + pnlLogInLayout.setHorizontalGroup( + pnlLogInLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnlLogInLayout.createSequentialGroup() + .addComponent(lblPassword) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtPassword)) ); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + pnlLogInLayout.setVerticalGroup( + pnlLogInLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlLogInLayout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(pnlLogInLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lblPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE))) ); - pnlPassword.add(jPanel1, "card2"); + pnlPassword.add(pnlLogIn, "card2"); btnLogout.setText(C.i18n("ui.button.logout")); // NOI18N btnLogout.addActionListener(new java.awt.event.ActionListener() { @@ -221,18 +221,18 @@ public class MainPagePanel extends AnimatedPanel { } }); - javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); - jPanel3.setLayout(jPanel3Layout); - jPanel3Layout.setHorizontalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + javax.swing.GroupLayout pnlLogOutLayout = new javax.swing.GroupLayout(pnlLogOut); + pnlLogOut.setLayout(pnlLogOutLayout); + pnlLogOutLayout.setHorizontalGroup( + pnlLogOutLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnLogout, javax.swing.GroupLayout.DEFAULT_SIZE, 170, Short.MAX_VALUE) ); - jPanel3Layout.setVerticalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + pnlLogOutLayout.setVerticalGroup( + pnlLogOutLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnLogout, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); - pnlPassword.add(jPanel3, "card3"); + pnlPassword.add(pnlLogOut, "card3"); btnImportModpack.setText(C.i18n("modpack.task.install")); // NOI18N btnImportModpack.addActionListener(new java.awt.event.ActionListener() { @@ -258,16 +258,16 @@ public class MainPagePanel extends AnimatedPanel { .addComponent(pnlPassword, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(pnlMoreLayout.createSequentialGroup() .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel10, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(lblProfile, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(lblVersion, javax.swing.GroupLayout.Alignment.TRAILING)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(cboProfiles, 0, 128, Short.MAX_VALUE) + .addComponent(cboProfiles, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(cboVersions, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(pnlMoreLayout.createSequentialGroup() .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblUserName) - .addComponent(jLabel7)) + .addComponent(lblLogin)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(cboLoginMode, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) @@ -281,7 +281,7 @@ public class MainPagePanel extends AnimatedPanel { .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlMoreLayout.createSequentialGroup() .addContainerGap() .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel10) + .addComponent(lblProfile) .addComponent(cboProfiles, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) @@ -289,7 +289,7 @@ public class MainPagePanel extends AnimatedPanel { .addComponent(lblVersion)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel7) + .addComponent(lblLogin) .addComponent(cboLoginMode, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) @@ -374,8 +374,8 @@ public class MainPagePanel extends AnimatedPanel { }//GEN-LAST:event_txtPasswordKeyPressed private void btnImportModpackActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnImportModpackActionPerformed - JFileChooser fc = new JFileChooser(); - fc.setFileSelectionMode(JFileChooser.FILES_ONLY); + JSystemFileChooser fc = new JSystemFileChooser(); + fc.setFileSelectionMode(JSystemFileChooser.FILES_ONLY); fc.setDialogTitle(C.i18n("modpack.choose")); fc.setMultiSelectionEnabled(false); fc.setFileFilter(new FileNameExtensionFilter(C.i18n("modpack"), "zip")); @@ -383,7 +383,7 @@ public class MainPagePanel extends AnimatedPanel { if (fc.getSelectedFile() == null) return; String suggestedModpackId = JOptionPane.showInputDialog("Please enter your favourite game name", FileUtils.getBaseName(fc.getSelectedFile().getName())); - TaskWindow.factory().append(ModpackManager.install(MainFrame.INSTANCE, fc.getSelectedFile(), Settings.getLastProfile().service(), suggestedModpackId)).create(); + TaskWindow.factory().append(ModpackManager.install(MainFrame.INSTANCE, fc.getSelectedFile(), Settings.getLastProfile().service(), suggestedModpackId)).execute(); Settings.getLastProfile().service().version().refreshVersions(); }//GEN-LAST:event_btnImportModpackActionPerformed @@ -434,13 +434,13 @@ public class MainPagePanel extends AnimatedPanel { private javax.swing.JComboBox cboLoginMode; private javax.swing.JComboBox cboProfiles; private javax.swing.JComboBox cboVersions; - private javax.swing.JLabel jLabel10; - private javax.swing.JLabel jLabel7; - private javax.swing.JLabel jLabel9; - private javax.swing.JPanel jPanel1; - private javax.swing.JPanel jPanel3; + private javax.swing.JLabel lblLogin; + private javax.swing.JLabel lblPassword; + private javax.swing.JLabel lblProfile; private javax.swing.JLabel lblUserName; private javax.swing.JLabel lblVersion; + private javax.swing.JPanel pnlLogIn; + private javax.swing.JPanel pnlLogOut; private javax.swing.JPanel pnlMore; private javax.swing.JPanel pnlPassword; private javax.swing.JPasswordField txtPassword; @@ -469,16 +469,14 @@ public class MainPagePanel extends AnimatedPanel { return true; }; - final Runnable onLoadingProfiles = this::loadProfiles; - - private void loadProfiles() { + final Runnable onLoadingProfiles = () -> { isLoading = true; DefaultComboBoxModel model = new DefaultComboBoxModel(); for (Profile s : Settings.getProfilesFiltered()) model.addElement(s.getName()); cboProfiles.setModel(model); isLoading = false; - } + }; final Consumer onRefreshedVersions = t -> { if (Settings.getLastProfile().service() == t) @@ -495,7 +493,7 @@ public class MainPagePanel extends AnimatedPanel { if (!showedNoVersion && ((HMCLMinecraftService) Settings.getLastProfile().service()).checkedModpack) { showedNoVersion = true; SwingUtilities.invokeLater(() -> { - if (MessageBox.Show(C.i18n("mainwindow.no_version"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) + if (MessageBox.show(C.i18n("mainwindow.no_version"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) MainFrame.INSTANCE.invokeAction("showGameDownloads"); }); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Page.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Page.java new file mode 100755 index 000000000..23d5d2ddd --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Page.java @@ -0,0 +1,56 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2013 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hellominecraft.launcher.ui; + +import javax.swing.JPanel; + +/** + * + * @author huangyuhui + */ +public class Page extends JPanel implements Selectable { + + boolean selected = false; + + @Override + public boolean isSelected() { + return selected; + } + + @Override + public void onSelect() { + selected = true; + } + + @Override + public void onLeave() { + selected = false; + } + + boolean created = false; + + @Override + public void onCreate() { + created = true; + } + + @Override + public boolean isCreated() { + return created; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackDescriptionPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackDescriptionPanel.java index f66e9c008..c914e9c07 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackDescriptionPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackDescriptionPanel.java @@ -18,6 +18,8 @@ package org.jackhuang.hellominecraft.launcher.ui.modpack; import java.awt.Dimension; +import java.awt.HeadlessException; +import java.io.IOException; import java.util.Map; import javax.swing.JOptionPane; import org.jackhuang.hellominecraft.util.C; @@ -113,8 +115,8 @@ public class ModpackDescriptionPanel extends javax.swing.JPanel { msgs[1] = new WebPage(new Markdown4jProcessor().process(txtDescription.getText())); ((WebPage) msgs[1]).setPreferredSize(new Dimension(800, 350)); JOptionPane.showOptionDialog(null, msgs, (String) msgs[0], JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null); - } catch (Exception e) { - MessageBox.Show(StrUtils.getStackTrace(e), C.i18n("message.error"), MessageBox.WARNING_MESSAGE); + } catch (HeadlessException | IOException e) { + MessageBox.show(StrUtils.getStackTrace(e), C.i18n("message.error"), MessageBox.WARNING_MESSAGE); } }//GEN-LAST:event_jButton1ActionPerformed diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackInitializationPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackInitializationPanel.java index 0f2bda974..5d15ed7f3 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackInitializationPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackInitializationPanel.java @@ -21,9 +21,9 @@ import java.util.Map; import java.util.Vector; import java.util.regex.Pattern; import javax.swing.DefaultComboBoxModel; -import javax.swing.JFileChooser; import javax.swing.filechooser.FileNameExtensionFilter; import org.jackhuang.hellominecraft.util.C; +import org.jackhuang.hellominecraft.util.ui.JSystemFileChooser; import org.jackhuang.hellominecraft.util.ui.wizard.spi.WizardController; /** @@ -172,8 +172,8 @@ public class ModpackInitializationPanel extends javax.swing.JPanel { }// //GEN-END:initComponents private void cboModpackLocationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cboModpackLocationActionPerformed - JFileChooser fc = new JFileChooser(); - fc.setFileSelectionMode(JFileChooser.FILES_ONLY); + JSystemFileChooser fc = new JSystemFileChooser(); + fc.setFileSelectionMode(JSystemFileChooser.FILES_ONLY); fc.setDialogTitle(C.i18n("modpack.wizard.step.initialization.save")); fc.setMultiSelectionEnabled(false); fc.setFileFilter(new FileNameExtensionFilter(C.i18n("modpack") + "(*.zip)", "zip")); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackWizard.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackWizard.java index 60903615c..c342b1a38 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackWizard.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackWizard.java @@ -19,6 +19,7 @@ package org.jackhuang.hellominecraft.launcher.ui.modpack; import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; @@ -95,7 +96,7 @@ public class ModpackWizard extends WizardBranchController { if (settings.containsKey(ModpackDescriptionPanel.KEY_MODPACK_DESCRITION)) try { map.put("description", new org.markdown4j.Markdown4jProcessor().process((String) settings.get(ModpackDescriptionPanel.KEY_MODPACK_DESCRITION))); - } catch (Exception ex) { + } catch (IOException ex) { progress.failed(C.i18n("modpack.export_error") + ": " + StrUtils.getStackTrace(ex), true); } try { @@ -134,7 +135,7 @@ public class ModpackWizard extends WizardBranchController { File f = new File(u.toURI()); if (f.getName().endsWith(".exe") || f.getName().endsWith(".jar")) engine.putFile(f, f.getName()); - } catch (Exception e) { + } catch (IOException | URISyntaxException e) { HMCLog.err("Failed to add launcher files.", e); flag = false; break; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java index ba507757d..2861ff3c4 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/CrashReporter.java @@ -48,6 +48,7 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { put("MessageBox", ""); put("AWTError", ""); put("JFileChooser", "Has your operating system been installed completely or is a ghost system?"); + put("JSystemFileChooser", "Has your operating system been installed completely or is a ghost system?"); put("Jce", "Has your operating system been installed completely or is a ghost system?"); put("couldn't create component peer", "Fucking computer!"); put("sun.awt.shell.Win32ShellFolder2", "crash.user_fault"); @@ -122,7 +123,7 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { void showMessage(String s) { try { - MessageBox.Show(s, "ERROR", MessageBox.ERROR_MESSAGE); + MessageBox.show(s, "ERROR", MessageBox.ERROR_MESSAGE); } catch (Throwable e) { LOGGER.log(Level.SEVERE, "ERROR", e); } @@ -131,7 +132,7 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { private static final HashSet THROWABLE_SET = new HashSet<>(); void reportToServer(final String text, String stacktrace) { - if (THROWABLE_SET.contains(stacktrace)) + if (THROWABLE_SET.contains(stacktrace) || stacktrace.contains("Font")) return; THROWABLE_SET.add(stacktrace); Thread t = new Thread(() -> { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/DefaultPlugin.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/DefaultPlugin.java index f744d9490..096cb3443 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/DefaultPlugin.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/DefaultPlugin.java @@ -17,11 +17,11 @@ */ package org.jackhuang.hellominecraft.launcher.util; +import java.util.ArrayList; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; import org.jackhuang.hellominecraft.launcher.api.IPlugin; import org.jackhuang.hellominecraft.launcher.core.auth.IAuthenticator; import org.jackhuang.hellominecraft.launcher.core.auth.OfflineAuthenticator; -import org.jackhuang.hellominecraft.launcher.core.auth.SkinmeAuthenticator; import org.jackhuang.hellominecraft.launcher.core.auth.UserProfileProvider; import org.jackhuang.hellominecraft.launcher.core.auth.YggdrasilAuthenticator; import org.jackhuang.hellominecraft.launcher.core.launch.LaunchOptions; @@ -37,9 +37,7 @@ import org.jackhuang.hellominecraft.util.func.Consumer; */ public class DefaultPlugin implements IPlugin { - YggdrasilAuthenticator YGGDRASIL_LOGIN = null; - OfflineAuthenticator OFFLINE_LOGIN = null; - SkinmeAuthenticator SKINME_LOGIN = null; + ArrayList auths = new ArrayList<>(); @Override public IMinecraftService provideMinecraftService(Object profile) { @@ -49,20 +47,17 @@ public class DefaultPlugin implements IPlugin { @Override public void onRegisterAuthenticators(Consumer apply) { String clientToken = Settings.getInstance().getClientToken(); - OFFLINE_LOGIN = new OfflineAuthenticator(clientToken); - OFFLINE_LOGIN.onLoadSettings(Settings.getInstance().getAuthenticatorConfig(OFFLINE_LOGIN.id())); - YGGDRASIL_LOGIN = new YggdrasilAuthenticator(clientToken); - YGGDRASIL_LOGIN.onLoadSettings(Settings.getInstance().getAuthenticatorConfig(YGGDRASIL_LOGIN.id())); + auths.add(new OfflineAuthenticator(clientToken)); + auths.add(new YggdrasilAuthenticator(clientToken)); - Runtime.getRuntime().addShutdownHook(new Thread() { - @Override - public void run() { - Settings.getInstance().setAuthenticatorConfig(OFFLINE_LOGIN.id(), OFFLINE_LOGIN.onSaveSettings()); - Settings.getInstance().setAuthenticatorConfig(YGGDRASIL_LOGIN.id(), YGGDRASIL_LOGIN.onSaveSettings()); - } - }); - apply.accept(OFFLINE_LOGIN); - apply.accept(YGGDRASIL_LOGIN); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + for (IAuthenticator i : auths) + Settings.getInstance().setAuthenticatorConfig(i.id(), i.onSaveSettings()); + })); + for (IAuthenticator i : auths) { + i.onLoadSettings(Settings.getInstance().getAuthenticatorConfig(i.id())); + apply.accept(i); + } } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/HMCLMinecraftService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/HMCLMinecraftService.java index b94c4a3aa..756f8d380 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/HMCLMinecraftService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/HMCLMinecraftService.java @@ -29,13 +29,7 @@ import org.jackhuang.hellominecraft.launcher.core.auth.UserProfileProvider; import org.jackhuang.hellominecraft.launcher.core.download.MinecraftDownloadService; import org.jackhuang.hellominecraft.launcher.core.launch.LaunchOptions; import org.jackhuang.hellominecraft.launcher.core.launch.MinecraftLoader; -import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftAssetService; -import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftDownloadService; -import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftInstallerService; -import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftLoader; -import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftModService; -import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftProvider; -import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; +import org.jackhuang.hellominecraft.launcher.core.service.*; import org.jackhuang.hellominecraft.launcher.core.mod.MinecraftModService; import org.jackhuang.hellominecraft.launcher.core.mod.ModpackManager; import org.jackhuang.hellominecraft.launcher.setting.Profile; @@ -60,7 +54,20 @@ public class HMCLMinecraftService extends IMinecraftService { this.provider = new HMCLGameProvider(this); provider.initializeMiencraft(); provider.onRefreshingVersions.register(versionSettings::clear); - provider.onRefreshedVersions.register(this::checkModpack); + provider.onRefreshedVersions.register(() -> { + if (!checkingModpack) { + checkingModpack = true; + if (version().getVersionCount() == 0) { + File modpack = new File("modpack.zip"); + if (modpack.exists()) + SwingUtilities.invokeLater(() -> { + if (TaskWindow.factory().execute(ModpackManager.install(MainFrame.INSTANCE, modpack, this, null))) + version().refreshVersions(); + checkedModpack = true; + }); + } + } + }); provider.onLoadedVersion.register(this::loadVersionSetting); this.mms = new MinecraftModService(this); this.mds = new MinecraftDownloadService(this); @@ -70,21 +77,6 @@ public class HMCLMinecraftService extends IMinecraftService { public boolean checkedModpack = false, checkingModpack = false; - private void checkModpack() { - if (!checkingModpack) { - checkingModpack = true; - if (version().getVersionCount() == 0) { - File modpack = new File("modpack.zip"); - if (modpack.exists()) - SwingUtilities.invokeLater(() -> { - if (TaskWindow.execute(ModpackManager.install(MainFrame.INSTANCE, modpack, this, null))) - version().refreshVersions(); - checkedModpack = true; - }); - } - } - } - private void loadVersionSetting(String id) { if (provider.getVersionById(id) == null) return; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java index 784f64a34..2991788c5 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java @@ -101,7 +101,7 @@ public class AppDataUpgrader extends IUpgrader { @Override public boolean call(Object sender, final VersionNumber number) { ((UpdateChecker) sender).requestDownloadLink().reg(map -> { - if (MessageBox.Show(C.i18n("update.newest_version") + number.firstVer + "." + number.secondVer + "." + number.thirdVer + "\n" + if (MessageBox.show(C.i18n("update.newest_version") + number.firstVer + "." + number.secondVer + "." + number.thirdVer + "\n" + C.i18n("update.should_open_link"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) if (map != null && map.containsKey("pack")) @@ -109,7 +109,7 @@ public class AppDataUpgrader extends IUpgrader { String hash = null; if (map.containsKey("packsha1")) hash = map.get("packsha1"); - if (TaskWindow.factory().append(new AppDataUpgraderTask(map.get("pack"), number.version, hash)).create()) { + if (TaskWindow.factory().append(new AppDataUpgraderTask(map.get("pack"), number.version, hash)).execute()) { new ProcessBuilder(new String[] { IOUtils.getJavaDir(), "-jar", AppDataUpgraderTask.getSelf(number.version).getAbsolutePath() }).directory(new File(".")).start(); System.exit(0); } @@ -130,7 +130,7 @@ public class AppDataUpgrader extends IUpgrader { } catch (URISyntaxException | IOException e) { HMCLog.warn("Failed to browse uri: " + url, e); Utils.setClipborad(url); - MessageBox.Show(C.i18n("update.no_browser")); + MessageBox.show(C.i18n("update.no_browser")); } } }).execute(); @@ -162,7 +162,7 @@ public class AppDataUpgrader extends IUpgrader { } @Override - public void executeTask() throws Exception { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { HashMap json = new HashMap<>(); File f = getSelf(newestVersion); if (!f.getParentFile().exists() && !f.getParentFile().mkdirs()) diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/NewFileUpgrader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/NewFileUpgrader.java index 5c07d76de..daa18e093 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/NewFileUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/NewFileUpgrader.java @@ -48,7 +48,7 @@ public class NewFileUpgrader extends IUpgrader { public boolean call(Object sender, VersionNumber number) { String str = requestDownloadLink(); File newf = new File(FileUtils.getName(str)); - if (TaskWindow.factory().append(new FileDownloadTask(str, newf)).create()) { + if (TaskWindow.factory().append(new FileDownloadTask(str, newf)).execute()) { try { new ProcessBuilder(new String[] { IOUtils.tryGetCanonicalFilePath(newf), "--removeOldLauncher", IOUtils.getRealPath() }).directory(new File(".")).start(); } catch (IOException ex) { diff --git a/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/HelloMinecraftLookAndFeel.java b/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/HelloMinecraftLookAndFeel.java index 868d39df8..cc0dd32cb 100755 --- a/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/HelloMinecraftLookAndFeel.java +++ b/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/HelloMinecraftLookAndFeel.java @@ -18,12 +18,13 @@ package org.jackhuang.hellominecraft.lookandfeel; import java.awt.Color; import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.text.ParseException; import java.util.Map; import javax.swing.UIDefaults; import javax.swing.plaf.synth.SynthLookAndFeel; import org.jackhuang.hellominecraft.util.logging.HMCLog; -import org.jackhuang.hellominecraft.util.NetUtils; +import org.jackhuang.hellominecraft.util.system.IOUtils; /** * @@ -37,7 +38,7 @@ public class HelloMinecraftLookAndFeel extends SynthLookAndFeel { * Creates a new instance of NimbusLookAndFeel * * @throws java.text.ParseException error parsing the xml, it must not - * happen. + * happen. */ public HelloMinecraftLookAndFeel() throws ParseException { this(DEFAULT_SETTINGS); @@ -45,14 +46,18 @@ public class HelloMinecraftLookAndFeel extends SynthLookAndFeel { public HelloMinecraftLookAndFeel(Map settings) throws ParseException { try { - String s = NetUtils.getStreamContent(HelloMinecraftLookAndFeel.class.getResourceAsStream("/org/jackhuang/hellominecraft/lookandfeel/synth.xml"), "UTF-8"); - for (String ss : settings.keySet()) - s = s.replace("${" + ss + "}", settings.get(ss)); - load(new ByteArrayInputStream(s.getBytes("UTF-8")), HelloMinecraftLookAndFeel.class); + try (InputStream is = HelloMinecraftLookAndFeel.class.getResourceAsStream("/org/jackhuang/hellominecraft/lookandfeel/synth.xml")) { + String s = IOUtils.getStreamContent(is, "UTF-8"); + for (Map.Entry ss : settings.entrySet()) + s = s.replace("${" + ss.getKey() + "}", ss.getValue()); + load(new ByteArrayInputStream(s.getBytes("UTF-8")), HelloMinecraftLookAndFeel.class); + } } catch (Throwable ex) { HMCLog.err("This fucking exception should not happen. Retry backup solution.", ex); try { - load(HelloMinecraftLookAndFeel.class.getResourceAsStream("/org/jackhuang/hellominecraft/lookandfeel/synth_backup.xml"), HelloMinecraftLookAndFeel.class); + try (InputStream is = HelloMinecraftLookAndFeel.class.getResourceAsStream("/org/jackhuang/hellominecraft/lookandfeel/synth_backup.xml")) { + load(is, HelloMinecraftLookAndFeel.class); + } } catch (Throwable e) { HMCLog.err("User fault", e); } diff --git a/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/painter/ButtonPainter.java b/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/painter/ButtonPainter.java index 103983a36..304145259 100755 --- a/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/painter/ButtonPainter.java +++ b/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/painter/ButtonPainter.java @@ -42,22 +42,22 @@ import org.jackhuang.hellominecraft.lookandfeel.comp.ConstomButton; public class ButtonPainter extends SynthPainter { private static final String DEFAULT_NORMAL = "D5D5D5"; - private static final Color[] DEFAULT_NORMAL_FG = new Color[] { + private static final Color[] DEFAULT_NORMAL_FG = new Color[]{ GraphicsUtils.getWebColor(DEFAULT_NORMAL), GraphicsUtils.getWebColor(DEFAULT_NORMAL) }; private static final String DEFAULT_PRELIGHT = "A9A9A9"; - private static final Color[] DEFAULT_PRELIGHT_FG = new Color[] { + private static final Color[] DEFAULT_PRELIGHT_FG = new Color[]{ GraphicsUtils.getWebColor(DEFAULT_PRELIGHT), GraphicsUtils.getWebColor(DEFAULT_PRELIGHT) }; private static final String DEFAULT_ACTIVE = "222222"; - private static final Color[] DEFAULT_ACTIVE_FG = new Color[] { + private static final Color[] DEFAULT_ACTIVE_FG = new Color[]{ GraphicsUtils.getWebColor(DEFAULT_ACTIVE), GraphicsUtils.getWebColor(DEFAULT_ACTIVE) }; - private static final Color[] DISABLED_BG = new Color[] { + private static final Color[] DISABLED_BG = new Color[]{ GraphicsUtils.getWebColor("E3EFE9"), GraphicsUtils.getMidWebColor("E3EFE9", "DFE2E6"), GraphicsUtils.getWebColor("DFE2E6"), @@ -68,7 +68,7 @@ public class ButtonPainter extends SynthPainter { GraphicsUtils.getWebColor("D8DBE1"), GraphicsUtils.getWebColor("DADDE3") }; - private static final Color[] DISABLED_FG = new Color[] { + private static final Color[] DISABLED_FG = new Color[]{ GraphicsUtils.getWebColor("C9CCD2"), GraphicsUtils.getWebColor("C9CCD2"), GraphicsUtils.getWebColor("BCBFC5"), @@ -106,8 +106,8 @@ public class ButtonPainter extends SynthPainter { if ((context.getComponentState() & SynthConstants.PRESSED) != 0) if (context.getComponent() instanceof ConstomButton) { ConstomButton c = (ConstomButton) context.getComponent(); - fg = new Color[] { c.activeFg, c.activeFg }; - bg = new Color[] { c.activeFg, c.activeFg }; + fg = new Color[]{c.activeFg, c.activeFg}; + bg = new Color[]{c.activeFg, c.activeFg}; } else { fg = DEFAULT_ACTIVE_FG; bg = DEFAULT_ACTIVE_FG; @@ -122,8 +122,8 @@ public class ButtonPainter extends SynthPainter { return; Color fgs = GraphicsUtils.getMidWebColor(c.normalFg, c.prelightFg, c.drawPercent); Color bgs = GraphicsUtils.getMidWebColor(c.normalBg, c.prelightBg, c.drawPercent); - fg = new Color[] { fgs, fgs }; - bg = new Color[] { bgs, bgs }; + fg = new Color[]{fgs, fgs}; + bg = new Color[]{bgs, bgs}; } else { fg = DEFAULT_PRELIGHT_FG; bg = DEFAULT_PRELIGHT_FG; @@ -134,8 +134,8 @@ public class ButtonPainter extends SynthPainter { return; Color fgs = GraphicsUtils.getMidWebColor(c.normalFg, c.prelightFg, c.drawPercent); Color bgs = GraphicsUtils.getMidWebColor(c.normalBg, c.prelightBg, c.drawPercent); - fg = new Color[] { fgs, fgs }; - bg = new Color[] { bgs, bgs }; + fg = new Color[]{fgs, fgs}; + bg = new Color[]{bgs, bgs}; } else { fg = DEFAULT_NORMAL_FG; bg = DEFAULT_NORMAL_FG; @@ -143,8 +143,8 @@ public class ButtonPainter extends SynthPainter { else if ((context.getComponentState() & SynthConstants.PRESSED) != 0) if (context.getComponent() instanceof ConstomButton) { ConstomButton c = (ConstomButton) context.getComponent(); - fg = new Color[] { c.activeFg, c.activeFg }; - bg = new Color[] { c.activeFg, c.activeFg }; + fg = new Color[]{c.activeFg, c.activeFg}; + bg = new Color[]{c.activeFg, c.activeFg}; } else { fg = DEFAULT_ACTIVE_FG; bg = DEFAULT_ACTIVE_FG; @@ -159,12 +159,12 @@ public class ButtonPainter extends SynthPainter { return; Color fgs = GraphicsUtils.getMidWebColor(c.normalFg, c.prelightFg, c.drawPercent); Color bgs = GraphicsUtils.getMidWebColor(c.normalBg, c.prelightBg, c.drawPercent); - fg = new Color[] { fgs, fgs }; - bg = new Color[] { bgs, bgs }; + fg = new Color[]{fgs, fgs}; + bg = new Color[]{bgs, bgs}; } else if (context.getComponent() instanceof ConstomButton) { ConstomButton c = (ConstomButton) context.getComponent(); - fg = new Color[] { c.prelightFg, c.prelightFg }; - bg = new Color[] { c.prelightBg, c.prelightBg }; + fg = new Color[]{c.prelightFg, c.prelightFg}; + bg = new Color[]{c.prelightBg, c.prelightBg}; } else { fg = DEFAULT_PRELIGHT_FG; bg = DEFAULT_PRELIGHT_FG; @@ -175,8 +175,8 @@ public class ButtonPainter extends SynthPainter { return; Color fgs = GraphicsUtils.getMidWebColor(c.normalFg, c.prelightFg, c.drawPercent); Color bgs = GraphicsUtils.getMidWebColor(c.normalBg, c.prelightBg, c.drawPercent); - fg = new Color[] { fgs, fgs }; - bg = new Color[] { bgs, bgs }; + fg = new Color[]{fgs, fgs}; + bg = new Color[]{bgs, bgs}; } else { fg = DEFAULT_NORMAL_FG; bg = DEFAULT_NORMAL_FG; @@ -207,21 +207,8 @@ public class ButtonPainter extends SynthPainter { Graphics2D g2 = (Graphics2D) g.create(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Color[] fg, bg; - if ((context.getComponentState() & SynthConstants.DEFAULT) != 0) - if ((context.getComponentState() & SynthConstants.PRESSED) != 0 || (context.getComponentState() & SynthConstants.SELECTED) != 0) { - fg = DEFAULT_ACTIVE_FG; - bg = DEFAULT_ACTIVE_FG; - } else if ((context.getComponentState() & SynthConstants.DISABLED) != 0) { - fg = DISABLED_FG; - bg = DISABLED_BG; - } else if ((context.getComponentState() & SynthConstants.MOUSE_OVER) != 0) { - fg = DEFAULT_PRELIGHT_FG; - bg = DEFAULT_PRELIGHT_FG; - } else { - fg = DEFAULT_NORMAL_FG; - bg = DEFAULT_NORMAL_FG; - } - else if ((context.getComponentState() & SynthConstants.PRESSED) != 0 || (context.getComponentState() & SynthConstants.SELECTED) != 0) { + //if ((context.getComponentState() & SynthConstants.DEFAULT) != 0) + if ((context.getComponentState() & SynthConstants.PRESSED) != 0 || (context.getComponentState() & SynthConstants.SELECTED) != 0) { fg = DEFAULT_ACTIVE_FG; bg = DEFAULT_ACTIVE_FG; } else if ((context.getComponentState() & SynthConstants.DISABLED) != 0) { @@ -234,6 +221,19 @@ public class ButtonPainter extends SynthPainter { fg = DEFAULT_NORMAL_FG; bg = DEFAULT_NORMAL_FG; } + /*else if ((context.getComponentState() & SynthConstants.PRESSED) != 0 || (context.getComponentState() & SynthConstants.SELECTED) != 0) { + fg = DEFAULT_ACTIVE_FG; + bg = DEFAULT_ACTIVE_FG; + } else if ((context.getComponentState() & SynthConstants.DISABLED) != 0) { + fg = DISABLED_FG; + bg = DISABLED_BG; + } else if ((context.getComponentState() & SynthConstants.MOUSE_OVER) != 0) { + fg = DEFAULT_PRELIGHT_FG; + bg = DEFAULT_PRELIGHT_FG; + } else { + fg = DEFAULT_NORMAL_FG; + bg = DEFAULT_NORMAL_FG; + }*/ g2.setColor(fg[0]); Rectangle2D fgshape = new Rectangle2D.Float(x, y, w, h); g2.draw(fgshape); diff --git a/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/ui/ComboBoxUI.java b/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/ui/ComboBoxUI.java index 939865504..2fb6b0eb9 100755 --- a/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/ui/ComboBoxUI.java +++ b/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/ui/ComboBoxUI.java @@ -18,6 +18,8 @@ import java.awt.Container; import java.awt.image.BufferedImage; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; +import javax.swing.plaf.basic.BasicComboPopup; +import javax.swing.plaf.basic.ComboPopup; /** * NimbusComboBoxUI @@ -87,6 +89,13 @@ public class ComboBoxUI extends BasicComboBoxUI implements MouseListener { return new Dimension(size); } + @Override + protected ComboPopup createPopup() { + BasicComboPopup p = new BasicComboPopup(comboBox); + //p.setPopupSize(100, comboBox.getPreferredSize().height); + return p; + } + @Override protected JButton createArrowButton() { JButton button = new JButton() { @@ -101,8 +110,8 @@ public class ComboBoxUI extends BasicComboBoxUI implements MouseListener { else if (mouseInside) img = COMBO_OVER; g.drawImage(img, - 0, 0, getWidth(), getHeight(), - 0, 0, img.getWidth(), img.getHeight(), comboBox); + 0, 0, getWidth(), getHeight(), + 0, 0, img.getWidth(), img.getHeight(), comboBox); } } }; @@ -141,14 +150,14 @@ public class ComboBoxUI extends BasicComboBoxUI implements MouseListener { else if (mouseInside) img = COMBO_OVER; g.drawImage(img, - bounds.x, bounds.y, bounds.x + 4, bounds.y + bounds.height, - 0, 0, 1, 26, comboBox); + bounds.x, bounds.y, bounds.x + 4, bounds.y + bounds.height, + 0, 0, 1, 26, comboBox); g.drawImage(img, - bounds.x + 1, bounds.y, bounds.x + bounds.width - 25, bounds.y + bounds.height, - 1, 0, 3, 26, comboBox); + bounds.x + 1, bounds.y, bounds.x + bounds.width - 25, bounds.y + bounds.height, + 1, 0, 3, 26, comboBox); g.drawImage(img, - bounds.x + bounds.width - 25, bounds.y, bounds.x + bounds.width, bounds.y + bounds.height, - 4, 0, 29, 26, comboBox); + bounds.x + bounds.width - 25, bounds.y, bounds.x + bounds.width, bounds.y + bounds.height, + 4, 0, 29, 26, comboBox); } else { /*g.setColor(Color.WHITE); g.fillRect(bounds.x, bounds.y, bounds.width - btnSize.width, bounds.height - 1); @@ -257,23 +266,25 @@ public class ComboBoxUI extends BasicComboBoxUI implements MouseListener { @Override public void layoutContainer(Container parent) { - JComboBox cb = (JComboBox) parent; - int width = cb.getWidth(); + if (parent instanceof JComboBox) { + JComboBox cb = (JComboBox) parent; + int width = cb.getWidth(); - Insets insets = getInsets(); - Rectangle cvb; + Insets insets = getInsets(); + Rectangle cvb; - if (arrowButton != null) - if (cb.getComponentOrientation().isLeftToRight()) - arrowButton.setBounds(width - (insets.right + btnSize.width), - insets.top, - btnSize.width, btnSize.height); - else - arrowButton.setBounds(insets.left, insets.top, - btnSize.width, btnSize.height); - if (editor != null) { - cvb = rectangleForCurrentValue(); - editor.setBounds(cvb.x, cvb.y, cvb.width, cvb.height); + if (arrowButton != null) + if (cb.getComponentOrientation().isLeftToRight()) + arrowButton.setBounds(width - (insets.right + btnSize.width), + insets.top, + btnSize.width, btnSize.height); + else + arrowButton.setBounds(insets.left, insets.top, + btnSize.width, btnSize.height); + if (editor != null) { + cvb = rectangleForCurrentValue(); + editor.setBounds(cvb.x, cvb.y, cvb.width, cvb.height); + } } } } diff --git a/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/ui/ScrollButton.java b/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/ui/ScrollButton.java index 337e81ccc..9387ceeba 100755 --- a/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/ui/ScrollButton.java +++ b/HMCLaF/src/main/java/org/jackhuang/hellominecraft/lookandfeel/ui/ScrollButton.java @@ -35,7 +35,7 @@ import java.awt.Graphics; * @author Created by Jasper Potts (Jan 17, 2007) * @version 1.0 */ -public class ScrollButton extends MetalScrollButton implements SwingConstants { +public class ScrollButton extends MetalScrollButton { private final int btnWidth, btnHeight; diff --git a/HMCSM/build.gradle b/HMCSM/build.gradle index ba1d513c5..81d9214a8 100755 --- a/HMCSM/build.gradle +++ b/HMCSM/build.gradle @@ -21,7 +21,7 @@ buildscript { mavenCentral(); dependencies { classpath 'edu.sc.seis.gradle:launch4j:1.0.6' - classpath 'me.tatarka:gradle-retrolambda:3.1.0' + classpath 'me.tatarka:gradle-retrolambda:3.4.0' } } } diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/Main.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/Main.java index 2239ea798..a9dfef364 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/Main.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/Main.java @@ -56,7 +56,7 @@ public class Main { } catch (ParseException | UnsupportedLookAndFeelException ex) { HMCLog.warn("Failed to set look and feel", ex); } - UPDATE_CHECKER.process(false).reg(t -> MessageBox.Show("发现更新!" + t.version)).execute(); + UPDATE_CHECKER.process(false).reg(t -> MessageBox.show("发现更新!" + t.version)).execute(); new MainWindow().setVisible(true); } catch (Throwable t) { HMCLog.err("There's something wrong when running server holder.", t); diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java index 3c01366cb..9776cae63 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java @@ -41,7 +41,6 @@ import org.jackhuang.hellominecraft.util.code.DigestUtils; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.MessageBox; -import org.jackhuang.hellominecraft.util.NetUtils; import org.jackhuang.hellominecraft.util.StrUtils; import org.jackhuang.hellominecraft.util.tasks.TaskWindow; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; @@ -67,7 +66,7 @@ public class ForgeInstaller { ZipFile zipFile = new ZipFile(forgeInstaller); ZipEntry entry = zipFile.getEntry("install_profile.json"); - String content = NetUtils.getStreamContent(zipFile.getInputStream(entry)); + String content = IOUtils.getStreamContent(zipFile.getInputStream(entry)); InstallProfile profile = gson.fromJson(content, InstallProfile.class); HMCLog.log("Extracting cauldron server pack..." + profile.install.filePath); @@ -88,8 +87,8 @@ public class ForgeInstaller { File minecraftserver = new File(gameDir, "minecraft_server." + profile.install.minecraft + ".jar"); if (minecraftserver.exists() && JOptionPane.showConfirmDialog(null, "已发现官方服务端文件,是否要重新下载?") == JOptionPane.YES_OPTION) if (!TaskWindow.factory().append(new FileDownloadTask("https://s3.amazonaws.com/Minecraft.Download/versions/{MCVER}/minecraft_server.{MCVER}.jar".replace("{MCVER}", profile.install.minecraft), - minecraftserver).setTag("minecraft_server")).create()) - MessageBox.Show("Minecraft官方服务端下载失败!"); + minecraftserver).setTag("minecraft_server")).execute()) + MessageBox.show("Minecraft官方服务端下载失败!"); TaskWindow.TaskWindowFactory tw = TaskWindow.factory(); for (MinecraftLibrary library : profile.versionInfo.libraries) { library.init(); @@ -99,8 +98,8 @@ public class ForgeInstaller { libURL = library.url; tw.append(new FileDownloadTask(libURL + library.formatted.replace("\\", "/"), lib).setTag(library.name)); } - if (!tw.create()) - MessageBox.Show("压缩库下载失败!"); + if (!tw.execute()) + MessageBox.show("压缩库下载失败!"); tw = TaskWindow.factory(); for (MinecraftLibrary library : profile.versionInfo.libraries) { @@ -114,8 +113,8 @@ public class ForgeInstaller { libURL = library.url; tw.append(new FileDownloadTask(libURL + library.formatted.replace("\\", "/"), lib).setTag(library.name)); } - if (!tw.create()) - MessageBox.Show("库下载失败!"); + if (!tw.execute()) + MessageBox.show("库下载失败!"); ArrayList badLibs = new ArrayList<>(); for (MinecraftLibrary library : profile.versionInfo.libraries) { @@ -123,7 +122,7 @@ public class ForgeInstaller { File packFile = new File(gameDir, "libraries" + File.separator + library.formatted + ".pack.xz"); if (packFile.exists() && packFile.isFile()) try { - unpackLibrary(lib.getParentFile(), NetUtils.getBytesFromStream(FileUtils.openInputStream(packFile))); + unpackLibrary(lib.getParentFile(), IOUtils.getBytesFromStream(FileUtils.openInputStream(packFile))); if (!checksumValid(lib, Arrays.asList(library.checksums))) badLibs.add(library.name); } catch (IOException e) { @@ -132,7 +131,7 @@ public class ForgeInstaller { } } if (badLibs.size() > 0) - MessageBox.Show("这些库在解压的时候出现了问题" + badLibs.toString()); + MessageBox.show("这些库在解压的时候出现了问题" + badLibs.toString()); } public static void unpackLibrary(File output, byte[] data) @@ -166,7 +165,7 @@ public class ForgeInstaller { private static boolean checksumValid(File libPath, List checksums) { try { - byte[] fileData = NetUtils.getBytesFromStream(FileUtils.openInputStream(libPath)); + byte[] fileData = IOUtils.getBytesFromStream(FileUtils.openInputStream(libPath)); boolean valid = (checksums == null) || (checksums.isEmpty()) || (checksums.contains(DigestUtils.sha1Hex(fileData))); if ((!valid) && (libPath.getName().endsWith(".jar"))) valid = validateJar(libPath, fileData, checksums); diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/server/BackupManager.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/server/BackupManager.java index 0753a6579..6e00831fd 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/server/BackupManager.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/server/BackupManager.java @@ -22,7 +22,7 @@ import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import org.jackhuang.hellominecraft.util.logging.HMCLog; -import org.jackhuang.hellominecraft.util.system.Compressor; +import org.jackhuang.hellominecraft.util.system.CompressingUtils; import org.jackhuang.hellominecraft.svrmgr.setting.SettingsManager; import org.jackhuang.hellominecraft.svrmgr.util.Utilities; import org.jackhuang.hellominecraft.util.func.Consumer; @@ -50,7 +50,7 @@ public class BackupManager { public void run() { try { SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); - Compressor.zip(Utilities.getGameDir() + folder + File.separator, + CompressingUtils.zip(Utilities.getGameDir() + folder + File.separator, backupDir() + "world+" + f.format(new Date()) + "+" + folder + ".zip"); } catch (IOException ex) { HMCLog.warn("Failed to compress world pack.", ex); @@ -79,7 +79,7 @@ public class BackupManager { File world = new File(Utilities.getGameDir() + folder + File.separator); FileUtils.deleteDirectoryQuietly(world); world.mkdirs(); - Compressor.unzip(backupFile, world); + CompressingUtils.unzip(backupFile, world); } catch (IOException ex) { HMCLog.warn("Failed to decompress world pack.", ex); } @@ -99,7 +99,7 @@ public class BackupManager { public void run() { try { SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); - Compressor.zip(Utilities.getGameDir() + "plugins" + File.separator, + CompressingUtils.zip(Utilities.getGameDir() + "plugins" + File.separator, backupDir() + "plugin+" + f.format(new Date()) + "+plugins.zip"); } catch (IOException ex) { HMCLog.warn("Failed to compress world pack with plugins.", ex); diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/server/Server.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/server/Server.java index 52bf0a34a..7c55aa46a 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/server/Server.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/server/Server.java @@ -235,7 +235,7 @@ public class Server implements Event, MonitorThread.MonitorThreadListen try { run(); } catch (IOException ex) { - MessageBox.Show("重启失败!"); + MessageBox.show("重启失败!"); HMCLog.warn("Failed to launch!", ex); } isRestart = false; diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java index d1cd4f674..b5f37d057 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java @@ -2975,7 +2975,7 @@ public final class MainWindow extends javax.swing.JFrame } @Override - public void executeTask() { + public void executeTask(boolean areDependTasksSucceeded) { javax.swing.JTable table = MainWindow.this.lstDownloads; DefaultTableModel model = (DefaultTableModel) table.getModel(); @@ -2999,7 +2999,7 @@ public final class MainWindow extends javax.swing.JFrame void refreshDownloads() { clearListDownloads(); - TaskWindow.factory().append(new RefreshDownloadsDone()).create(); + TaskWindow.factory().append(new RefreshDownloadsDone()).execute(); } void refreshInfos() { @@ -3092,7 +3092,7 @@ public final class MainWindow extends javax.swing.JFrame lstPlayers.setModel(lstPlayersModel); }); else - MessageBox.Show("服务器未开启!"); + MessageBox.show("服务器未开启!"); } class ServerBeginListener implements Event { @@ -3137,7 +3137,7 @@ public final class MainWindow extends javax.swing.JFrame else if (option == JOptionPane.NO_OPTION) FileUtils.write(eula, "eula=false"); } catch (IOException e) { - MessageBox.Show("确认rula失败"); + MessageBox.show("确认rula失败"); } } File serverproperties = new File(new File(SettingsManager.settings.mainjar).getParentFile(), "server.properties"); @@ -3164,7 +3164,7 @@ public final class MainWindow extends javax.swing.JFrame try { Server.getInstance().run(); } catch (IOException ex) { - MessageBox.Show("启动服务端失败!"); + MessageBox.show("启动服务端失败!"); HMCLog.err("Failed to launch!", ex); } }//GEN-LAST:event_btnLaunchActionPerformed @@ -3335,7 +3335,7 @@ public final class MainWindow extends javax.swing.JFrame op.saveAsBoth(new File(dir, "ops.txt"), new File(dir, "ops.json")); } catch (IOException ex) { HMCLog.warn("Failed to save ops", ex); - MessageBox.Show("添加失败。。。"); + MessageBox.show("添加失败。。。"); } } }//GEN-LAST:event_btnAddOPActionPerformed @@ -3355,7 +3355,7 @@ public final class MainWindow extends javax.swing.JFrame op.saveAsBoth(new File(dir, "ops.txt"), new File(dir, "ops.json")); } catch (IOException ex) { HMCLog.warn("Failed to save ops", ex); - MessageBox.Show("删除失败。。。"); + MessageBox.show("删除失败。。。"); } } }//GEN-LAST:event_btnDeleteOPActionPerformed @@ -3374,7 +3374,7 @@ public final class MainWindow extends javax.swing.JFrame whitelist.saveAsBoth(new File(dir, "white-list.txt"), new File(dir, "white-list.json")); } catch (IOException ex) { HMCLog.warn("Failed to save white-list", ex); - MessageBox.Show("添加失败。。。"); + MessageBox.show("添加失败。。。"); } } }//GEN-LAST:event_btnAddWhiteActionPerformed @@ -3394,7 +3394,7 @@ public final class MainWindow extends javax.swing.JFrame whitelist.saveAsBoth(new File(dir, "white-list.txt"), new File(dir, "white-list.json")); } catch (IOException ex) { HMCLog.warn("Failed to save white-list", ex); - MessageBox.Show("删除失败。。。"); + MessageBox.show("删除失败。。。"); } } }//GEN-LAST:event_btnDeleteWhiteActionPerformed @@ -3421,7 +3421,7 @@ public final class MainWindow extends javax.swing.JFrame model.addRow(new Object[] { fc.getSelectedFile().getName(), ModType.getModTypeShowName(ModType.getModType(newf)) }); lstExternalMods.updateUI(); } catch (IOException e) { - MessageBox.Show(C.i18n("mods.failed")); + MessageBox.show(C.i18n("mods.failed")); HMCLog.warn("Failed to add ext mods", e); } }//GEN-LAST:event_btnAddExternelModActionPerformed @@ -3460,7 +3460,7 @@ public final class MainWindow extends javax.swing.JFrame model.addRow(new Object[] { fc.getSelectedFile().getName(), ModType.getModTypeShowName(ModType.getModType(newf)) }); FileUtils.copyFile(new File(path), newf); } catch (IOException e) { - MessageBox.Show(C.i18n("mods.failed")); + MessageBox.show(C.i18n("mods.failed")); HMCLog.warn("Failed to add ext core mod.", e); } }//GEN-LAST:event_btnAddExternelCoreModActionPerformed @@ -3500,7 +3500,7 @@ public final class MainWindow extends javax.swing.JFrame model.addRow(new Object[] { fc.getSelectedFile().getName(), ModType.getModTypeShowName(ModType.getModType(newf)) }); FileUtils.copyFile(new File(path), newf); } catch (IOException e) { - MessageBox.Show(C.i18n("mods.failed")); + MessageBox.show(C.i18n("mods.failed")); HMCLog.warn("Failed to add plugin", e); } }//GEN-LAST:event_btnAddPluginsActionPerformed @@ -3566,7 +3566,7 @@ public final class MainWindow extends javax.swing.JFrame whitelist.saveAsBoth(new File(dir, "banned-players.txt"), new File(dir, "banned-players.json")); } catch (IOException ex) { HMCLog.warn("Failed to save banned-players", ex); - MessageBox.Show(C.i18n("mods.failed")); + MessageBox.show(C.i18n("mods.failed")); } } }//GEN-LAST:event_btnAddBanActionPerformed @@ -3606,7 +3606,7 @@ public final class MainWindow extends javax.swing.JFrame resizeBackgroundLabel(); } catch (IOException e) { HMCLog.warn("Failed to set background path", e); - MessageBox.Show(C.i18n("ui.label.failed_set") + e.getMessage()); + MessageBox.show(C.i18n("ui.label.failed_set") + e.getMessage()); } }//GEN-LAST:event_btnSetBackgroundPathActionPerformed @@ -3628,7 +3628,7 @@ public final class MainWindow extends javax.swing.JFrame s.per = Double.parseDouble(txtTimerTaskPeriod.getText()); } catch (NumberFormatException e) { HMCLog.warn("Failed to parse double: " + txtTimerTaskPeriod.getText(), e); - MessageBox.Show("错误的间隔时间"); + MessageBox.show("错误的间隔时间"); return; } SettingsManager.settings.schedules.add(s); @@ -3720,7 +3720,7 @@ public final class MainWindow extends javax.swing.JFrame serverjar.delete(); String downloadURL = url + "minecraft_server." + id + ".jar"; - TaskWindow.factory().append(new FileDownloadTask(downloadURL, serverjar).setTag(id)).create(); + TaskWindow.factory().append(new FileDownloadTask(downloadURL, serverjar).setTag(id)).execute(); }//GEN-LAST:event_btnMinecraftServerDownloadActionPerformed private void btnRefreshInfosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshInfosActionPerformed @@ -3783,7 +3783,7 @@ public final class MainWindow extends javax.swing.JFrame txtCrashReport.setText(content); } catch (IOException ex) { HMCLog.warn("Failed to get crash-report.", ex); - MessageBox.Show("无法获取崩溃报告"); + MessageBox.show("无法获取崩溃报告"); } }//GEN-LAST:event_btnShowReportActionPerformed @@ -3855,7 +3855,7 @@ public final class MainWindow extends javax.swing.JFrame BukkitVersion v = cb.get(idx); File file = new File("craftbukkit-" + ext + "-" + v.version + ".jar"); TaskWindow.factory().append(new FileDownloadTask(v.downloadLink, IOUtils.tryGetCanonicalFile(file)).setTag("bukkit-" + ext + "-" + v.version)) - .create(); + .execute(); }//GEN-LAST:event_btnDownloadCraftbukkitActionPerformed private void btnDownloadMCPCActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDownloadMCPCActionPerformed @@ -3866,8 +3866,8 @@ public final class MainWindow extends javax.swing.JFrame String url; File filepath = new File("forge-installer.jar"); url = v.installer[1]; - if (!TaskWindow.factory().append(new FileDownloadTask(url, filepath).setTag("cauldron-" + v.ver)).create()) - MessageBox.Show(C.i18n("install.failed_download_forge")); + if (!TaskWindow.factory().append(new FileDownloadTask(url, filepath).setTag("cauldron-" + v.ver)).execute()) + MessageBox.show(C.i18n("install.failed_download_forge")); else installMCPC(filepath); }//GEN-LAST:event_btnDownloadMCPCActionPerformed @@ -3876,10 +3876,10 @@ public final class MainWindow extends javax.swing.JFrame try { ForgeInstaller installer = new ForgeInstaller(new File("."), filepath); installer.install(); - MessageBox.Show(C.i18n("install.success")); + MessageBox.show(C.i18n("install.success")); } catch (Exception e) { HMCLog.warn("Failed to install liteloader", e); - MessageBox.Show(C.i18n("install.failed_forge")); + MessageBox.show(C.i18n("install.failed_forge")); } } @@ -3907,7 +3907,7 @@ public final class MainWindow extends javax.swing.JFrame private void btnInstallMCPCActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnInstallMCPCActionPerformed File filepath = new File("forge-installer.jar"); if (!filepath.exists()) { - MessageBox.Show("您还未下载Cauldron!请点击下载按钮下载并自动安装!"); + MessageBox.show("您还未下载Cauldron!请点击下载按钮下载并自动安装!"); return; } installMCPC(filepath); diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/PluginInfoDialog.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/PluginInfoDialog.java index 02f69435c..3ec5868a5 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/PluginInfoDialog.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/PluginInfoDialog.java @@ -234,7 +234,7 @@ public class PluginInfoDialog extends javax.swing.JDialog { TaskWindow.factory() .append(new FileDownloadTask(url, new File(Utilities.getGameDir() + "plugins" + File.separator + pi.versions.get(index).filename))) - .create(); + .execute(); }//GEN-LAST:event_jButton1ActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/util/FolderOpener.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/util/FolderOpener.java index 31598d168..4eeeb96d9 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/util/FolderOpener.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/util/FolderOpener.java @@ -32,7 +32,7 @@ public class FolderOpener { f.mkdirs(); java.awt.Desktop.getDesktop().open(f); } catch (Exception ex) { - MessageBox.Show("无法打开资源管理器: " + ex.getMessage()); + MessageBox.show("无法打开资源管理器: " + ex.getMessage()); } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ArrayUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ArrayUtils.java index a127bd7fc..e5b4a4651 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ArrayUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ArrayUtils.java @@ -18,7 +18,6 @@ package org.jackhuang.hellominecraft.util; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Map; @@ -26,7 +25,10 @@ import java.util.Map; * * @author huangyuhui */ -public class ArrayUtils { +public final class ArrayUtils { + + private ArrayUtils() { + } public static boolean isEmpty(T[] array) { return array == null || array.length <= 0; @@ -72,42 +74,20 @@ public class ArrayUtils { return -1; } - public static ArrayList merge(List a, List b) { + public static ArrayList merge(List a, List b) { ArrayList al = new ArrayList(a.size() + b.size()); al.addAll(a); al.addAll(b); return al; } - public static K getEnd(K[] k) { - if (k == null) - return null; - else - return k[k.length - 1]; - } - public static List tryGetMapWithList(Map map, String key) { List l = (List) map.get(key); if (l == null) map.put(key, l = new ArrayList()); return l; } - - public static int matchArray(T[] a, T[] b) { - for (int i = 0; i < a.length - b.length; i++) { - int j = 1; - for (int k = 0; k < b.length; k++) { - if (b[k].equals(a[(i + k)])) - continue; - j = 0; - break; - } - if (j != 0) - return i; - } - return -1; - } - + public static int matchArray(byte[] a, byte[] b) { for (int i = 0; i < a.length - b.length; i++) { int j = 1; @@ -122,19 +102,4 @@ public class ArrayUtils { } return -1; } - - public static boolean equals(T[] a, T[] b) { - if (a == null && b == null) - return true; - if (a == null || b == null) - return false; - if (a.length != b.length) - return false; - Arrays.sort(a); - Arrays.sort(b); - for (int i = 0; i < a.length; i++) - if (a[i] == null && b[i] != null || a[i] != null && b[i] == null || !a[i].equals(b[i])) - return false; - return true; - } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/CollectionUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/CollectionUtils.java index 9f8284ae5..29a4ecb59 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/CollectionUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/CollectionUtils.java @@ -28,6 +28,9 @@ import java.util.Iterator; */ public final class CollectionUtils { + private CollectionUtils() { + } + public static ArrayList map(Collection coll, Predicate p) { ArrayList newColl = new ArrayList<>(); for (T t : coll) diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MathUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MathUtils.java index 18e605482..ffb49dadf 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MathUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MathUtils.java @@ -21,7 +21,10 @@ package org.jackhuang.hellominecraft.util; * * @author huang */ -public class MathUtils { +public final class MathUtils { + + private MathUtils() { + } public static int parseInt(String s, int def) { try { diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java index d3fd908f6..6c4aaad5e 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MessageBox.java @@ -92,7 +92,7 @@ public class MessageBox { * * @return user operation. */ - public static int Show(String Msg, String Title, int Option) { + public static int show(String Msg, String Title, int Option) { switch (Option) { case YES_NO_OPTION: case YES_NO_CANCEL_OPTION: @@ -112,8 +112,8 @@ public class MessageBox { * * @return User Operation */ - public static int Show(String Msg, int Option) { - return Show(Msg, TITLE, Option); + public static int show(String Msg, int Option) { + return show(Msg, TITLE, Option); } /** @@ -123,11 +123,11 @@ public class MessageBox { * * @return User Operation */ - public static int Show(String Msg) { - return Show(Msg, TITLE, INFORMATION_MESSAGE); + public static int show(String Msg) { + return show(Msg, TITLE, INFORMATION_MESSAGE); } - public static int ShowLocalized(String msg) { - return Show(C.i18n(msg)); + public static int showLocalized(String msg) { + return show(C.i18n(msg)); } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MinecraftVersionRequest.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MinecraftVersionRequest.java index d983903e2..c353aef84 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MinecraftVersionRequest.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/MinecraftVersionRequest.java @@ -22,15 +22,15 @@ import java.io.IOException; import java.io.Serializable; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; -import org.jackhuang.hellominecraft.util.ArrayUtils; -import org.jackhuang.hellominecraft.util.NetUtils; +import org.jackhuang.hellominecraft.util.system.IOUtils; /** * @author huangyuhui */ public class MinecraftVersionRequest implements Serializable { + + private static final long serialVersionUID = 1L; public static final int UNKOWN = 0, INVALID = 1, INVALID_JAR = 2, MODIFIED = 3, OK = 4, NOT_FOUND = 5, UNREADABLE = 6, NOT_FILE = 7; @@ -38,34 +38,25 @@ public class MinecraftVersionRequest implements Serializable { public String version; public static String getResponse(MinecraftVersionRequest minecraftVersion) { - String text = ""; switch (minecraftVersion.type) { case MinecraftVersionRequest.INVALID: - text = C.i18n("minecraft.invalid"); - break; + return C.i18n("minecraft.invalid"); case MinecraftVersionRequest.INVALID_JAR: - text = C.i18n("minecraft.invalid_jar"); - break; + return C.i18n("minecraft.invalid_jar"); case MinecraftVersionRequest.NOT_FILE: - text = C.i18n("minecraft.not_a_file"); - break; + return C.i18n("minecraft.not_a_file"); case MinecraftVersionRequest.NOT_FOUND: - text = C.i18n("minecraft.not_found"); - break; + return C.i18n("minecraft.not_found"); case MinecraftVersionRequest.UNREADABLE: - text = C.i18n("minecraft.not_readable"); - break; + return C.i18n("minecraft.not_readable"); case MinecraftVersionRequest.MODIFIED: - text = C.i18n("minecraft.modified") + " "; + return C.i18n("minecraft.modified") + ' ' + minecraftVersion.version; case MinecraftVersionRequest.OK: - text += minecraftVersion.version; - break; + return minecraftVersion.version; case MinecraftVersionRequest.UNKOWN: default: - text = "???"; - break; + return "???"; } - return text; } private static int lessThan32(byte[] b, int x) { @@ -77,11 +68,11 @@ public class MinecraftVersionRequest implements Serializable { private static MinecraftVersionRequest getVersionOfOldMinecraft(ZipFile file, ZipEntry entry) throws IOException { MinecraftVersionRequest r = new MinecraftVersionRequest(); - byte[] tmp = NetUtils.getBytesFromStream(file.getInputStream(entry)); + byte[] tmp = IOUtils.getBytesFromStream(file.getInputStream(entry)); byte[] bytes = "Minecraft Minecraft ".getBytes("ASCII"); - int j; - if ((j = ArrayUtils.matchArray(tmp, bytes)) < 0) { + int j = ArrayUtils.matchArray(tmp, bytes); + if (j < 0) { r.type = MinecraftVersionRequest.UNKOWN; return r; } @@ -101,7 +92,7 @@ public class MinecraftVersionRequest implements Serializable { private static MinecraftVersionRequest getVersionOfNewMinecraft(ZipFile file, ZipEntry entry) throws IOException { MinecraftVersionRequest r = new MinecraftVersionRequest(); - byte[] tmp = NetUtils.getBytesFromStream(file.getInputStream(entry)); + byte[] tmp = IOUtils.getBytesFromStream(file.getInputStream(entry)); byte[] str = "-server.txt".getBytes("ASCII"); int j = ArrayUtils.matchArray(tmp, str); @@ -145,7 +136,7 @@ public class MinecraftVersionRequest implements Serializable { while (tmp[k] >= 48 && tmp[k] <= 57 || tmp[k] == (int) '-' || tmp[k] == (int) '.' || tmp[k] >= 97 && tmp[k] <= (int) 'z') k--; k++; - r.version = new String(tmp, k, i - k + 1); + r.version = new String(tmp, k, i - k + 1, "ASCII"); } r.type = file.getEntry("META-INF/MANIFEST.MF") == null ? MinecraftVersionRequest.MODIFIED : MinecraftVersionRequest.OK; @@ -166,27 +157,27 @@ public class MinecraftVersionRequest implements Serializable { r.type = MinecraftVersionRequest.UNREADABLE; return r; } - ZipFile localZipFile = null; + ZipFile f = null; try { - localZipFile = new ZipFile(file); - ZipEntry minecraft = localZipFile + f = new ZipFile(file); + ZipEntry minecraft = f .getEntry("net/minecraft/client/Minecraft.class"); if (minecraft != null) - return getVersionOfOldMinecraft(localZipFile, minecraft); - ZipEntry main = localZipFile.getEntry("net/minecraft/client/main/Main.class"); - ZipEntry minecraftserver = localZipFile.getEntry("net/minecraft/server/MinecraftServer.class"); + return getVersionOfOldMinecraft(f, minecraft); + ZipEntry main = f.getEntry("net/minecraft/client/main/Main.class"); + ZipEntry minecraftserver = f.getEntry("net/minecraft/server/MinecraftServer.class"); if ((main != null) && (minecraftserver != null)) - return getVersionOfNewMinecraft(localZipFile, minecraftserver); + return getVersionOfNewMinecraft(f, minecraftserver); r.type = MinecraftVersionRequest.INVALID; return r; - } catch (IOException localException) { - HMCLog.warn("Zip file is invalid", localException); + } catch (IOException e) { + HMCLog.warn("Zip file is invalid", e); r.type = MinecraftVersionRequest.INVALID_JAR; return r; } finally { - if (localZipFile != null) + if (f != null) try { - localZipFile.close(); + f.close(); } catch (IOException ex) { HMCLog.warn("Failed to close zip file", ex); } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java index adc12fd31..8839fbebf 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/NetUtils.java @@ -18,10 +18,8 @@ package org.jackhuang.hellominecraft.util; import org.jackhuang.hellominecraft.util.logging.HMCLog; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; @@ -35,38 +33,16 @@ import org.jackhuang.hellominecraft.util.system.IOUtils; * @author huang */ public final class NetUtils { - - public static byte[] getBytesFromStream(InputStream is) throws IOException { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - IOUtils.copyStream(is, out); - is.close(); - return out.toByteArray(); - } - - public static String getStreamContent(InputStream is) throws IOException { - return getStreamContent(is, DEFAULT_CHARSET); - } - - public static String getStreamContent(InputStream is, String encoding) - throws IOException { - if (is == null) - return null; - StringBuilder sb = new StringBuilder(); - try (InputStreamReader br = new InputStreamReader(is, encoding)) { - int len; - char[] buf = new char[16384]; - while ((len = br.read(buf)) != -1) - sb.append(buf, 0, len); - } - return sb.toString(); + + private NetUtils() { } public static String get(String url, String encoding) throws IOException { - return getStreamContent(new URL(url).openConnection().getInputStream()); + return IOUtils.getStreamContent(new URL(url).openConnection().getInputStream()); } public static String get(String url) throws IOException { - return get(url, DEFAULT_CHARSET); + return get(url, IOUtils.DEFAULT_CHARSET); } public static String get(URL url) throws IOException { @@ -74,7 +50,7 @@ public final class NetUtils { } public static String get(URL url, Proxy proxy) throws IOException { - return getStreamContent(url.openConnection(proxy).getInputStream()); + return IOUtils.getStreamContent(url.openConnection(proxy).getInputStream()); } public static String post(URL u, Map params) throws IOException { @@ -104,7 +80,7 @@ public final class NetUtils { con.setConnectTimeout(30000); con.setReadTimeout(30000); con.setRequestProperty("Content-Type", contentType + "; charset=utf-8"); - byte[] bytes = post.getBytes(DEFAULT_CHARSET); + byte[] bytes = post.getBytes(IOUtils.DEFAULT_CHARSET); con.setRequestProperty("Content-Length", "" + bytes.length); con.connect(); OutputStream os = null; @@ -119,19 +95,17 @@ public final class NetUtils { InputStream is = null; try { is = con.getInputStream(); - result = getStreamContent(is); + result = IOUtils.getStreamContent(is); } catch (IOException ex) { IOUtils.closeQuietly(is); is = con.getErrorStream(); - result = getStreamContent(is); + result = IOUtils.getStreamContent(is); } con.disconnect(); return result; } - private static final String DEFAULT_CHARSET = "UTF-8"; - public static URL constantURL(String url) { try { return new URL(url); diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/OverridableSwingWorker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/OverridableSwingWorker.java index b02735a6e..11852942d 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/OverridableSwingWorker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/OverridableSwingWorker.java @@ -20,6 +20,7 @@ package org.jackhuang.hellominecraft.util; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import javax.swing.SwingWorker; import org.jackhuang.hellominecraft.util.func.Consumer; @@ -47,13 +48,13 @@ public abstract class OverridableSwingWorker extends SwingWorker { } public OverridableSwingWorker reg(Consumer c) { - Utils.requireNonNull(c); + Objects.requireNonNull(c); processListeners.add(c); return this; } public OverridableSwingWorker regDone(Runnable c) { - Utils.requireNonNull(c); + Objects.requireNonNull(c); doneListeners.add(c); return this; } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/StrUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/StrUtils.java index f2ec6038f..d18dede06 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/StrUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/StrUtils.java @@ -33,6 +33,9 @@ import org.jackhuang.hellominecraft.util.func.Predicate; * @author huang */ public final class StrUtils { + + private StrUtils() { + } public static String substring(String src, int start_idx, int end_idx) { byte[] b = src.getBytes(); diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java index e440e0995..77bb1ce1b 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/UpdateChecker.java @@ -17,6 +17,8 @@ */ package org.jackhuang.hellominecraft.util; +import com.google.gson.JsonSyntaxException; +import java.io.IOException; import org.jackhuang.hellominecraft.util.logging.HMCLog; import java.util.Map; @@ -52,7 +54,7 @@ public final class UpdateChecker implements IUpdateChecker { if (value == null) { HMCLog.warn("Failed to check update..."); if (showMessage) - MessageBox.Show(C.i18n("update.failed")); + MessageBox.show(C.i18n("update.failed")); } else if (VersionNumber.isOlder(base, value)) OUT_DATED = true; if (OUT_DATED) @@ -74,7 +76,7 @@ public final class UpdateChecker implements IUpdateChecker { if (download_link == null) try { download_link = C.GSON.fromJson(NetUtils.get("http://huangyuhui.duapp.com/update_link.php?type=" + type), Map.class); - } catch (Exception e) { + } catch (JsonSyntaxException | IOException e) { HMCLog.warn("Failed to get update link.", e); } publish(download_link); diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/Utils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/Utils.java index 3deec8dce..77c9ae792 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/Utils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/Utils.java @@ -17,49 +17,32 @@ */ package org.jackhuang.hellominecraft.util; -import org.jackhuang.hellominecraft.util.logging.HMCLog; -import com.sun.management.OperatingSystemMXBean; +import java.awt.HeadlessException; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; -import java.lang.management.ManagementFactory; import java.lang.reflect.Method; -import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import java.security.AccessController; +import java.security.PrivilegedExceptionAction; /** * @author huangyuhui */ public final class Utils { - @SuppressWarnings("ResultOfObjectAllocationIgnored") - public static boolean isURL(String s) { - try { - new URL(s); - return true; - } catch (MalformedURLException ex) { - return false; - } + private Utils() { } public static URL[] getURL() { return ((URLClassLoader) Utils.class.getClassLoader()).getURLs(); } - public static int getSuggestedMemorySize() { - try { - OperatingSystemMXBean osmb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); - int memory = (int) (osmb.getTotalPhysicalMemorySize() / 1024 / 1024) / 4; - memory = Math.round((float) memory / 128.0f) * 128; - return memory; - } catch (Throwable t) { - HMCLog.warn("Failed to get total memory size, use 1024MB.", t); - return 1024; - } - } - public static void setClipborad(String text) { - Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text), null); + try { + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text), null); + } catch(HeadlessException ignored) { + } } /** @@ -68,21 +51,12 @@ public final class Utils { * @param status exit code */ public static void shutdownForcely(int status) throws Exception { - Class z = Class.forName("java.lang.Shutdown"); - Method exit = z.getDeclaredMethod("exit", int.class); - exit.setAccessible(true); - exit.invoke(z, status); - } - - public static void requireNonNull(Object o) { - if (o == null) - throw new NullPointerException("Oh dear, there is a problem..."); - } - - public static Object firstNonNull(Object... o) { - for (Object s : o) - if (s != null) - return s; - return null; + AccessController.doPrivileged((PrivilegedExceptionAction) () -> { + Class z = Class.forName("java.lang.Shutdown"); + Method exit = z.getDeclaredMethod("exit", int.class); + exit.setAccessible(true); + exit.invoke(z, status); + return null; + }); } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/VersionNumber.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/VersionNumber.java index bb0025917..f0acebc06 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/VersionNumber.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/VersionNumber.java @@ -78,6 +78,33 @@ public final class VersionNumber implements Comparable { return false; } + @Override + public int hashCode() { + int hash = 3; + hash = 83 * hash + this.firstVer; + hash = 83 * hash + this.secondVer; + hash = 83 * hash + this.thirdVer; + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final VersionNumber other = (VersionNumber) obj; + if (this.firstVer != other.firstVer) + return false; + if (this.secondVer != other.secondVer) + return false; + if (this.thirdVer != other.thirdVer) + return false; + return true; + } + @Override public int compareTo(VersionNumber o) { if (isOlder(this, o)) diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Base64.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Base64.java index 4250861f8..31ae91c1b 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Base64.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Base64.java @@ -17,13 +17,14 @@ */ package org.jackhuang.hellominecraft.util.code; -import java.io.UnsupportedEncodingException; - /** * * @author huangyuhui */ -public class Base64 { +public final class Base64 { + + private Base64() { + } public static char[] encode(byte[] data) { char[] out = new char[((data.length + 2) / 3) * 4]; @@ -52,12 +53,8 @@ public class Base64 { return out; } - public static char[] encode(String s, String charset) throws UnsupportedEncodingException { - return encode(s.getBytes(charset)); - } - public static char[] encode(String s) { - return encode(s.getBytes()); + return encode(s.getBytes(Charsets.UTF_8)); } public static byte[] decode(char[] data) { diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Charsets.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Charsets.java index 2d8d52322..e82910087 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Charsets.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Charsets.java @@ -19,7 +19,10 @@ package org.jackhuang.hellominecraft.util.code; import java.nio.charset.Charset; -public class Charsets { +public final class Charsets { + + private Charsets() { + } public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/DigestUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/DigestUtils.java index 5aedd9859..4f4176b1e 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/DigestUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/DigestUtils.java @@ -26,7 +26,10 @@ import java.security.NoSuchAlgorithmException; * * @author huangyuhui */ -public class DigestUtils { +public final class DigestUtils { + + private DigestUtils() { + } private static final int STREAM_BUFFER_LENGTH = 1024; diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Hex.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Hex.java index 9d5d969f6..c678aaf40 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Hex.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/code/Hex.java @@ -19,7 +19,7 @@ package org.jackhuang.hellominecraft.util.code; import java.nio.charset.Charset; -public class Hex { +public final class Hex { public static final Charset DEFAULT_CHARSET = Charsets.UTF_8; public static final String DEFAULT_CHARSET_NAME = "UTF-8"; diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/lang/Localization.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/lang/Localization.java index e5705c225..a90ee4329 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/lang/Localization.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/lang/Localization.java @@ -29,7 +29,7 @@ import org.jackhuang.hellominecraft.util.system.IOUtils; * * @author huangyuhui */ -public class Localization { +public final class Localization { private static final String ROOT_LOCATION = "/org/jackhuang/hellominecraft/lang/I18N%s.lang"; @@ -51,7 +51,7 @@ public class Localization { String[] strings = IOUtils.readFully(is).toString("UTF-8").split("\n"); for (String s : strings) if (!s.isEmpty() && s.charAt(0) != 35) { - int i = s.indexOf("="); + int i = s.indexOf('='); if (i == -1) continue; lang.put(s.substring(0, i), s.substring(i + 1)); diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/lang/SupportedLocales.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/lang/SupportedLocales.java index 3bc58d7b8..034e87516 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/lang/SupportedLocales.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/lang/SupportedLocales.java @@ -36,9 +36,8 @@ public enum SupportedLocales { bundle = Localization.get(self); showString = bundle.localize("lang"); this.customized = customized; - } catch (Throwable t) { + } catch (Throwable ignore) { showString = name(); - t.printStackTrace(); } } @@ -54,8 +53,7 @@ public enum SupportedLocales { public String translate(String key, Object... format) { try { return String.format(bundle.localize(key), format); - } catch (Exception ex) { - ex.printStackTrace(); + } catch (Exception ignore) { return key; } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/AppenderControl.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/AppenderControl.java index bdfce4e94..3ea9e6918 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/AppenderControl.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/AppenderControl.java @@ -37,8 +37,8 @@ public class AppenderControl { } public void callAppender(LogEvent event) { - if ((this.level != null) - && (this.intLevel < event.level.level)) + if (this.level != null + && this.intLevel < event.level.level) return; if (this.recursive.get() != null) { diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/layout/AbstractStringLayout.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/layout/AbstractStringLayout.java index c67b9e580..468a9a3ff 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/layout/AbstractStringLayout.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/layout/AbstractStringLayout.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hellominecraft.util.logging.layout; +import org.jackhuang.hellominecraft.util.code.Charsets; import org.jackhuang.hellominecraft.util.logging.LogEvent; /** @@ -27,7 +28,7 @@ public abstract class AbstractStringLayout implements ILayout { @Override public byte[] toByteArray(LogEvent event) { - return toSerializable(event).getBytes(); + return toSerializable(event).getBytes(Charsets.UTF_8); } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/logger/SimpleLogger.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/logger/SimpleLogger.java index 077884456..facd7e4ff 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/logger/SimpleLogger.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/logger/SimpleLogger.java @@ -40,7 +40,7 @@ public class SimpleLogger extends AbstractLogger { super(name, messageFactory); this.level = defaultLevel; if (showShortLogName) { - int index = name.lastIndexOf("."); + int index = name.lastIndexOf('.'); if ((index > 0) && (index < name.length())) this.logName = name.substring(index + 1); else diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/message/ObjectMessage.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/message/ObjectMessage.java index 1ec991cec..5c7fdb966 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/message/ObjectMessage.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/logging/message/ObjectMessage.java @@ -21,7 +21,7 @@ public class ObjectMessage implements IMessage { private static final long serialVersionUID = -5903272448334166185L; - private final transient Object obj; + private final Object obj; public ObjectMessage(Object obj) { if (obj == null) diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/Compressor.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/CompressingUtils.java similarity index 99% rename from HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/Compressor.java rename to HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/CompressingUtils.java index 9a5a3653a..5dc5b41de 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/Compressor.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/CompressingUtils.java @@ -35,7 +35,10 @@ import org.jackhuang.hellominecraft.util.func.BiFunction; * * @author huangyuhui */ -public class Compressor { +public final class CompressingUtils { + + private CompressingUtils() { + } public static void zip(String sourceDir, String zipFile) throws IOException { zip(new File(sourceDir), new File(zipFile), null); diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/FileUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/FileUtils.java index a32dcbdf7..feb9ece60 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/FileUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/FileUtils.java @@ -29,13 +29,15 @@ import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List; import org.jackhuang.hellominecraft.util.logging.HMCLog; -import org.jackhuang.hellominecraft.util.NetUtils; /** * * @author huangyuhui */ -public class FileUtils { +public final class FileUtils { + + private FileUtils() { + } public static void deleteDirectory(File directory) throws IOException { @@ -75,7 +77,8 @@ public class FileUtils { public static void cleanDirectory(File directory) throws IOException { if (!directory.exists()) { - directory.mkdirs(); + if (!directory.mkdirs() && !directory.isDirectory()) + throw new IOException("Failed to create directory: " + directory); return; } @@ -186,17 +189,18 @@ public class FileUtils { else doCopyFile(srcFile, dstFile); } - destDir.setLastModified(srcDir.lastModified()); + if (!destDir.setLastModified(srcDir.lastModified())) + HMCLog.warn("Failed to set last modified date of dir: " + destDir); } public static String read(File file) throws IOException { - return NetUtils.getStreamContent(IOUtils.openInputStream(file)); + return IOUtils.getStreamContent(IOUtils.openInputStream(file)); } public static String readQuietly(File file) { try { - return NetUtils.getStreamContent(IOUtils.openInputStream(file)); + return IOUtils.getStreamContent(IOUtils.openInputStream(file)); } catch (IOException ex) { HMCLog.err("Failed to read file: " + file, ex); return null; @@ -205,12 +209,12 @@ public class FileUtils { public static String read(File file, String charset) throws IOException { - return NetUtils.getStreamContent(IOUtils.openInputStream(file), charset); + return IOUtils.getStreamContent(IOUtils.openInputStream(file), charset); } public static String readIgnoreFileNotFound(File file) throws IOException { try { - return NetUtils.getStreamContent(IOUtils.openInputStream(file)); + return IOUtils.getStreamContent(IOUtils.openInputStream(file)); } catch (FileNotFoundException ex) { return ""; } @@ -364,7 +368,8 @@ public class FileUtils { if ((parent != null) && (!parent.mkdirs()) && (!parent.isDirectory())) throw new IOException("Directory '" + parent + "' could not be created"); - file.createNewFile(); + if (!file.createNewFile()) + throw new IOException("File `" + file + "` cannot be created."); } return new FileOutputStream(file, append); @@ -378,6 +383,6 @@ public class FileUtils { for (File f : files) if (f.getName().endsWith(suffix)) al.add(f); - return al.toArray(new File[0]); + return al.toArray(new File[al.size()]); } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/IOUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/IOUtils.java index 86f3e7790..9beb0b247 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/IOUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/IOUtils.java @@ -27,22 +27,29 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.NetworkInterface; import java.net.SocketException; import java.net.URL; import java.net.UnknownHostException; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import org.jackhuang.hellominecraft.util.func.Consumer; +import org.jackhuang.hellominecraft.util.func.Function; import org.jackhuang.hellominecraft.util.logging.HMCLog; /** * * @author huang */ -public class IOUtils { +public final class IOUtils { + + private IOUtils() { + } public static String addSeparator(String path) { if (path == null || path.trim().length() == 0) @@ -109,7 +116,7 @@ public class IOUtils { java.io.File file = new java.io.File(realPath); realPath = file.getAbsolutePath(); try { - realPath = java.net.URLDecoder.decode(realPath, "utf-8"); + realPath = java.net.URLDecoder.decode(realPath, DEFAULT_CHARSET); } catch (Exception e) { e.printStackTrace(); } @@ -119,7 +126,7 @@ public class IOUtils { public static boolean isAbsolutePath(String path) { if (path == null) return true; - return path.startsWith("/") || path.indexOf(":") > 0; + return path.startsWith("/") || path.indexOf(':') > 0; } public static String getLocalMAC() { @@ -205,19 +212,19 @@ public class IOUtils { } public static void write(byte[] data, OutputStream output) - throws IOException { + throws IOException { if (data != null) output.write(data); } public static void write(String data, OutputStream output, String encoding) - throws IOException { + throws IOException { if (data != null) output.write(data.getBytes(encoding)); } public static FileInputStream openInputStream(File file) - throws IOException { + throws IOException { if (file.exists()) { if (file.isDirectory()) throw new IOException("File '" + file + "' exists but is a directory"); @@ -266,21 +273,17 @@ public class IOUtils { } public static List readProcessByInputStream(String[] cmd) throws IOException, InterruptedException { - JavaProcess jp = new JavaProcess(cmd, new ProcessBuilder(cmd).start(), null); - ArrayList lines = new ArrayList<>(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(jp.getRawProcess().getInputStream()))) { - jp.getRawProcess().waitFor(); - String line; - while ((line = br.readLine()) != null) - lines.add(line); - } - return lines; + return readProcessImpl(cmd, p -> p.getInputStream()); } public static List readProcessByErrorStream(String[] cmd) throws IOException, InterruptedException { + return readProcessImpl(cmd, p -> p.getErrorStream()); + } + + private static List readProcessImpl(String[] cmd, Function callback) throws IOException, InterruptedException { JavaProcess jp = new JavaProcess(cmd, new ProcessBuilder(cmd).start(), null); ArrayList lines = new ArrayList<>(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(jp.getRawProcess().getErrorStream()))) { + try (BufferedReader br = new BufferedReader(new InputStreamReader(callback.apply(jp.getRawProcess()), Charset.defaultCharset()))) { jp.getRawProcess().waitFor(); String line; while ((line = br.readLine()) != null) @@ -298,4 +301,39 @@ public class IOUtils { while ((length = input.read(buf)) != -1) output.write(buf, 0, length); } + + public static byte[] getBytesFromStream(InputStream is) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + IOUtils.copyStream(is, out); + is.close(); + return out.toByteArray(); + } + + public static String getStreamContent(InputStream is) throws IOException { + return getStreamContent(is, DEFAULT_CHARSET); + } + + public static String getStreamContent(InputStream is, String encoding) + throws IOException { + if (is == null) + return null; + StringBuilder sb = new StringBuilder(); + try (InputStreamReader br = new InputStreamReader(is, encoding)) { + int len; + char[] buf = new char[16384]; + while ((len = br.read(buf)) != -1) + sb.append(buf, 0, len); + } + return sb.toString(); + } + + public static final String DEFAULT_CHARSET = "UTF-8"; + + public static PrintStream createPrintStream(OutputStream out, Charset charset) { + try { + return new PrintStream(out, false, charset.name()); + } catch (UnsupportedEncodingException ignore) { + return null; + } + } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/Java.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/Java.java index ef91647ec..040d298b0 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/Java.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/Java.java @@ -21,7 +21,9 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; @@ -38,8 +40,8 @@ public class Java { temp.add(new Java("Default", System.getProperty("java.home"))); temp.add(new Java("Custom", null)); if (OS.os() == OS.WINDOWS) - temp.addAll(Java.queryAllJavaHomeInWindowsByReg()); - if (OS.os() == OS.OSX) + temp.addAll(Java.queryAllJavaHomeInWindowsByReg().values()); + else if (OS.os() == OS.OSX) temp.addAll(Java.queryAllJDKInMac()); JAVA = Collections.unmodifiableList(temp); } @@ -114,18 +116,18 @@ public class Java { * WINDOWS * ----------------------------------- */ - public static List queryAllJavaHomeInWindowsByReg() { - List ans = new ArrayList<>(); + public static Map queryAllJavaHomeInWindowsByReg() { + Map ans = new HashMap<>(); try { - queryJava(ans, "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment"); - queryJava(ans, "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit"); + queryJava(ans, "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\"); + queryJava(ans, "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\"); } catch (IOException | InterruptedException ex) { HMCLog.err("Faield to query java", ex); } return ans; } - private static void queryJava(List ans, String location) throws IOException, InterruptedException { + private static void queryJava(Map ans, String location) throws IOException, InterruptedException { for (String java : queryRegSubFolders(location)) { int s = 0; for (char c : java.toCharArray()) @@ -133,9 +135,9 @@ public class Java { ++s; if (s <= 1) continue; - String javahome = queryRegValue(java, "JavaHome"); - if (javahome != null) - ans.add(new Java(java.substring(location.length()), javahome)); + String javahome = queryRegValue(java, "JavaHome"), ver = java.substring(location.length()); + if (javahome != null && !ans.containsKey(ver)) + ans.put(ver, new Java(ver, javahome)); } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/JdkVersion.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/JdkVersion.java index 0a5e1c1ba..eb5b6405b 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/JdkVersion.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/JdkVersion.java @@ -59,9 +59,12 @@ public final class JdkVersion implements Cloneable { if (!(obj instanceof JdkVersion)) return false; JdkVersion b = (JdkVersion) obj; - if (b.location == null || location == null) - return b.location == location; - return new File(b.location).equals(new File(location)); + if (b.location == null && location == null) + return true; + else if (b.location == null || location == null) + return false; + else + return new File(b.location).equals(new File(location)); } @Override @@ -175,7 +178,7 @@ public final class JdkVersion implements Cloneable { private static final Pattern p = Pattern.compile("java version \"[1-9]*\\.[1-9]*\\.[0-9]*(.*?)\""); public static JdkVersion getJavaVersionFromExecutable(String file) throws IOException { - String[] str = new String[] { file, "-version" }; + String[] str = new String[]{file, "-version"}; Platform platform = Platform.BIT_32; String ver = null; try { diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/OS.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/OS.java index 904f0cf4a..a081480cb 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/OS.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/OS.java @@ -24,7 +24,9 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.lang.management.ManagementFactory; +import java.util.Locale; import java.util.StringTokenizer; +import org.jackhuang.hellominecraft.util.code.Charsets; import org.jackhuang.hellominecraft.util.logging.HMCLog; /** @@ -46,7 +48,7 @@ public enum OS { } public static OS os() { - String str = System.getProperty("os.name").toLowerCase(); + String str = System.getProperty("os.name").toLowerCase(Locale.US); if (str.contains("win")) return OS.WINDOWS; if (str.contains("mac")) @@ -79,33 +81,42 @@ public enum OS { } } + public static int getSuggestedMemorySize() { + long total = getTotalPhysicalMemory(); + if (total == -1) + return 1024; + int memory = (int) (total / 1024 / 1024) / 4; + memory = Math.round((float) memory / 128.0f) * 128; + return memory; + } + public static long[] memoryInfoForLinux() throws IOException { File file = new File("/proc/meminfo"); - BufferedReader br = new BufferedReader(new InputStreamReader( - new FileInputStream(file))); - long[] result = new long[4]; - String str; - StringTokenizer token; - while ((str = br.readLine()) != null) { - token = new StringTokenizer(str); - if (!token.hasMoreTokens()) - continue; + try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charsets.UTF_8))) { + long[] result = new long[4]; + String str; + StringTokenizer token; + while ((str = br.readLine()) != null) { + token = new StringTokenizer(str); + if (!token.hasMoreTokens()) + continue; - str = token.nextToken(); - if (!token.hasMoreTokens()) - continue; + str = token.nextToken(); + if (!token.hasMoreTokens()) + continue; - if (str.equalsIgnoreCase("MemTotal:")) - result[0] = Long.parseLong(token.nextToken()); - else if (str.equalsIgnoreCase("MemFree:")) - result[1] = Long.parseLong(token.nextToken()); - else if (str.equalsIgnoreCase("SwapTotal:")) - result[2] = Long.parseLong(token.nextToken()); - else if (str.equalsIgnoreCase("SwapFree:")) - result[3] = Long.parseLong(token.nextToken()); + if (str.equalsIgnoreCase("MemTotal:")) + result[0] = Long.parseLong(token.nextToken()); + else if (str.equalsIgnoreCase("MemFree:")) + result[1] = Long.parseLong(token.nextToken()); + else if (str.equalsIgnoreCase("SwapTotal:")) + result[2] = Long.parseLong(token.nextToken()); + else if (str.equalsIgnoreCase("SwapFree:")) + result[3] = Long.parseLong(token.nextToken()); + } + + return result; } - - return result; } public static String getLinuxReleaseVersion() throws IOException { diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/ProcessThread.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/ProcessThread.java index c472a5bf7..e3650ed02 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/ProcessThread.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/ProcessThread.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hellominecraft.util.system; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; @@ -75,7 +76,7 @@ public class ProcessThread extends Thread { } else line += (char) ch; stopEvent.execute(p); - } catch (Exception e) { + } catch (IOException e) { HMCLog.err("An error occured when reading process stdout/stderr.", e); } finally { IOUtils.closeQuietly(br); diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/ZipEngine.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/ZipEngine.java index aeab0c375..e3939018d 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/ZipEngine.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/system/ZipEngine.java @@ -17,7 +17,6 @@ */ package org.jackhuang.hellominecraft.util.system; -import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.File; @@ -61,10 +60,9 @@ public class ZipEngine { /** * 功能:把 sourceDir 目录下的所有文件进行 zip 格式的压缩,保存为指定 zip 文件 * - * @param sourceDir 源文件夹 - * @param zipFile 压缩生成的zip文件路径。 + * @param sourceDir 源文件夹 * @param pathNameCallback callback(pathName, isDirectory) returns your - * modified pathName + * modified pathName * * @throws java.io.IOException 压缩失败或无法读取 */ @@ -75,11 +73,11 @@ public class ZipEngine { /** * 将文件压缩成zip文件 * - * @param source zip文件路径 - * @param basePath 待压缩文件根目录 - * @param zos zip文件的os + * @param source zip文件路径 + * @param basePath 待压缩文件根目录 + * @param zos zip文件的os * @param pathNameCallback callback(pathName, isDirectory) returns your - * modified pathName, null if you dont want this file zipped + * modified pathName, null if you dont want this file zipped */ private void putDirectoryImpl(File source, String basePath, BiFunction pathNameCallback) throws IOException { File[] files; @@ -95,7 +93,7 @@ public class ZipEngine { for (File file : files) if (file.isDirectory()) { pathName = file.getPath().substring(basePath.length() + 1) - + "/"; + + "/"; pathName = pathName.replace('\\', '/'); if (pathNameCallback != null) pathName = pathNameCallback.apply(pathName, true); @@ -117,14 +115,14 @@ public class ZipEngine { } public void putFile(File file, String pathName) throws IOException { - putStream(new FileInputStream(file), pathName); + try (FileInputStream fis = new FileInputStream(file)) { + putStream(fis, pathName); + } } public void putStream(InputStream is, String pathName) throws IOException { - try (BufferedInputStream bis = new BufferedInputStream(is)) { - put(new ZipEntry(pathName)); - IOUtils.copyStream(bis, zos, buf); - } + put(new ZipEntry(pathName)); + IOUtils.copyStream(is, zos, buf); } public void putTextFile(String text, String pathName) throws IOException { diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DecompressTask.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DecompressTask.java index 1163b6b77..b22599011 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DecompressTask.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DecompressTask.java @@ -18,7 +18,7 @@ package org.jackhuang.hellominecraft.util.tasks; import java.io.File; -import org.jackhuang.hellominecraft.util.system.Compressor; +import org.jackhuang.hellominecraft.util.system.CompressingUtils; /** * @@ -34,8 +34,8 @@ public class DecompressTask extends Task { } @Override - public void executeTask() throws Throwable { - Compressor.unzip(src, dest); + public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + CompressingUtils.unzip(src, dest); } @Override diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DeleteFileTask.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DeleteFileTask.java index b9422c766..6317d71b4 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DeleteFileTask.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DeleteFileTask.java @@ -18,6 +18,7 @@ package org.jackhuang.hellominecraft.util.tasks; import java.io.File; +import java.io.IOException; /** * @@ -32,8 +33,8 @@ public class DeleteFileTask extends Task { } @Override - public void executeTask() throws Throwable { - f.delete(); + public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + if (!f.delete()) throw new IOException("Failed to delete" + f); } @Override diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoubleTask.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoubleTask.java index eb858c9bc..04af5b1ba 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoubleTask.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoubleTask.java @@ -49,7 +49,9 @@ public class DoubleTask extends TaskInfo { } @Override - public void executeTask() throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Throwable { + if (!areDependTasksSucceeded) + throw new IllegalStateException("Depend tasks failed."); } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/ParallelTask.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/ParallelTask.java index 15793d200..ab0cac55d 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/ParallelTask.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/ParallelTask.java @@ -29,7 +29,7 @@ public class ParallelTask extends Task { Collection dependsTask = new HashSet<>(); @Override - public void executeTask() { + public void executeTask(boolean areDependTasksSucceeded) { } @Override diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/Task.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/Task.java index e700229bd..98dbe2ba2 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/Task.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/Task.java @@ -17,7 +17,6 @@ */ package org.jackhuang.hellominecraft.util.tasks; -import java.util.ArrayList; import java.util.Collection; import org.jackhuang.hellominecraft.util.logging.HMCLog; @@ -29,8 +28,11 @@ public abstract class Task { /** * Run in a new thread(packed in TaskList). + * + * @param areDependTasksSucceeded Would be true if all of tasks which this task depends on have succeed. + * @throws java.lang.Throwable If a task throws an exception, this task will be marked as `failed`. */ - public abstract void executeTask() throws Throwable; + public abstract void executeTask(boolean areDependTasksSucceeded) throws Throwable; /** * if this func returns false, TaskList will force abort the thread. run in @@ -54,37 +56,25 @@ public abstract class Task { } protected Throwable failReason = null; + /** + * This method can be only invoked by TaskList. + * @param s what the `executeTask` throws. + */ protected void setFailReason(Throwable s) { failReason = s; } protected String tag; - protected boolean parallelExecuting; + public String getTag() { + return tag; + } + public Task setTag(String tag) { this.tag = tag; return this; } - public boolean isParallelExecuting() { - return parallelExecuting; - } - - public void setParallelExecuting(boolean parallelExecuting) { - this.parallelExecuting = parallelExecuting; - } - - ArrayList> taskListener = new ArrayList(); - - public Task addTaskListener(DoingDoneListener l) { - taskListener.add(l); - return this; - } - - public ArrayList> getTaskListeners() { - return taskListener; - } - public abstract String getInfo(); public Collection getDependTasks() { @@ -95,8 +85,6 @@ public abstract class Task { return null; } - public boolean areDependTasksSucceeded; - protected ProgressProviderListener ppl; public Task setProgressProviderListener(ProgressProviderListener p) { @@ -117,7 +105,7 @@ public abstract class Task { if (c != null) for (Task t : c) t.runWithException(); - executeTask(); + executeTask(true); c = getAfterTasks(); if (c != null) for (Task t : c) diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java index df318b254..11408d5a5 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java @@ -29,6 +29,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; +import org.jackhuang.hellominecraft.util.EventHandler; import org.jackhuang.hellominecraft.util.logging.HMCLog; /** @@ -38,7 +39,7 @@ import org.jackhuang.hellominecraft.util.logging.HMCLog; public class TaskList extends Thread { List taskQueue = Collections.synchronizedList(new LinkedList<>()); - ArrayList allDone = new ArrayList(); + public final EventHandler doneEvent = new EventHandler<>(this); ArrayList> taskListener = new ArrayList(); int totTask; @@ -53,10 +54,6 @@ public class TaskList extends Thread { taskQueue.clear(); } - public void addAllDoneListener(Runnable l) { - allDone.add(l); - } - public void addTaskListener(DoingDoneListener l) { taskListener.add(l); } @@ -83,9 +80,12 @@ public class TaskList extends Thread { @Override public void run() { - if (!executeTask(task)) - bool.set(false); - latch.countDown(); + try { + if (!executeTask(task)) + bool.set(false); + } finally { + latch.countDown(); + } } } @@ -101,9 +101,10 @@ public class TaskList extends Thread { AtomicBoolean bool = new AtomicBoolean(true); CountDownLatch counter = new CountDownLatch(c.size()); for (Task t2 : c) { - if (t2 == null) + if (t2 == null) { + counter.countDown(); continue; - t2.setParallelExecuting(true); + } Invoker thread = new Invoker(t2, counter, bool); invokers.add(thread); if (!EXECUTOR_SERVICE.isShutdown() && !EXECUTOR_SERVICE.isTerminated()) @@ -126,15 +127,13 @@ public class TaskList extends Thread { if (c == null) c = new HashSet<>(); HMCLog.log("Executing task: " + t.getInfo()); - for (DoingDoneListener d : t.getTaskListeners()) - d.onDoing(t, c); for (DoingDoneListener d : taskListener) d.onDoing(t, c); - t.areDependTasksSucceeded = processTasks(c); + boolean areDependTasksSucceeded = processTasks(c); boolean flag = true; try { - t.executeTask(); + t.executeTask(areDependTasksSucceeded); } catch (Throwable e) { t.setFailReason(e); flag = false; @@ -144,8 +143,6 @@ public class TaskList extends Thread { Collection at = t.getAfterTasks(); if (at == null) at = new HashSet<>(); - for (DoingDoneListener d : t.getTaskListeners()) - d.onDone(t, at); for (DoingDoneListener d : taskListener) d.onDone(t, at); processTasks(at); @@ -153,22 +150,21 @@ public class TaskList extends Thread { HMCLog.err("Task failed: " + t.getInfo(), t.getFailReason()); for (DoingDoneListener d : taskListener) d.onFailed(t); - for (DoingDoneListener d : t.getTaskListeners()) - d.onFailed(t); } return flag; } @Override public void run() { - Thread.currentThread().setName("TaskList"); + Thread.currentThread().setName("Task List"); totTask = taskQueue.size(); while (!taskQueue.isEmpty()) executeTask(taskQueue.remove(0)); - if (shouldContinue) - for (Runnable d : allDone) - d.run(); + if (shouldContinue) { + HMCLog.log("Tasks are successfully finished."); + doneEvent.execute(null); + } } public boolean isEmpty() { diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskRunnable.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskRunnable.java index 000cbacbc..28f42de50 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskRunnable.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskRunnable.java @@ -35,7 +35,7 @@ public class TaskRunnable extends TaskInfo { } @Override - public void executeTask() { + public void executeTask(boolean areDependTasksSucceeded) { r.run(); } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java index 83f3c4276..e1a635d4a 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import javax.swing.SwingUtilities; +import javax.swing.table.TableColumn; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.MessageBox; @@ -32,16 +33,9 @@ import org.jackhuang.hellominecraft.util.ui.SwingUtils; * @author huangyuhui */ public class TaskWindow extends javax.swing.JDialog - implements ProgressProviderListener, Runnable, DoingDoneListener { + implements ProgressProviderListener, DoingDoneListener { - private static volatile TaskWindow INSTANCE = null; - - private static synchronized TaskWindow instance() { - if (INSTANCE == null) - INSTANCE = new TaskWindow(); - INSTANCE.clean(); - return INSTANCE; - } + private static volatile TaskWindow INST = null; public static TaskWindowFactory factory() { return new TaskWindowFactory(); @@ -49,7 +43,7 @@ public class TaskWindow extends javax.swing.JDialog boolean suc = false; - private TaskList taskList; + private transient TaskList taskList; private final ArrayList failReasons = new ArrayList(); private String stackTrace = null, lastStackTrace = null; @@ -59,34 +53,34 @@ public class TaskWindow extends javax.swing.JDialog private TaskWindow() { initComponents(); - setLocationRelativeTo(null); - if (lstDownload.getColumnModel().getColumnCount() > 1) { int i = 35; - lstDownload.getColumnModel().getColumn(1).setMinWidth(i); - lstDownload.getColumnModel().getColumn(1).setMaxWidth(i); - lstDownload.getColumnModel().getColumn(1).setPreferredWidth(i); + TableColumn c = lstDownload.getColumnModel().getColumn(1); + c.setMinWidth(i); + c.setMaxWidth(i); + c.setPreferredWidth(i); } setModal(true); + setLocationRelativeTo(null); } - public TaskWindow addTask(Task task) { - taskList.addTask(task); - return this; - } - - public synchronized void clean() { + private synchronized void clean() { if (isVisible()) return; taskList = new TaskList(); taskList.addTaskListener(this); - taskList.addAllDoneListener(this); + taskList.doneEvent.register(() -> { + SwingUtilities.invokeLater(() -> { + dispose(); + suc = true; + }); + }); } public static String downloadSource = ""; - public boolean start() { + private boolean start() { if (isVisible() || taskList == null || taskList.isAlive()) return false; pgsTotal.setValue(0); @@ -102,7 +96,7 @@ public class TaskWindow extends javax.swing.JDialog HMCLog.err(stackTrace); HMCLog.err("There's the stacktrace of the last invoking."); HMCLog.err(lastStackTrace); - MessageBox.Show(C.i18n("taskwindow.no_more_instance")); + MessageBox.show(C.i18n("taskwindow.no_more_instance")); return false; } setTitle(C.i18n("taskwindow.title") + " - " + C.i18n("download.source") + ": " + downloadSource); @@ -174,7 +168,7 @@ public class TaskWindow extends javax.swing.JDialog }// //GEN-END:initComponents private void btnCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelActionPerformed - if (MessageBox.Show(C.i18n("operation.confirm_stop"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) + if (MessageBox.show(C.i18n("operation.confirm_stop"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) this.dispose(); }//GEN-LAST:event_btnCancelActionPerformed @@ -185,13 +179,12 @@ public class TaskWindow extends javax.swing.JDialog if (!this.failReasons.isEmpty()) { String str = StrUtils.parseParams("", failReasons.toArray(), "\n"); - SwingUtilities.invokeLater(() -> MessageBox.Show(str, C.i18n("message.error"), MessageBox.ERROR_MESSAGE)); + SwingUtilities.invokeLater(() -> MessageBox.show(str, C.i18n("message.error"), MessageBox.ERROR_MESSAGE)); failReasons.clear(); } if (!suc) { - if (taskList != null) - SwingUtilities.invokeLater(taskList::abort); + SwingUtilities.invokeLater(taskList::abort); HMCLog.log("Tasks have been canceled by user."); } taskList = null; @@ -223,15 +216,6 @@ public class TaskWindow extends javax.swing.JDialog }); } - @Override - public void run() { - SwingUtilities.invokeLater(() -> { - dispose(); - suc = true; - HMCLog.log("Tasks are finished."); - }); - } - @Override public void onDoing(Task task, Collection taskCollection) { if (task == null) @@ -309,36 +293,33 @@ public class TaskWindow extends javax.swing.JDialog }); } - public static boolean execute(Task... ts) { - TaskWindowFactory f = factory(); - for (Task t : ts) - f.append(t); - return f.create(); - } - public static class TaskWindowFactory { LinkedList ll = new LinkedList<>(); boolean flag; - public TaskWindowFactory append(Task t) { - if (t != null) - ll.add(t); + public TaskWindowFactory append(Task ts) { + if (ts != null) + ll.add(ts); return this; } - public boolean create() { + public boolean execute(Task... ts) { + for (Task t : ts) + append(t); String stacktrace = StrUtils.getStackTrace(new Throwable()); return SwingUtils.invokeAndWait(() -> { - final TaskWindow tw = instance(); - synchronized (tw) { - if (tw.isVisible()) + if (INST == null) + INST = new TaskWindow(); + INST.clean(); + synchronized (INST) { + if (INST.isVisible()) return false; for (Task t : ll) - tw.addTask(t); - tw.lastStackTrace = tw.stackTrace; - tw.stackTrace = stacktrace; - return tw.start(); + INST.taskList.addTask(t); + INST.lastStackTrace = INST.stackTrace; + INST.stackTrace = stacktrace; + return INST.start(); } }); } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/communication/DefaultPreviousResult.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/comm/DefaultPreviousResult.java similarity index 94% rename from HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/communication/DefaultPreviousResult.java rename to HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/comm/DefaultPreviousResult.java index ea6d688c0..0550769fb 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/communication/DefaultPreviousResult.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/comm/DefaultPreviousResult.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see {http://www.gnu.org/licenses/}. */ -package org.jackhuang.hellominecraft.util.tasks.communication; +package org.jackhuang.hellominecraft.util.tasks.comm; /** * diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/communication/PreviousResult.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/comm/PreviousResult.java similarity index 93% rename from HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/communication/PreviousResult.java rename to HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/comm/PreviousResult.java index 4aa1ad85f..a73a592d9 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/communication/PreviousResult.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/comm/PreviousResult.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see {http://www.gnu.org/licenses/}. */ -package org.jackhuang.hellominecraft.util.tasks.communication; +package org.jackhuang.hellominecraft.util.tasks.comm; /** * diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/communication/PreviousResultRegistrar.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/comm/PreviousResultRegistrar.java similarity index 94% rename from HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/communication/PreviousResultRegistrar.java rename to HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/comm/PreviousResultRegistrar.java index eed6be7ad..e63f2918b 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/communication/PreviousResultRegistrar.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/comm/PreviousResultRegistrar.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see {http://www.gnu.org/licenses/}. */ -package org.jackhuang.hellominecraft.util.tasks.communication; +package org.jackhuang.hellominecraft.util.tasks.comm; import org.jackhuang.hellominecraft.util.tasks.Task; diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/ContentGetAndShowTask.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/ContentGetAndShowTask.java index b4b381dd0..3c984137b 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/ContentGetAndShowTask.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/ContentGetAndShowTask.java @@ -27,21 +27,8 @@ import org.jackhuang.hellominecraft.util.ui.LogWindow; public class ContentGetAndShowTask extends HTTPGetTask implements Event { public ContentGetAndShowTask(String info, String changeLogUrl) { - super(changeLogUrl); - this.info = info; - } - - @Override - public void executeTask() throws Exception { + super(info, changeLogUrl); tdtsl.register(this); - super.executeTask(); - } - - String info; - - @Override - public String getInfo() { - return info; } @Override diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java index d4e97809f..cfb2f9906 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java @@ -31,8 +31,8 @@ import org.jackhuang.hellominecraft.util.code.DigestUtils; import org.jackhuang.hellominecraft.util.func.Function; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.tasks.Task; -import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResult; -import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResultRegistrar; +import org.jackhuang.hellominecraft.util.tasks.comm.PreviousResult; +import org.jackhuang.hellominecraft.util.tasks.comm.PreviousResultRegistrar; import org.jackhuang.hellominecraft.util.system.IOUtils; /** @@ -113,7 +113,7 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev // Download file. @Override - public void executeTask() throws Throwable { + public void executeTask(boolean areDependTasksSucceeded) throws Throwable { for (PreviousResult p : al) this.url = IOUtils.parseURL(p.getResult()); @@ -158,7 +158,7 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev if (!tempFile.exists()) tempFile.createNewFile(); else if (!tempFile.renameTo(tempFile)) // check file lock - throw new RuntimeException("The temp file is locked, maybe there is an application using the file?"); + throw new IllegalStateException("The temp file is locked, maybe there is an application using the file?"); // Open file and seek to the end of it. file = new RandomAccessFile(tempFile, "rw"); @@ -217,7 +217,7 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev if (ppl != null) ppl.onProgressProviderDone(this); return; - } catch (Exception e) { + } catch (IOException | IllegalStateException | NetException e) { setFailReason(new NetException(C.i18n("download.failed") + " " + url, e)); } finally { closeFiles(); @@ -232,7 +232,7 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev } public static void download(String url, File file, DownloadListener dl) throws Throwable { - ((Task) new FileDownloadTask(url, file).setProgressProviderListener(dl)).executeTask(); + ((Task) new FileDownloadTask(url, file).setProgressProviderListener(dl)).executeTask(true); } @Override diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/HTTPGetTask.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/HTTPGetTask.java index 9fe25a852..6f0f3fbd8 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/HTTPGetTask.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/HTTPGetTask.java @@ -18,12 +18,13 @@ package org.jackhuang.hellominecraft.util.tasks.download; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.tasks.TaskInfo; -import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResult; +import org.jackhuang.hellominecraft.util.tasks.comm.PreviousResult; import org.jackhuang.hellominecraft.util.EventHandler; /** @@ -51,11 +52,11 @@ public class HTTPGetTask extends TaskInfo implements PreviousResult { } @Override - public void executeTask() throws Exception { + public void executeTask(boolean areDependTasksSucceeded) throws Exception { Exception t = null; - for (int repeat = 0; repeat < 6; repeat++) { - if (repeat > 0) - HMCLog.warn("Failed to download, repeat: " + repeat); + for (int time = 0; time < 6; time++) { + if (time > 0) + HMCLog.warn("Failed to download, repeat times: " + time); try { if (ppl != null) ppl.setProgress(this, -1, 1); @@ -76,10 +77,10 @@ public class HTTPGetTask extends TaskInfo implements PreviousResult { if (!shouldContinue) return; } - result = baos.toString(); + result = baos.toString(encoding); tdtsl.execute(result); return; - } catch (Exception ex) { + } catch (IOException ex) { t = new NetException("Failed to get " + url, ex); } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/AbstractFilter.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/AbstractFilter.java index fe6d04d5f..af41c8145 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/AbstractFilter.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/AbstractFilter.java @@ -24,8 +24,6 @@ import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; import java.awt.image.ColorModel; -import java.awt.image.Raster; -import java.awt.image.WritableRaster; public abstract class AbstractFilter implements BufferedImageOp { @@ -55,36 +53,4 @@ public abstract class AbstractFilter public RenderingHints getRenderingHints() { return null; } - - protected int[] getPixels(BufferedImage img, int x, int y, int w, int h, int[] pixels) { - if ((w == 0) || (h == 0)) - return new int[0]; - - if (pixels == null) - pixels = new int[w * h]; - else if (pixels.length < w * h) - throw new IllegalArgumentException("pixels array must have a length >= w*h"); - - int imageType = img.getType(); - if ((imageType == 2) || (imageType == 1)) { - Raster raster = img.getRaster(); - return (int[]) (int[]) raster.getDataElements(x, y, w, h, pixels); - } - - return img.getRGB(x, y, w, h, pixels, 0, w); - } - - protected void setPixels(BufferedImage img, int x, int y, int w, int h, int[] pixels) { - if ((pixels == null) || (w == 0) || (h == 0)) - return; - if (pixels.length < w * h) - throw new IllegalArgumentException("pixels array must have a length >= w*h"); - - int imageType = img.getType(); - if ((imageType == 2) || (imageType == 1)) { - WritableRaster raster = img.getRaster(); - raster.setDataElements(x, y, w, h, pixels); - } else - img.setRGB(x, y, w, h, pixels, 0, w); - } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/BasicColors.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/BasicColors.java index b2977af5a..5031117fa 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/BasicColors.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/BasicColors.java @@ -23,8 +23,11 @@ import java.awt.Color; * * @author huangyuhui */ -public class BasicColors { +public final class BasicColors { + private BasicColors() { + } + private static Color getWebColor(String c) { return new Color( Integer.parseInt(c.substring(0, 2), 16), @@ -41,7 +44,7 @@ public class BasicColors { public static final Color COLOR_WHITE_TEXT = new Color(254, 254, 254); public static final Color COLOR_CENTRAL_BACK = new Color(25, 30, 34, 160); - public static final Color bgcolors[] = new Color[] { + public static final Color[] BG_COLORS = new Color[] { COLOR_BLUE, getWebColor("1ABC9C"), getWebColor("9B59B6"), @@ -49,7 +52,8 @@ public class BasicColors { getWebColor("E67E22"), getWebColor("E74C3C") }; - public static final Color bgcolors_darker[] = new Color[] { + + public static final Color[] BG_COLORS_DARKER = new Color[] { COLOR_BLUE_DARKER, getWebColor("16A085"), getWebColor("8E44AD"), diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/DropShadowBorder.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/DropShadowBorder.java index 98de6fd3a..aed92f16c 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/DropShadowBorder.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/DropShadowBorder.java @@ -68,8 +68,9 @@ public class DropShadowBorder extends AbstractBorder { @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { Pair pair = new Pair<>(width, height); - if (CACHE.containsKey(pair)) - g.drawImage(CACHE.get(pair), x, y, width, height, null); + BufferedImage list; + int border = this.thickness * 4; + if (CACHE.containsKey(pair)) list = CACHE.get(pair); else { BufferedImage shadow = new BufferedImage(width, height, 2); @@ -82,7 +83,6 @@ public class DropShadowBorder extends AbstractBorder { g2.fillRect(0, 0, width, height); g2.setComposite(oldComposite); g2.setColor(this.color); - int border = (int) (this.thickness * 4); g2.fillRect(border, border + border / 6, width - border * 2, height - border * 2); g2.dispose(); @@ -91,9 +91,14 @@ public class DropShadowBorder extends AbstractBorder { shadow = blur.filter(shadow, null); shadow = blur.filter(shadow, null); shadow = blur.filter(shadow, null); - - CACHE.put(pair, shadow); - g.drawImage(shadow, x, y, width, height, null); + CACHE.put(pair, list = shadow); } + g.drawImage(list, 0, 0, width, height, null); + } + + void copyFromArray(int[] from, int W, int H, int[] to, int x, int y, int w, int h) { + for (int i = 0; i < h; ++i) + for (int j = 0; j < w; ++j) + to[i * w + j] = from[(i + y) * W + j + x]; } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/FastBlurFilter.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/FastBlurFilter.java index a69b749d1..93eae016b 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/FastBlurFilter.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/FastBlurFilter.java @@ -42,20 +42,22 @@ public class FastBlurFilter extends AbstractFilter { public BufferedImage filter(BufferedImage src, BufferedImage dst) { int width = src.getWidth(); int height = src.getHeight(); + return filter(src, new int[width * height], dst, new int[width * height]); + } + + public BufferedImage filter(BufferedImage src, int[] srcPixels, BufferedImage dst, int[] dstPixels) { + int width = src.getWidth(); + int height = src.getHeight(); if (dst == null) dst = createCompatibleDestImage(src, null); - int[] srcPixels = new int[width * height]; - int[] dstPixels = new int[width * height]; - - getPixels(src, 0, 0, width, height, srcPixels); + GraphicsUtils.getPixels(src, 0, 0, width, height, srcPixels); blur(srcPixels, dstPixels, width, height, this.radius); - blur(dstPixels, srcPixels, height, width, this.radius); - setPixels(dst, 0, 0, width, height, srcPixels); + GraphicsUtils.setPixels(dst, 0, 0, width, height, srcPixels); return dst; } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/GraphicsUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/GraphicsUtils.java index f2b328575..6593e56f0 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/GraphicsUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/GraphicsUtils.java @@ -6,6 +6,8 @@ import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.image.BufferedImage; +import java.awt.image.Raster; +import java.awt.image.WritableRaster; import java.util.Map; import javax.imageio.ImageIO; import javax.swing.plaf.synth.SynthContext; @@ -203,5 +205,81 @@ public class GraphicsUtils extends SynthGraphicsUtils { int aMid = aTop + ((aBot - aTop) * percent / 100); return new Color(rMid, gMid, bMid, aMid); } + + /** + *

Returns an array of pixels, stored as integers, from a + * BufferedImage. The pixels are grabbed from a rectangular + * area defined by a location and two dimensions. Calling this method on + * an image of type different from BufferedImage.TYPE_INT_ARGB + * and BufferedImage.TYPE_INT_RGB will unmanage the image.

+ * + * @param img the source image + * @param x the x location at which to start grabbing pixels + * @param y the y location at which to start grabbing pixels + * @param w the width of the rectangle of pixels to grab + * @param h the height of the rectangle of pixels to grab + * @param pixels a pre-allocated array of pixels of size w*h; can be null + * @return pixels if non-null, a new array of integers + * otherwise + * @throws IllegalArgumentException is pixels is non-null and + * of length < w*h + */ + public static int[] getPixels(BufferedImage img, + int x, int y, int w, int h, int[] pixels) { + if (w == 0 || h == 0) { + return new int[0]; + } + if (pixels == null) { + pixels = new int[w * h]; + } else if (pixels.length < w * h) { + throw new IllegalArgumentException("pixels array must have a length" + + " >= w*h"); + } + + int imageType = img.getType(); + if (imageType == BufferedImage.TYPE_INT_ARGB || + imageType == BufferedImage.TYPE_INT_RGB) { + Raster raster = img.getRaster(); + return (int[]) raster.getDataElements(x, y, w, h, pixels); + } + + // Unmanages the image + return img.getRGB(x, y, w, h, pixels, 0, w); + } + + /** + *

Writes a rectangular area of pixels in the destination + * BufferedImage. Calling this method on + * an image of type different from BufferedImage.TYPE_INT_ARGB + * and BufferedImage.TYPE_INT_RGB will unmanage the image.

+ * + * @param img the destination image + * @param x the x location at which to start storing pixels + * @param y the y location at which to start storing pixels + * @param w the width of the rectangle of pixels to store + * @param h the height of the rectangle of pixels to store + * @param pixels an array of pixels, stored as integers + * @throws IllegalArgumentException is pixels is non-null and + * of length < w*h + */ + public static void setPixels(BufferedImage img, + int x, int y, int w, int h, int[] pixels) { + if (pixels == null || w == 0 || h == 0) { + return; + } else if (pixels.length < w * h) { + throw new IllegalArgumentException("pixels array must have a length" + + " >= w*h"); + } + + int imageType = img.getType(); + if (imageType == BufferedImage.TYPE_INT_ARGB || + imageType == BufferedImage.TYPE_INT_RGB) { + WritableRaster raster = img.getRaster(); + raster.setDataElements(x, y, w, h, pixels); + } else { + // Unmanages the image + img.setRGB(x, y, w, h, pixels, 0, w); + } + } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java index 1377be174..c52e58a4e 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindow.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hellominecraft.util.ui; +import javax.swing.SwingUtilities; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; @@ -33,7 +34,7 @@ import org.jackhuang.hellominecraft.util.Utils; * @author huangyuhui */ public class LogWindow extends javax.swing.JFrame { - + boolean movingEnd; NonFunction listener; Runnable terminateGameListener; @@ -43,17 +44,20 @@ public class LogWindow extends javax.swing.JFrame { */ public LogWindow() { initComponents(); - + movingEnd = true; - - setLocationRelativeTo(null); - txtLog.setEditable(false); + DoubleOutputStream out = new DoubleOutputStream(new LogWindowOutputStream(this, Level.INFO), System.out); System.setOut(new LauncherPrintStream(out)); DoubleOutputStream err = new DoubleOutputStream(new LogWindowOutputStream(this, Level.ERROR), System.err); System.setErr(new LauncherPrintStream(err)); + + SwingUtilities.invokeLater(() -> { + setLocationRelativeTo(null); + txtLog.setEditable(false); + }); } - + public static final LogWindow INSTANCE = new LogWindow(); /** @@ -235,15 +239,15 @@ public class LogWindow extends javax.swing.JFrame { terminateGameListener.run(); SwingUtils.exitIfNoWindow(this); }//GEN-LAST:event_formWindowClosing - + public void log(String status) { log(status, Level.INFO); } - + public void warning(String status) { log(status, Level.WARN); } - + public synchronized void log(String status, Level c) { status = status.replace("\t", " "); Document d = txtLog.getStyledDocument(); @@ -254,33 +258,33 @@ public class LogWindow extends javax.swing.JFrame { } catch (Exception ex) { HMCLog.err("Failed to insert \"" + status + "\" to " + d.getLength(), ex); } - + if (movingEnd) { int position = d.getLength(); txtLog.setCaretPosition(position); } } - + public void setExit(NonFunction exit) { this.listener = exit; } - + public void setTerminateGame(Runnable l) { this.terminateGameListener = l; } - + public void clean() { txtLog.setText(""); } - + public boolean getMovingEnd() { return movingEnd; } - + public void setMovingEnd(boolean b) { movingEnd = b; } - + @Override public void setVisible(boolean b) { lblCrash.setVisible(false); @@ -289,7 +293,7 @@ public class LogWindow extends javax.swing.JFrame { btnMCF.setVisible(false); super.setVisible(b); } - + public void showAsCrashWindow(boolean out_date) { if (out_date) { lblCrash.setVisible(false); @@ -304,7 +308,7 @@ public class LogWindow extends javax.swing.JFrame { btnMCF.setVisible(true); lblCrash.setText(C.i18n("ui.label.crashing")); } - + super.setVisible(true); } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java index a400f150c..5aa3b97c5 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/LogWindowOutputStream.java @@ -21,6 +21,7 @@ import java.io.OutputStream; import java.util.Objects; import java.util.Timer; import javax.swing.SwingUtilities; +import org.jackhuang.hellominecraft.util.code.Charsets; import org.jackhuang.hellominecraft.util.logging.Level; /** @@ -35,8 +36,8 @@ public class LogWindowOutputStream extends OutputStream { private final Level sas; public LogWindowOutputStream(LogWindow logWindow, Level l) { - Objects.nonNull(logWindow); - Objects.nonNull(l); + Objects.requireNonNull(logWindow); + Objects.requireNonNull(l); txt = logWindow; sas = l; } @@ -48,7 +49,7 @@ public class LogWindowOutputStream extends OutputStream { @Override public final void write(byte[] arr, int off, int len) { - append(new String(arr, off, len)); + append(new String(arr, off, len, Charsets.UTF_8)); } private void append(final String str) { @@ -56,14 +57,13 @@ public class LogWindowOutputStream extends OutputStream { SwingUtilities.invokeLater(() -> { txt.log(str, Level.guessLevel(str, sas)); }); - } catch (Throwable e) { - e.printStackTrace(); + } catch (Throwable ignore) { } } @Override public final void write(int i) { - append(new String(new byte[] { (byte) i })); + append(new String(new byte[] { (byte) i }, Charsets.UTF_8)); } public static void dispose() { diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/SwingUtils.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/SwingUtils.java index 32587df07..06b8578ca 100755 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/SwingUtils.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/SwingUtils.java @@ -54,8 +54,11 @@ import org.jackhuang.hellominecraft.util.system.OS; * * @author huang */ -public class SwingUtils { +public final class SwingUtils { + private SwingUtils() { + } + /** * Make DefaultTableModel by overriding getColumnClass and isCellEditable of * DefaultTableModel. @@ -100,7 +103,7 @@ public class SwingUtils { try { java.awt.Desktop.getDesktop().open(f); } catch (Throwable ex) { - MessageBox.Show(C.i18n("message.cannot_open_explorer") + ex.getMessage()); + MessageBox.show(C.i18n("message.cannot_open_explorer") + ex.getMessage()); HMCLog.warn("Failed to open " + path + " through java.awt.Desktop.getDesktop().open()", ex); } break; @@ -299,7 +302,7 @@ public class SwingUtils { try { Utils.shutdownForcely(0); } catch (Exception e) { - MessageBox.Show(C.i18n("launcher.exit_failed")); + MessageBox.show(C.i18n("launcher.exit_failed")); HMCLog.err("Failed to shutdown forcely", e); } else diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/NavButtonManager.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/NavButtonManager.java index 94de57f21..30d5d7776 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/NavButtonManager.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/NavButtonManager.java @@ -125,6 +125,7 @@ public class NavButtonManager implements ActionListener { final boolean aqua = "Aqua".equals(UIManager.getLookAndFeel().getID()); buttons = new JPanel() { + @Override public void doLayout() { Insets ins = getInsets(); JButton b = aqua ? finish : cancel; @@ -221,6 +222,7 @@ public class NavButtonManager implements ActionListener { } + @Override public void actionPerformed(ActionEvent event) { JButton button = (JButton) event.getSource(); @@ -590,10 +592,12 @@ public class NavButtonManager implements ActionListener { boolean wasBusy = false; + @Override public void stepsChanged(Wizard wizard) { // do nothing } + @Override public void navigabilityChanged(final Wizard wizard) { final Runnable runnable = () -> { if (wizard.isBusy()) { @@ -618,6 +622,7 @@ public class NavButtonManager implements ActionListener { EventQueue.invokeLater(runnable); } + @Override public void selectionChanged(Wizard wizard) { // do nothing } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/NavProgress.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/NavProgress.java index df44ba0b8..7f543b47a 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/NavProgress.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/NavProgress.java @@ -48,6 +48,7 @@ public class NavProgress implements ResultProgressHandle { this.parent = impl; } + @Override public void addProgressComponents(Container panel) { panel.add(lbl); panel.add(progressBar); @@ -55,6 +56,7 @@ public class NavProgress implements ResultProgressHandle { ipanel = panel; } + @Override public void setProgress(final String description, final int currentStep, final int totalSteps) { invoke(() -> { lbl.setText(description == null ? " " : description); @@ -62,6 +64,7 @@ public class NavProgress implements ResultProgressHandle { }); } + @Override public void setProgress(final int currentStep, final int totalSteps) { invoke(() -> { if (totalSteps == -1) { @@ -82,6 +85,7 @@ public class NavProgress implements ResultProgressHandle { }); } + @Override public void setBusy(final String description) { invoke(() -> { lbl.setText(description == null ? " " : description); @@ -101,6 +105,7 @@ public class NavProgress implements ResultProgressHandle { } } + @Override public void finished(final Object o) { isRunning = false; Runnable r = () -> { @@ -118,6 +123,7 @@ public class NavProgress implements ResultProgressHandle { invoke(r); } + @Override public void failed(final String message, final boolean canGoBack) { failMessage = message; isRunning = false; @@ -134,6 +140,7 @@ public class NavProgress implements ResultProgressHandle { invoke(r); } + @Override public boolean isRunning() { return isRunning; } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/WizardDisplayerImpl.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/WizardDisplayerImpl.java index 790f2b1d4..d43f7e976 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/WizardDisplayerImpl.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/api/displayer/WizardDisplayerImpl.java @@ -66,11 +66,10 @@ import org.jackhuang.hellominecraft.util.ui.wizard.spi.WizardPanel; * This class is NOT AN API CLASS. There is no * commitment that it will remain backward compatible or even exist in the * future. The API of this library is in the packages - * org.netbeans.api.wizard - * and org.netbeans.spi.wizard. + * org.netbeans.api.wizard and + * org.netbeans.spi.wizard. *

- * Use - * WizardDisplayer.showWizard() or its other static methods to + * Use WizardDisplayer.showWizard() or its other static methods to * display wizards in a way which will continue to work over time. * * @author stanley@StanleyKnutson.com @@ -122,9 +121,10 @@ public class WizardDisplayerImpl extends WizardDisplayer { protected void buildStepTitle() { ttlLabel = new JLabel(wizard.getStepDescription(wizard.getAllSteps()[0])); ttlLabel.setBorder(BorderFactory.createCompoundBorder(BorderFactory - .createEmptyBorder(5, 5, 12, 5), BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager - .getColor("textText")))); + .createEmptyBorder(5, 5, 12, 5), BorderFactory.createMatteBorder(0, 0, 1, 0, UIManager + .getColor("textText")))); ttlPanel = new JPanel() { + @Override public void doLayout() { Dimension d = ttlLabel.getPreferredSize(); if (ttlLabel.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT) @@ -133,6 +133,7 @@ public class WizardDisplayerImpl extends WizardDisplayer { ttlLabel.setBounds(0, 0, getWidth(), d.height); } + @Override public Dimension getPreferredSize() { return ttlLabel.getPreferredSize(); } @@ -151,9 +152,8 @@ public class WizardDisplayerImpl extends WizardDisplayer { /** * Show a wizard * - * @param awizard is the wizard to be displayed - * @param bounds for display, may be null for default of - * 0,0,400,600. + * @param awizard is the wizard to be displayed + * @param bounds for display, may be null for default of 0,0,400,600. * @param helpAction * @param initialProperties - initial values for the map * @@ -164,7 +164,7 @@ public class WizardDisplayerImpl extends WizardDisplayer { * java.awt.Rectangle, javax.swing.Action, java.util.Map) */ private JPanel createOuterPanel(final Wizard awizard, Rectangle bounds, Action helpAction, - Map initialProperties) { + Map initialProperties) { this.wizard = awizard; @@ -181,6 +181,7 @@ public class WizardDisplayerImpl extends WizardDisplayer { outerPanel.setLayout(new BorderLayout()); Action kbdCancel = new AbstractAction() { + @Override public void actionPerformed(ActionEvent e) { JButton b = buttonManager.getCancel(); if (b.isEnabled()) @@ -188,7 +189,7 @@ public class WizardDisplayerImpl extends WizardDisplayer { } }; outerPanel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW).put( - KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel"); + KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel"); outerPanel.getActionMap().put("cancel", kbdCancel); instructions = createInstructionsPanel(); @@ -232,8 +233,9 @@ public class WizardDisplayerImpl extends WizardDisplayer { return new InstructionsPanelImpl(wizard); } + @Override public void install(Container c, Object layoutConstraint, Wizard awizard, - Action helpAction, Map initialProperties, WizardResultReceiver receiver) { + Action helpAction, Map initialProperties, WizardResultReceiver receiver) { JPanel pnl = createOuterPanel(awizard, new Rectangle(), helpAction, initialProperties); if (layoutConstraint != null) if (c instanceof RootPaneContainer) @@ -249,12 +251,13 @@ public class WizardDisplayerImpl extends WizardDisplayer { private static boolean warned; + @Override public Object show(final Wizard awizard, Rectangle bounds, Action helpAction, - Map initialProperties) { + Map initialProperties) { if (!EventQueue.isDispatchThread() && !warned) { HMCLog.warn("WizardDisplayerImpl: show() should be called from the AWT Event Thread. This " - + "call may deadlock - c.f. " - + "http://java.net/jira/browse/WIZARD-33", new Throwable()); + + "call may deadlock - c.f. " + + "http://java.net/jira/browse/WIZARD-33", new Throwable()); warned = true; } createOuterPanel(awizard, bounds, helpAction, initialProperties); @@ -291,25 +294,26 @@ public class WizardDisplayerImpl extends WizardDisplayer { dlg.pack(); dlg.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); dlg.addWindowListener(new WindowAdapter() { + @Override public void windowClosing(WindowEvent e) { - if (!(e.getWindow() instanceof JDialog)) - return; - JDialog dlg = (JDialog) e.getWindow(); - boolean dontClose = false; - if (!wizard.isBusy()) { - DeferredWizardResult defResult; - synchronized (WizardDisplayerImpl.this) { - defResult = deferredResult; - } - try { - if (defResult != null && defResult.canAbort()) - defResult.abort(); - else if (defResult != null && !defResult.canAbort()) - dontClose = true; - } finally { - if (!dontClose && wizard.cancel(settings)) { - dlg.setVisible(false); - dlg.dispose(); + if (e.getWindow() instanceof JDialog) { + JDialog dlg = (JDialog) e.getWindow(); + boolean dontClose = false; + if (!wizard.isBusy()) { + DeferredWizardResult defResult; + synchronized (WizardDisplayerImpl.this) { + defResult = deferredResult; + } + try { + if (defResult != null && defResult.canAbort()) + defResult.abort(); + else if (defResult != null && !defResult.canAbort()) + dontClose = true; + } finally { + if (!dontClose && wizard.cancel(settings)) { + dlg.setVisible(false); + dlg.dispose(); + } } } } @@ -355,13 +359,13 @@ public class WizardDisplayerImpl extends WizardDisplayer { // available in the package only static void checkLegalNavMode(int i) { switch (i) { - case Wizard.MODE_CAN_CONTINUE: - case Wizard.MODE_CAN_CONTINUE_OR_FINISH: - case Wizard.MODE_CAN_FINISH: - return; - default: - throw new IllegalArgumentException("Illegal forward " - + "navigation mode: " + i); + case Wizard.MODE_CAN_CONTINUE: + case Wizard.MODE_CAN_CONTINUE_OR_FINISH: + case Wizard.MODE_CAN_FINISH: + return; + default: + throw new IllegalArgumentException("Illegal forward " + + "navigation mode: " + i); } } @@ -399,7 +403,7 @@ public class WizardDisplayerImpl extends WizardDisplayer { JComponent summaryComp = (JComponent) summary.getSummaryComponent(); // XXX if (summaryComp.getBorder() != null) { CompoundBorder b = new CompoundBorder(new EmptyBorder(5, 5, 5, 5), summaryComp - .getBorder()); + .getBorder()); summaryComp.setBorder(b); } setCurrentWizardPanel((JComponent) summaryComp); // XXX @@ -426,6 +430,7 @@ public class WizardDisplayerImpl extends WizardDisplayer { ((JComponent) inst).revalidate(); inst.repaint(); Runnable run = new Runnable() { + @Override public void run() { if (!EventQueue.isDispatchThread()) try { @@ -433,7 +438,7 @@ public class WizardDisplayerImpl extends WizardDisplayer { r.start(settings, progress); if (progress.isRunning()) progress.failed("Start method did not inidicate " - + "failure or finished in " + r, false); + + "failure or finished in " + r, false); } finally { try { @@ -538,8 +543,8 @@ public class WizardDisplayerImpl extends WizardDisplayer { /** * Will only be called if there is a WizardResultReceiver - i.e. if the - * wizard is being displayed in some kind of custom container. Return - * true to indicate we should not try to close the parent window. + * wizard is being displayed in some kind of custom container. Return true + * to indicate we should not try to close the parent window. */ boolean cancel() { boolean result = receiver != null; @@ -556,10 +561,10 @@ public class WizardDisplayerImpl extends WizardDisplayer { // showing the error line prob = null; Border b = prob == null ? BorderFactory.createEmptyBorder(1, 0, 0, 0) : BorderFactory - .createMatteBorder(1, 0, 0, 0, problem.getForeground()); + .createMatteBorder(1, 0, 0, 0, problem.getForeground()); Border b1 = BorderFactory.createCompoundBorder(BorderFactory - .createEmptyBorder(0, 12, 0, 12), b); + .createEmptyBorder(0, 12, 0, 12), b); problem.setBorder(b1); } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/modules/InstructionsPanelImpl.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/modules/InstructionsPanelImpl.java index 2049e4a58..19d1c0fab 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/modules/InstructionsPanelImpl.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/modules/InstructionsPanelImpl.java @@ -50,15 +50,15 @@ import org.jackhuang.hellominecraft.util.ui.wizard.spi.Wizard; import org.jackhuang.hellominecraft.util.ui.wizard.spi.WizardObserver; /** - * A panel that displays a background image and optionally instructions - * from a wizard, tracking the selected panel and showing that in bold. - *

+ * A panel that displays a background image and optionally instructions from a + * wizard, tracking the selected panel and showing that in bold. + *
* This class is NOT AN API CLASS. There is no * commitment that it will remain backward compatible or even exist in the * future. The API of this library is in the packages - * org.netbeans.api.wizard - * and org.netbeans.spi.wizard. - *

+ * org.netbeans.api.wizard and + * org.netbeans.spi.wizard. + *
* There is currently a single use-case for subclassing this - a navigation * panel that wants to display a different image for each step. * @@ -66,8 +66,8 @@ import org.jackhuang.hellominecraft.util.ui.wizard.spi.WizardObserver; */ public class InstructionsPanelImpl extends JComponent implements WizardObserver, Accessible, InstructionsPanel { - private final BufferedImage img; - private final Wizard wizard; + private transient final BufferedImage img; + private transient final Wizard wizard; private static final int MARGIN = 5; public InstructionsPanelImpl(Wizard wiz) { @@ -86,6 +86,7 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, return wizard; } + @Override public final Container getComponent() { return this; } @@ -93,6 +94,7 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, /** * Overridden to start listening to the wizard when added to a container */ + @Override public void addNotify() { super.addNotify(); wizard.addWizardObserver(this); @@ -101,16 +103,16 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, /** * Overridden to stop listening to the wizard when removed from a container */ + @Override public void removeNotify() { wizard.removeWizardObserver(this); super.removeNotify(); } /** - * Get the image to be displayed. Note that unpredictable behavior - * may result if all images returned from this method are not the - * same size. Override to display a different wizard depending on the - * step. + * Get the image to be displayed. Note that unpredictable behavior may + * result if all images returned from this method are not the same size. + * Override to display a different wizard depending on the step. * * @return */ @@ -122,7 +124,7 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, if (img == null) try { img = ImageIO.read(InstructionsPanelImpl.class.getResourceAsStream( - "/org/jackhuang/hellominecraft/wizard.jpg")); + "/org/jackhuang/hellominecraft/wizard.jpg")); } catch (IOException ioe) { HMCLog.err("Failed to load wizard.jpg, maybe you fucking modified the launcher", ioe); } @@ -130,13 +132,14 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, this.wizard = wizard; } + @Override public boolean isOpaque() { return img != null; } /** - * Paints the background image for this component, or fills the - * background with a color if no image present. + * Paints the background image for this component, or fills the background + * with a color if no image present. * * @param g A Graphic2D to paint into * @param x The x coordinate of the area that should contain the image @@ -158,6 +161,7 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, String[] steps = new String[0]; + @Override public final void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); @@ -193,10 +197,10 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, int underlineY = ins.top + MARGIN + fm.getAscent() + 3; g.drawLine(x, underlineY, x + (getWidth() - (x + ins.left + MARGIN)), - underlineY); + underlineY); int bottom = getComponentCount() == 0 ? getHeight() - getInsets().bottom - : getHeight() - getInsets().bottom - getComponents()[0].getPreferredSize().height; + : getHeight() - getInsets().bottom - getComponents()[0].getPreferredSize().height; y += h + 10; int first = 0; @@ -231,7 +235,7 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, for (int i = first; i < stop; i++) { boolean isUndetermined = Wizard.UNDETERMINED_STEP.equals(steps2[i]); boolean canOnlyFinish = wizard.getForwardNavigationMode() - == Wizard.MODE_CAN_FINISH; + == Wizard.MODE_CAN_FINISH; if (isUndetermined && canOnlyFinish) break; String curr; @@ -240,36 +244,35 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, curr = (i + 1) + ". " + steps2[i]; else curr = (i + 1) + ". " + (isUndetermined - ? elipsis - : steps2[i].equals(elipsis) ? elipsis - : wizard.getStepDescription(steps2[i])); + ? elipsis + : steps2[i].equals(elipsis) ? elipsis + : wizard.getStepDescription(steps2[i])); else curr = elipsis; - if (curr != null) { - boolean selected = (steps2[i].equals(currentStep) && !inSummaryPage) - || (inSummaryPage && i == steps2.length - 1); - if (selected) - g.setFont(boldFont); + boolean selected = (steps2[i].equals(currentStep) && !inSummaryPage) + || (inSummaryPage && i == steps2.length - 1); + if (selected) + g.setFont(boldFont); - int width = fm.stringWidth(curr); - while (width > getWidth() - (ins.left + ins.right) && curr.length() > 5) - curr = curr.substring(0, curr.length() - 5) + elipsis; + int width = fm.stringWidth(curr); + while (width > getWidth() - (ins.left + ins.right) && curr.length() > 5) + curr = curr.substring(0, curr.length() - 5) + elipsis; - g.drawString(curr, x, y); - if (selected) - g.setFont(f); - y += h; - } + g.drawString(curr, x, y); + if (selected) + g.setFont(f); + y += h; } } private int historicWidth = Integer.MIN_VALUE; - String elipsis = "..."; + private static final String elipsis = "..."; + @Override public final Dimension getPreferredSize() { Font f = getFont() != null ? getFont() - : UIManager.getFont("controlFont"); + : UIManager.getFont("controlFont"); Graphics g = getGraphics(); if (g == null) @@ -283,10 +286,9 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, int w = Integer.MIN_VALUE; for (int i = 0; i < steps2.length; i++) { String desc = i + ". " + (Wizard.UNDETERMINED_STEP.equals(steps2[i]) - ? elipsis - : wizard.getStepDescription(steps2[i])); - if (desc != null) - w = Math.max(w, fm.stringWidth(desc) + MARGIN); + ? elipsis + : wizard.getStepDescription(steps2[i])); + w = Math.max(w, fm.stringWidth(desc) + MARGIN); } if (Integer.MIN_VALUE == w) w = 250; @@ -301,27 +303,33 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, private boolean inSummaryPage; + @Override public void setInSummaryPage(boolean val) { this.inSummaryPage = val; repaint(); } + @Override public final Dimension getMinimumSize() { return getPreferredSize(); } + @Override public void stepsChanged(Wizard wizard) { repaint(); } + @Override public void navigabilityChanged(Wizard wizard) { //do nothing } + @Override public void selectionChanged(Wizard wizard) { repaint(); } + @Override public final void doLayout() { Component[] c = getComponents(); Insets ins = getInsets(); @@ -337,6 +345,7 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, } } + @Override public final AccessibleContext getAccessibleContext() { return new ACI(this); } @@ -355,6 +364,7 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, JEditorPane pane; + @Override public AccessibleText getAccessibleText() { if (pane == null) { //Cheat just a bit here - will do for now - the text is @@ -382,31 +392,37 @@ public class InstructionsPanelImpl extends JComponent implements WizardObserver, return sb.toString(); } + @Override public AccessibleRole getAccessibleRole() { return AccessibleRole.LIST; } + @Override public AccessibleStateSet getAccessibleStateSet() { - AccessibleState[] states = new AccessibleState[] { + AccessibleState[] states = new AccessibleState[]{ AccessibleState.VISIBLE, AccessibleState.OPAQUE, AccessibleState.SHOWING, - AccessibleState.MULTI_LINE, }; + AccessibleState.MULTI_LINE,}; return new AccessibleStateSet(states); } + @Override public int getAccessibleIndexInParent() { return -1; } + @Override public int getAccessibleChildrenCount() { return 0; } + @Override public Accessible getAccessibleChild(int i) { throw new IndexOutOfBoundsException("" + i); } + @Override public Locale getLocale() throws IllegalComponentStateException { return Locale.getDefault(); } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/modules/MergeMap.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/modules/MergeMap.java index 31dcf03e4..e750cd280 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/modules/MergeMap.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/modules/MergeMap.java @@ -124,7 +124,6 @@ public class MergeMap implements Map { //we're removing, and if any of them are in steps lower on the //stack, change those lower steps values to whatever was written //into the map we're calving off - Set keysForCurr = curr.keySet(); for (Iterator i = orderIterator(); i.hasNext();) { Map other = (Map) id2map.get(i.next()); for (Iterator j = curr.keySet().iterator(); j.hasNext();) { @@ -136,10 +135,12 @@ public class MergeMap implements Map { return result; } + @Override public void clear() { throw new UnsupportedOperationException(); } + @Override public boolean containsKey(Object obj) { for (Iterator i = orderIterator(); i.hasNext();) { Map curr = (Map) id2map.get(i.next()); @@ -149,6 +150,7 @@ public class MergeMap implements Map { return false; } + @Override public boolean containsValue(Object obj) { for (Iterator i = orderIterator(); i.hasNext();) { Map curr = (Map) id2map.get(i.next()); @@ -158,6 +160,7 @@ public class MergeMap implements Map { return false; } + @Override public java.util.Set entrySet() { HashSet result = new HashSet(); for (Iterator i = orderIterator(); i.hasNext();) { @@ -167,6 +170,7 @@ public class MergeMap implements Map { return result; } + @Override public Object get(Object obj) { for (Iterator i = orderIterator(); i.hasNext();) { String id = (String) i.next(); @@ -178,10 +182,12 @@ public class MergeMap implements Map { return null; } + @Override public boolean isEmpty() { return size() == 0; } + @Override public Set keySet() { HashSet result = new HashSet(); for (Iterator i = orderIterator(); i.hasNext();) { @@ -191,11 +197,13 @@ public class MergeMap implements Map { return result; } + @Override public Object put(Object obj, Object obj1) { Map curr = (Map) id2map.get(order.peek()); return curr.put(obj, obj1); } + @Override public void putAll(Map map) { Map curr = (Map) id2map.get(order.peek()); curr.putAll(map); @@ -214,6 +222,7 @@ public class MergeMap implements Map { return result; } + @Override public Object remove(Object obj) { //Ensure we remove any duplicates in upper arrays Object result = get(obj); @@ -222,11 +231,13 @@ public class MergeMap implements Map { return result; } + @Override public int size() { //using keySet() prunes duplicates return keySet().size(); } + @Override public Collection values() { HashSet result = new HashSet(); Set keys = keySet(); diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/BranchingWizard.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/BranchingWizard.java index a79607d49..a224f2b18 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/BranchingWizard.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/BranchingWizard.java @@ -18,28 +18,22 @@ package org.jackhuang.hellominecraft.util.ui.wizard.spi; import javax.swing.*; import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; import java.util.Map; /** - * A Wizard with indeterminate branches. The actual branch decision-making - * is done by the WizardBranchController passed to the constructor. + * A Wizard with indeterminate branches. The actual branch decision-making is + * done by the WizardBranchController passed to the constructor. *

* Wizards with arbitrary numbers of branches can be handled by a - * WizardBranchController by returning wizards created by - * another WizardBranchController's createWizard() method. + * WizardBranchController by returning wizards created by another + * WizardBranchController's createWizard() method. *

- * One important point: There should be no duplicate IDs between steps of - * this wizard. + * One important point: There should be no duplicate IDs between steps of this + * wizard. * * @author Tim Boudreau */ -final class BranchingWizard implements WizardImplementation { - - private final List listenerList = Collections.synchronizedList( - new LinkedList()); +final class BranchingWizard extends AbstractWizard { private final WizardBranchController brancher; final WizardImplementation initialSteps; @@ -89,8 +83,8 @@ final class BranchingWizard implements WizardImplementation { private void setSecondary(WizardImplementation newSecondary) { /* johnflournoy added additional condition: secondary != this */ if ((((subsequentSteps == null) != (newSecondary == null)) - || (subsequentSteps != null && !subsequentSteps.equals(newSecondary))) - && !this.equals(newSecondary)) + || (subsequentSteps != null && !subsequentSteps.equals(newSecondary))) + && !this.equals(newSecondary)) /* * johnflournoy: only set the subsequent steps if it @@ -102,6 +96,7 @@ final class BranchingWizard implements WizardImplementation { } } + @Override public int getForwardNavigationMode() { return activeWizard.getForwardNavigationMode(); } @@ -124,10 +119,12 @@ final class BranchingWizard implements WizardImplementation { activeWizard.addWizardObserver(wl); } + @Override public final boolean isBusy() { return activeWizard.isBusy(); } + @Override public final Object finish(Map settings) throws WizardException { try { Object result = activeWizard.finish(settings); @@ -147,6 +144,7 @@ final class BranchingWizard implements WizardImplementation { } } + @Override public final String[] getAllSteps() { String[] result; if (subsequentSteps == null) { @@ -164,10 +162,12 @@ final class BranchingWizard implements WizardImplementation { return result; } + @Override public String getCurrentStep() { return currStep; } + @Override public final String getNextStep() { String result; if (currStep == null) @@ -177,8 +177,8 @@ final class BranchingWizard implements WizardImplementation { int idx = Arrays.asList(steps).indexOf(currStep); if (idx == -1) throw new IllegalStateException("Current step not in" - + " available steps: " + currStep + " not in " - + Arrays.asList(steps)); + + " available steps: " + currStep + " not in " + + Arrays.asList(steps)); else if (idx == steps.length - 1) if (subsequentSteps == null) result = UNDETERMINED_STEP; @@ -199,6 +199,7 @@ final class BranchingWizard implements WizardImplementation { return getProblem() == null ? result : UNDETERMINED_STEP.equals(result) ? result : null; } + @Override public final String getPreviousStep() { if (activeWizard == subsequentSteps && subsequentSteps.getAllSteps()[0].equals(currStep)) return initialSteps.getAllSteps()[initialSteps.getAllSteps().length - 1]; @@ -206,10 +207,12 @@ final class BranchingWizard implements WizardImplementation { return activeWizard.getPreviousStep(); } + @Override public final String getProblem() { return activeWizard.getProblem(); } + @Override public final String getStepDescription(String id) { WizardImplementation w = ownerOf(id); if (w == null) @@ -217,6 +220,7 @@ final class BranchingWizard implements WizardImplementation { return w.getStepDescription(id); } + @Override public final String getLongDescription(String id) { WizardImplementation w = ownerOf(id); if (w == null) @@ -249,10 +253,12 @@ final class BranchingWizard implements WizardImplementation { } } + @Override public final String getTitle() { return activeWizard.getTitle(); } + @Override public final JComponent navigatingTo(String id, Map settings) { if (id == null) throw new NullPointerException(); @@ -262,63 +268,53 @@ final class BranchingWizard implements WizardImplementation { WizardImplementation impl = ownerOf(id); if (impl == null) throw new NullPointerException("No owning WizardImplementation for" - + " id " + id); + + " id " + id); setCurrent(impl); return activeWizard.navigatingTo(id, settings); } + @Override public final void removeWizardObserver(WizardObserver observer) { listenerList.remove(observer); } + @Override public final void addWizardObserver(WizardObserver observer) { listenerList.add(observer); } private void fireStepsChanged() { - WizardObserver[] listeners = (WizardObserver[]) listenerList.toArray(new WizardObserver[0]); - - for (int i = listeners.length - 1; i >= 0; i--) { - WizardObserver l = (WizardObserver) listeners[i]; - l.stepsChanged(null); - } + fireChanged(l -> l.stepsChanged(null)); } private void fireNavigabilityChanged() { checkForSecondary(); - - WizardObserver[] listeners = (WizardObserver[]) listenerList.toArray(new WizardObserver[0]); - - for (int i = listeners.length - 1; i >= 0; i--) { - WizardObserver l = (WizardObserver) listeners[i]; - l.navigabilityChanged(null); - } + fireChanged(l -> l.navigabilityChanged(null)); } private void fireSelectionChanged() { - WizardObserver[] listeners = (WizardObserver[]) listenerList.toArray(new WizardObserver[0]); - - for (int i = listeners.length - 1; i >= 0; i--) { - WizardObserver l = (WizardObserver) listeners[i]; - l.selectionChanged(null); - } + fireChanged(l -> l.selectionChanged(null)); } + @Override public boolean cancel(Map settings) { return activeWizard == null ? true : activeWizard.cancel(settings); } private class WL implements WizardObserver { + @Override public void stepsChanged(Wizard wizard) { fireStepsChanged(); } + @Override public void navigabilityChanged(Wizard wizard) { fireNavigabilityChanged(); } + @Override public void selectionChanged(Wizard wizard) { fireSelectionChanged(); } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/SimpleWizard.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/SimpleWizard.java index e6c0f0379..09b33ca7d 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/SimpleWizard.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/SimpleWizard.java @@ -18,10 +18,7 @@ package org.jackhuang.hellominecraft.util.ui.wizard.spi; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; import java.util.Map; import javax.swing.JComponent; @@ -33,10 +30,8 @@ import javax.swing.JComponent; * @see SimpleWizardInfo * @author Tim Boudreau */ -final class SimpleWizard implements WizardImplementation { +final class SimpleWizard extends AbstractWizard { - private final List listenerList - = Collections.synchronizedList(new LinkedList()); private final Map ids2panels = new HashMap(); final SimpleWizardInfo info; @@ -65,14 +60,17 @@ final class SimpleWizard implements WizardImplementation { info.setWizard(this); } + @Override public void addWizardObserver(WizardObserver observer) { listenerList.add(observer); } + @Override public void removeWizardObserver(WizardObserver observer) { listenerList.remove(observer); } + @Override public int getForwardNavigationMode() { int result = info.getFwdNavMode(); if (!subwizard && ((result & WizardController.MODE_CAN_CONTINUE) != 0) && isLastStep()) @@ -85,6 +83,7 @@ final class SimpleWizard implements WizardImplementation { return currID != null && steps.length > 0 && currID.equals(steps[steps.length - 1]); } + @Override public String[] getAllSteps() { String[] allSteps = info.getSteps(); String[] result = new String[allSteps.length]; @@ -93,6 +92,7 @@ final class SimpleWizard implements WizardImplementation { return result; } + @Override public String getStepDescription(String id) { int idx = Arrays.asList(info.getSteps()).indexOf(id); if (idx == -1) @@ -100,10 +100,12 @@ final class SimpleWizard implements WizardImplementation { return info.getDescriptions()[idx]; } + @Override public String getLongDescription(String id) { return info.getLongDescription(id); } + @Override public JComponent navigatingTo(String id, Map settings) { // assert SwingUtilities.isEventDispatchThread(); @@ -121,10 +123,12 @@ final class SimpleWizard implements WizardImplementation { return result; } + @Override public String getCurrentStep() { return currID; } + @Override public String getNextStep() { if (!info.isValid()) return null; @@ -138,6 +142,7 @@ final class SimpleWizard implements WizardImplementation { return null; } + @Override public String getPreviousStep() { int idx = currentStepIndex(); if (idx < info.getSteps().length && idx > 0) @@ -154,47 +159,44 @@ final class SimpleWizard implements WizardImplementation { } void fireNavigability() { - WizardObserver[] listeners = (WizardObserver[]) listenerList.toArray(new WizardObserver[0]); - - for (int i = listeners.length - 1; i >= 0; i--) { - WizardObserver l = (WizardObserver) listeners[i]; - l.navigabilityChanged(null); - } + fireChanged(l -> l.navigabilityChanged(null)); } private void fireSelectionChanged() { - WizardObserver[] listeners = (WizardObserver[]) listenerList.toArray(new WizardObserver[0]); - - for (int i = listeners.length - 1; i >= 0; i--) { - WizardObserver l = (WizardObserver) listeners[i]; - l.selectionChanged(null); - } + fireChanged(l -> l.selectionChanged(null)); } + @Override public Object finish(Map settings) throws WizardException { return info.finish(settings); } + @Override public boolean cancel(Map settings) { return info.cancel(settings); } + @Override public String getTitle() { return info.getTitle(); } + @Override public String getProblem() { return info.getProblem(); } + @Override public boolean isBusy() { return info.isBusy(); } + @Override public int hashCode() { return info.hashCode() ^ 17; } + @Override public boolean equals(Object o) { if (o instanceof SimpleWizard) return ((SimpleWizard) o).info.equals(info); @@ -202,6 +204,7 @@ final class SimpleWizard implements WizardImplementation { return false; } + @Override public String toString() { return "SimpleWizard for " + info; } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/SimpleWizardInfo.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/SimpleWizardInfo.java index 507e150fa..8738385d7 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/SimpleWizardInfo.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/SimpleWizardInfo.java @@ -29,6 +29,8 @@ import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JScrollPane; import javax.swing.JTextArea; +import org.jackhuang.hellominecraft.util.code.Charsets; +import org.jackhuang.hellominecraft.util.system.IOUtils; /** * Provides information about a simple wizard. Wraps a @@ -117,9 +119,9 @@ public final class SimpleWizardInfo implements WizardControllerImplementation { JTextArea jta = new JTextArea(); jta.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.RED)); ByteArrayOutputStream buf = new ByteArrayOutputStream(); - PrintStream str = new PrintStream(buf); + PrintStream str = IOUtils.createPrintStream(buf, Charsets.UTF_8); re.printStackTrace(str); - jta.setText(new String(buf.toByteArray())); + jta.setText(new String(buf.toByteArray(), Charsets.UTF_8)); setProblem(re.getLocalizedMessage()); return new JScrollPane(jta); } @@ -176,6 +178,7 @@ public final class SimpleWizardInfo implements WizardControllerImplementation { return a == null ? 0 : a.currentStepIndex(); } + @Override public final void setBusy(boolean value) { if (value != busy) { busy = value; @@ -188,6 +191,7 @@ public final class SimpleWizardInfo implements WizardControllerImplementation { * user-entered information in a panel changes, call this method as * appropriate. */ + @Override public final void setProblem(String value) { this.problem = value; int idx = index(); @@ -215,6 +219,7 @@ public final class SimpleWizardInfo implements WizardControllerImplementation { * * @see setProblem */ + @Override public final void setForwardNavigationMode(int value) { switch (value) { case WizardController.MODE_CAN_CONTINUE: @@ -292,6 +297,7 @@ public final class SimpleWizardInfo implements WizardControllerImplementation { return busy; } + @Override public boolean equals(Object o) { if (o != null && o.getClass() == getClass()) { SimpleWizardInfo info = (SimpleWizardInfo) o; @@ -308,6 +314,7 @@ public final class SimpleWizardInfo implements WizardControllerImplementation { return false; } + @Override public int hashCode() { int result = 0; for (int i = 0; i < steps.length; i++) diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/Util.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/Util.java index bf812ecb1..bd6fbfd69 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/Util.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/Util.java @@ -7,6 +7,8 @@ package org.jackhuang.hellominecraft.util.ui.wizard.spi; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.HashSet; import java.util.Set; @@ -30,7 +32,7 @@ final class Util { result[i] = pages[i].id(); if (result[i] == null || uniqueNames.contains(result[i])) { result[i] = uniquify(getIDFromStaticMethod(pages[i].getClass()), - uniqueNames); + uniqueNames); pages[i].id = result[i]; } uniqueNames.add(result[i]); @@ -67,12 +69,12 @@ final class Util { // System.err.println("GetID by method for " + clazz); String result = null; try { - Method m = clazz.getDeclaredMethod("getStep", new Class[] {}); + Method m = clazz.getDeclaredMethod("getStep", new Class[]{}); // assert m.getReturnType() == String.class; result = (String) m.invoke(clazz, (Object[]) null); if (result == null) throw new NullPointerException("getStep may not return null"); - } catch (Exception ex) { + } catch (IllegalAccessException | IllegalArgumentException | NoSuchMethodException | NullPointerException | SecurityException | InvocationTargetException ex) { //do nothing } return result == null ? clazz.getName() : result; @@ -92,11 +94,11 @@ final class Util { for (int i = 0; i < pages.length; i++) { if (pages[i] == null) throw new NullPointerException("Null at " + i + " in array " - + "of panel classes"); + + "of panel classes"); if (!WizardPage.class.isAssignableFrom(pages[i])) throw new IllegalArgumentException(pages[i] - + " is not a subclass of WizardPage"); + + " is not a subclass of WizardPage"); result[i] = uniquify(getIDFromStaticMethod(pages[i]), used); if (result[i] == null) result[i] = pages[i].getName(); @@ -128,33 +130,33 @@ final class Util { } static String getDescriptionFromStaticMethod(Class clazz) { - String result = null; Method m; try { m = clazz.getDeclaredMethod("getDescription", (Class[]) null); - } catch (Exception e) { + } catch (NoSuchMethodException | SecurityException e) { throw new IllegalArgumentException("Could not find or access " - + "public static String " + clazz.getName() - + ".getDescription() - make sure it exists"); + + "public static String " + clazz.getName() + + ".getDescription() - make sure it exists"); } if (m.getReturnType() != String.class) throw new IllegalArgumentException("getStep has wrong " - + " return type: " + m.getReturnType() + " on " - + clazz); + + " return type: " + m.getReturnType() + " on " + + clazz); if (!Modifier.isStatic(m.getModifiers())) throw new IllegalArgumentException("getStep is not " - + "static on " + clazz); + + "static on " + clazz); - try { - m.setAccessible(true); - result = (String) m.invoke(null, (Object[]) null); - } catch (InvocationTargetException | IllegalAccessException ite) { - throw new IllegalArgumentException("Could not invoke " - + "public static String " + clazz.getName() - + ".getDescription() - make sure it exists.", ite); - } - return result; + return AccessController.doPrivileged((PrivilegedAction) () -> { + try { + m.setAccessible(true); + return (String) m.invoke(null, (Object[]) null); + } catch (InvocationTargetException | IllegalAccessException ite) { + throw new IllegalArgumentException("Could not invoke " + + "public static String " + clazz.getName() + + ".getDescription() - make sure it exists.", ite); + } + }); } } diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/WizardPage.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/WizardPage.java index 7cdd1937f..529f74c09 100644 --- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/WizardPage.java +++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/wizard/spi/WizardPage.java @@ -33,14 +33,13 @@ import java.util.Map; *

* Automatic listening to child components
* If you add an editable component (all standard Swing controls are supported) - * to a WizardPage or a child JPanel inside it, - * a listener is automatically attached to it. If user input occurs, the - * following things happen, in order: + * to a WizardPage or a child JPanel inside it, a listener is automatically + * attached to it. If user input occurs, the following things happen, in order: *

    - *
  • If the name property of the component has been set, then - * the value from the component (i.e. Boolean for checkboxes, selected item(s) - * for lists/combo boxes/trees, etc.) will automatically be added to the - * wizard settings map, with the component name as the key.
  • + *
  • If the name property of the component has been set, then the + * value from the component (i.e. Boolean for checkboxes, selected item(s) for + * lists/combo boxes/trees, etc.) will automatically be added to the wizard + * settings map, with the component name as the key.
  • *
  • Regardless of whether the name property is set, * validateContents() will be called. You can override that method * to enable/disable the finish button, call setProblem() to @@ -51,21 +50,21 @@ import java.util.Map; * appropriate constructor. In that case, validateContents will * never be called automatically. *

    - * If you have custom components that WizardPage will not know how to listen - * to automatically, attach an appropriate listener to them and optionally - * call userInputReceived() with the component and the event if - * you want to run your automatic validation code. + * If you have custom components that WizardPage will not know how to listen to + * automatically, attach an appropriate listener to them and optionally call + * userInputReceived() with the component and the event if you want + * to run your automatic validation code. *

    - * For convenience, this class implements the relevant methods for accessing - * the WizardController and the settings map for the wizard that - * the panel is a part of. + * For convenience, this class implements the relevant methods for accessing the + * WizardController and the settings map for the wizard that the + * panel is a part of. *

    * Instances of WizardPage can be returned from a WizardPanelProvider; this * class also offers two methods for conveniently assembling a wizard: *

      *
    • Pass an array of already instantiated WizardPages to - * createWizard(). Note that for large wizards, it is preferable - * to construct the panels on demand rather than at construction time.
    • + * createWizard(). Note that for large wizards, it is preferable to + * construct the panels on demand rather than at construction time. *
    • Construct a wizard out of WizardPages, instantiating the panels as * needed: Pass an array of classes all of which *
        @@ -80,20 +79,19 @@ import java.util.Map; *

        * Note that during development of a wizard, it is worthwhile to test/run with * assertions enabled, as there is quite a bit of validity checking via - * assertions - * that can help find problems early. + * assertions that can help find problems early. *

        Using Custom Components

        * If the autoListen constructor argument is true, a WizardPage * will automatically listen to components which have a name, if they are - * standard Swing components it knows how to listen to. If you are using - * custom components, implement WizardPage.CustomComponentListener and return - * it from createCustomComponentListener() to add supplementary - * listening code for custom components. + * standard Swing components it knows how to listen to. If you are using custom + * components, implement WizardPage.CustomComponentListener and return it from + * createCustomComponentListener() to add supplementary listening + * code for custom components. *

        * Note: Swing components do not fire property changes when setName() is called. * If your component's values are not being propagated into the settings map, - * make sure you are calling setName() before adding the component - * to the hierarchy. + * make sure you are calling setName() before adding the component to the + * hierarchy. *

        * Also note that cell editors in tables and lists and so forth are always * ignored by the automatic listening code. @@ -127,23 +125,23 @@ public class WizardPage extends JPanel implements WizardPanel { * behavior. * * @param stepDescription the localized description of this step - * @param autoListen if true, components added will automatically be - * listened to for user input + * @param autoListen if true, components added will automatically be + * listened to for user input */ public WizardPage(String stepDescription, boolean autoListen) { this(null, stepDescription, autoListen); } /** - * Construct a new WizardPage with the passed step id and description. - * Use this constructor for WizardPages which will be constructed ahead - * of time and passed in an array to createWizard. + * Construct a new WizardPage with the passed step id and description. Use + * this constructor for WizardPages which will be constructed ahead of time + * and passed in an array to createWizard. * - * @param stepId the unique ID for the step represented. If null, - * the class name or a variant of it will be used + * @param stepId the unique ID for the step represented. If null, the class + * name or a variant of it will be used * @param stepDescription the localized description of this step - * @param autoListen if true, components added will automatically be - * listened to for user input + * @param autoListen if true, components added will automatically be + * listened to for user input * * @see #validateContents */ @@ -161,12 +159,12 @@ public class WizardPage extends JPanel implements WizardPanel { if (autoListen) { //It will attach itself GenericListener gl = new GenericListener(this, ccl = createCustomComponentListener(), - ccl == null ? null : new CustomComponentNotifierImpl(this)); + ccl == null ? null : new CustomComponentNotifierImpl(this)); gl.attachToHierarchyOf(this); } else if ((ccl = createCustomComponentListener()) != null) throw new IllegalStateException("CustomComponentListener " - + "will never be called if the autoListen parameter is " - + "false"); + + "will never be called if the autoListen parameter is " + + "false"); // if (getClass() == WizardPage.class && stepId == null || // description == null) { // throw new NullPointerException ("Step or ID is null"); @@ -186,8 +184,8 @@ public class WizardPage extends JPanel implements WizardPanel { /** * Create an auto-listening WizardPage with the passed description * - * @param stepId The unique id for the step. If null, an id will be - * generated + * @param stepId The unique id for the step. If null, an id will be + * generated * @param stepDescription the localized description of this step * */ @@ -196,8 +194,8 @@ public class WizardPage extends JPanel implements WizardPanel { } /** - * Use this constructor or the default constructor if you intend to - * pass an array of Class objects to lazily create WizardPanels. + * Use this constructor or the default constructor if you intend to pass an + * array of Class objects to lazily create WizardPanels. */ protected WizardPage(boolean autoListen) { this(null, null, autoListen); @@ -211,10 +209,9 @@ public class WizardPage extends JPanel implements WizardPanel { } /** - * If you are using custom Swing or AWT components which the - * WizardPage will not know how to automatically listen to, you - * may want to override this method, implement CustomComponentListener - * and return an instance of it. + * If you are using custom Swing or AWT components which the WizardPage will + * not know how to automatically listen to, you may want to override this + * method, implement CustomComponentListener and return an instance of it. * * @return A CustomComponentListener implementation, or null (the default). */ @@ -223,8 +220,8 @@ public class WizardPage extends JPanel implements WizardPanel { } /** - * Implement this class if you are using custom Swing or AWT components, - * and return an instance of it from + * Implement this class if you are using custom Swing or AWT components, and + * return an instance of it from * WizardPage.createCustomComponentListener(). */ public static abstract class CustomComponentListener { @@ -232,21 +229,20 @@ public class WizardPage extends JPanel implements WizardPanel { /** * Indicates that this CustomComponentListener will take responsibility * for noticing events from the passed component, and that the - * WizardPage should not try to automatically listen on it (which it - * can only do for standard Swing components and their children). + * WizardPage should not try to automatically listen on it (which it can + * only do for standard Swing components and their children). *

        - * Note that this method may be called frequently and any test it - * does should be fast. + * Note that this method may be called frequently and any test it does + * should be fast. *

        - * Important: The return value from this method should always - * be the same for any given component, for the lifetime of the - * WizardPage. + * Important: The return value from this method should always be + * the same for any given component, for the lifetime of the WizardPage. * * @param c A component * - * @return Whether or not this CustomComponentListener will listen - * on the passed component. If true, the component will later be - * passed to startListeningTo() + * @return Whether or not this CustomComponentListener will listen on + * the passed component. If true, the component will later be passed to + * startListeningTo() */ public abstract boolean accept(Component c); @@ -256,8 +252,8 @@ public class WizardPage extends JPanel implements WizardPanel { * CustomComponentNotifier. * * @param c The component to start listening to - * @param n An object that can be called to update the settings map - * when an interesting event occurs on the component + * @param n An object that can be called to update the settings map when + * an interesting event occurs on the component */ public abstract void startListeningTo(Component c, CustomComponentNotifier n); @@ -269,8 +265,8 @@ public class WizardPage extends JPanel implements WizardPanel { public abstract void stopListeningTo(Component c); /** - * Determine if the passed component is a container whose children - * may need to be listened on. Returns false by default. + * Determine if the passed component is a container whose children may + * need to be listened on. Returns false by default. * * @param c A component which might be a container */ @@ -279,47 +275,44 @@ public class WizardPage extends JPanel implements WizardPanel { } /** - * Get the map key for this component's value. By default, returns - * the component's name. Will only - * be passed components which the accept() method - * returned true for. + * Get the map key for this component's value. By default, returns the + * component's name. Will only be passed components which the + * accept() method returned true for. *

        - * Important: The return value from this method should always - * be the same for any given component, for the lifetime of the - * WizardPage. + * Important: The return value from this method should always be + * the same for any given component, for the lifetime of the WizardPage. * - * @param c the component, which the accept method earlier returned - * true for + * @param c the component, which the accept method earlier returned true + * for * - * @return A string key that should be used in the Wizard's settings - * map for the name of this component's value + * @return A string key that should be used in the Wizard's settings map + * for the name of this component's value */ public String keyFor(Component c) { return c.getName(); } /** - * Get the value currently set on the passed component. Will only - * be passed components which the accept() method - * returned true for, and which keyFor() returned non-null. + * Get the value currently set on the passed component. Will only be + * passed components which the accept() method returned + * true for, and which keyFor() returned non-null. * * @param c the component * * @return An object representing the current value of this component. - * For example, if it were a JTextComponent, the value - * would likely - * be the return value of JTextComponent.getText() + * For example, if it were a JTextComponent, the value + * would likely be the return value of + * JTextComponent.getText() */ public abstract Object valueFor(Component c); } /** * Object which is passed to - * CustomComponentListener.startListeningTo(), - * which can be called when an event has occurred on a custom component the + * CustomComponentListener.startListeningTo(), which can be + * called when an event has occurred on a custom component the * CustomComponentListener has claimed (by returning - * true - * from its accept() method). + * true from its accept() method). */ public static abstract class CustomComponentNotifier { @@ -330,10 +323,10 @@ public class WizardPage extends JPanel implements WizardPanel { * Method which may be called when an event occurred on a custom * component. * - * @param c the component + * @param c the component * @param eventObject the event object from the component, or null (with - * the exception of javax.swing.text.DocumentEvent, it - * will likely be a subclass of java.util.EventObject). + * the exception of javax.swing.text.DocumentEvent, it will + * likely be a subclass of java.util.EventObject). */ public abstract void userInputReceived(Component c, Object eventObject); } @@ -398,9 +391,8 @@ public class WizardPage extends JPanel implements WizardPanel { private boolean inValidateContents = false; /** - * Called whenever the page is rendered. - * This can be used by the page as a notification - * to load page-specific information in its fields. + * Called whenever the page is rendered. This can be used by the page as a + * notification to load page-specific information in its fields. *

        * By default, this method does nothing. */ @@ -424,57 +416,55 @@ public class WizardPage extends JPanel implements WizardPanel { } /** - * Create a simple Wizard from an array of WizardPages, with a - * no-op WizardResultProducer. + * Create a simple Wizard from an array of WizardPages, with a no-op + * WizardResultProducer. */ public static Wizard createWizard(WizardPage[] contents) { return createWizard(contents, WizardResultProducer.NO_OP); } /** - * Create simple Wizard from an array of classes, each of which is a - * unique subclass of WizardPage. + * Create simple Wizard from an array of classes, each of which is a unique + * subclass of WizardPage. */ public static Wizard createWizard(Class[] wizardPageClasses, WizardResultProducer finisher) { return new CWPP(wizardPageClasses, finisher).createWizard(); } /** - * Create simple Wizard from an array of classes, each of which is a - * unique subclass of WizardPage. + * Create simple Wizard from an array of classes, each of which is a unique + * subclass of WizardPage. */ public static Wizard createWizard(String title, Class[] wizardPageClasses, WizardResultProducer finisher) { return new CWPP(title, wizardPageClasses, finisher).createWizard(); } /** - * Create simple Wizard from an array of classes, each of which is a - * unique subclass of WizardPage. + * Create simple Wizard from an array of classes, each of which is a unique + * subclass of WizardPage. */ public static Wizard createWizard(String title, Class[] wizardPageClasses) { return new CWPP(title, wizardPageClasses, - WizardResultProducer.NO_OP).createWizard(); + WizardResultProducer.NO_OP).createWizard(); } /** * Create a simple Wizard from an array of classes, each of which is a - * unique subclass of WizardPage, with a - * no-op WizardResultProducer. + * unique subclass of WizardPage, with a no-op WizardResultProducer. */ public static Wizard createWizard(Class[] wizardPageClasses) { return createWizard(wizardPageClasses, WizardResultProducer.NO_OP); } /** - * Called by createPanelForStep, with whatever map is passed. In the - * current impl this is always the same Map, but that is not guaranteed. - * If any content was added by calls to putWizardData() during the - * constructor, etc., such data is copied to the settings map the first - * time this method is called. + * Called by createPanelForStep, with whatever map is passed. In the current + * impl this is always the same Map, but that is not guaranteed. If any + * content was added by calls to putWizardData() during the constructor, + * etc., such data is copied to the settings map the first time this method + * is called. * - * Subclasses do NOT need to override this method, - * they can override renderPage which is always called AFTER the map has - * been made valid. + * Subclasses do NOT need to override this method, they can override + * renderPage which is always called AFTER the map has been made valid. */ void setWizardDataMap(Map m) { if (m == null) @@ -497,8 +487,8 @@ public class WizardPage extends JPanel implements WizardPanel { /** * Set the WizardController. In the current impl, this is always the same * object, but the API does not guarantee that. The first time this is - * called, it will update the state of the passed controller to match - * any state that was set by components during the construction of this + * called, it will update the state of the passed controller to match any + * state that was set by components during the construction of this * component */ void setController(WizardController controller) { @@ -509,9 +499,8 @@ public class WizardPage extends JPanel implements WizardPanel { } /** - * Get the WizardController for interacting with the Wizard that - * contains this panel. - * Return value will never be null. + * Get the WizardController for interacting with the Wizard that contains + * this panel. Return value will never be null. */ private WizardController getController() { return controller; @@ -519,29 +508,29 @@ public class WizardPage extends JPanel implements WizardPanel { /** * Set the problem string. Call this method if next/finish should be - * disabled. The passed string will be visible to the user, and should - * be a short, localized description of what is wrong. + * disabled. The passed string will be visible to the user, and should be a + * short, localized description of what is wrong. */ protected final void setProblem(String value) { getController().setProblem(value); } /** - * Set whether the finish, next or both buttons should be enabled, - * assuming no problem string is set. + * Set whether the finish, next or both buttons should be enabled, assuming + * no problem string is set. * * @param value WizardController.MODE_CAN_CONTINUE, - * WizardController.MODE_CAN_FINISH or - * WizardController.MODE_CAN_CONTINUE_OR_FINISH; + * WizardController.MODE_CAN_FINISH or + * WizardController.MODE_CAN_CONTINUE_OR_FINISH; */ protected final void setForwardNavigationMode(int value) { getController().setForwardNavigationMode(value); } /** - * Disable all navigation. Useful if some background task is being - * completed during which no navigation should be allowed. Use with care, - * as it disables the cancel button as well. + * Disable all navigation. Useful if some background task is being completed + * during which no navigation should be allowed. Use with care, as it + * disables the cancel button as well. */ protected final void setBusy(boolean busy) { getController().setBusy(busy); @@ -572,8 +561,7 @@ public class WizardPage extends JPanel implements WizardPanel { /** * Retrieve a value stored in the wizard map, which may have been * putWizardData there by this panel or any previous panel in the wizard - * which - * contains this panel. + * which contains this panel. */ protected final Object getWizardData(Object key) { return getWizardDataMap().get(key); @@ -587,21 +575,20 @@ public class WizardPage extends JPanel implements WizardPanel { } /** - * Called when an event is received from one of the components in the - * panel that indicates user input. Typically you won't need to touch this - * method, unless your panel contains custom components which are not - * subclasses of any standard Swing component, which the framework won't - * know how to listen for changes on. For such cases, attach a listener - * to the custom component, and call this method with the event if you want - * validation to run when input happens. Automatic updating of the - * settings map will not work for such custom components, for obvious - * reasons, so update the settings map, if needed, in validateContents - * for this case. + * Called when an event is received from one of the components in the panel + * that indicates user input. Typically you won't need to touch this method, + * unless your panel contains custom components which are not subclasses of + * any standard Swing component, which the framework won't know how to + * listen for changes on. For such cases, attach a listener to the custom + * component, and call this method with the event if you want validation to + * run when input happens. Automatic updating of the settings map will not + * work for such custom components, for obvious reasons, so update the + * settings map, if needed, in validateContents for this case. * - * @param source The component that the user interacted with (if it can - * be determined from the event) or null - * @param event Usually an instance of EventObject, except in the case of - * DocumentEvent. + * @param source The component that the user interacted with (if it can be + * determined from the event) or null + * @param event Usually an instance of EventObject, except in the case of + * DocumentEvent. */ protected final void userInputReceived(Component source, Object event) { if (inBeginUIChanged) @@ -633,8 +620,8 @@ public class WizardPage extends JPanel implements WizardPanel { } /** - * Puts the value from the component in the settings map if the - * component's name property is not null + * Puts the value from the component in the settings map if the component's + * name property is not null */ void maybeUpdateMap(Component comp) { Object mapKey = getMapKeyFor(comp); @@ -657,8 +644,8 @@ public class WizardPage extends JPanel implements WizardPanel { * Given an ad-hoc swing component, fetch the likely value based on its * state. The default implementation handles most common swing components. * If you are using custom components and have assigned them names, override - * this method to handle getting an appropriate value out of your - * custom component and call super for the others. + * this method to handle getting an appropriate value out of your custom + * component and call super for the others. */ protected Object valueFrom(Component comp) { if (ccl != null && ccl.accept(comp)) @@ -673,11 +660,10 @@ public class WizardPage extends JPanel implements WizardPanel { return ((JFormattedTextField) comp).getValue(); else if (comp instanceof JList) { Object[] o = ((JList) comp).getSelectedValues(); - if (o != null) - if (o.length > 1) - return o; - else if (o.length == 1) - return o[0]; + if (o.length > 1) + return o; + else if (o.length == 1) + return o[0]; } else if (comp instanceof JTextComponent) return ((JTextComponent) comp).getText(); else if (comp instanceof JComboBox) @@ -693,12 +679,11 @@ public class WizardPage extends JPanel implements WizardPanel { } /** - * Given an ad-hoc swing component, set the value as the property - * from the settings. The default implementation handles most common swing - * components. - * If you are using custom components and have assigned them names, override - * this method to handle getting an appropriate value out of your - * custom component and call super for the others. + * Given an ad-hoc swing component, set the value as the property from the + * settings. The default implementation handles most common swing + * components. If you are using custom components and have assigned them + * names, override this method to handle getting an appropriate value out of + * your custom component and call super for the others. */ protected void valueTo(Map settings, Component comp) { String name = comp.getName(); @@ -734,14 +719,13 @@ public class WizardPage extends JPanel implements WizardPanel { * represented by this component into the wizard data map. *

        * The default implementation returns the result of - * c.getName(), - * which is almost always sufficient and convenient - just set the - * component names in a GUI builder and everything will be handled. + * c.getName(), which is almost always sufficient and + * convenient - just set the component names in a GUI builder and everything + * will be handled. * - * @return null if the component's value should not be automatically - * written to the wizard data map, or an object which is the key that - * later code will use to find this value. By default, it returns the - * component's name. + * @return null if the component's value should not be automatically written + * to the wizard data map, or an object which is the key that later code + * will use to find this value. By default, it returns the component's name. */ protected Object getMapKeyFor(Component c) { if (ccl != null && ccl.accept(c)) @@ -752,55 +736,54 @@ public class WizardPage extends JPanel implements WizardPanel { /** * Called when user interaction has occurred on a component contained by - * this - * panel or one of its children. Override this method to check if all of - * the values are legal, such that the Next/Finish button should be enabled, - * optionally calling setForwardNavigationMode() if warranted. + * this panel or one of its children. Override this method to check if all + * of the values are legal, such that the Next/Finish button should be + * enabled, optionally calling setForwardNavigationMode() if + * warranted. *

        - * This method also may be called with a null argument an effect of - * calling putWizardData() from someplace other than within - * this method. + * This method also may be called with a null argument an effect of calling + * putWizardData() from someplace other than within this + * method. *

        * Note that this method may be called very frequently, so it is important * that validation code be fast. For cases such as - * DocumentEvents, - * it may be desirable to delay validation with a timer, if the - * implementation - * of this method is too expensive to call on each keystroke. + * DocumentEvents, it may be desirable to delay validation with + * a timer, if the implementation of this method is too expensive to call on + * each keystroke. *

        - * Either the component, or the event, or both may be null on some calls - * to this method (such as when it is called because the settings map - * has been written to). + * Either the component, or the event, or both may be null on some calls to + * this method (such as when it is called because the settings map has been + * written to). *

        * The default implementation returns null. * * @param component The component the user interacted with, if it can be - * determined. The infrastructure does track the owners of list models - * and such, and can find the associated component, so this will usually - * (but not necessarily) be non-null. - * @param event The event object (if any) that triggered this call to - * validateContents. For most cases this will be an instance of - * EventObject, and can be used to directly detect what component - * the user interacted with. Since javax.swing.text.DocumentEvent is - * not a subclass of EventObject, the type of the argument is Object, - * so these events may be passed. + * determined. The infrastructure does track the owners of list models and + * such, and can find the associated component, so this will usually (but + * not necessarily) be non-null. + * @param event The event object (if any) that triggered this call to + * validateContents. For most cases this will be an instance of EventObject, + * and can be used to directly detect what component the user interacted + * with. Since javax.swing.text.DocumentEvent is not a subclass of + * EventObject, the type of the argument is Object, so these events may be + * passed. * * @return A localized string describing why navigation should be disabled, - * or null if the state of the components is valid and forward navigation - * should be enabled. + * or null if the state of the components is valid and forward navigation + * should be enabled. */ protected String validateContents(Component component, Object event) { return null; } /** - * Called if the user is navigating into this panel when it has already - * been displayed at least once - the user has navigated back to this - * panel, or back past this panel and is now navigating forward again. + * Called if the user is navigating into this panel when it has already been + * displayed at least once - the user has navigated back to this panel, or + * back past this panel and is now navigating forward again. *

        - * If some of the UI needs to be set up based on values from earlier - * pages that may have changed, do that here, fetching values from the - * settings map by calling getWizardData(). + * If some of the UI needs to be set up based on values from earlier pages + * that may have changed, do that here, fetching values from the settings + * map by calling getWizardData(). *

        * The default implementation simply calls * validateContents (null, null). @@ -810,8 +793,8 @@ public class WizardPage extends JPanel implements WizardPanel { } /** - * Get the settings map into which the wizard gathers settings. - * Return value will never be null. + * Get the settings map into which the wizard gathers settings. Return value + * will never be null. */ // the map is empty during construction, then later set to the map from the containing WizardController protected Map getWizardDataMap() { @@ -823,22 +806,22 @@ public class WizardPage extends JPanel implements WizardPanel { private String longDescription; /** - * Set the long description of this page. This method may be called - * only once and should be called from within the constructor. + * Set the long description of this page. This method may be called only + * once and should be called from within the constructor. * * @param desc The long description for this step */ protected void setLongDescription(String desc) { if (!Beans.isDesignTime() && this.longDescription != null) throw new IllegalStateException("Long description already set to" - + " " + desc); + + " " + desc); this.longDescription = desc; } /** * Get the long description of this page, which should be used in the title - * area of the wizard's UI if non-null. To use, call setLongDescription() - * in your WizardPage's constructor. It may be set only once. + * area of the wizard's UI if non-null. To use, call setLongDescription() in + * your WizardPage's constructor. It may be set only once. * * @return the description */ @@ -847,7 +830,7 @@ public class WizardPage extends JPanel implements WizardPanel { } static WizardPanelProvider createWizardPanelProvider(WizardPage page) { - return new WPP(new WizardPage[] { page }, WizardResultProducer.NO_OP); + return new WPP(new WizardPage[]{page}, WizardResultProducer.NO_OP); } static WizardPanelProvider createWizardPanelProvider(WizardPage[] page) { @@ -897,7 +880,7 @@ public class WizardPage extends JPanel implements WizardPanel { } protected JComponent createPanel(WizardController controller, String id, - Map wizardData) { + Map wizardData) { int idx = indexOfStep(id); // assert idx != -1 : "Bad ID passed to createPanel: " + id; @@ -915,7 +898,7 @@ public class WizardPage extends JPanel implements WizardPanel { private String valid(WizardPage[] pages) { if (new HashSet(Arrays.asList(pages)).size() != pages.length) return "Duplicate entry in array: " - + Arrays.asList(pages); + + Arrays.asList(pages); for (int i = 0; i < pages.length; i++) if (pages[i] == null) @@ -1005,10 +988,10 @@ public class WizardPage extends JPanel implements WizardPanel { result.setWizardDataMap(wizardData); return result; - } catch (Exception e) { + } catch (IllegalAccessException | InstantiationException e) { // really IllegalArgumentException, but we need to have the "cause" get shown in stack trace throw new RuntimeException("Could not instantiate " - + classes[idx], e); + + classes[idx], e); } } @@ -1028,15 +1011,15 @@ public class WizardPage extends JPanel implements WizardPanel { int idx = indexOfStep(stepId); if (idx != -1) return longDescriptions[idx] == null ? descriptions[idx] - : longDescriptions[idx]; + : longDescriptions[idx]; return null; } } /** - * A dummy wizard controller which is used until the panel has actually - * been put into use; so state can be set during the constructor, etc. - * Its state will be dumped into the real one once there is a real one. + * A dummy wizard controller which is used until the panel has actually been + * put into use; so state can be set during the constructor, etc. Its state + * will be dumped into the real one once there is a real one. */ private static final class WC implements WizardControllerImplementation { @@ -1050,12 +1033,12 @@ public class WizardPage extends JPanel implements WizardPanel { public void setForwardNavigationMode(int value) { switch (value) { - case WizardController.MODE_CAN_CONTINUE: - case WizardController.MODE_CAN_FINISH: - case WizardController.MODE_CAN_CONTINUE_OR_FINISH: - break; - default: - throw new IllegalArgumentException(Integer.toString(value)); + case WizardController.MODE_CAN_CONTINUE: + case WizardController.MODE_CAN_FINISH: + case WizardController.MODE_CAN_CONTINUE_OR_FINISH: + break; + default: + throw new IllegalArgumentException(Integer.toString(value)); } canFinish = value; @@ -1082,9 +1065,9 @@ public class WizardPage extends JPanel implements WizardPanel { /** * Interface that is passed to WizardPage.createWizard(). For wizards - * created from a set of WizardPages or WizardPage subclasses, this is - * the object that whose code will be run to create or do whatever the - * wizard does when the user clicks the Finish button. + * created from a set of WizardPages or WizardPage subclasses, this is the + * object that whose code will be run to create or do whatever the wizard + * does when the user clicks the Finish button. */ public static interface WizardResultProducer { @@ -1093,30 +1076,23 @@ public class WizardPage extends JPanel implements WizardPanel { * gathered into the map on the various panels. *

        * If an instance of Summary is returned from this method, - * the - * UI shall display it on a final page and disable all navigation - * buttons - * except the Close/Cancel button. + * the UI shall display it on a final page and disable all navigation + * buttons except the Close/Cancel button. *

        * If an instance of DeferredWizardResult is returned from - * this - * method, the UI shall display some sort of progress bar while the - * result - * is computed in the background. If that - * DeferredWizardResult - * produces a Summary object, that summary shall be - * displayed - * as described above. + * this method, the UI shall display some sort of progress bar while the + * result is computed in the background. If that + * DeferredWizardResult produces a Summary + * object, that summary shall be displayed as described above. * * @param wizardData the map with key-value pairs which has been - * populated by the UI as the user progressed through the wizard + * populated by the UI as the user progressed through the wizard * * @return an object composed based on what the user entered in the - * wizard - - * somethingmeaningful to whatever code invoked the wizard, or null. - * Note - * special handling if an instance of DeferredWizardResult - * or Summary is returned from this method. + * wizard - somethingmeaningful to whatever code invoked the wizard, or + * null. Note special handling if an instance of + * DeferredWizardResult or Summary is returned + * from this method. */ Object finish(Map wizardData) throws WizardException; diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang index c57982610..f12938165 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.lang @@ -298,7 +298,7 @@ mainwindow.enter_script_name=输入要生成脚本的文件名 mainwindow.make_launch_succeed=启动脚本已生成完毕: mainwindow.no_version=未找到任何版本,是否进入游戏下载? -launcher.about=默认背景图感谢gamerteam提供。
        如果您希望本软件继续发展,请赞助
        关于作者:
        百度ID:huanghongxun20
        mcbbs:huanghongxun
        邮箱:huanghongxun2008@126.com
        Minecraft Forum ID: klkl6523
        欢迎提交Bug哦
        Copyright (c) 2013-2016 huangyuhui.
        免责声明:Minecraft软件版权归Mojang AB所有,使用本软件产生的版权问题本软件制作方概不负责。
        本启动器在GPLv3协议下开源:https://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
        本软件使用了基于Apache License 2.0的Gson项目,感谢贡献者。 +launcher.about=默认背景图感谢gamerteam提供。
        关于作者:
        百度ID:huanghongxun20
        mcbbs:huanghongxun
        Minecraft Forum ID: klkl6523
        欢迎提交Bug哦
        Copyright (c) 2013-2017 huangyuhui.
        免责声明:Minecraft软件版权归Mojang AB所有,使用本软件产生的版权问题本软件制作方概不负责。
        本启动器在GPLv3协议下开源:https://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
        本软件使用了基于Apache License 2.0的Gson项目,感谢贡献者。 launcher.download_source=下载源 launcher.background_location=背景地址 launcher.exit_failed=强制退出失败,可能是Forge 1.7.10及更高版本导致的,无法解决。 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties index 642388d74..73f5b0458 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties @@ -298,7 +298,7 @@ mainwindow.enter_script_name=\u8f93\u5165\u8981\u751f\u6210\u811a\u672c\u7684\u6 mainwindow.make_launch_succeed=\u542f\u52a8\u811a\u672c\u5df2\u751f\u6210\u5b8c\u6bd5: mainwindow.no_version=\u672a\u627e\u5230\u4efb\u4f55\u7248\u672c\uff0c\u662f\u5426\u8fdb\u5165\u6e38\u620f\u4e0b\u8f7d\uff1f -launcher.about=\u9ed8\u8ba4\u80cc\u666f\u56fe\u611f\u8c22gamerteam\u63d0\u4f9b\u3002
        \u5982\u679c\u60a8\u5e0c\u671b\u672c\u8f6f\u4ef6\u7ee7\u7eed\u53d1\u5c55\uff0c\u8bf7\u8d5e\u52a9
        \u5173\u4e8e\u4f5c\u8005\uff1a
        \u767e\u5ea6ID\uff1ahuanghongxun20
        mcbbs\uff1ahuanghongxun
        \u90ae\u7bb1\uff1ahuanghongxun2008@126.com
        Minecraft Forum ID: klkl6523
        \u6b22\u8fce\u63d0\u4ea4Bug\u54e6
        Copyright (c) 2013-2016 huangyuhui.
        \u514d\u8d23\u58f0\u660e\uff1aMinecraft\u8f6f\u4ef6\u7248\u6743\u5f52Mojang AB\u6240\u6709\uff0c\u4f7f\u7528\u672c\u8f6f\u4ef6\u4ea7\u751f\u7684\u7248\u6743\u95ee\u9898\u672c\u8f6f\u4ef6\u5236\u4f5c\u65b9\u6982\u4e0d\u8d1f\u8d23\u3002
        \u672c\u542f\u52a8\u5668\u5728GPLv3\u534f\u8bae\u4e0b\u5f00\u6e90:https://github.com/huanghongxun/HMCL/ ,\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
        \u672c\u8f6f\u4ef6\u4f7f\u7528\u4e86\u57fa\u4e8eApache License 2.0\u7684Gson\u9879\u76ee\uff0c\u611f\u8c22\u8d21\u732e\u8005\u3002 +launcher.about=\u9ed8\u8ba4\u80cc\u666f\u56fe\u611f\u8c22gamerteam\u63d0\u4f9b\u3002
        \u5173\u4e8e\u4f5c\u8005\uff1a
        \u767e\u5ea6ID\uff1ahuanghongxun20
        mcbbs\uff1ahuanghongxun
        Minecraft Forum ID: klkl6523
        \u6b22\u8fce\u63d0\u4ea4Bug\u54e6
        Copyright (c) 2013-2017 huangyuhui.
        \u514d\u8d23\u58f0\u660e\uff1aMinecraft\u8f6f\u4ef6\u7248\u6743\u5f52Mojang AB\u6240\u6709\uff0c\u4f7f\u7528\u672c\u8f6f\u4ef6\u4ea7\u751f\u7684\u7248\u6743\u95ee\u9898\u672c\u8f6f\u4ef6\u5236\u4f5c\u65b9\u6982\u4e0d\u8d1f\u8d23\u3002
        \u672c\u542f\u52a8\u5668\u5728GPLv3\u534f\u8bae\u4e0b\u5f00\u6e90:https://github.com/huanghongxun/HMCL/ ,\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
        \u672c\u8f6f\u4ef6\u4f7f\u7528\u4e86\u57fa\u4e8eApache License 2.0\u7684Gson\u9879\u76ee\uff0c\u611f\u8c22\u8d21\u732e\u8005\u3002 launcher.download_source=\u4e0b\u8f7d\u6e90 launcher.background_location=\u80cc\u666f\u5730\u5740 launcher.exit_failed=\u5f3a\u5236\u9000\u51fa\u5931\u8d25\uff0c\u53ef\u80fd\u662fForge 1.7.10\u53ca\u66f4\u9ad8\u7248\u672c\u5bfc\u81f4\u7684\uff0c\u65e0\u6cd5\u89e3\u51b3\u3002 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang index 9d746d0e1..73e0c3b2a 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.lang @@ -298,7 +298,7 @@ mainwindow.enter_script_name=Enter the script name. mainwindow.make_launch_succeed=Finished script creation. mainwindow.no_version=No version found. Switch to Game Downloads Tab? -launcher.about=About Author
        Email:huanghongxun2008@126.com
        Minecraft Forum ID: klkl6523
        Copyright (c) 2013 huangyuhui
        Opened source under GPL v3 license:http://github.com/huanghongxun/HMCL/
        This software used project Gson which is under Apache License 2.0, thanks contributors. +launcher.about=About Author
        Minecraft Forum ID: klkl6523
        Copyright (c) 2013 huangyuhui
        Opened source under GPL v3 license:http://github.com/huanghongxun/HMCL/
        This software used project Gson which is under Apache License 2.0, thanks contributors. launcher.download_source=Download Source launcher.background_location=Background Location launcher.exit_failed=Failed to shutdown. diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties index c1ed34126..73e0c3b2a 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties @@ -298,7 +298,7 @@ mainwindow.enter_script_name=Enter the script name. mainwindow.make_launch_succeed=Finished script creation. mainwindow.no_version=No version found. Switch to Game Downloads Tab? -launcher.about=About Author
        Email\uff1ahuanghongxun2008@126.com
        Minecraft Forum ID: klkl6523
        Copyright (c) 2013 huangyuhui
        Opened source under GPL v3 license:http://github.com/huanghongxun/HMCL/
        This software used project Gson which is under Apache License 2.0, thanks contributors. +launcher.about=About Author
        Minecraft Forum ID: klkl6523
        Copyright (c) 2013 huangyuhui
        Opened source under GPL v3 license:http://github.com/huanghongxun/HMCL/
        This software used project Gson which is under Apache License 2.0, thanks contributors. launcher.download_source=Download Source launcher.background_location=Background Location launcher.exit_failed=Failed to shutdown. diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang index feaaa638c..0a4f5f555 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.lang @@ -298,7 +298,7 @@ mainwindow.enter_script_name=輸入要生成腳本的資料名 mainwindow.make_launch_succeed=啟動腳本已生成完畢: mainwindow.no_version=未找到任何版本,是否進入遊戲下載? -launcher.about=默認背景圖感謝gamerteam提供。
        如果您希望本軟件繼續發展,請贊助
        關於作者:
        百度ID:huanghongxun20
        mcbbs:huanghongxun
        郵箱:huanghongxun2008@126.com
        Minecraft Forum ID: klkl6523
        歡迎提交Bug哦
        Copyright (c) 2013-2016 huangyuhui.
        免責聲明:Minecraft軟體版權歸Mojang AB所有,遊戲由於誤操作本啟動器而丟失數據的概不負責。
        本啟動器在GPLv3協議下開源:http://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
        本軟體使用了基於Apache License 2.0的Gson項目,感謝貢獻者。 +launcher.about=默認背景圖感謝gamerteam提供。
        關於作者:
        百度ID:huanghongxun20
        mcbbs:huanghongxun
        Minecraft Forum ID: klkl6523
        歡迎提交Bug哦
        Copyright (c) 2013-2016 huangyuhui.
        免責聲明:Minecraft軟體版權歸Mojang AB所有,遊戲由於誤操作本啟動器而丟失數據的概不負責。
        本啟動器在GPLv3協議下開源:http://github.com/huanghongxun/HMCL/ ,感谢issues和pull requests贡献者
        本軟體使用了基於Apache License 2.0的Gson項目,感謝貢獻者。 launcher.download_source=下載源 launcher.background_location=背景地址 launcher.exit_failed=強制退出失敗,可能是Forge 1.7.10及更高版本導致的,無法解決。 diff --git a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties index 1d6f19cd8..00fd63059 100755 --- a/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties +++ b/HMCUtils/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties @@ -298,7 +298,7 @@ mainwindow.enter_script_name=\u8f38\u5165\u8981\u751f\u6210\u8173\u672c\u7684\u8 mainwindow.make_launch_succeed=\u555f\u52d5\u8173\u672c\u5df2\u751f\u6210\u5b8c\u7562: mainwindow.no_version=\u672a\u627e\u5230\u4efb\u4f55\u7248\u672c\uff0c\u662f\u5426\u9032\u5165\u904a\u6232\u4e0b\u8f09\uff1f -launcher.about=\u9ed8\u8a8d\u80cc\u666f\u5716\u611f\u8b1dgamerteam\u63d0\u4f9b\u3002
        \u5982\u679c\u60a8\u5e0c\u671b\u672c\u8edf\u4ef6\u7e7c\u7e8c\u767c\u5c55\uff0c\u8acb\u8d0a\u52a9
        \u95dc\u65bc\u4f5c\u8005\uff1a
        \u767e\u5ea6ID\uff1ahuanghongxun20
        mcbbs\uff1ahuanghongxun
        \u90f5\u7bb1\uff1ahuanghongxun2008@126.com
        Minecraft Forum ID: klkl6523
        \u6b61\u8fce\u63d0\u4ea4Bug\u54e6
        Copyright (c) 2013-2016 huangyuhui.
        \u514d\u8cac\u8072\u660e\uff1aMinecraft\u8edf\u9ad4\u7248\u6b0a\u6b78Mojang AB\u6240\u6709\uff0c\u904a\u6232\u7531\u65bc\u8aa4\u64cd\u4f5c\u672c\u555f\u52d5\u5668\u800c\u4e1f\u5931\u6578\u64da\u7684\u6982\u4e0d\u8ca0\u8cac\u3002
        \u672c\u555f\u52d5\u5668\u5728GPLv3\u5354\u8b70\u4e0b\u958b\u6e90:http://github.com/huanghongxun/HMCL/ ,\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
        \u672c\u8edf\u9ad4\u4f7f\u7528\u4e86\u57fa\u65bcApache License 2.0\u7684Gson\u9805\u76ee\uff0c\u611f\u8b1d\u8ca2\u737b\u8005\u3002 +launcher.about=\u9ed8\u8a8d\u80cc\u666f\u5716\u611f\u8b1dgamerteam\u63d0\u4f9b\u3002
        \u95dc\u65bc\u4f5c\u8005\uff1a
        \u767e\u5ea6ID\uff1ahuanghongxun20
        mcbbs\uff1ahuanghongxun
        Minecraft Forum ID: klkl6523
        \u6b61\u8fce\u63d0\u4ea4Bug\u54e6
        Copyright (c) 2013-2016 huangyuhui.
        \u514d\u8cac\u8072\u660e\uff1aMinecraft\u8edf\u9ad4\u7248\u6b0a\u6b78Mojang AB\u6240\u6709\uff0c\u904a\u6232\u7531\u65bc\u8aa4\u64cd\u4f5c\u672c\u555f\u52d5\u5668\u800c\u4e1f\u5931\u6578\u64da\u7684\u6982\u4e0d\u8ca0\u8cac\u3002
        \u672c\u555f\u52d5\u5668\u5728GPLv3\u5354\u8b70\u4e0b\u958b\u6e90:http://github.com/huanghongxun/HMCL/ ,\u611f\u8c22issues\u548cpull requests\u8d21\u732e\u8005
        \u672c\u8edf\u9ad4\u4f7f\u7528\u4e86\u57fa\u65bcApache License 2.0\u7684Gson\u9805\u76ee\uff0c\u611f\u8b1d\u8ca2\u737b\u8005\u3002 launcher.download_source=\u4e0b\u8f09\u6e90 launcher.background_location=\u80cc\u666f\u5730\u5740 launcher.exit_failed=\u5f37\u5236\u9000\u51fa\u5931\u6557\uff0c\u53ef\u80fd\u662fForge 1.7.10\u53ca\u66f4\u9ad8\u7248\u672c\u5c0e\u81f4\u7684\uff0c\u7121\u6cd5\u89e3\u6c7a\u3002