From 3a75a5d6be22e34431d04815feb0a8b3d6722914 Mon Sep 17 00:00:00 2001 From: plata Date: Sat, 14 Apr 2018 13:09:46 +0200 Subject: [PATCH 01/76] Fix install/delete of engines (#1247) --- .../src/main/java/org/phoenicis/engines/dto/EngineDTO.java | 5 +++++ .../javafx/controller/engines/EnginesController.java | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/phoenicis-engines/src/main/java/org/phoenicis/engines/dto/EngineDTO.java b/phoenicis-engines/src/main/java/org/phoenicis/engines/dto/EngineDTO.java index d912141c17c..92f8464193f 100644 --- a/phoenicis-engines/src/main/java/org/phoenicis/engines/dto/EngineDTO.java +++ b/phoenicis-engines/src/main/java/org/phoenicis/engines/dto/EngineDTO.java @@ -52,6 +52,11 @@ public String getVersion() { return version; } + public String getId() { + // TODO: get from script.json + return category.toLowerCase(); + } + public Map getUserData() { return userData; } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java index e1ed6149199..d816dad17a1 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java @@ -106,7 +106,7 @@ private void installEngine(EngineDTO engineDTO, Consumer errorCallbac final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); interactiveScriptSession.eval( - "include([\"engines\", \"" + engineDTO.getCategory() + "\", \"engine\", \"object\"]);", + "include([\"engines\", \"" + engineDTO.getId() + "\", \"engine\", \"object\"]);", ignored -> interactiveScriptSession.eval("new Wine()", output -> { final ScriptObjectMirror wine = (ScriptObjectMirror) output; wine.callMember("install", engineDTO.getCategory(), engineDTO.getSubCategory(), @@ -118,7 +118,7 @@ private void deleteEngine(EngineDTO engineDTO, Consumer errorCallback final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); interactiveScriptSession.eval( - "include([\"engines\", \"" + engineDTO.getCategory() + "\", \"engine\", \"object\"]);", + "include([\"engines\", \"" + engineDTO.getId() + "\", \"engine\", \"object\"]);", ignored -> interactiveScriptSession.eval("new Wine()", output -> { final ScriptObjectMirror wine = (ScriptObjectMirror) output; wine.callMember("delete", engineDTO.getCategory(), engineDTO.getSubCategory(), From d51ad1c5469739a4fc83e6f73d7bff5e2a38b81a Mon Sep 17 00:00:00 2001 From: plata Date: Sun, 15 Apr 2018 08:51:32 +0200 Subject: [PATCH 02/76] Define default repositories in configuration (#1249) --- .../src/main/resources/Linux.properties | 3 +++ .../src/main/resources/Mac OS X.properties | 3 +++ .../FilesystemJsonRepositoryLocationLoader.java | 15 +++++++++++---- .../repository/RepositoryConfiguration.java | 15 ++++++++++++++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/phoenicis-configuration/src/main/resources/Linux.properties b/phoenicis-configuration/src/main/resources/Linux.properties index 39ce2b18e8b..2dff28379c3 100644 --- a/phoenicis-configuration/src/main/resources/Linux.properties +++ b/phoenicis-configuration/src/main/resources/Linux.properties @@ -31,6 +31,9 @@ application.user.repository = ${application.user.root} application.user.cache = ${application.user.root}/cache/ application.repository.list = ${application.user.root}/repositories.json +application.repository.default.git.url = https://github.com/PhoenicisOrg/scripts +application.repository.default.git.branch = master +application.repository.default.classpath = /org/phoenicis/repository application.root = ${user.dir} application.macosx.tools = diff --git a/phoenicis-configuration/src/main/resources/Mac OS X.properties b/phoenicis-configuration/src/main/resources/Mac OS X.properties index 3f1a0b55174..2fbbb3fc280 100644 --- a/phoenicis-configuration/src/main/resources/Mac OS X.properties +++ b/phoenicis-configuration/src/main/resources/Mac OS X.properties @@ -31,6 +31,9 @@ application.user.repository = ${application.user.root} application.user.cache = ${application.user.root}/cache/ application.repository.list = ${application.user.root}/repositories.json +application.repository.default.git.url = https://github.com/PhoenicisOrg/scripts +application.repository.default.git.branch = master +application.repository.default.classpath = /org/phoenicis/repository application.root = ${user.dir} application.macosx.tools = ${application.root}/tools diff --git a/phoenicis-repository/src/main/java/org/phoenicis/repository/FilesystemJsonRepositoryLocationLoader.java b/phoenicis-repository/src/main/java/org/phoenicis/repository/FilesystemJsonRepositoryLocationLoader.java index 8641e69ca5d..049ed90827d 100644 --- a/phoenicis-repository/src/main/java/org/phoenicis/repository/FilesystemJsonRepositoryLocationLoader.java +++ b/phoenicis-repository/src/main/java/org/phoenicis/repository/FilesystemJsonRepositoryLocationLoader.java @@ -21,10 +21,17 @@ public class FilesystemJsonRepositoryLocationLoader implements RepositoryLocatio private static final Logger LOGGER = LoggerFactory.getLogger(FilesystemJsonRepositoryLocationLoader.class); private final String repositoryListPath; + private final String defaultGitUrl; + private final String defaultGitBranch; + private final String defaultClasspath; private final ObjectMapper objectMapper; - public FilesystemJsonRepositoryLocationLoader(String repositoryListPath, ObjectMapper objectMapper) { + public FilesystemJsonRepositoryLocationLoader(String repositoryListPath, String defaultGitUrl, + String defaultGitBranch, String defaultClasspath, ObjectMapper objectMapper) { this.repositoryListPath = repositoryListPath; + this.defaultGitUrl = defaultGitUrl; + this.defaultGitBranch = defaultGitBranch; + this.defaultClasspath = defaultClasspath; this.objectMapper = objectMapper; } @@ -44,9 +51,9 @@ public List> loadRepositoryLocations() } else { try { result.add(new GitRepositoryLocation.Builder() - .withGitRepositoryUri(new URL("https://github.com/PhoenicisOrg/scripts").toURI()) - .withBranch("master").build()); - result.add(new ClasspathRepositoryLocation("/org/phoenicis/repository")); + .withGitRepositoryUri(new URL(defaultGitUrl).toURI()) + .withBranch(defaultGitBranch).build()); + result.add(new ClasspathRepositoryLocation(defaultClasspath)); } catch (URISyntaxException | MalformedURLException e) { LOGGER.error("Couldn't create default repository location list", e); } diff --git a/phoenicis-repository/src/main/java/org/phoenicis/repository/RepositoryConfiguration.java b/phoenicis-repository/src/main/java/org/phoenicis/repository/RepositoryConfiguration.java index 1abb58ee7f1..9898c4e74b9 100644 --- a/phoenicis-repository/src/main/java/org/phoenicis/repository/RepositoryConfiguration.java +++ b/phoenicis-repository/src/main/java/org/phoenicis/repository/RepositoryConfiguration.java @@ -42,6 +42,15 @@ public class RepositoryConfiguration { @Value("${application.repository.list}") private String repositoryListPath; + @Value("${application.repository.default.git.url}") + private String defaultGitUrl; + + @Value("${application.repository.default.git.branch}") + private String defaultGitBranch; + + @Value("${application.repository.default.classpath}") + private String defaultClasspath; + @Autowired private MultithreadingConfiguration multithreadingConfiguration; @@ -80,7 +89,11 @@ public RepositoryLocationLoader repositoryLocationLoader() { @Bean public RepositoryLocationLoader filesystemLocationLoader() { - return new FilesystemJsonRepositoryLocationLoader(repositoryListPath, + return new FilesystemJsonRepositoryLocationLoader( + repositoryListPath, + defaultGitUrl, + defaultGitBranch, + defaultClasspath, phoenicisGlobalConfiguration.objectMapper()); } From 889ec8ab7f47c25bd90754b3e9187fd77bd079f3 Mon Sep 17 00:00:00 2001 From: plata Date: Fri, 20 Apr 2018 16:50:14 +0200 Subject: [PATCH 03/76] Fix "create shortcut" (#1266) --- .../javafx/controller/library/LibraryController.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java index dc04372e9c6..9200887d322 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java @@ -109,11 +109,14 @@ private void createShortcut(ShortcutCreationDTO shortcutCreationDTO) { final String engineContainer = split[0]; final String engine = (Character.toUpperCase(engineContainer.charAt(0)) + engineContainer.substring(1)) .replace("prefix", ""); + // TODO: better way to get engine ID + final String engineId = engine.toLowerCase(); final String container = split[1]; final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); - interactiveScriptSession.eval("include([\"engines\", \"" + engine + "\", \"shortcuts\", \"" + engine + "\"]);", + interactiveScriptSession.eval( + "include([\"engines\", \"" + engineId + "\", \"shortcuts\", \"" + engineId + "\"]);", ignored -> interactiveScriptSession.eval("new " + engine + "Shortcut()", output -> { final ScriptObjectMirror shortcutObject = (ScriptObjectMirror) output; shortcutObject.callMember("name", shortcutCreationDTO.getName()); From 8db12584fafcf347a185b848921e0f57b0a3f4b9 Mon Sep 17 00:00:00 2001 From: plata Date: Fri, 20 Apr 2018 21:06:18 +0200 Subject: [PATCH 04/76] Describe required steps for a release in docs (#1252) --- docs/_data/navigation.yml | 2 ++ docs/_pages/release-process.md | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 docs/_pages/release-process.md diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index 25d3226ede2..4d73a38e330 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -25,3 +25,5 @@ docs: url: /themes/ - title: "Translation" url: /translation/ + - title: "Release process" + url: /release-process/ diff --git a/docs/_pages/release-process.md b/docs/_pages/release-process.md new file mode 100644 index 00000000000..912baca9572 --- /dev/null +++ b/docs/_pages/release-process.md @@ -0,0 +1,21 @@ +--- +title: "Release process" +permalink: /release-process/ +toc: false +--- + +The following steps must be executed to release a new version of Phoenicis: +* Create release branches (e.g. "5.0-alpha") for phoenicis and scripts +* Protect release branch + * Require pull request reviews before merging + * Require status checks to pass before merging (Travis CI and Codacy) +* on the release branch: + * Add release branch to `branches` section of `.travis.yml` such that Travis CI executes checks for the branch + * Specify scripts release branch in configuration (`application.repository.default.git.url`) + * Set release version for Maven in `pom.xml` files + * Set release version in .deb control files +* Test +* Create GitHub release from the release branches for phoenicis and scripts +* Announce release on phoenicis.org + * Showcase new features + * List major changes/fixed bugs From 60b8eb9b203ea9706958db6c59f2313ca887b984 Mon Sep 17 00:00:00 2001 From: plata Date: Fri, 20 Apr 2018 21:06:37 +0200 Subject: [PATCH 05/76] Fix Wine webservice URL (#1267) --- phoenicis-configuration/src/main/resources/Linux.properties | 2 +- phoenicis-configuration/src/main/resources/Mac OS X.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/phoenicis-configuration/src/main/resources/Linux.properties b/phoenicis-configuration/src/main/resources/Linux.properties index 2dff28379c3..3d41de5970d 100644 --- a/phoenicis-configuration/src/main/resources/Linux.properties +++ b/phoenicis-configuration/src/main/resources/Linux.properties @@ -41,6 +41,6 @@ application.environment.path = application.environment.ld = application.environment.dyld = -webservice.wine.url = http://phoenicis.playonlinux.com/index.php/wine?os=linux +webservice.wine.url = https://phoenicis.playonlinux.com/index.php/wine?os=linux tools.linux-terminal = x-terminal-emulator diff --git a/phoenicis-configuration/src/main/resources/Mac OS X.properties b/phoenicis-configuration/src/main/resources/Mac OS X.properties index 2fbbb3fc280..36a6bdd68fa 100644 --- a/phoenicis-configuration/src/main/resources/Mac OS X.properties +++ b/phoenicis-configuration/src/main/resources/Mac OS X.properties @@ -41,4 +41,4 @@ application.environment.path = ${application.root}/tool application.environment.ld = ${application.root}/tools/lib/ld:/opt/X11/lib application.environment.dyld = ${application.root}/tools/lib/dyld -webservice.wine.url = http://phoenicis.playonlinux.com/index.php/wine?os=darwin +webservice.wine.url = https://phoenicis.playonlinux.com/index.php/wine?os=darwin From 9c9940ed72e7be22f759ee08bdbd6b8aa69f8e91 Mon Sep 17 00:00:00 2001 From: plata Date: Sat, 21 Apr 2018 16:27:25 +0200 Subject: [PATCH 06/76] Add issue template (#1259) --- .github/issue_template.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/issue_template.md diff --git a/.github/issue_template.md b/.github/issue_template.md new file mode 100644 index 00000000000..3642ae8a932 --- /dev/null +++ b/.github/issue_template.md @@ -0,0 +1,10 @@ +### Expected behavior + +### Actual behavior + +### Steps to reproduce + +### System information +* software version (git revision) of phoenicis and scripts repositories +* used operating system +* used Java version From 7bd686627d5b9fba7445b50c99eb4d20ac04abe6 Mon Sep 17 00:00:00 2001 From: ImperatorS79 Date: Sun, 22 Apr 2018 14:35:43 +0200 Subject: [PATCH 07/76] Update build description for TrueOS (#1270) --- docs/_pages/build.md | 50 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/docs/_pages/build.md b/docs/_pages/build.md index 3827064f0f7..9ec97124923 100644 --- a/docs/_pages/build.md +++ b/docs/_pages/build.md @@ -4,7 +4,6 @@ permalink: /build/ toc: true --- -## Dependencies ### Ubuntu 16.04 * Install the dependencies: ``` @@ -17,6 +16,17 @@ sudo apt-get install git maven openjdk-8-jdk openjfx libxext6:i386 * `export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"` * Oracle JDK * `export JAVA_HOME="/usr/lib/jvm/java-8-oracle"` + +* Clone the repository from GitHub: +``` +git clone https://github.com/PhoenicisOrg/phoenicis.git +``` + +* Build Phoenicis: +``` +cd phoenicis +mvn clean package +``` ### Arch Linux * Install the dependencies. Set the JAVA_HOME after installing `jdk8-openjdk`, but before installing `openjfx`. @@ -31,6 +41,17 @@ sudo apt-get install git maven openjdk-8-jdk openjfx libxext6:i386 * `export JAVA_HOME="/usr/lib/jvm/java-8-openjdk"` * Oracle JDK * `export JAVA_HOME="/usr/lib/jvm/java-8-oracle"` + +* Clone the repository from GitHub: +``` +git clone https://github.com/PhoenicisOrg/phoenicis.git +``` + +* Build Phoenicis: +``` +cd phoenicis +mvn clean package +``` ### Fedora >= 26 @@ -39,7 +60,6 @@ sudo apt-get install git maven openjdk-8-jdk openjfx libxext6:i386 sudo dnf install git java-1.8.0-openjdk java-1.8.0-openjdk-openjfx maven openjfx ``` -## Build * Clone the repository from GitHub: ``` git clone https://github.com/PhoenicisOrg/phoenicis.git @@ -51,6 +71,25 @@ cd phoenicis mvn clean package ``` +### TrueOS + +* Install the dependencies: +``` +sudo pkg install git openjdk8 openjfx8-devel maven roboto-fonts-ttf +``` + +* Clone the repository from GitHub: +``` +git clone https://github.com/PhoenicisOrg/phoenicis.git +``` + +* Create a file called `FreeBSD.properties` inside `phoenicis/phoenicis-configuration/src/main/resources/`, similar to `Linux.properties`, just change those two lines : +``` +application.name = Phoenicis PlayOnBSD +#tools.linux-terminal = x-terminal-emulator +``` +Note : As there is not FreeBSD wine at the moment, the linux wine package will be displayed in the engine window. + ## Run ``` cd phoenicis/phoenicis-dist/target @@ -58,6 +97,13 @@ unzip phoenicis-dist.zip -d built ./phoenicis-dist/phoenicis.sh ``` +* On TrueOs, do : +``` +cd phoenicis/phoenicis-dist/target +unzip phoenicis-dist.zip -d built +bash ./phoenicis-dist/phoenicis.sh +``` + ## Troubleshooting #### Old Java version on Arch Linux Problem: From b41eb6a619c409e0d4485850c43a8e244253ce41 Mon Sep 17 00:00:00 2001 From: plata Date: Mon, 23 Apr 2018 17:53:39 +0200 Subject: [PATCH 08/76] Add Mint-X theme (#1278) --- .../javafx/views/common/themes/Themes.java | 4 +- .../src/main/resources/javafx.properties | 2 +- .../javafx/themes/mint-x/description.less | 9 + .../phoenicis/javafx/themes/mint-x/main.less | 255 ++++++++++++++++++ 4 files changed, 268 insertions(+), 2 deletions(-) create mode 100644 phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/description.less create mode 100644 phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/main.less diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/themes/Themes.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/themes/Themes.java index ce0de38660d..6042189eabc 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/themes/Themes.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/themes/Themes.java @@ -16,9 +16,11 @@ public class Themes { "/org/phoenicis/javafx/themes/breezeDark/"); public static final Theme UNITY = new ClasspathTheme(tr("Unity theme"), "unity", "/org/phoenicis/javafx/themes/unity/"); + public static final Theme MINT_X = new ClasspathTheme(tr("Mint-X theme"), "mint-x", + "/org/phoenicis/javafx/themes/mint-x/"); public static Theme[] all() { - return new Theme[] { DEFAULT, DARK, BREEZE_DARK, UNITY }; + return new Theme[] { DEFAULT, DARK, BREEZE_DARK, UNITY, MINT_X }; } public static Optional fromShortName(String shortName) { diff --git a/phoenicis-javafx/src/main/resources/javafx.properties b/phoenicis-javafx/src/main/resources/javafx.properties index e9ef91d359c..fcc8a67b5c2 100644 --- a/phoenicis-javafx/src/main/resources/javafx.properties +++ b/phoenicis-javafx/src/main/resources/javafx.properties @@ -16,7 +16,7 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # -# theme (default, dark, breeze_dark, unity) +# theme (default, dark, breeze_dark, unity, mint-x) application.theme = default # font size used to scale application.scale = 12 diff --git a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/description.less b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/description.less new file mode 100644 index 00000000000..c1f1f6e198d --- /dev/null +++ b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/description.less @@ -0,0 +1,9 @@ +body { + font-family: "Roboto light"; + font-size: 0.9em; +} + +b { + font-family: "Roboto"; + font-weight: normal; +} \ No newline at end of file diff --git a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/main.less b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/main.less new file mode 100644 index 00000000000..78df8448f99 --- /dev/null +++ b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/main.less @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2015-2017 PÂRIS Quentin + * + * 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 2 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +@main-color: #f7f7f7; +@background-color: #505050; +@focus-color: #88ad54; +@text-color: #212121; + +/*******************************************************/ +/*********************** general ***********************/ +/*******************************************************/ +.text-field { + -fx-focus-color: @focus-color; + -fx-faint-focus-color: @focus-color; + -fx-text-fill: @text-color; + -fx-text-base-color: @text-color; + -fx-text-inner-color: @text-color; +} + + + +.text { + -fx-fill: @text-color; +} + +.toggle-button { + -fx-text-fill: @text-color; + + &:hover, &:selected, &:selected:focused { + -fx-background-color: #b5b5b5; + } +} + +.combo-box:hover { + -fx-border-color: @focus-color; +} + +.combo-box:hover .arrow-button { + -fx-color: @focus-color; +} + +.combo-box-popup .list-view { + -fx-background-color: @main-color, @main-color; +} + +.combo-box .list-cell { + -fx-background: @main-color; + -fx-background-color: @main-color; +} + +.combo-box-popup .list-view .list-cell:filled:hover { + -fx-background-color: @focus-color; +} + +.context-menu { + -fx-text-fill: @text-color; +} + +.menu-item:hover { + -fx-background-color: @focus-color; +} + +.menu-item .label { + -fx-text-fill: @text-color; +} + +.check-box:hover .box { + -fx-background-color: transparent; + -fx-border-color: @focus-color; +} + +.check-box:selected .mark { + -fx-color: @focus-color; + -fx-background-color: @focus-color; +} + +.list-cell:filled:hover, .list-cell:filled:selected:focused, .list-cell:filled:selected { + -fx-background-color: @focus-color; + -fx-text-fill: @text-color; +} + +.text-field, .text-area { + -fx-text-fill: @text-color; + -fx-focus-color: @focus-color; +} + +.text-field:hover, .text-area:hover { + -fx-border-color: @focus-color; + -fx-text-fill: @text-color; +} + +/*******************************************************/ +/************************ menu *************************/ +/*******************************************************/ +#menuPane > .tab-header-area .tab:selected { + -fx-border-color: @focus-color; +} + +#menuPane > .tab-header-area .tab-header-background { + -fx-background-color: linear-gradient(#e4e4e4, #bebebe); +} + +/*******************************************************/ +/*********************** sidebar ***********************/ +/*******************************************************/ +.sidebar { + -fx-background-color: @background-color; + -fx-padding: 0 0 0.83em 0; + + .sidebarScrollbar { + -fx-background-color: @background-color; + } + + .sidebarScrollbar > .viewport { + -fx-background-color: @background-color; + } + + .sidebarScrollbar .scroll-bar:vertical .track { + -fx-background-color: #3c3f41; + -fx-background-radius: 1em; + } + + .sidebarScrollbar .scroll-bar:vertical .thumb { + -fx-background-color: @background-color; + -fx-background-radius: 0em; + } + + .sidebarTitle { + -fx-padding: 0.83em 0.83em 0.4em 0.83em; + -fx-font-size: 1.2em; + + .text { + -fx-fill: white; + } + } + + .sidebarButton { + -fx-border-color: transparent; + -fx-text-fill: white; + -fx-border-radius: 0; + -fx-background-radius: 0; + -fx-label-padding: 0 1.5em 0 3.03em; + -fx-background-position: 0.83em 0.1em; + + .text { + -fx-fill: white; + } + + &:hover { + -fx-border-color: transparent; + } + + &:selected { + -fx-background-color: @focus-color; + -fx-border-color: transparent; + -fx-background-radius: 0; + + .text { + -fx-fill: white; + } + } + } + + .sidebarCheckBox { + -fx-translate-x: 0.83em; + -fx-label-padding: 0 1.5em 0 0.4em; + + .text { + -fx-fill: white; + } + } + + .searchBar { + -fx-border-radius: 0; + -fx-background-radius: 0; + -fx-background-color: @main-color; + -fx-border-color: transparent; + -fx-text-fill: @text-color; + -fx-focus-color: @focus-color; + + &:focused { + -fx-border-color: transparent; + -fx-text-fill: @text-color; + } + + &:hover { + -fx-border-color: @focus-color; + -fx-text-fill: @text-color; + } + } + + .searchBox { + .searchCleanButton { + -fx-border-color: transparent; + } + } +} + +/*******************************************************/ +/************************* apps ************************/ +/*******************************************************/ +.appPanelMiniaturesPane { + -fx-padding: 1em; +} + +/*******************************************************/ +/********************** containers *********************/ +/*******************************************************/ +.containerConfigurationPane > .grid { + -fx-padding: 1em; + -fx-hgap: 1em; + -fx-vgap: 1em; + -fx-spacing: 1em; +} + +/*******************************************************/ +/********************** miniature **********************/ +/*******************************************************/ + +.listChooser { + -fx-translate-x: 0.83em; + -fx-spacing: 0.2em; + -fx-padding: 0; + + .listIcon:selected { + -fx-border-radius: 0.2em; + } +} + +/*******************************************************/ +/***************** installation wizard *****************/ +/*******************************************************/ +#presentationBackground { + -fx-padding: 0.8em; +} + +/************************ step *************************/ +#panelForTopheader { + -fx-border-color: #CCCCCC; +} \ No newline at end of file From c63e3232e54ac0b80f80ae063788d0642fbe738c Mon Sep 17 00:00:00 2001 From: plata Date: Mon, 23 Apr 2018 17:53:57 +0200 Subject: [PATCH 09/76] Fix shortcut deletion when container is deleted (#1274) --- .../org/phoenicis/containers/GenericContainersManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/GenericContainersManager.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/GenericContainersManager.java index 25c4f20bc0c..c711a0f1155 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/GenericContainersManager.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/GenericContainersManager.java @@ -139,6 +139,8 @@ public void deleteContainer(ContainerDTO container, Consumer errorCal LOGGER.error("Cannot delete container (" + container.getPath() + ")! Exception: " + e.toString()); errorCallback.accept(e); } + // TODO: better way to get engine ID + final String engineId = container.getEngine().toLowerCase(); List categories = this.libraryManager.fetchShortcuts(); categories.stream().flatMap(shortcutCategoryDTO -> shortcutCategoryDTO.getShortcuts().stream()) @@ -146,7 +148,7 @@ public void deleteContainer(ContainerDTO container, Consumer errorCal final InteractiveScriptSession interactiveScriptSession = this.scriptInterpreter .createInteractiveSession(); interactiveScriptSession.eval( - "include([\"engines\", \"" + container.getEngine() + "\", \"shortcuts\", \"reader\"]);", + "include([\"engines\", \"" + engineId + "\", \"shortcuts\", \"reader\"]);", ignored -> interactiveScriptSession.eval("new ShortcutReader()", output -> { final ScriptObjectMirror shortcutReader = (ScriptObjectMirror) output; shortcutReader.callMember("of", shortcutDTO); @@ -222,4 +224,4 @@ private List fetchContainers(File directory) { return containers; } -} \ No newline at end of file +} From 4b56c55590c62897ab2bc31ad7fb3dde60d2e08e Mon Sep 17 00:00:00 2001 From: plata Date: Mon, 23 Apr 2018 17:54:10 +0200 Subject: [PATCH 10/76] Fix "Run executable" in container tools (#1272) --- .../containers/wine/WinePrefixContainerController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/WinePrefixContainerController.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/WinePrefixContainerController.java index 320d4df7c10..7af48c0b06b 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/WinePrefixContainerController.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/WinePrefixContainerController.java @@ -62,10 +62,12 @@ public void changeSetting(WinePrefixContainerDTO winePrefix, RegistryParameter s public void runInContainer(ContainerDTO container, String command, Runnable doneCallback, Consumer errorCallback) { + // TODO: better way to get engine ID + final String engineId = container.getEngine().toLowerCase(); final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); interactiveScriptSession.eval( - "include([\"engines\", \"" + container.getEngine() + "\", \"engine\", \"object\"]);", + "include([\"engines\", \"" + engineId + "\", \"engine\", \"object\"]);", ignored -> interactiveScriptSession.eval("new " + container.getEngine() + "()", output -> { final ScriptObjectMirror wine = (ScriptObjectMirror) output; wine.callMember("prefix", container.getName()); From 56df357c922996bbf554b7762b020958451ade88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 23 Apr 2018 18:06:39 +0200 Subject: [PATCH 11/76] Bump commons-io:commons-io from 2.5 to 2.6 (#1295) Bumps commons-io:commons-io from 2.5 to 2.6. Signed-off-by: dependabot[bot] --- phoenicis-library/pom.xml | 2 +- phoenicis-repository/pom.xml | 2 +- phoenicis-scripts/pom.xml | 2 +- phoenicis-settings/pom.xml | 2 +- phoenicis-tools/pom.xml | 2 +- phoenicis-win32/pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/phoenicis-library/pom.xml b/phoenicis-library/pom.xml index 23325f549e7..2ba5d40148b 100644 --- a/phoenicis-library/pom.xml +++ b/phoenicis-library/pom.xml @@ -67,7 +67,7 @@ commons-io commons-io - 2.5 + 2.6 diff --git a/phoenicis-repository/pom.xml b/phoenicis-repository/pom.xml index 93dac253e2f..6c6f39dcc24 100644 --- a/phoenicis-repository/pom.xml +++ b/phoenicis-repository/pom.xml @@ -100,7 +100,7 @@ commons-io commons-io - 2.5 + 2.6 diff --git a/phoenicis-scripts/pom.xml b/phoenicis-scripts/pom.xml index c5fdd6e2c17..95a3514fc73 100644 --- a/phoenicis-scripts/pom.xml +++ b/phoenicis-scripts/pom.xml @@ -67,7 +67,7 @@ commons-io commons-io - 2.5 + 2.6 commons-lang diff --git a/phoenicis-settings/pom.xml b/phoenicis-settings/pom.xml index c25191622ee..293e284f4fd 100644 --- a/phoenicis-settings/pom.xml +++ b/phoenicis-settings/pom.xml @@ -67,7 +67,7 @@ commons-io commons-io - 2.5 + 2.6 diff --git a/phoenicis-tools/pom.xml b/phoenicis-tools/pom.xml index a510e9c43b6..9742606b206 100644 --- a/phoenicis-tools/pom.xml +++ b/phoenicis-tools/pom.xml @@ -62,7 +62,7 @@ commons-io commons-io - 2.5 + 2.6 diff --git a/phoenicis-win32/pom.xml b/phoenicis-win32/pom.xml index 8a69ae9a4a0..0ab08f91e4a 100644 --- a/phoenicis-win32/pom.xml +++ b/phoenicis-win32/pom.xml @@ -37,7 +37,7 @@ commons-io commons-io - 2.5 + 2.6 From 72182c510d08a218305a0bb02787fbcac16294b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 23 Apr 2018 18:06:54 +0200 Subject: [PATCH 12/76] Bump org.mockito:mockito-core from 2.18.0 to 2.18.3 (#1294) Bumps [org.mockito:mockito-core](https://github.com/mockito/mockito) from 2.18.0 to 2.18.3. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.18.0...v2.18.3) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1cc8f063b9f..bea93d5289e 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,7 @@ 1.7.16 1.2.3 4.12 - 2.18.0 + 2.18.3 4.2.5.RELEASE From ac135313fe6b0c7ea25de39490615fd9481e01ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 23 Apr 2018 18:07:12 +0200 Subject: [PATCH 13/76] Bump org.codehaus.mojo:exec-maven-plugin from 1.4.0 to 1.6.0 (#1293) Bumps [org.codehaus.mojo:exec-maven-plugin](https://github.com/mojohaus/exec-maven-plugin) from 1.4.0 to 1.6.0. - [Release notes](https://github.com/mojohaus/exec-maven-plugin/releases) - [Commits](https://github.com/mojohaus/exec-maven-plugin/compare/exec-maven-plugin-1.4.0...exec-maven-plugin-1.6.0) Signed-off-by: dependabot[bot] --- phoenicis-javafx/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-javafx/pom.xml b/phoenicis-javafx/pom.xml index d0b4475410c..31988e11fdb 100644 --- a/phoenicis-javafx/pom.xml +++ b/phoenicis-javafx/pom.xml @@ -66,7 +66,7 @@ org.codehaus.mojo exec-maven-plugin - 1.4.0 + 1.6.0 org.phoenicis.javafx.JavaFXApplication From 09d6355684b53b648ebf103f71fe743871cee0bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 23 Apr 2018 18:08:47 +0200 Subject: [PATCH 14/76] Bump org.slf4j:slf4j-api from 1.7.16 to 1.7.25 (#1291) Bumps org.slf4j:slf4j-api from 1.7.16 to 1.7.25. Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bea93d5289e..7148b76897b 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ UTF-8 1.46 ${project.basedir}/target/jacoco-it.exec - 1.7.16 + 1.7.25 1.2.3 4.12 2.18.3 From f53cfd523d64709c89b80526cfad2dfb880d286a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 23 Apr 2018 18:09:51 +0200 Subject: [PATCH 15/76] Bump org.eclipse.jgit:org.eclipse.jgit from 4.7.0.201704051617-r to 4.11.0.201803080745-r (#1287) Bumps org.eclipse.jgit:org.eclipse.jgit from 4.7.0.201704051617-r to 4.11.0.201803080745-r. Signed-off-by: dependabot[bot] --- phoenicis-repository/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-repository/pom.xml b/phoenicis-repository/pom.xml index 6c6f39dcc24..fb277c67f2c 100644 --- a/phoenicis-repository/pom.xml +++ b/phoenicis-repository/pom.xml @@ -112,7 +112,7 @@ org.eclipse.jgit org.eclipse.jgit - 4.7.0.201704051617-r + 4.11.0.201803080745-r From 7acfbeba38f76e87ccec1e92321660692bd05552 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 23 Apr 2018 18:10:43 +0200 Subject: [PATCH 16/76] Bump org.apache.maven.plugins:maven-assembly-plugin from 2.6 to 3.1.0 (#1282) Bumps org.apache.maven.plugins:maven-assembly-plugin from 2.6 to 3.1.0. Signed-off-by: dependabot[bot] --- phoenicis-dist/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-dist/pom.xml b/phoenicis-dist/pom.xml index 7147220aecc..804301528f8 100644 --- a/phoenicis-dist/pom.xml +++ b/phoenicis-dist/pom.xml @@ -48,7 +48,7 @@ org.apache.maven.plugins maven-assembly-plugin - 2.6 + 3.1.0 distribution From 01c49d25348f68b16ccf4109f5b1f413c16868df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 23 Apr 2018 18:12:35 +0200 Subject: [PATCH 17/76] Bump org.apache.maven.plugins:maven-surefire-plugin from 2.19.1 to 2.21.0 (#1280) Bumps org.apache.maven.plugins:maven-surefire-plugin from 2.19.1 to 2.21.0. Signed-off-by: dependabot[bot] --- phoenicis-javafx/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-javafx/pom.xml b/phoenicis-javafx/pom.xml index 31988e11fdb..8d1d21895c2 100644 --- a/phoenicis-javafx/pom.xml +++ b/phoenicis-javafx/pom.xml @@ -38,7 +38,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.19.1 + 2.21.0 -Djava.awt.headless=true -Dtestfx.robot=glass -Dtestfx.headless=true -Dprism.order=sw -Dprism.text=t2k From 7543ce7f82f6e10e584677b58fcf63c98d3a17b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 23 Apr 2018 20:49:27 +0200 Subject: [PATCH 18/76] Bump org.fedorahosted.tennera:jgettext from 0.14 to 0.15.1 (#1288) Bumps [org.fedorahosted.tennera:jgettext](https://github.com/zanata/jgettext) from 0.14 to 0.15.1. - [Release notes](https://github.com/zanata/jgettext/releases) - [Commits](https://github.com/zanata/jgettext/compare/jgettext-0.14...jgettext-0.15.1) Signed-off-by: dependabot[bot] --- phoenicis-configuration/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-configuration/pom.xml b/phoenicis-configuration/pom.xml index 1d6e6a3f07b..5e23e42d921 100644 --- a/phoenicis-configuration/pom.xml +++ b/phoenicis-configuration/pom.xml @@ -50,7 +50,7 @@ org.fedorahosted.tennera jgettext - 0.14 + 0.15.1 com.google.guava From f3cf3b4a451b0ff556b543e3d3d9100299bd9b5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 23 Apr 2018 20:50:13 +0200 Subject: [PATCH 19/76] Bump org.apache.commons:commons-compress from 1.13 to 1.16.1 (#1284) Bumps org.apache.commons:commons-compress from 1.13 to 1.16.1. Signed-off-by: dependabot[bot] --- phoenicis-tools/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-tools/pom.xml b/phoenicis-tools/pom.xml index 9742606b206..91d12b71119 100644 --- a/phoenicis-tools/pom.xml +++ b/phoenicis-tools/pom.xml @@ -80,7 +80,7 @@ org.apache.commons commons-compress - 1.13 + 1.16.1 From 63f8f1c445d450641ea18bef97044a0d209081c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 23 Apr 2018 20:51:34 +0200 Subject: [PATCH 20/76] Bump me.xdrop:fuzzywuzzy from 1.1.8 to 1.1.10 (#1281) Bumps [me.xdrop:fuzzywuzzy](https://github.com/xdrop/fuzzywuzzy) from 1.1.8 to 1.1.10. - [Release notes](https://github.com/xdrop/fuzzywuzzy/releases) - [Commits](https://github.com/xdrop/fuzzywuzzy/compare/1.1.8...1.1.10) Signed-off-by: dependabot[bot] --- phoenicis-javafx/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-javafx/pom.xml b/phoenicis-javafx/pom.xml index 8d1d21895c2..859f81786d1 100644 --- a/phoenicis-javafx/pom.xml +++ b/phoenicis-javafx/pom.xml @@ -244,7 +244,7 @@ me.xdrop fuzzywuzzy - 1.1.8 + 1.1.10 From 9c826a702e02d20d411fbc022cb5979dc9f8fbfa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 23 Apr 2018 20:52:43 +0200 Subject: [PATCH 21/76] Bump org.mock-server:mockserver-netty from 3.10.7 to 5.3.0 (#1289) Bumps org.mock-server:mockserver-netty from 3.10.7 to 5.3.0. Signed-off-by: dependabot[bot] --- phoenicis-tools/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-tools/pom.xml b/phoenicis-tools/pom.xml index 91d12b71119..ef919d72f6f 100644 --- a/phoenicis-tools/pom.xml +++ b/phoenicis-tools/pom.xml @@ -120,7 +120,7 @@ org.mock-server mockserver-netty - 3.10.7 + 5.3.0 test From a206f6a8e0b4c55fe1dbd0359c3a728bcae4dfb5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 24 Apr 2018 17:45:10 +0200 Subject: [PATCH 22/76] Bump org.jsoup:jsoup from 1.10.2 to 1.11.3 (#1290) Bumps [org.jsoup:jsoup](https://github.com/jhy/jsoup) from 1.10.2 to 1.11.3. - [Release notes](https://github.com/jhy/jsoup/releases) - [Changelog](https://github.com/jhy/jsoup/blob/master/CHANGES) - [Commits](https://github.com/jhy/jsoup/compare/jsoup-1.10.2...jsoup-1.11.3) Signed-off-by: dependabot[bot] --- phoenicis-cli/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-cli/pom.xml b/phoenicis-cli/pom.xml index 140041d0dba..5a803edf3ed 100644 --- a/phoenicis-cli/pom.xml +++ b/phoenicis-cli/pom.xml @@ -116,7 +116,7 @@ org.jsoup jsoup - 1.10.2 + 1.11.3 \ No newline at end of file From 53035c0dfda4ddc7ae892961a333069c9fea9433 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 24 Apr 2018 17:45:48 +0200 Subject: [PATCH 23/76] Bump spring.version from 4.2.5.RELEASE to 5.0.5.RELEASE (#1296) Bumps `spring.version` from 4.2.5.RELEASE to 5.0.5.RELEASE. Updates `org.springframework:spring-context` from 4.2.5.RELEASE to 5.0.5.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v4.2.5.RELEASE...v5.0.5.RELEASE) Updates `org.springframework:spring-core` from 4.2.5.RELEASE to 5.0.5.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v4.2.5.RELEASE...v5.0.5.RELEASE) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7148b76897b..4ee330ca065 100644 --- a/pom.xml +++ b/pom.xml @@ -55,7 +55,7 @@ 1.2.3 4.12 2.18.3 - 4.2.5.RELEASE + 5.0.5.RELEASE From 06bfc25f92735104bd932269371fc0569d25f068 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 24 Apr 2018 18:08:01 +0200 Subject: [PATCH 24/76] Bump commons-codec:commons-codec from 1.10 to 1.11 (#1286) * Bump commons-codec:commons-codec from 1.10 to 1.11 Bumps commons-codec:commons-codec from 1.10 to 1.11. Signed-off-by: dependabot[bot] * Delete unused in phoenicis-repository --- phoenicis-repository/pom.xml | 8 +------- phoenicis-tools/pom.xml | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/phoenicis-repository/pom.xml b/phoenicis-repository/pom.xml index fb277c67f2c..ca1c3a61894 100644 --- a/phoenicis-repository/pom.xml +++ b/phoenicis-repository/pom.xml @@ -85,12 +85,6 @@ test - - commons-codec - commons-codec - 1.10 - - commons-lang commons-lang @@ -116,4 +110,4 @@ - \ No newline at end of file + diff --git a/phoenicis-tools/pom.xml b/phoenicis-tools/pom.xml index ef919d72f6f..bd17bbcdc4e 100644 --- a/phoenicis-tools/pom.xml +++ b/phoenicis-tools/pom.xml @@ -56,7 +56,7 @@ commons-codec commons-codec - 1.10 + 1.11 From 5c3d027f681ac93c62ff6fb459903693f1e9416f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 24 Apr 2018 18:08:42 +0200 Subject: [PATCH 25/76] Bump org.vafer:jdeb from 1.5 to 1.6 (#1283) Bumps [org.vafer:jdeb](https://github.com/tcurdt/jdeb) from 1.5 to 1.6. - [Release notes](https://github.com/tcurdt/jdeb/releases) - [Changelog](https://github.com/tcurdt/jdeb/blob/master/HISTORY.md) - [Commits](https://github.com/tcurdt/jdeb/compare/jdeb-1.5...jdeb-1.6) Signed-off-by: dependabot[bot] --- phoenicis-dist/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-dist/pom.xml b/phoenicis-dist/pom.xml index 804301528f8..729359d7a3d 100644 --- a/phoenicis-dist/pom.xml +++ b/phoenicis-dist/pom.xml @@ -83,7 +83,7 @@ jdeb org.vafer - 1.5 + 1.6 package From 4e095c57b321d879ac5844fbd57eef3da38f4d17 Mon Sep 17 00:00:00 2001 From: plata Date: Tue, 24 Apr 2018 18:14:42 +0200 Subject: [PATCH 26/76] Add test plan to docs (#1276) --- docs/_data/navigation.yml | 2 + docs/_pages/release-process.md | 2 +- docs/_pages/test-plan.md | 184 +++++++++++++++++++++++++++++++++ 3 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 docs/_pages/test-plan.md diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index 4d73a38e330..d5958a4f7c9 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -27,3 +27,5 @@ docs: url: /translation/ - title: "Release process" url: /release-process/ + - title: "Test plan" + url: /test-plan/ diff --git a/docs/_pages/release-process.md b/docs/_pages/release-process.md index 912baca9572..3a96ed36bdd 100644 --- a/docs/_pages/release-process.md +++ b/docs/_pages/release-process.md @@ -14,7 +14,7 @@ The following steps must be executed to release a new version of Phoenicis: * Specify scripts release branch in configuration (`application.repository.default.git.url`) * Set release version for Maven in `pom.xml` files * Set release version in .deb control files -* Test +* [Test]({{ site.baseurl }}{% link _pages/test-plan.md %}) * Create GitHub release from the release branches for phoenicis and scripts * Announce release on phoenicis.org * Showcase new features diff --git a/docs/_pages/test-plan.md b/docs/_pages/test-plan.md new file mode 100644 index 00000000000..7fbc74b04cf --- /dev/null +++ b/docs/_pages/test-plan.md @@ -0,0 +1,184 @@ +--- +title: "Test plan" +permalink: /test-plan/ +toc: true +--- + +This page describes the test plan which is used to verify that Phoenicis works as expected. + +Before you start, ensure that you are in a clean environment: +* move `.Phoenicis` to `.Phoenicis_bak` +* checkout and pull the desired branch/revision from upstream `phoenicis` +* do a clean build (`mvn clean package`) + +## Applications +* open "Applications" tab +* check that several categories are shown +* check that applications are listed +* check that list style can be switched +* click a category +* check that apps are filtered +* check "testing" +* check that "testing" apps are shown (if there are any in the scripts repository) +* search for "notep" +* check that categories are filtered +* check that apps are filtered +* click "Notepad++" +* check that details panel opens +* if you don't use the English version: check that description is translated +* click "install" +* check that "Installations" tab is opened + +# Engines +* open "Engines" tab +* check that Wine categoriy is shown +* check that engines are listed +* check that list style can be switched +* search for "3.0" +* check that engines are filtered +* open "Upstream linux x86" +* click "3.0" +* check that details panel opens +* click "install" +* approve pop-up +* check that "Installations" tab is opened + +## Installations +* check that "Applications" and "Engines" categories are shown +* check that installations of Notepad++ and Wine 3.0 are listed +* search for "notep" +* check that categories are filtered +* check that installations are filtered +* click "Notepad++" +* check that details panel is shown +* click Wine 3.0 installation +* check that details panel is shown +* wait until Wine 3.0 installation is finished +* check that Wine 3.0 is installed in `.Phoenicis/engines` + +## Engines +* open "Engines" tab +* check that Wine 3.0 is marked as installed +* delete Wine 3.0 +* check that Wine 3.0 is deleted from `.Phoenicis/engines` +* check that Wine 3.0 is marked as not installed + +## Installations +* open "Installations" tab +* click "Notepad++" +* follow installation wizard and finish installation + +## Library +* open "Library" tab +* check that "All" and "Development" categories are shown +* check that Notepad++ is listed +* check that list style can be switched +* click "Notepad++" +* check that details panel is shown +* click "run" +* check that Notepad++ opens +* click "close" +* check that Notepad++ closes +* right-click "Notepad++" and select "Edit" +* check that edit form is shown in details panel +* fill "Arguments" with "/home//.Phoenicis/shortcuts/Notepad.shortcut" +* click "save" +* run Notepad++ +* check that Notepad++ opens and shows the Notepad.shortcut file +* close Notepad++ +* click "Create shortcut" +* click "create" +* check that the required fields are highlighted +* fill with + * name: "Test" + * category: "test-category" + * executable: "/home//.Phoenicis/containers/wineprefix/Notepad/drive_c/Program Files/Internet Explorer/iexplore.exe" +* click "create" +* check that "All", "Development" and "test-category" categories are shown +* check that "Test" shortcut is listed with default miniature +* search for "Test" +* check that categories are filtered +* check that only "Test" shortcut is listed +* run "Test" shortcut +* check that Wine Internet Explorer opens +* close Wine Internet Explorer + +## Containers +* open "Containers" tab +* check that "All" and "wineprefix" categories are shown +* check that Notepad is listed with composed miniature (half Notepad++, half default) +* check that list style can be switched + +## Library +* open "Library" tab +* uninstall "Test" shortcut +* check that "Test" shorcut is not listed anymore + +## Containers +* open "Containers" tab +* click "Notepad" +* check that details panel is shown +* check that tabs exist + * Information + * Display + * Input + * Wine Tools + * Tools +* open "Wine Tools" tab +* check that all tools open +* open "Tools" tab +* click "Run executable" +* select "/home//.Phoenicis/containers/wineprefix/Notepad/drive_c/Program Files/Notepad++/notepad++.exe" +* check that Notepad++ opens +* close Notepad++ +* open "Information" tab +* click "delete container" +* approve pop-up +* check that "Notepad" is not listed anymore +* check that Notepad has been deleted from `.Phoenicis/containers/wineprefix` + +## Library +* open "Library" tab +* check that "Notepad++" shortcut is not listed anymore +* check that the shortcut files have been deleted from `.Phoenicis/shortcuts` + +## Settings +* open "Settings" tab +### User Interface +* open "User Interface" +* select all themes and check that they are applied +* change scaling +* check that UI is scaled +* maximize window +* click "reset" +* restart Phoenicis +* check that window is not maximized and default scaling and theme are used +### Repositories +* open "Repositories" +* check that default repositories are listed +* click "add" +* select "local repository" +* use "/home//.Phoenicis/cache/git-XXXXXX" +* click "finish" +* check that new repository is listed +* select new repository +* click "delete" +* approve pop-up +* check that repository has been removed from list +* click "add" +* select "local repository" +* use "/home//.Phoenicis/cache/git-XXXXXX" +* click "finish" +* check that new repository is listed +* click "reset +* restart Phoenicis +* check that repository has been removed from list +### File Associations +* open "File Associations" +* check that it is empty +### Network +* open "Network" +* check that it is empty +### About +* open "About" +* check that shown information is correct From 60115c15a62385f9a3d09d7ff3dedd00e6e11ced Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 24 Apr 2018 18:28:00 +0200 Subject: [PATCH 27/76] Delete unused HtmlTemplate class (#1292) * Bump com.github.spullara.mustache.java:compiler from 0.9.4 to 0.9.5 Bumps [com.github.spullara.mustache.java:compiler](https://github.com/spullara/mustache.java) from 0.9.4 to 0.9.5. - [Release notes](https://github.com/spullara/mustache.java/releases) - [Commits](https://github.com/spullara/mustache.java/compare/mustache.java-0.9.4...mustache.java-0.9.5) Signed-off-by: dependabot[bot] * Delete unused in phoenicis-cli - remove HtmlTemplate - remove HtmlTemplateTest - remove the dependency com.github.spullara.mustache.java-compile --- phoenicis-cli/pom.xml | 8 +-- phoenicis-javafx/pom.xml | 6 -- .../javafx/views/common/HtmlTemplate.java | 57 ------------------- .../javafx/views/common/HtmlTemplateTest.java | 57 ------------------- 4 files changed, 1 insertion(+), 127 deletions(-) delete mode 100644 phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/HtmlTemplate.java delete mode 100644 phoenicis-javafx/src/test/java/org/phoenicis/javafx/views/common/HtmlTemplateTest.java diff --git a/phoenicis-cli/pom.xml b/phoenicis-cli/pom.xml index 5a803edf3ed..dc17f92c99b 100644 --- a/phoenicis-cli/pom.xml +++ b/phoenicis-cli/pom.xml @@ -64,12 +64,6 @@ ${project.version} - - com.github.spullara.mustache.java - compiler - 0.9.4 - - org.slf4j slf4j-api @@ -119,4 +113,4 @@ 1.11.3 - \ No newline at end of file + diff --git a/phoenicis-javafx/pom.xml b/phoenicis-javafx/pom.xml index 859f81786d1..31d298db11c 100644 --- a/phoenicis-javafx/pom.xml +++ b/phoenicis-javafx/pom.xml @@ -184,12 +184,6 @@ ${project.version} - - com.github.spullara.mustache.java - compiler - 0.9.4 - - org.slf4j slf4j-api diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/HtmlTemplate.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/HtmlTemplate.java deleted file mode 100644 index 38475642e59..00000000000 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/HtmlTemplate.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.javafx.views.common; - -import com.github.mustachejava.DefaultMustacheFactory; -import com.github.mustachejava.Mustache; - -import java.io.*; -import java.util.HashMap; -import java.util.Map; - -public class HtmlTemplate { - private final InputStream inputStream; - private final DefaultMustacheFactory mf; - - public HtmlTemplate(InputStream inputStream) { - this.inputStream = inputStream; - mf = new DefaultMustacheFactory(); - } - - public String render(Object userScope) throws IOException { - final Reader reader = new InputStreamReader(inputStream); - final Mustache mustache = mf.compile(reader, null); - OutputStream stream = new ByteArrayOutputStream(); - - Object[] scopes = new Object[2]; - scopes[0] = userScope; - scopes[1] = globalScope(); - - mustache.execute(new PrintWriter(stream), scopes).flush(); - - return stream.toString(); - } - - private Map globalScope() { - Map scopes = new HashMap<>(); - scopes.put("LOGO", - this.getClass().getResource("/org/phoenicis/javafx/views/common/phoenicis.png").toExternalForm()); - return scopes; - } -} diff --git a/phoenicis-javafx/src/test/java/org/phoenicis/javafx/views/common/HtmlTemplateTest.java b/phoenicis-javafx/src/test/java/org/phoenicis/javafx/views/common/HtmlTemplateTest.java deleted file mode 100644 index 0df29681a44..00000000000 --- a/phoenicis-javafx/src/test/java/org/phoenicis/javafx/views/common/HtmlTemplateTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.javafx.views.common; - -import org.junit.Before; -import org.junit.Test; - -import java.io.*; - -import static org.junit.Assert.assertEquals; - -public class HtmlTemplateTest { - - private File testTemplate; - - @Before - public void setUp() throws IOException { - testTemplate = File.createTempFile("test", "html"); - testTemplate.deleteOnExit(); - - try (OutputStream outputStream = new FileOutputStream(testTemplate)) { - outputStream.write(("" + "" + "{{title}}" + "" + "" - + "Content: {{content}}" + "" + "").getBytes()); - - outputStream.flush(); - } - } - - @Test - public void testRenderReplaceTwoValuesValuesAreReplaced() throws Exception { - HtmlTemplate htmlTemplate = new HtmlTemplate(new FileInputStream(testTemplate)); - - String expected = "" + "" + "Title" + "" + "" + "Content: Content" - + "" + ""; - assertEquals(expected, htmlTemplate.render(new Object() { - String title = "Title"; - String content = "Content"; - })); - } - -} \ No newline at end of file From c08e229b457e57cdaef6265c7eedd52e41e2953e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 24 Apr 2018 18:49:30 +0200 Subject: [PATCH 28/76] Bump net.revelc.code.formatter:formatter-maven-plugin from 2.0.1 to 2.7.2 (#1213) Bumps [net.revelc.code.formatter:formatter-maven-plugin](https://github.com/revelc/formatter-maven-plugin) from 2.0.1 to 2.7.2. - [Release notes](https://github.com/revelc/formatter-maven-plugin/releases) - [Changelog](https://github.com/revelc/formatter-maven-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/revelc/formatter-maven-plugin/compare/formatter-maven-plugin-2.0.1...formatter-maven-plugin-2.7.2) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4ee330ca065..14f83243c6d 100644 --- a/pom.xml +++ b/pom.xml @@ -168,7 +168,7 @@ net.revelc.code.formatter formatter-maven-plugin - 2.0.1 + 2.7.2 From b2c7f8a22179b05d42428839cea94f9fee45c57e Mon Sep 17 00:00:00 2001 From: plata Date: Wed, 25 Apr 2018 18:29:28 +0200 Subject: [PATCH 29/76] Revert "Bump net.revelc.code.formatter:formatter-maven-plugin from 2.0.1 to 2.7.2 (#1213)" (#1299) This reverts commit c08e229b457e57cdaef6265c7eedd52e41e2953e. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 14f83243c6d..4ee330ca065 100644 --- a/pom.xml +++ b/pom.xml @@ -168,7 +168,7 @@ net.revelc.code.formatter formatter-maven-plugin - 2.7.2 + 2.0.1 From 787b161e2fe407d2e60c5d9c009963faa1cfb9df Mon Sep 17 00:00:00 2001 From: plata Date: Wed, 25 Apr 2018 20:39:31 +0200 Subject: [PATCH 30/76] Use Ruby 2.5 for Travis CI GitHub Pages check (#1300) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 10e03c9d398..b97001cc2ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,7 +43,7 @@ matrix: os: linux language: ruby rvm: - - 2.1 + - 2.5 before_install: cd docs script: - bundle exec jekyll build From ded3f97725ad3f4579626c6d17bb7ae8ba671555 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 26 Apr 2018 18:54:43 +0200 Subject: [PATCH 31/76] Bump com.google.guava:guava from 21.0 to 25.0-jre (#1301) Bumps com.google.guava:guava from 21.0 to 25.0-jre. Signed-off-by: dependabot[bot] --- phoenicis-configuration/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-configuration/pom.xml b/phoenicis-configuration/pom.xml index 5e23e42d921..e904e561512 100644 --- a/phoenicis-configuration/pom.xml +++ b/phoenicis-configuration/pom.xml @@ -55,7 +55,7 @@ com.google.guava guava - 21.0 + 25.0-jre From 969d58aa13a73c45955419ff9708146b20ec6e30 Mon Sep 17 00:00:00 2001 From: plata Date: Sat, 5 May 2018 11:08:57 +0200 Subject: [PATCH 32/76] Remove SonarQube (#1308) --- pom.xml | 1 - sonar-project.properties | 91 ---------------------------------------- 2 files changed, 92 deletions(-) delete mode 100644 sonar-project.properties diff --git a/pom.xml b/pom.xml index 4ee330ca065..e8eb2601d95 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,6 @@ ${project.basedir}/settings UTF-8 1.46 - ${project.basedir}/target/jacoco-it.exec 1.7.25 1.2.3 4.12 diff --git a/sonar-project.properties b/sonar-project.properties deleted file mode 100644 index e3e79be98cb..00000000000 --- a/sonar-project.properties +++ /dev/null @@ -1,91 +0,0 @@ -# -# Copyright (C) 2015-2017 PÂRIS Quentin -# -# 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 2 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, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# - -sonar.projectKey=org.phoenicis:phoenicis -sonar.projectName=Phoenicis -sonar.projectVersion=5.0-SNAPSHOT - -sonar.exclusions=**/target/**/* -sonar.sourceEncoding=UTF8 - -sonar.modules=app, apps, bash, core, injection, javafx, javafx-wine, qt, ui - -app.sonar.projectBaseDir=phoenicis-app -app.sonar.sources=src/main/java -app.sonar.java.binaries=target/classes - -apps.sonar.projectBaseDir=phoenicis-repository -apps.sonar.sources=src/main/java -apps.sonar.tests=src/test/java -apps.sonar.java.binaries=target/classes -apps.sonar.test.binaries=target/test-classes -apps.sonar.jacoco.reportPath=target/jacoco.exec - -bash.sonar.projectBaseDir=phoenicis-bash -bash.sonar.sources=src/main/java -bash.sonar.tests=src/test/java -bash.sonar.java.binaries=target/classes -bash.sonar.test.binaries=target/test-classes -bash.sonar.jacoco.reportPath=target/jacoco.exec - -core.sonar.projectBaseDir=phoenicis-core -core.sonar.sources=src/main/java -core.sonar.tests=src/test/java -core.sonar.java.binaries=target/classes -core.sonar.test.binaries=target/test-classes -core.sonar.jacoco.reportPath=target/jacoco.exec - -injection.sonar.projectBaseDir=phoenicis-injection -injection.sonar.sources=src/main/java -injection.sonar.tests=src/test/java -injection.sonar.java.binaries=target/classes -injection.sonar.test.binaries=target/test-classes -injection.sonar.jacoco.reportPath=target/jacoco.exec - -javafx.sonar.projectBaseDir=phoenicis-javafx -javafx.sonar.sources=src/main/java -javafx.sonar.tests=src/test/java -javafx.sonar.java.binaries=target/classes -javafx.sonar.test.binaries=target/test-classes -javafx.sonar.jacoco.reportPath=target/jacoco.exec - -javafx-wine.sonar.projectBaseDir=phoenicis-javafx-wine -javafx-wine.sonar.sources=src/main/java -javafx-wine.sonar.java.binaries=target/classes - -qt.sonar.projectBaseDir=phoenicis-qt -qt.sonar.sources=src/main/java -qt.sonar.java.binaries=target/classes - -ui.sonar.projectBaseDir=phoenicis-ui -ui.sonar.sources=src/main/java -ui.sonar.java.binaries=target/classes - -win32.sonar.projectBaseDir=phoenicis-win32 -win32.sonar.sources=src/main/java -win32.sonar.tests=src/test/java -win32.sonar.java.binaries=target/classes -win32.sonar.test.binaries=target/test-classes -win32.sonar.jacoco.reportPath=target/jacoco.exec - -wine.sonar.projectBaseDir=phoenicis-wine -wine.sonar.sources=src/main/java -wine.sonar.tests=src/test/java -wine.sonar.java.binaries=target/classes -wine.sonar.test.binaries=target/test-classes -wine.sonar.jacoco.reportPath=target/jacoco.exec \ No newline at end of file From 904915479e3ae9de6e71c551a8affc2ae85cedd6 Mon Sep 17 00:00:00 2001 From: plata Date: Sat, 5 May 2018 11:09:39 +0200 Subject: [PATCH 33/76] Add image of IntelliJ IDEA configuration to docs (#1307) --- docs/_pages/intellij-idea.md | 1 + docs/assets/images/intellij-idea-run.png | Bin 0 -> 66337 bytes 2 files changed, 1 insertion(+) create mode 100644 docs/assets/images/intellij-idea-run.png diff --git a/docs/_pages/intellij-idea.md b/docs/_pages/intellij-idea.md index 57503295e2a..dcb101bb498 100644 --- a/docs/_pages/intellij-idea.md +++ b/docs/_pages/intellij-idea.md @@ -14,6 +14,7 @@ Build phoenicis (root) → Lifecycle → package ### Run Run → Edit Configurations add: JavaFXApplication with main class org.phoenicis.javafx.JavaFXApplication +{% include figure image_path="/assets/images/intellij-idea-run.png" alt="IntelliJ IDEA configuration" caption="IntelliJ IDEA configuration" %} ### Code Style File → Settings → Editor → Code Style → Scheme: Manage... → Import → Eclipse XML Profile: select [settings/POL_Formatter_Settings.xml](https://github.com/PhoenicisOrg/phoenicis/blob/master/settings/POL_Formatter_Settings.xml) diff --git a/docs/assets/images/intellij-idea-run.png b/docs/assets/images/intellij-idea-run.png new file mode 100644 index 0000000000000000000000000000000000000000..016b4fd8ef7f3f5ce4239ffee69d2a17b0b60379 GIT binary patch literal 66337 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

%Xc0U$`NQCzN%$F8%zAj>p!+bNY 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�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

e>PcdMu^&B`?No~&&C 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 h@h>W39-#zgIHt~<`yWidh5-doQ7N|yit literal 0 HcmV?d00001 From b746d194f9913bcda4e72fad92e078348129ffab Mon Sep 17 00:00:00 2001 From: plata Date: Sat, 5 May 2018 11:15:01 +0200 Subject: [PATCH 34/76] Implement OOP engines (#1298) Use composition over inheritance for OOP engine implementation. --- phoenicis-containers/pom.xml | 27 ++-- .../containers/ContainersConfiguration.java | 7 +- .../wine/WinePrefixContainerController.java | 23 ++-- .../java/org/phoenicis/engines/Engine.java | 99 +++++++++++++++ .../engines/EnginesConfiguration.java | 5 +- .../org/phoenicis/engines/EnginesManager.java | 120 ++++++++++++++++++ .../org/phoenicis/engines/EnginesSource.java | 98 -------------- .../engines/dto/EngineCategoryDTO.java | 4 +- .../controller/ControllerConfiguration.java | 5 +- .../containers/ContainersController.java | 2 +- .../controller/engines/EnginesController.java | 74 +++++------ .../controller/library/LibraryController.java | 2 +- .../views/mainwindow/engines/EnginesView.java | 70 +++++++++- 13 files changed, 358 insertions(+), 178 deletions(-) create mode 100644 phoenicis-engines/src/main/java/org/phoenicis/engines/Engine.java create mode 100644 phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesManager.java delete mode 100644 phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesSource.java diff --git a/phoenicis-containers/pom.xml b/phoenicis-containers/pom.xml index 3212a2baa75..5c18dc1ae25 100644 --- a/phoenicis-containers/pom.xml +++ b/phoenicis-containers/pom.xml @@ -47,36 +47,45 @@ - org.phoenicis - phoenicis-entities - ${project.version} + junit + junit org.phoenicis - phoenicis-tools - ${project.version} + phoenicis-engines + 5.0-SNAPSHOT + compile org.phoenicis - phoenicis-scripts + phoenicis-entities ${project.version} - junit - junit + org.phoenicis + phoenicis-library + ${project.version} + org.phoenicis - phoenicis-library + phoenicis-scripts ${project.version} + org.phoenicis phoenicis-settings 5.0-SNAPSHOT + + + org.phoenicis + phoenicis-tools + ${project.version} + \ No newline at end of file diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java index d871e1c5d1d..490e41579c1 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java @@ -21,6 +21,7 @@ import org.phoenicis.configuration.PhoenicisGlobalConfiguration; import org.phoenicis.containers.wine.WinePrefixContainerController; import org.phoenicis.containers.wine.configurations.*; +import org.phoenicis.engines.EnginesConfiguration; import org.phoenicis.library.LibraryConfiguration; import org.phoenicis.multithreading.MultithreadingConfiguration; import org.phoenicis.scripts.ScriptsConfiguration; @@ -35,6 +36,9 @@ public class ContainersConfiguration { @Autowired private LibraryConfiguration libraryConfiguration; + @Autowired + private EnginesConfiguration enginesConfiguration; + @Autowired private MultithreadingConfiguration multithreadingConfiguration; @@ -71,7 +75,8 @@ public ContainersManager backgroundContainersManager() { @Bean public WinePrefixContainerController winePrefixContainerController() { return new WinePrefixContainerController(scriptsConfiguration.scriptInterpreter(), - win32Configuration.registryWriter()); + win32Configuration.registryWriter(), + enginesConfiguration.enginesSource()); } @Bean diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/WinePrefixContainerController.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/WinePrefixContainerController.java index 7af48c0b06b..b5752937d8c 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/WinePrefixContainerController.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/WinePrefixContainerController.java @@ -22,23 +22,28 @@ import org.phoenicis.containers.dto.ContainerDTO; import org.phoenicis.containers.dto.WinePrefixContainerDTO; import org.phoenicis.containers.wine.parameters.RegistryParameter; +import org.phoenicis.engines.EnginesManager; import org.phoenicis.scripts.interpreter.InteractiveScriptSession; import org.phoenicis.scripts.interpreter.ScriptInterpreter; import org.phoenicis.win32.registry.RegistryWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.HashMap; import java.util.function.Consumer; public class WinePrefixContainerController { private static final Logger LOGGER = LoggerFactory.getLogger(WinePrefixContainerController.class); private final ScriptInterpreter scriptInterpreter; private final RegistryWriter registryWriter; + private EnginesManager enginesManager; public WinePrefixContainerController(ScriptInterpreter scriptInterpreter, - RegistryWriter registryWriter) { + RegistryWriter registryWriter, + EnginesManager enginesManager) { this.scriptInterpreter = scriptInterpreter; this.registryWriter = registryWriter; + this.enginesManager = enginesManager; } public void changeSetting(WinePrefixContainerDTO winePrefix, RegistryParameter setting, Runnable doneCallback, @@ -64,16 +69,10 @@ public void runInContainer(ContainerDTO container, String command, Runnable done Consumer errorCallback) { // TODO: better way to get engine ID final String engineId = container.getEngine().toLowerCase(); - final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); - - interactiveScriptSession.eval( - "include([\"engines\", \"" + engineId + "\", \"engine\", \"object\"]);", - ignored -> interactiveScriptSession.eval("new " + container.getEngine() + "()", output -> { - final ScriptObjectMirror wine = (ScriptObjectMirror) output; - wine.callMember("prefix", container.getName()); - wine.callMember("run", command); - wine.callMember("wait"); - doneCallback.run(); - }, errorCallback), errorCallback); + this.enginesManager.getEngine(engineId, engine -> { + engine.setWorkingContainer(container.getName()); + engine.run(command, null, container.getPath(), false, true, new HashMap<>()); + doneCallback.run(); + }, errorCallback); } } diff --git a/phoenicis-engines/src/main/java/org/phoenicis/engines/Engine.java b/phoenicis-engines/src/main/java/org/phoenicis/engines/Engine.java new file mode 100644 index 00000000000..899e89bcf34 --- /dev/null +++ b/phoenicis-engines/src/main/java/org/phoenicis/engines/Engine.java @@ -0,0 +1,99 @@ +package org.phoenicis.engines; + +import org.phoenicis.scripts.wizard.SetupWizard; + +import java.util.Map; + +/** + * interface which must be implemented by all engines in Javascript + */ +public interface Engine { + + /** + * returns the local directory (e.g. ~/.Phoenicis/engines/wine/upstream-linux-x86/3.0) + * @param subCategory e.g. upstream-linux-x86 + * @param version e.g. 3.0 + * @return local directory + */ + String getLocalDirectory(String subCategory, String version); + + /** + * returns true if the engine is installed + * @param subCategory e.g. upstream-linux-x86 + * @param version e.g. 3.0 + * @return is engine version installed + */ + boolean isInstalled(String subCategory, String version); + + /** + * installs the given engine version + * @param subCategory e.g. upstream-linux-x86 + * @param version e.g. 3.0 + */ + void install(String subCategory, String version); + + /** + * deletes the given engine version + * @param subCategory e.g. upstream-linux-x86 + * @param version e.g. 3.0 + */ + void delete(String subCategory, String version); + + /** + * fetches the available versions + * @return content of JSON file (format like the file provided by webservice.wine.url) + */ + String getAvailableVersions(); + + /** + * returns the current working container (i.e. name of container directory without full path) + * @return working container + */ + String getWorkingContainer(); + + /** + * sets the working container (i.e. name of container directory without full path) + * @param workingContainer working container + */ + void setWorkingContainer(String workingContainer); + + /** + * returns path of a container + * @param containerName name of the container + * @return path of container + */ + String getContainerDirectory(String containerName); + + /** + * creates a container + * @param subCategory e.g. upstream-linux-x86 + * @param version e.g. 3.0 + * @param containerName name of the container + */ + void createContainer(String subCategory, String version, String containerName); + + /** + * runs an executable with this engine + * @param executable executable + * @param args program arguments + * @param workingDir working directory + * @param captureOutput true if output shall be captured + * @param wait wait until run finished + * @param userData engine specific data + * @return output + */ + String run(String executable, String[] args, String workingDir, boolean captureOutput, boolean wait, + Map userData); + + /** + * returns the setup wizard + * @return setup wizard + */ + SetupWizard getWizard(); + + /** + * sets the setup wizard + * @param wizard setup wizard + */ + void setWizard(SetupWizard wizard); +} diff --git a/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesConfiguration.java b/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesConfiguration.java index a4ab805019f..df3ec2a10cb 100644 --- a/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesConfiguration.java +++ b/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesConfiguration.java @@ -33,8 +33,9 @@ public class EnginesConfiguration { private PhoenicisGlobalConfiguration phoenicisGlobalConfiguration; @Bean - public EnginesSource enginesSource() { - return new EnginesSource(scriptsConfiguration.scriptInterpreter(), phoenicisGlobalConfiguration.objectMapper()); + public EnginesManager enginesSource() { + return new EnginesManager(scriptsConfiguration.scriptInterpreter(), + phoenicisGlobalConfiguration.objectMapper()); } @Bean diff --git a/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesManager.java b/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesManager.java new file mode 100644 index 00000000000..8d0bfd10365 --- /dev/null +++ b/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesManager.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2015-2017 PÂRIS Quentin + * + * 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 2 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.phoenicis.engines; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.phoenicis.configuration.security.Safe; +import org.phoenicis.engines.dto.EngineCategoryDTO; +import org.phoenicis.engines.dto.EngineSubCategoryDTO; +import org.phoenicis.repository.dto.CategoryDTO; +import org.phoenicis.scripts.interpreter.InteractiveScriptSession; +import org.phoenicis.scripts.interpreter.ScriptInterpreter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Consumer; + +/** + * manages the several engines provided by the repository + */ +@Safe +public class EnginesManager { + private static final Logger LOGGER = LoggerFactory.getLogger(EnginesManager.class); + private final ScriptInterpreter scriptInterpreter; + private final ObjectMapper objectMapper; + + /** + * constructor + * @param scriptInterpreter to access the javascript engine implementation + * @param objectMapper to parse the available versions + */ + public EnginesManager(ScriptInterpreter scriptInterpreter, ObjectMapper objectMapper) { + this.scriptInterpreter = scriptInterpreter; + this.objectMapper = objectMapper; + } + + /** + * fetches the required engine + * @param engineId engine ID (e.g. "wine") + * @param doneCallback callback which will be executed with the fetched engine + * @param errorCallback callback which will be executed if an error occurs + */ + public void getEngine(String engineId, Consumer doneCallback, Consumer errorCallback) { + final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); + + interactiveScriptSession.eval( + "include([\"engines\", \"" + engineId + "\", \"engine\", \"implementation\"]); new Engine();", + output -> { + final Engine engine = (Engine) output; + doneCallback.accept(engine); + }, errorCallback); + } + + /** + * fetches the available versions of a certain engine + * @param engineId engine ID (e.g. "wine") + * @param callback callback which will be executed with the fetched engine versions + * @param errorCallback callback which will be executed if an error occurs + */ + public void fetchAvailableVersions(String engineId, Consumer> callback, + Consumer errorCallback) { + this.getEngine(engineId, engine -> callback.accept(unSerialize(engine.getAvailableVersions())), errorCallback); + } + + /** + * fetches all available engines from the repository + * @param categoryDTOS engine categories from the repository + * @return available engines + */ + public List getAvailableEngines(List categoryDTOS) { + List engines = new ArrayList<>(); + for (CategoryDTO categoryDTO : categoryDTOS) { + final String engineName = categoryDTO.getName(); + final EngineCategoryDTO engineCategoryDTO = new EngineCategoryDTO.Builder() + .withName(engineName) + .withDescription(engineName) + .withSubCategories(new ArrayList<>()) + .build(); + engines.add(engineCategoryDTO); + } + return engines; + } + + /** + * reads available engine versions from JSON + * @param json JSON file + * @return available engine versions + */ + private List unSerialize(Object json) { + try { + return objectMapper.readValue(json.toString(), new TypeReference>() { + // Default + }); + } catch (IOException e) { + LOGGER.debug("Unable to unserialize engine json"); + return Collections.emptyList(); + } + } + +} diff --git a/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesSource.java b/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesSource.java deleted file mode 100644 index 4039ee22cd5..00000000000 --- a/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesSource.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.engines; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.phoenicis.configuration.security.Safe; -import org.phoenicis.engines.dto.EngineCategoryDTO; -import org.phoenicis.engines.dto.EngineSubCategoryDTO; -import org.phoenicis.repository.dto.CategoryDTO; -import org.phoenicis.scripts.interpreter.InteractiveScriptSession; -import org.phoenicis.scripts.interpreter.ScriptInterpreter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -@Safe -public class EnginesSource { - private static final Logger LOGGER = LoggerFactory.getLogger(EnginesSource.class); - private final ScriptInterpreter scriptInterpreter; - private final ObjectMapper objectMapper; - - public EnginesSource(ScriptInterpreter scriptInterpreter, ObjectMapper objectMapper) { - this.scriptInterpreter = scriptInterpreter; - this.objectMapper = objectMapper; - } - - public void fetchAvailableEngines(List categoryDTOS, Consumer> callback) { - final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); - - StringBuilder includesBuilder = new StringBuilder(); - StringBuilder constructorsBuilder = new StringBuilder(); - constructorsBuilder.append("function fetchEngines() {\n"); - constructorsBuilder.append("var engines = [];\n"); - for (CategoryDTO categoryDTO : categoryDTOS) { - final String engineId = categoryDTO.getId(); - includesBuilder.append("include([\"engines\", \"" + engineId + "\", \"engine\", \"object\"]);\n"); - final String engineName = categoryDTO.getName(); - constructorsBuilder - .append("engines[\"" + engineName + "\"] = new " + engineName + "().getAvailableVersions();\n"); - } - constructorsBuilder.append("return engines;\n"); - constructorsBuilder.append("}\n"); - constructorsBuilder.append("fetchEngines();"); - interactiveScriptSession.eval(includesBuilder.toString(), - ignored -> interactiveScriptSession.eval(constructorsBuilder.toString(), - output -> { - List engines = new ArrayList<>(); - for (Map.Entry entry : ((Map) output).entrySet()) { - final EngineCategoryDTO engineCategoryDTO = new EngineCategoryDTO.Builder() - .withName(entry.getKey()) - .withDescription(entry.getKey()) - .withSubCategories(unSerialize(entry.getValue())) - .build(); - engines.add(engineCategoryDTO); - } - callback.accept(engines); - }, this::throwError), - this::throwError); - } - - private List unSerialize(Object json) { - try { - return objectMapper.readValue(json.toString(), new TypeReference>() { - // Default - }); - } catch (IOException e) { - LOGGER.debug("Unable to unserialize engine json"); - return Collections.emptyList(); - } - } - - private void throwError(Exception e) { - throw new IllegalStateException(e); - } -} diff --git a/phoenicis-engines/src/main/java/org/phoenicis/engines/dto/EngineCategoryDTO.java b/phoenicis-engines/src/main/java/org/phoenicis/engines/dto/EngineCategoryDTO.java index 3663a03fa6f..65523fea16f 100644 --- a/phoenicis-engines/src/main/java/org/phoenicis/engines/dto/EngineCategoryDTO.java +++ b/phoenicis-engines/src/main/java/org/phoenicis/engines/dto/EngineCategoryDTO.java @@ -31,14 +31,14 @@ import java.util.List; /** - * Represents a category of application + * Represents a category of engines */ @JsonDeserialize(builder = EngineCategoryDTO.Builder.class) public class EngineCategoryDTO { private final String name; private final String description; private final List subCategories; - private URI icon; + private final URI icon; private EngineCategoryDTO(Builder builder) { this.name = builder.name; diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java index 8a27530dddb..07d9435c4bb 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java @@ -93,9 +93,10 @@ public ContainersController containersController() { @Bean public EnginesController enginesController() { - return new EnginesController(viewsConfiguration.viewEngines(), repositoryConfiguration.repositoryManager(), + return new EnginesController(viewsConfiguration.viewEngines(), + repositoryConfiguration.repositoryManager(), enginesConfiguration.enginesSource(), - scriptsConfiguration.scriptInterpreter(), themeConfiguration.themeManager()); + themeConfiguration.themeManager()); } @Bean diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java index 129212540ee..d8d5534665d 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java @@ -75,7 +75,7 @@ public ContainersController(ContainersView containersView, // changing engine does not work currently // querying Wine webservice causes performance issues on systems with slow internet connection // List categoryDTOS = Collections.singletonList(new CategoryDTO.Builder().withName("Wine").build()); - // enginesSource.fetchAvailableEngines(categoryDTOS, engineCategoryDTOS -> { + // enginesSource.getAvailableEngines(categoryDTOS, engineCategoryDTOS -> { final WinePrefixContainerPanel panel = winePrefixContainerPanelFactory.createContainerPanel( (WinePrefixContainerDTO) containerDTO, /*engineCategoryDTOS.stream().flatMap(category -> category.getSubCategories().stream()) diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java index d816dad17a1..e8b1c893c46 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java @@ -19,9 +19,8 @@ package org.phoenicis.javafx.controller.engines; import javafx.application.Platform; -import jdk.nashorn.api.scripting.ScriptObjectMirror; -import org.phoenicis.engines.EnginesSource; -import org.phoenicis.engines.dto.EngineDTO; +import org.phoenicis.engines.EnginesManager; +import org.phoenicis.engines.dto.EngineSubCategoryDTO; import org.phoenicis.javafx.controller.apps.AppsController; import org.phoenicis.javafx.views.common.ConfirmMessage; import org.phoenicis.javafx.views.common.ErrorMessage; @@ -31,8 +30,6 @@ import org.phoenicis.repository.dto.CategoryDTO; import org.phoenicis.repository.dto.RepositoryDTO; import org.phoenicis.repository.dto.TypeDTO; -import org.phoenicis.scripts.interpreter.InteractiveScriptSession; -import org.phoenicis.scripts.interpreter.ScriptInterpreter; import org.slf4j.LoggerFactory; import java.io.File; @@ -40,10 +37,7 @@ import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.function.Consumer; +import java.util.*; import static org.phoenicis.configuration.localisation.Localisation.tr; @@ -51,35 +45,54 @@ public class EnginesController { private final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(AppsController.class); private final EnginesView enginesView; private final RepositoryManager repositoryManager; - private final EnginesSource enginesSource; - private final ScriptInterpreter scriptInterpreter; + private final EnginesManager enginesManager; private ThemeManager themeManager; + private Map> versionsCache = new HashMap<>(); - public EnginesController(EnginesView enginesView, RepositoryManager repositoryManager, EnginesSource enginesSource, - ScriptInterpreter scriptInterpreter, + public EnginesController(EnginesView enginesView, RepositoryManager repositoryManager, + EnginesManager enginesManager, ThemeManager themeManager) { this.enginesView = enginesView; this.repositoryManager = repositoryManager; - this.enginesSource = enginesSource; - this.scriptInterpreter = scriptInterpreter; + this.enginesManager = enginesManager; this.themeManager = themeManager; this.repositoryManager.addCallbacks(this::populateView, e -> Platform.runLater(() -> enginesView.showFailure(tr("Loading engines failed."), Optional.of(e)))); + this.enginesView.setOnSelectEngineCategory(engineCategoryDTO -> { + // TODO: better way to get engine ID + final String engineId = engineCategoryDTO.getName().toLowerCase(); + // only if not chached + if (!this.versionsCache.containsKey(engineId)) { + this.enginesManager.fetchAvailableVersions(engineId, + versions -> { + this.versionsCache.put(engineId, versions); + this.enginesView.updateVersions(engineCategoryDTO, versions); + }, + e -> Platform.runLater(() -> new ErrorMessage("Error", e, this.enginesView).show())); + } + }); + this.enginesView.setOnInstallEngine(engineDTO -> { new ConfirmMessage(tr("Install {0}", engineDTO.getVersion()), tr("Are you sure you want to install {0}?", engineDTO.getVersion())).ask(() -> { - installEngine(engineDTO, + this.enginesManager.getEngine(engineDTO.getId(), + engine -> engine.install(engineDTO.getSubCategory(), engineDTO.getVersion()), e -> Platform.runLater(() -> new ErrorMessage("Error", e, this.enginesView).show())); + // invalidate cache to show installed version correctly + this.versionsCache.remove(engineDTO.getId()); }); }); this.enginesView.setOnDeleteEngine(engineDTO -> { new ConfirmMessage(tr("Delete {0}", engineDTO.getVersion()), tr("Are you sure you want to delete {0}", engineDTO.getVersion())).ask(() -> { - deleteEngine(engineDTO, + this.enginesManager.getEngine(engineDTO.getId(), + engine -> engine.delete(engineDTO.getSubCategory(), engineDTO.getVersion()), e -> Platform.runLater(() -> new ErrorMessage("Error", e, this.enginesView).show())); + // invalidate cache to show deleted version correctly + this.versionsCache.remove(engineDTO.getId()); }); }); } @@ -97,35 +110,10 @@ private void populateView(RepositoryDTO repositoryDTO) { } } setDefaultEngineIcons(categoryDTOS); - enginesSource.fetchAvailableEngines(categoryDTOS, - versions -> Platform.runLater(() -> this.enginesView.populate(versions))); + this.enginesView.populate(this.enginesManager.getAvailableEngines(categoryDTOS)); }); } - private void installEngine(EngineDTO engineDTO, Consumer errorCallback) { - final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); - - interactiveScriptSession.eval( - "include([\"engines\", \"" + engineDTO.getId() + "\", \"engine\", \"object\"]);", - ignored -> interactiveScriptSession.eval("new Wine()", output -> { - final ScriptObjectMirror wine = (ScriptObjectMirror) output; - wine.callMember("install", engineDTO.getCategory(), engineDTO.getSubCategory(), - engineDTO.getVersion(), engineDTO.getUserData()); - }, errorCallback), errorCallback); - } - - private void deleteEngine(EngineDTO engineDTO, Consumer errorCallback) { - final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); - - interactiveScriptSession.eval( - "include([\"engines\", \"" + engineDTO.getId() + "\", \"engine\", \"object\"]);", - ignored -> interactiveScriptSession.eval("new Wine()", output -> { - final ScriptObjectMirror wine = (ScriptObjectMirror) output; - wine.callMember("delete", engineDTO.getCategory(), engineDTO.getSubCategory(), - engineDTO.getVersion(), engineDTO.getUserData()); - }, errorCallback), errorCallback); - } - private void setDefaultEngineIcons(List categoryDTOS) { try { StringBuilder cssBuilder = new StringBuilder(); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java index 9200887d322..e1a4cfa1eb6 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java @@ -132,7 +132,7 @@ private void createShortcut(ShortcutCreationDTO shortcutCreationDTO) { private void runShortcut(ShortcutDTO shortcutDTO) { shortcutRunner.run(shortcutDTO, Collections.emptyList(), - e -> new ErrorMessage(tr("Error"), e, this.libraryView)); + e -> Platform.runLater(() -> new ErrorMessage(tr("Error"), e, this.libraryView))); } /** diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java index 2346dea3b2d..6ad836ed133 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java @@ -26,6 +26,7 @@ import javafx.scene.control.TabPane; import org.phoenicis.engines.dto.EngineCategoryDTO; import org.phoenicis.engines.dto.EngineDTO; +import org.phoenicis.engines.dto.EngineSubCategoryDTO; import org.phoenicis.engines.dto.EngineVersionDTO; import org.phoenicis.javafx.settings.JavaFxSettingsManager; import org.phoenicis.javafx.views.common.ThemeManager; @@ -42,6 +43,9 @@ import static org.phoenicis.configuration.localisation.Localisation.tr; +/** + * "Engines" tab + */ public class EnginesView extends MainWindowView { private final EnginesFilter filter; @@ -61,7 +65,15 @@ public class EnginesView extends MainWindowView { }; private Consumer setOnDeleteEngine = (engine) -> { }; + private Consumer onSelectEngineCategory = (engineCategory) -> { + }; + /** + * constructor + * @param themeManager + * @param enginesPath + * @param javaFxSettingsManager + */ public EnginesView(ThemeManager themeManager, String enginesPath, JavaFxSettingsManager javaFxSettingsManager) { super(tr("Engines"), themeManager); @@ -95,7 +107,10 @@ public EnginesView(ThemeManager themeManager, String enginesPath, JavaFxSettings this.sidebar = new EnginesSidebar(mappedListWidgets, filter, javaFxSettingsManager); - this.sidebar.setOnCategorySelection(filter::setSelectedEngineCategory); + this.sidebar.setOnCategorySelection(engineCategoryDTO -> { + this.onSelectEngineCategory.accept(engineCategoryDTO); + this.filter.setSelectedEngineCategory(engineCategoryDTO); + }); this.initFailure(); this.initWineVersions(); @@ -106,10 +121,26 @@ public EnginesView(ThemeManager themeManager, String enginesPath, JavaFxSettings this.setSidebar(this.sidebar); } + /** + * sets the consumer which shall be executed if an engine is selected + * @param engineCategory + */ + public void setOnSelectEngineCategory(Consumer engineCategory) { + this.onSelectEngineCategory = engineCategory; + } + + /** + * sets the consumer which shall be executed if an engine is installed + * @param onInstallEngine + */ public void setOnInstallEngine(Consumer onInstallEngine) { this.setOnInstallEngine = onInstallEngine; } + /** + * sets the consumer which shall be executed if an engine is deleted + * @param onDeleteEngine + */ public void setOnDeleteEngine(Consumer onDeleteEngine) { this.setOnDeleteEngine = onDeleteEngine; } @@ -125,12 +156,10 @@ private void initWineVersions() { availableEngines.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE); } - // TODO: delete this method because it doesn't do what it promises, namely showing the wine versions tab - @Deprecated - public void showWineVersions() { - setCenter(availableEngines); - } - + /** + * inits the view with the given engines + * @param engineCategoryDTOS + */ public void populate(List engineCategoryDTOS) { Platform.runLater(() -> { this.engineCategories.setAll(engineCategoryDTOS); @@ -144,6 +173,25 @@ public void populate(List engineCategoryDTOS) { }); } + /** + * updates available versions for a certain engine + * @param engineCategoryDTO engine + * @param versions available versions for the engine + */ + public void updateVersions(EngineCategoryDTO engineCategoryDTO, List versions) { + Platform.runLater(() -> { + EngineCategoryDTO newEngineCategoryDTO = new EngineCategoryDTO.Builder(engineCategoryDTO) + .withSubCategories(versions) + .build(); + this.engineCategories.remove(engineCategoryDTO); + this.engineCategories.add(newEngineCategoryDTO); + }); + } + + /** + * shows details for a given engine + * @param engineDTO + */ private void showEngineDetails(EngineDTO engineDTO) { currentEnginePanel = new EnginePanel(engineDTO); currentEnginePanel.setOnClose(this::closeDetailsView); @@ -153,10 +201,18 @@ private void showEngineDetails(EngineDTO engineDTO) { this.showDetailsView(currentEnginePanel); } + /** + * installs given engine + * @param engineDTO + */ private void installEngine(EngineDTO engineDTO) { this.setOnInstallEngine.accept(engineDTO); } + /** + * deletes given engine + * @param engineDTO + */ private void deleteEngine(EngineDTO engineDTO) { this.setOnDeleteEngine.accept(engineDTO); } From ab91b5665a93e8d1b772e3dc9898d5d882998dc0 Mon Sep 17 00:00:00 2001 From: plata Date: Sat, 5 May 2018 13:24:59 +0200 Subject: [PATCH 35/76] Use generic "container" naming (#1310) --- ...er.java => ContainerEngineController.java} | 6 +-- .../containers/ContainersConfiguration.java | 6 +-- .../containers/ContainersController.java | 40 +++++++++---------- .../javafx/views/ViewsConfiguration.java | 6 +-- ...splayTab.java => ContainerDisplayTab.java} | 14 +++---- ...sTab.java => ContainerEngineToolsTab.java} | 4 +- ...nTab.java => ContainerInformationTab.java} | 4 +- ...erInputTab.java => ContainerInputTab.java} | 4 +- ...ontainerPanel.java => ContainerPanel.java} | 32 +++++++-------- .../containers/ContainerPanelFactory.java | 8 ++-- ...erToolsTab.java => ContainerToolsTab.java} | 14 +++---- 11 files changed, 65 insertions(+), 73 deletions(-) rename phoenicis-containers/src/main/java/org/phoenicis/containers/{wine/WinePrefixContainerController.java => ContainerEngineController.java} (95%) rename phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/{WinePrefixContainerDisplayTab.java => ContainerDisplayTab.java} (94%) rename phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/{WinePrefixContainerWineToolsTab.java => ContainerEngineToolsTab.java} (94%) rename phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/{WinePrefixContainerInformationTab.java => ContainerInformationTab.java} (97%) rename phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/{WinePrefixContainerInputTab.java => ContainerInputTab.java} (95%) rename phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/{WinePrefixContainerPanel.java => ContainerPanel.java} (53%) rename phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/{WinePrefixContainerToolsTab.java => ContainerToolsTab.java} (82%) diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/WinePrefixContainerController.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainerEngineController.java similarity index 95% rename from phoenicis-containers/src/main/java/org/phoenicis/containers/wine/WinePrefixContainerController.java rename to phoenicis-containers/src/main/java/org/phoenicis/containers/ContainerEngineController.java index b5752937d8c..9750d5d5283 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/WinePrefixContainerController.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainerEngineController.java @@ -32,13 +32,13 @@ import java.util.HashMap; import java.util.function.Consumer; -public class WinePrefixContainerController { - private static final Logger LOGGER = LoggerFactory.getLogger(WinePrefixContainerController.class); +public class ContainerEngineController { + private static final Logger LOGGER = LoggerFactory.getLogger(ContainerEngineController.class); private final ScriptInterpreter scriptInterpreter; private final RegistryWriter registryWriter; private EnginesManager enginesManager; - public WinePrefixContainerController(ScriptInterpreter scriptInterpreter, + public ContainerEngineController(ScriptInterpreter scriptInterpreter, RegistryWriter registryWriter, EnginesManager enginesManager) { this.scriptInterpreter = scriptInterpreter; diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java index 490e41579c1..04ee762930f 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java @@ -19,7 +19,7 @@ package org.phoenicis.containers; import org.phoenicis.configuration.PhoenicisGlobalConfiguration; -import org.phoenicis.containers.wine.WinePrefixContainerController; +import org.phoenicis.containers.wine.ContainerEngineController; import org.phoenicis.containers.wine.configurations.*; import org.phoenicis.engines.EnginesConfiguration; import org.phoenicis.library.LibraryConfiguration; @@ -73,8 +73,8 @@ public ContainersManager backgroundContainersManager() { } @Bean - public WinePrefixContainerController winePrefixContainerController() { - return new WinePrefixContainerController(scriptsConfiguration.scriptInterpreter(), + public ContainerEngineController winePrefixContainerController() { + return new ContainerEngineController(scriptsConfiguration.scriptInterpreter(), win32Configuration.registryWriter(), enginesConfiguration.enginesSource()); } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java index d8d5534665d..762abea0db8 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java @@ -22,13 +22,13 @@ import org.phoenicis.containers.ContainersManager; import org.phoenicis.containers.dto.ContainerDTO; import org.phoenicis.containers.dto.WinePrefixContainerDTO; -import org.phoenicis.containers.wine.WinePrefixContainerController; +import org.phoenicis.containers.wine.ContainerEngineController; import org.phoenicis.engines.EngineToolsManager; import org.phoenicis.javafx.views.common.ConfirmMessage; import org.phoenicis.javafx.views.common.ErrorMessage; import org.phoenicis.javafx.views.mainwindow.containers.ContainerPanelFactory; import org.phoenicis.javafx.views.mainwindow.containers.ContainersView; -import org.phoenicis.javafx.views.mainwindow.containers.WinePrefixContainerPanel; +import org.phoenicis.javafx.views.mainwindow.containers.ContainerPanel; import org.phoenicis.repository.RepositoryManager; import org.phoenicis.repository.dto.ApplicationDTO; import org.phoenicis.repository.dto.RepositoryDTO; @@ -42,26 +42,22 @@ public class ContainersController { private final ContainersView containersView; private final ContainersManager containersManager; - private final ContainerPanelFactory winePrefixContainerPanelFactory; - private final RepositoryManager repositoryManager; private final EngineToolsManager engineToolsManager; private Map engineTools; // engine tools per engine public ContainersController(ContainersView containersView, ContainersManager containersManager, - ContainerPanelFactory winePrefixContainerPanelFactory, - WinePrefixContainerController winePrefixContainerController, + ContainerPanelFactory winePrefixContainerPanelFactory, + ContainerEngineController containerEngineController, RepositoryManager repositoryManager, EngineToolsManager engineToolsManager) { this.containersView = containersView; this.containersManager = containersManager; - this.winePrefixContainerPanelFactory = winePrefixContainerPanelFactory; - this.repositoryManager = repositoryManager; this.engineToolsManager = engineToolsManager; this.engineTools = new HashMap<>(); - this.repositoryManager.addCallbacks(this::updateEngineTools, + repositoryManager.addCallbacks(this::updateEngineTools, e -> Platform.runLater(() -> new ErrorMessage(tr("Loading engines failed."), e, this.containersView))); containersView.setOnSelectionChanged(event -> { @@ -76,25 +72,25 @@ public ContainersController(ContainersView containersView, // querying Wine webservice causes performance issues on systems with slow internet connection // List categoryDTOS = Collections.singletonList(new CategoryDTO.Builder().withName("Wine").build()); // enginesSource.getAvailableEngines(categoryDTOS, engineCategoryDTOS -> { - final WinePrefixContainerPanel panel = winePrefixContainerPanelFactory.createContainerPanel( + final ContainerPanel panel = winePrefixContainerPanelFactory.createContainerPanel( (WinePrefixContainerDTO) containerDTO, /*engineCategoryDTOS.stream().flatMap(category -> category.getSubCategories().stream()) .flatMap(subCategory -> subCategory.getPackages().stream()) .collect(Collectors.toList()),*/ engineToolsManager, Optional.ofNullable(engineTools.get("wine")), - winePrefixContainerController); - - panel.setOnDeletePrefix(winePrefixDTO -> { - new ConfirmMessage(tr("Delete {0} container", winePrefixDTO.getName()), - tr("Are you sure you want to delete the {0} container?", winePrefixDTO.getName())) - .ask(() -> { - containersManager.deleteContainer(winePrefixDTO, - e -> Platform.runLater( - () -> new ErrorMessage("Error", e, this.containersView).show())); - loadContainers(); - }); - }); + containerEngineController); + + panel.setOnDeletePrefix( + winePrefixDTO -> new ConfirmMessage(tr("Delete {0} container", winePrefixDTO.getName()), + tr("Are you sure you want to delete the {0} container?", winePrefixDTO.getName())) + .ask(() -> { + containersManager.deleteContainer(winePrefixDTO, + e -> Platform.runLater( + () -> new ErrorMessage("Error", e, this.containersView) + .show())); + loadContainers(); + })); panel.setOnClose(containersView::closeDetailsView); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java index d7d104d7d60..2b638757512 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java @@ -25,7 +25,7 @@ import org.phoenicis.javafx.views.mainwindow.console.ConsoleTabFactory; import org.phoenicis.javafx.views.mainwindow.containers.ContainerPanelFactory; import org.phoenicis.javafx.views.mainwindow.containers.ContainersView; -import org.phoenicis.javafx.views.mainwindow.containers.WinePrefixContainerPanel; +import org.phoenicis.javafx.views.mainwindow.containers.ContainerPanel; import org.phoenicis.javafx.views.mainwindow.engines.EnginesView; import org.phoenicis.javafx.views.mainwindow.installations.InstallationsView; import org.phoenicis.javafx.views.mainwindow.library.LibraryView; @@ -123,7 +123,7 @@ public ConsoleTabFactory consoleTabFactory() { } @Bean - public ContainerPanelFactory winePrefixContainerPanelFactory() { - return new ContainerPanelFactory<>(WinePrefixContainerPanel.class, WinePrefixContainerDTO.class); + public ContainerPanelFactory winePrefixContainerPanelFactory() { + return new ContainerPanelFactory<>(ContainerPanel.class, WinePrefixContainerDTO.class); } } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java similarity index 94% rename from phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java rename to phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java index 6f36fd9f4bc..2406140bbd4 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java @@ -13,7 +13,7 @@ import javafx.scene.layout.VBox; import javafx.scene.text.Text; import org.phoenicis.containers.dto.WinePrefixContainerDTO; -import org.phoenicis.containers.wine.WinePrefixContainerController; +import org.phoenicis.containers.wine.ContainerEngineController; import org.phoenicis.containers.wine.parameters.*; import org.phoenicis.javafx.views.common.ErrorMessage; import org.phoenicis.javafx.views.common.TextWithStyle; @@ -28,22 +28,22 @@ /** * Created by marc on 27.05.17. */ -public class WinePrefixContainerDisplayTab extends Tab { +public class ContainerDisplayTab extends Tab { private static final String CAPTION_TITLE_CSS_CLASS = "captionTitle"; private static final String CONFIGURATION_PANE_CSS_CLASS = "containerConfigurationPane"; private static final String TITLE_CSS_CLASS = "title"; private final WinePrefixContainerDTO container; - private final WinePrefixContainerController winePrefixContainerController; + private final ContainerEngineController containerEngineController; private final List lockableElements = new ArrayList<>(); - public WinePrefixContainerDisplayTab(WinePrefixContainerDTO container, - WinePrefixContainerController winePrefixContainerController) { + public ContainerDisplayTab(WinePrefixContainerDTO container, + ContainerEngineController containerEngineController) { super(tr("Display")); this.container = container; - this.winePrefixContainerController = winePrefixContainerController; + this.containerEngineController = containerEngineController; this.setClosable(false); @@ -145,7 +145,7 @@ private void populate() { private void changeSettings(RegistryParameter newValue) { this.lockAll(); - winePrefixContainerController.changeSetting(container, newValue, this::unlockAll, + containerEngineController.changeSetting(container, newValue, this::unlockAll, e -> Platform.runLater(() -> new ErrorMessage(tr("Error"), e).show())); } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerWineToolsTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java similarity index 94% rename from phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerWineToolsTab.java rename to phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java index 4d5d638f89b..983d02c7684 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerWineToolsTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java @@ -22,7 +22,7 @@ /** * Created by marc on 27.05.17. */ -public class WinePrefixContainerWineToolsTab extends Tab { +public class ContainerEngineToolsTab extends Tab { private static final String CONFIGURATION_PANE_CSS_CLASS = "containerConfigurationPane"; private static final String TITLE_CSS_CLASS = "title"; @@ -31,7 +31,7 @@ public class WinePrefixContainerWineToolsTab extends Tab { private final List lockableElements = new ArrayList<>(); - public WinePrefixContainerWineToolsTab(WinePrefixContainerDTO container, EngineToolsManager engineToolsManager, + public ContainerEngineToolsTab(WinePrefixContainerDTO container, EngineToolsManager engineToolsManager, ApplicationDTO engineTools) { super(tr("Wine tools")); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java similarity index 97% rename from phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java rename to phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java index e5f7565c191..20e8b222794 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java @@ -19,7 +19,7 @@ /** * Created by marc on 27.05.17. */ -public class WinePrefixContainerInformationTab extends Tab { +public class ContainerInformationTab extends Tab { private static final String CAPTION_TITLE_CSS_CLASS = "captionTitle"; private static final String CONFIGURATION_PANE_CSS_CLASS = "containerConfigurationPane"; private static final String TITLE_CSS_CLASS = "title"; @@ -28,7 +28,7 @@ public class WinePrefixContainerInformationTab extends Tab { private Consumer onDeletePrefix; - public WinePrefixContainerInformationTab(WinePrefixContainerDTO container) { + public ContainerInformationTab(WinePrefixContainerDTO container) { super(tr("Information")); this.container = container; diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java similarity index 95% rename from phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java rename to phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java index ce092ee44a7..92a7e9a5661 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java @@ -22,7 +22,7 @@ /** * Created by marc on 27.05.17. */ -public class WinePrefixContainerInputTab extends Tab { +public class ContainerInputTab extends Tab { private static final String CAPTION_TITLE_CSS_CLASS = "captionTitle"; private static final String CONFIGURATION_PANE_CSS_CLASS = "containerConfigurationPane"; private static final String TITLE_CSS_CLASS = "title"; @@ -31,7 +31,7 @@ public class WinePrefixContainerInputTab extends Tab { private final List lockableElements = new ArrayList<>(); - public WinePrefixContainerInputTab(WinePrefixContainerDTO container) { + public ContainerInputTab(WinePrefixContainerDTO container) { super(tr("Input")); this.container = container; diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerPanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanel.java similarity index 53% rename from phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerPanel.java rename to phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanel.java index 37059a04076..43443176914 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerPanel.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanel.java @@ -19,39 +19,35 @@ package org.phoenicis.javafx.views.mainwindow.containers; import org.phoenicis.containers.dto.WinePrefixContainerDTO; -import org.phoenicis.containers.wine.WinePrefixContainerController; +import org.phoenicis.containers.wine.ContainerEngineController; import org.phoenicis.engines.EngineToolsManager; import org.phoenicis.repository.dto.ApplicationDTO; import java.util.Optional; import java.util.function.Consumer; -public class WinePrefixContainerPanel extends AbstractContainerPanel { - private WinePrefixContainerInformationTab informationTab; - private WinePrefixContainerDisplayTab displayTab; - private WinePrefixContainerInputTab inputTab; - private WinePrefixContainerWineToolsTab wineToolsTab; - private WinePrefixContainerToolsTab toolsTab; +public class ContainerPanel extends AbstractContainerPanel { + private ContainerInformationTab informationTab; - public WinePrefixContainerPanel(WinePrefixContainerDTO containerEntity, + public ContainerPanel(WinePrefixContainerDTO containerEntity, EngineToolsManager engineToolsManager, Optional engineTools, - WinePrefixContainerController winePrefixContainerController) { + ContainerEngineController containerEngineController) { super(containerEntity); - this.informationTab = new WinePrefixContainerInformationTab(containerEntity); + this.informationTab = new ContainerInformationTab(containerEntity); this.tabPane.getTabs().add(this.informationTab); - this.displayTab = new WinePrefixContainerDisplayTab(containerEntity, winePrefixContainerController); - this.tabPane.getTabs().add(this.displayTab); - this.inputTab = new WinePrefixContainerInputTab(containerEntity); - this.tabPane.getTabs().add(this.inputTab); + ContainerDisplayTab displayTab = new ContainerDisplayTab(containerEntity, containerEngineController); + this.tabPane.getTabs().add(displayTab); + ContainerInputTab inputTab = new ContainerInputTab(containerEntity); + this.tabPane.getTabs().add(inputTab); if (engineTools.isPresent()) { - this.wineToolsTab = new WinePrefixContainerWineToolsTab(containerEntity, engineToolsManager, + ContainerEngineToolsTab wineToolsTab = new ContainerEngineToolsTab(containerEntity, engineToolsManager, engineTools.get()); - this.tabPane.getTabs().add(this.wineToolsTab); + this.tabPane.getTabs().add(wineToolsTab); } - this.toolsTab = new WinePrefixContainerToolsTab(containerEntity, winePrefixContainerController); - this.tabPane.getTabs().add(this.toolsTab); + ContainerToolsTab toolsTab = new ContainerToolsTab(containerEntity, containerEngineController); + this.tabPane.getTabs().add(toolsTab); } public void setOnDeletePrefix(Consumer onDeletePrefix) { diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanelFactory.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanelFactory.java index 4ce8c439cb6..1b38eaf7c2a 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanelFactory.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanelFactory.java @@ -19,7 +19,7 @@ package org.phoenicis.javafx.views.mainwindow.containers; import org.phoenicis.containers.dto.ContainerDTO; -import org.phoenicis.containers.wine.WinePrefixContainerController; +import org.phoenicis.containers.wine.ContainerEngineController; import org.phoenicis.engines.EngineToolsManager; import org.phoenicis.repository.dto.ApplicationDTO; @@ -38,13 +38,13 @@ public ContainerPanelFactory(Class viewClazz, Class entityClazz) { public T createContainerPanel(C containerDTO, EngineToolsManager engineToolsManager, Optional engineTools, - WinePrefixContainerController winePrefixContainerController) { + ContainerEngineController containerEngineController) { try { return this.clazz .getConstructor(entityClazz, EngineToolsManager.class, Optional.class, - WinePrefixContainerController.class) + ContainerEngineController.class) .newInstance(containerDTO, engineToolsManager, engineTools, - winePrefixContainerController); + containerEngineController); } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { throw new IllegalStateException(e); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java similarity index 82% rename from phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java rename to phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java index c43cf21d6e0..4c684bef3e7 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java @@ -9,7 +9,7 @@ import javafx.scene.text.Text; import javafx.stage.FileChooser; import org.phoenicis.containers.dto.WinePrefixContainerDTO; -import org.phoenicis.containers.wine.WinePrefixContainerController; +import org.phoenicis.containers.wine.ContainerEngineController; import org.phoenicis.javafx.views.common.ErrorMessage; import org.phoenicis.javafx.views.common.TextWithStyle; @@ -22,21 +22,21 @@ /** * Created by marc on 27.05.17. */ -public class WinePrefixContainerToolsTab extends Tab { +public class ContainerToolsTab extends Tab { private static final String CONFIGURATION_PANE_CSS_CLASS = "containerConfigurationPane"; private static final String TITLE_CSS_CLASS = "title"; private final WinePrefixContainerDTO container; - private final WinePrefixContainerController winePrefixContainerController; + private final ContainerEngineController containerEngineController; private final List lockableElements = new ArrayList<>(); - public WinePrefixContainerToolsTab(WinePrefixContainerDTO container, - WinePrefixContainerController winePrefixContainerController) { + public ContainerToolsTab(WinePrefixContainerDTO container, + ContainerEngineController containerEngineController) { super(tr("Tools")); this.container = container; - this.winePrefixContainerController = winePrefixContainerController; + this.containerEngineController = containerEngineController; this.setClosable(false); @@ -62,7 +62,7 @@ private void populate() { fileChooser.setTitle(tr("Choose executable")); File file = fileChooser.showOpenDialog(this.getContent().getScene().getWindow()); if (file != null) { - winePrefixContainerController.runInContainer(container, file.getAbsolutePath(), this::unlockAll, + containerEngineController.runInContainer(container, file.getAbsolutePath(), this::unlockAll, e -> Platform.runLater(() -> new ErrorMessage("Error", e).show())); } }); From 60a8bd59ee8b19b582b856b751345f15c7147886 Mon Sep 17 00:00:00 2001 From: plata Date: Mon, 7 May 2018 18:45:45 +0200 Subject: [PATCH 36/76] Set owner for ConfirmMessage (#1314) --- .../containers/ContainersController.java | 3 +- .../controller/engines/EnginesController.java | 34 +++++++++++-------- .../controller/library/LibraryController.java | 3 +- .../javafx/views/common/ConfirmMessage.java | 8 +++-- .../scriptui/UiQuestionFactoryJavaFX.java | 2 +- 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java index 762abea0db8..98a782d8ce5 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java @@ -83,7 +83,8 @@ public ContainersController(ContainersView containersView, panel.setOnDeletePrefix( winePrefixDTO -> new ConfirmMessage(tr("Delete {0} container", winePrefixDTO.getName()), - tr("Are you sure you want to delete the {0} container?", winePrefixDTO.getName())) + tr("Are you sure you want to delete the {0} container?", winePrefixDTO.getName()), + this.containersView.getContent().getScene().getWindow()) .ask(() -> { containersManager.deleteContainer(winePrefixDTO, e -> Platform.runLater( diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java index e8b1c893c46..224ec4f2eb0 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java @@ -76,24 +76,30 @@ public EnginesController(EnginesView enginesView, RepositoryManager repositoryMa this.enginesView.setOnInstallEngine(engineDTO -> { new ConfirmMessage(tr("Install {0}", engineDTO.getVersion()), - tr("Are you sure you want to install {0}?", engineDTO.getVersion())).ask(() -> { - this.enginesManager.getEngine(engineDTO.getId(), - engine -> engine.install(engineDTO.getSubCategory(), engineDTO.getVersion()), - e -> Platform.runLater(() -> new ErrorMessage("Error", e, this.enginesView).show())); - // invalidate cache to show installed version correctly - this.versionsCache.remove(engineDTO.getId()); - }); + tr("Are you sure you want to install {0}?", engineDTO.getVersion()), + this.enginesView.getContent().getScene().getWindow()) + .ask(() -> { + this.enginesManager.getEngine(engineDTO.getId(), + engine -> engine.install(engineDTO.getSubCategory(), engineDTO.getVersion()), + e -> Platform + .runLater(() -> new ErrorMessage("Error", e, this.enginesView).show())); + // invalidate cache to show installed version correctly + this.versionsCache.remove(engineDTO.getId()); + }); }); this.enginesView.setOnDeleteEngine(engineDTO -> { new ConfirmMessage(tr("Delete {0}", engineDTO.getVersion()), - tr("Are you sure you want to delete {0}", engineDTO.getVersion())).ask(() -> { - this.enginesManager.getEngine(engineDTO.getId(), - engine -> engine.delete(engineDTO.getSubCategory(), engineDTO.getVersion()), - e -> Platform.runLater(() -> new ErrorMessage("Error", e, this.enginesView).show())); - // invalidate cache to show deleted version correctly - this.versionsCache.remove(engineDTO.getId()); - }); + tr("Are you sure you want to delete {0}", engineDTO.getVersion()), + this.enginesView.getContent().getScene().getWindow()) + .ask(() -> { + this.enginesManager.getEngine(engineDTO.getId(), + engine -> engine.delete(engineDTO.getSubCategory(), engineDTO.getVersion()), + e -> Platform + .runLater(() -> new ErrorMessage("Error", e, this.enginesView).show())); + // invalidate cache to show deleted version correctly + this.versionsCache.remove(engineDTO.getId()); + }); }); } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java index e1a4cfa1eb6..7df81ddce67 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java @@ -77,7 +77,8 @@ public LibraryController(LibraryView libraryView, ConsoleController consoleContr this.libraryView.setOnShortcutUninstall(shortcutDTO -> { final String shortcutName = shortcutDTO.getInfo().getName(); new ConfirmMessage(tr("Uninstall {0}", shortcutName), - tr("Are you sure you want to uninstall {0}?", shortcutName)) + tr("Are you sure you want to uninstall {0}?", shortcutName), + this.libraryView.getContent().getScene().getWindow()) .ask(() -> shortcutManager.uninstallFromShortcut(shortcutDTO, e -> new ErrorMessage("Error while uninstalling " + shortcutName, e, this.libraryView))); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/ConfirmMessage.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/ConfirmMessage.java index 7100cef8ae8..78d1b97e9e0 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/ConfirmMessage.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/ConfirmMessage.java @@ -22,6 +22,7 @@ import javafx.scene.control.ButtonType; import javafx.scene.control.Label; import javafx.scene.layout.Region; +import javafx.stage.Window; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,13 +32,16 @@ public class ConfirmMessage { private final Logger LOGGER = LoggerFactory.getLogger(ConfirmMessage.class); private final Alert alert; - public ConfirmMessage(String title, String message) { + public ConfirmMessage(String title, String message, Window owner) { LOGGER.info("Ask for confirmation", message); alert = new Alert(Alert.AlertType.CONFIRMATION); + alert.initOwner(owner); alert.setTitle(title); alert.setHeaderText(title); alert.setContentText(message); - alert.getDialogPane().getChildren().stream().filter(node -> node instanceof Label) + alert.getDialogPane().getChildren() + .stream() + .filter(node -> node instanceof Label) .forEach(node -> ((Label) node).setMinHeight(Region.USE_PREF_SIZE)); } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/UiQuestionFactoryJavaFX.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/UiQuestionFactoryJavaFX.java index 196be0f1485..e1d760e5313 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/UiQuestionFactoryJavaFX.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/UiQuestionFactoryJavaFX.java @@ -34,6 +34,6 @@ public UiQuestionFactoryJavaFX(String title) { @Override public void create(String questionText, Runnable yesCallback, Runnable noCallback) { - Platform.runLater(() -> new ConfirmMessage(this.wizardTitle, questionText).ask(yesCallback, noCallback)); + Platform.runLater(() -> new ConfirmMessage(this.wizardTitle, questionText, null).ask(yesCallback, noCallback)); } } From 063bb78296d064f4de24d19578f909826db48e48 Mon Sep 17 00:00:00 2001 From: plata Date: Mon, 7 May 2018 18:46:31 +0200 Subject: [PATCH 37/76] Delete .pot timestamp (#1313) --- i18n/keys.pot | 194 ++++++++++++++++++++++++++------------------------ pom.xml | 22 ++++++ 2 files changed, 121 insertions(+), 95 deletions(-) diff --git a/i18n/keys.pot b/i18n/keys.pot index ea0ad37af0a..ac423f4c7b2 100644 --- a/i18n/keys.pot +++ b/i18n/keys.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-16 10:04+0100\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -57,53 +57,53 @@ msgstr "" msgid "Force" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:78 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:136 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:75 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:135 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/ErrorMessage.java:71 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:149 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:149 msgid "Error" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:82 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:79 #, java-format msgid "Uninstall {0}" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:83 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:80 #, java-format msgid "Are you sure you want to uninstall {0}?" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:98 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:95 msgid "Error while running script" msgstr "" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:129 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:130 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:131 msgid "Error while creating shortcut" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:68 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:72 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:61 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:61 msgid "Loading engines failed." msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:71 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:78 #, java-format msgid "Install {0}" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:72 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:79 #, java-format msgid "Are you sure you want to install {0}?" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:79 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:89 #, java-format msgid "Delete {0}" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:80 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:90 #, java-format msgid "Are you sure you want to delete {0}" msgstr "" @@ -114,21 +114,21 @@ msgid "" "Please check your connection and try again." msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/apps/AppsController.java:94 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/apps/AppsController.java:96 msgid "The script ended unexpectedly" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:97 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:85 #, java-format msgid "Delete {0} container" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:98 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:86 #, java-format msgid "Are you sure you want to delete the {0} container?" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:121 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:109 msgid "Loading containers failed." msgstr "" @@ -157,6 +157,10 @@ msgstr "" msgid "Unity theme" msgstr "" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/themes/Themes.java:19 +msgid "Mint-X theme" +msgstr "" + #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/AbstractStepRepresentation.java:104 msgid "Cancel" msgstr "" @@ -165,7 +169,7 @@ msgstr "" msgid "Next" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/JavaFxUiConfiguration.java:63 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/JavaFxUiConfiguration.java:62 msgid "Question" msgstr "" @@ -201,77 +205,77 @@ msgstr "" msgid "Uninstall" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:79 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:78 msgid "Library" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:153 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:151 msgid "My applications" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:71 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:68 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java:69 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:55 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:51 msgid "Name:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:79 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:76 msgid "Please specify a name!" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:82 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:79 msgid "Category:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:90 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:87 msgid "Please specify a category!" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:93 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:90 msgid "Description:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:102 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:99 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java:105 msgid "Miniature:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:109 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:132 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:106 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:129 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java:112 msgid "Choose" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:112 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:109 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java:115 msgid "Images" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:122 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:119 msgid "Please specify a valid miniature!" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:125 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:122 msgid "Executable:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:144 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:141 msgid "Please specify a valid executable!" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:149 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:146 msgid "Create" msgstr "" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibrarySidebar.java:136 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/installations/InstallationsSidebar.java:112 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:126 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:122 msgid "Categories" msgstr "" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibrarySidebar.java:162 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/installations/InstallationsSidebar.java:138 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:172 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:168 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:142 msgid "All" msgstr "" @@ -352,7 +356,7 @@ msgstr "" msgid "Choose the repository type" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/addrepository/AddRepositoryDialog.java:59 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/addrepository/AddRepositoryDialog.java:42 msgid "Add a new Repository" msgstr "" @@ -465,7 +469,7 @@ msgstr "" msgid "Error while trying to delete the engine" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java:66 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java:78 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:120 msgid "Engines" msgstr "" @@ -486,7 +490,7 @@ msgstr "" msgid "Installations" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsView.java:86 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsView.java:83 msgid "Apps" msgstr "" @@ -503,19 +507,19 @@ msgstr "" msgid "Error while trying to download the installer" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:133 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:129 msgid "Testing" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:136 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:132 msgid "Requires patch" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:139 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:135 msgid "Commercial" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:143 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:139 msgid "All Operating Systems" msgstr "" @@ -524,103 +528,103 @@ msgstr "" msgid "Containers" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java:35 -msgid "Input" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:43 +msgid "Display" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java:46 -msgid "Input settings" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:55 +msgid "Display settings" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java:57 -msgid "Mouse Warp Override" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:68 +msgid "GLSL support" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:35 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:47 -msgid "Information" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:77 +msgid "Direct Draw Renderer" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:60 -msgid "Path:" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:86 +msgid "Video memory size" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:65 -msgid "Installed shortcuts:" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:95 +msgid "Offscreen rendering mode" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:71 -msgid "Wine version:" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:104 +msgid "Render target lock mode" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:76 -msgid "Wine architecture:" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:113 +msgid "Multisampling" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:81 -msgid "Wine distribution:" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:122 +msgid "Strict Draw Ordering" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:109 -msgid "Delete container" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:131 +msgid "Always Offscreen" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerWineToolsTab.java:39 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerWineToolsTab.java:52 -msgid "Wine tools" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java:35 +msgid "Input" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:40 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:53 -msgid "Tools" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java:46 +msgid "Input settings" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:62 -msgid "Run executable" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java:57 +msgid "Mouse Warp Override" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:67 -msgid "Choose executable" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:32 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:43 +msgid "Information" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:43 -msgid "Display" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:56 +msgid "Path:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:55 -msgid "Display settings" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:61 +msgid "Installed shortcuts:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:68 -msgid "GLSL support" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:67 +msgid "Wine version:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:77 -msgid "Direct Draw Renderer" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:72 +msgid "Wine architecture:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:86 -msgid "Video memory size" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:77 +msgid "Wine distribution:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:95 -msgid "Offscreen rendering mode" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:105 +msgid "Delete container" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:104 -msgid "Render target lock mode" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:36 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:48 +msgid "Tools" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:113 -msgid "Multisampling" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:57 +msgid "Run executable" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:122 -msgid "Strict Draw Ordering" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:62 +msgid "Choose executable" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:131 -msgid "Always Offscreen" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:36 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:48 +msgid "Wine tools" msgstr "" #: phoenicis-scripts/src/main/java/org/phoenicis/scripts/wizard/UiSetupWizardImplementation.java:151 diff --git a/pom.xml b/pom.xml index e8eb2601d95..9b4406f46a5 100644 --- a/pom.xml +++ b/pom.xml @@ -208,6 +208,28 @@ + + com.google.code.maven-replacer-plugin + replacer + 1.5.3 + + + package + + replace + + + + + i18n/keys.pot + + + "POT-Creation-Date: \d{4}-\d{2}-\d{2} \d{2}:\d{2}\+\d{4}\\n" + "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n" + + + + From 5af10a45b2c53606d5e4ab66c168bfd8b3dba135 Mon Sep 17 00:00:00 2001 From: plata Date: Mon, 7 May 2018 18:46:45 +0200 Subject: [PATCH 38/76] Do not update .po's during build (#1312) update only .pot, Crowdin will update the .po's --- phoenicis-configuration/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-configuration/pom.xml b/phoenicis-configuration/pom.xml index e904e561512..4ab05a30329 100644 --- a/phoenicis-configuration/pom.xml +++ b/phoenicis-configuration/pom.xml @@ -115,7 +115,7 @@ gettext compile - merge + gettext dist From bbe3b7e908043703d35ba1c2e4bea8af6ebef635 Mon Sep 17 00:00:00 2001 From: plata Date: Mon, 7 May 2018 19:14:20 +0200 Subject: [PATCH 39/76] Implement engine settings (#1311) --- i18n/keys.pot | 114 ++------- .../containers/ContainerEngineController.java | 38 +-- .../containers/ContainersConfiguration.java | 23 +- .../containers/GenericContainersManager.java | 28 --- .../dto/WinePrefixContainerDTO.java | 109 -------- ...nePrefixContainerDisplayConfiguration.java | 65 ----- ...WinePrefixContainerInputConfiguration.java | 30 --- ...nePrefixContainerDisplayConfiguration.java | 234 ------------------ ...WinePrefixContainerInputConfiguration.java | 59 ----- ...nePrefixContainerDisplayConfiguration.java | 73 ------ ...WinePrefixContainerInputConfiguration.java | 31 --- .../wine/parameters/AlwaysOffscreen.java | 58 ----- .../wine/parameters/DirectDrawRenderer.java | 58 ----- .../wine/parameters/MouseWarpOverride.java | 60 ----- .../wine/parameters/Multisampling.java | 58 ----- .../parameters/OffscreenRenderingMode.java | 58 ----- .../wine/parameters/RegistryParameter.java | 25 -- .../wine/parameters/RenderTargetModeLock.java | 60 ----- .../wine/parameters/StrictDrawOrdering.java | 58 ----- .../containers/wine/parameters/UseGLSL.java | 58 ----- .../wine/parameters/VideoMemorySize.java | 72 ------ .../AbstractRegistryParameterTest.java | 41 --- .../wine/parameters/UseGLSLTest.java | 39 --- .../org/phoenicis/engines/EngineSetting.java | 32 +++ .../engines/EngineSettingsManager.java | 114 +++++++++ .../engines/EnginesConfiguration.java | 5 + .../controller/ControllerConfiguration.java | 2 +- .../containers/ContainersController.java | 49 ++-- .../javafx/views/ViewsConfiguration.java | 8 - .../containers/ContainerDisplayTab.java | 174 ------------- .../ContainerEngineSettingsTab.java | 88 +++++++ .../containers/ContainerInputTab.java | 76 ------ .../mainwindow/containers/ContainerPanel.java | 19 +- .../containers/ContainerPanelFactory.java | 53 ---- .../containers/ContainerToolsTab.java | 2 +- phoenicis-win32/pom.xml | 6 + .../win32/registry/RegistryParser.java | 2 + 37 files changed, 316 insertions(+), 1763 deletions(-) delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/DefaultWinePrefixContainerDisplayConfiguration.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/DefaultWinePrefixContainerInputConfiguration.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/RegistryWinePrefixContainerDisplayConfiguration.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/RegistryWinePrefixContainerInputConfiguration.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/WinePrefixContainerDisplayConfiguration.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/WinePrefixContainerInputConfiguration.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/DirectDrawRenderer.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/OffscreenRenderingMode.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RegistryParameter.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RenderTargetModeLock.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java delete mode 100644 phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/VideoMemorySize.java delete mode 100644 phoenicis-containers/src/test/java/org/phoenicis/containers/wine/parameters/AbstractRegistryParameterTest.java delete mode 100644 phoenicis-containers/src/test/java/org/phoenicis/containers/wine/parameters/UseGLSLTest.java create mode 100644 phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSetting.java create mode 100644 phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSettingsManager.java delete mode 100644 phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java create mode 100644 phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineSettingsTab.java delete mode 100644 phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java delete mode 100644 phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanelFactory.java diff --git a/i18n/keys.pot b/i18n/keys.pot index ac423f4c7b2..a6eaeb3b969 100644 --- a/i18n/keys.pot +++ b/i18n/keys.pot @@ -26,41 +26,9 @@ msgstr "" msgid "Please wait while we are verifying the file ..." msgstr "" -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/DirectDrawRenderer.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RenderTargetModeLock.java:26 -msgid "Default" -msgstr "" - -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RenderTargetModeLock.java:26 -msgid "Disabled" -msgstr "" - -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java:26 -msgid "Enabled" -msgstr "" - -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:27 -msgid "Force" -msgstr "" - #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:75 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:135 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:136 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/ErrorMessage.java:71 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:149 msgid "Error" msgstr "" @@ -74,17 +42,16 @@ msgstr "" msgid "Are you sure you want to uninstall {0}?" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:95 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:96 msgid "Error while running script" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:129 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:130 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:131 msgid "Error while creating shortcut" msgstr "" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:61 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:61 msgid "Loading engines failed." msgstr "" @@ -98,12 +65,12 @@ msgstr "" msgid "Are you sure you want to install {0}?" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:89 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:92 #, java-format msgid "Delete {0}" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:90 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:93 #, java-format msgid "Are you sure you want to delete {0}" msgstr "" @@ -118,17 +85,26 @@ msgstr "" msgid "The script ended unexpectedly" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:85 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:66 +msgid "Loading engine settings failed." +msgstr "" + +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:71 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:124 +msgid "Loading engine tools failed." +msgstr "" + +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:91 #, java-format msgid "Delete {0} container" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:86 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:92 #, java-format msgid "Are you sure you want to delete the {0} container?" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:109 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:116 msgid "Loading containers failed." msgstr "" @@ -523,63 +499,15 @@ msgstr "" msgid "All Operating Systems" msgstr "" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineSettingsTab.java:35 +msgid "Engine Settings" +msgstr "" + #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersView.java:72 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:116 msgid "Containers" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:43 -msgid "Display" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:55 -msgid "Display settings" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:68 -msgid "GLSL support" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:77 -msgid "Direct Draw Renderer" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:86 -msgid "Video memory size" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:95 -msgid "Offscreen rendering mode" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:104 -msgid "Render target lock mode" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:113 -msgid "Multisampling" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:122 -msgid "Strict Draw Ordering" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java:131 -msgid "Always Offscreen" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java:35 -msgid "Input" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java:46 -msgid "Input settings" -msgstr "" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java:57 -msgid "Mouse Warp Override" -msgstr "" - #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:32 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:43 msgid "Information" diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainerEngineController.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainerEngineController.java index 9750d5d5283..460097ba538 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainerEngineController.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainerEngineController.java @@ -16,55 +16,21 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -package org.phoenicis.containers.wine; +package org.phoenicis.containers; -import jdk.nashorn.api.scripting.ScriptObjectMirror; import org.phoenicis.containers.dto.ContainerDTO; -import org.phoenicis.containers.dto.WinePrefixContainerDTO; -import org.phoenicis.containers.wine.parameters.RegistryParameter; import org.phoenicis.engines.EnginesManager; -import org.phoenicis.scripts.interpreter.InteractiveScriptSession; -import org.phoenicis.scripts.interpreter.ScriptInterpreter; -import org.phoenicis.win32.registry.RegistryWriter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.function.Consumer; public class ContainerEngineController { - private static final Logger LOGGER = LoggerFactory.getLogger(ContainerEngineController.class); - private final ScriptInterpreter scriptInterpreter; - private final RegistryWriter registryWriter; private EnginesManager enginesManager; - public ContainerEngineController(ScriptInterpreter scriptInterpreter, - RegistryWriter registryWriter, - EnginesManager enginesManager) { - this.scriptInterpreter = scriptInterpreter; - this.registryWriter = registryWriter; + public ContainerEngineController(EnginesManager enginesManager) { this.enginesManager = enginesManager; } - public void changeSetting(WinePrefixContainerDTO winePrefix, RegistryParameter setting, Runnable doneCallback, - Consumer errorCallback) { - final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); - final String registryPatch = registryWriter.generateRegFileContent(setting.toRegistryPatch()); - - LOGGER.info("Updating registry for prefix: " + winePrefix.getPath()); - LOGGER.info(registryPatch); - - interactiveScriptSession.eval("include([\"engines\", \"wine\", \"engine\", \"object\"]);", - ignored -> interactiveScriptSession.eval("new Wine()", output -> { - final ScriptObjectMirror wine = (ScriptObjectMirror) output; - wine.callMember("prefix", winePrefix.getName()); - final ScriptObjectMirror regedit = (ScriptObjectMirror) wine.callMember("regedit"); - regedit.callMember("patch", registryPatch); - wine.callMember("wait"); - doneCallback.run(); - }, errorCallback), errorCallback); - } - public void runInContainer(ContainerDTO container, String command, Runnable doneCallback, Consumer errorCallback) { // TODO: better way to get engine ID diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java index 04ee762930f..35fae873da2 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java @@ -19,8 +19,6 @@ package org.phoenicis.containers; import org.phoenicis.configuration.PhoenicisGlobalConfiguration; -import org.phoenicis.containers.wine.ContainerEngineController; -import org.phoenicis.containers.wine.configurations.*; import org.phoenicis.engines.EnginesConfiguration; import org.phoenicis.library.LibraryConfiguration; import org.phoenicis.multithreading.MultithreadingConfiguration; @@ -45,9 +43,6 @@ public class ContainersConfiguration { @Autowired private ToolsConfiguration toolsConfiguration; - @Autowired - private Win32Configuration win32Configuration; - @Autowired private ScriptsConfiguration scriptsConfiguration; @@ -57,8 +52,6 @@ public class ContainersConfiguration { @Bean public ContainersManager containersManager() { return new GenericContainersManager(toolsConfiguration.compatibleConfigFileFormatFactory(), - winePrefixDisplayConfiguration(), - winePrefixInputConfiguration(), libraryConfiguration.libraryManager(), libraryConfiguration.shortcutManager(), toolsConfiguration.fileUtilities(), @@ -74,20 +67,6 @@ public ContainersManager backgroundContainersManager() { @Bean public ContainerEngineController winePrefixContainerController() { - return new ContainerEngineController(scriptsConfiguration.scriptInterpreter(), - win32Configuration.registryWriter(), - enginesConfiguration.enginesSource()); - } - - @Bean - WinePrefixContainerInputConfiguration winePrefixInputConfiguration() { - return new RegistryWinePrefixContainerInputConfiguration(win32Configuration.registryParser(), - new DefaultWinePrefixContainerInputConfiguration()); - } - - @Bean - WinePrefixContainerDisplayConfiguration winePrefixDisplayConfiguration() { - return new RegistryWinePrefixContainerDisplayConfiguration(win32Configuration.registryParser(), - new DefaultWinePrefixContainerDisplayConfiguration()); + return new ContainerEngineController(enginesConfiguration.enginesSource()); } } diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/GenericContainersManager.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/GenericContainersManager.java index c711a0f1155..cd4c2f7c467 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/GenericContainersManager.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/GenericContainersManager.java @@ -25,8 +25,6 @@ import org.phoenicis.containers.dto.ContainerCategoryDTO; import org.phoenicis.containers.dto.ContainerDTO; import org.phoenicis.containers.dto.WinePrefixContainerDTO; -import org.phoenicis.containers.wine.configurations.WinePrefixContainerDisplayConfiguration; -import org.phoenicis.containers.wine.configurations.WinePrefixContainerInputConfiguration; import org.phoenicis.library.LibraryManager; import org.phoenicis.library.ShortcutManager; import org.phoenicis.library.dto.ShortcutCategoryDTO; @@ -60,8 +58,6 @@ public class GenericContainersManager implements ContainersManager { private String containersPath; private final CompatibleConfigFileFormatFactory compatibleConfigFileFormatFactory; - private final WinePrefixContainerDisplayConfiguration winePrefixContainerDisplayConfiguration; - private final WinePrefixContainerInputConfiguration winePrefixContainerInputConfiguration; private final LibraryManager libraryManager; private final ShortcutManager shortcutManager; private final FileUtilities fileUtilities; @@ -71,8 +67,6 @@ public class GenericContainersManager implements ContainersManager { /** * constructor * @param compatibleConfigFileFormatFactory - * @param winePrefixContainerDisplayConfiguration - * @param winePrefixContainerInputConfiguration * @param libraryManager * @param shortcutManager * @param fileUtilities @@ -80,16 +74,12 @@ public class GenericContainersManager implements ContainersManager { * @param objectMapper */ public GenericContainersManager(CompatibleConfigFileFormatFactory compatibleConfigFileFormatFactory, - WinePrefixContainerDisplayConfiguration winePrefixContainerDisplayConfiguration, - WinePrefixContainerInputConfiguration winePrefixContainerInputConfiguration, LibraryManager libraryManager, ShortcutManager shortcutManager, FileUtilities fileUtilities, ScriptInterpreter scriptInterpreter, ObjectMapper objectMapper) { this.compatibleConfigFileFormatFactory = compatibleConfigFileFormatFactory; - this.winePrefixContainerDisplayConfiguration = winePrefixContainerDisplayConfiguration; - this.winePrefixContainerInputConfiguration = winePrefixContainerInputConfiguration; this.libraryManager = libraryManager; this.shortcutManager = shortcutManager; this.fileUtilities = fileUtilities; @@ -174,7 +164,6 @@ private List fetchContainers(File directory) { for (File containerDirectory : containerDirectories) { final ConfigFile configFile = compatibleConfigFileFormatFactory .open(new File(containerDirectory, "phoenicis.cfg")); - final File userRegistryFile = new File(containerDirectory, "user.reg"); final String containerPath = containerDirectory.getAbsolutePath(); final String containerName = containerPath.substring(containerPath.lastIndexOf('/') + 1); @@ -199,23 +188,6 @@ private List fetchContainers(File directory) { .withArchitecture(configFile.readValue("wineArchitecture", "")) .withDistribution(configFile.readValue("wineDistribution", "")) .withVersion(configFile.readValue("wineVersion", "")) - .withGlslValue(winePrefixContainerDisplayConfiguration.getGLSL(userRegistryFile)) - .withDirectDrawRenderer( - winePrefixContainerDisplayConfiguration.getDirectDrawRenderer(userRegistryFile)) - .withVideoMemorySize( - winePrefixContainerDisplayConfiguration.getVideoMemorySize(userRegistryFile)) - .withOffscreenRenderingMode( - winePrefixContainerDisplayConfiguration.getOffscreenRenderingMode(userRegistryFile)) - .withMultisampling( - winePrefixContainerDisplayConfiguration.getMultisampling(userRegistryFile)) - .withAlwaysOffscreen( - winePrefixContainerDisplayConfiguration.getAlwaysOffscreen(userRegistryFile)) - .withStrictDrawOrdering( - winePrefixContainerDisplayConfiguration.getStrictDrawOrdering(userRegistryFile)) - .withRenderTargetModeLock( - winePrefixContainerDisplayConfiguration.getRenderTargetModeLock(userRegistryFile)) - .withMouseWarpOverride( - winePrefixContainerInputConfiguration.getMouseWarpOverride(userRegistryFile)) .build()); } } diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/dto/WinePrefixContainerDTO.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/dto/WinePrefixContainerDTO.java index 759e7841ca0..7487e18b779 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/dto/WinePrefixContainerDTO.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/dto/WinePrefixContainerDTO.java @@ -18,7 +18,6 @@ package org.phoenicis.containers.dto; -import org.phoenicis.containers.wine.parameters.*; import org.phoenicis.library.dto.ShortcutDTO; import java.util.List; @@ -27,30 +26,12 @@ public class WinePrefixContainerDTO extends ContainerDTO { private final String architecture; private final String distribution; private final String version; - private final UseGLSL useGlslValue; - private final DirectDrawRenderer directDrawRenderer; - private final VideoMemorySize videoMemorySize; - private final OffscreenRenderingMode offscreenRenderingMode; - private final Multisampling multisampling; - private final AlwaysOffscreen alwaysOffscreen; - private final StrictDrawOrdering strictDrawOrdering; - private final RenderTargetModeLock renderTargetModeLock; - private final MouseWarpOverride mouseWarpOverride; private WinePrefixContainerDTO(Builder builder) { super(builder.name, builder.path, ContainerType.WINEPREFIX, "Wine", builder.installedShortcuts); this.architecture = builder.architecture; this.distribution = builder.distribution; this.version = builder.version; - this.useGlslValue = builder.useGlslValue; - this.directDrawRenderer = builder.directDrawRenderer; - this.videoMemorySize = builder.videoMemorySize; - this.offscreenRenderingMode = builder.offscreenRenderingMode; - this.multisampling = builder.multisampling; - this.alwaysOffscreen = builder.alwaysOffscreen; - this.strictDrawOrdering = builder.strictDrawOrdering; - this.renderTargetModeLock = builder.renderTargetModeLock; - this.mouseWarpOverride = builder.mouseWarpOverride; } public String getArchitecture() { @@ -65,57 +46,12 @@ public String getVersion() { return version; } - public UseGLSL getUseGlslValue() { - return useGlslValue; - } - - public DirectDrawRenderer getDirectDrawRenderer() { - return directDrawRenderer; - } - - public VideoMemorySize getVideoMemorySize() { - return videoMemorySize; - } - - public OffscreenRenderingMode getOffscreenRenderingMode() { - return offscreenRenderingMode; - } - - public Multisampling getMultisampling() { - return multisampling; - } - - public AlwaysOffscreen getAlwaysOffscreen() { - return alwaysOffscreen; - } - - public StrictDrawOrdering getStrictDrawOrdering() { - return strictDrawOrdering; - } - - public RenderTargetModeLock getRenderTargetModeLock() { - return renderTargetModeLock; - } - - public MouseWarpOverride getMouseWarpOverride() { - return mouseWarpOverride; - } - public static class Builder { private String name; private String path; private String architecture; private String distribution; private String version; - private UseGLSL useGlslValue; - private DirectDrawRenderer directDrawRenderer; - private VideoMemorySize videoMemorySize; - private OffscreenRenderingMode offscreenRenderingMode; - private Multisampling multisampling; - private AlwaysOffscreen alwaysOffscreen; - private StrictDrawOrdering strictDrawOrdering; - private RenderTargetModeLock renderTargetModeLock; - private MouseWarpOverride mouseWarpOverride; private List installedShortcuts; public Builder withName(String name) { @@ -148,51 +84,6 @@ public Builder withVersion(String version) { return this; } - public Builder withGlslValue(UseGLSL useGlslValue) { - this.useGlslValue = useGlslValue; - return this; - } - - public Builder withDirectDrawRenderer(DirectDrawRenderer directDrawRenderer) { - this.directDrawRenderer = directDrawRenderer; - return this; - } - - public Builder withVideoMemorySize(VideoMemorySize videoMemorySize) { - this.videoMemorySize = videoMemorySize; - return this; - } - - public Builder withOffscreenRenderingMode(OffscreenRenderingMode offscreenRenderingMode) { - this.offscreenRenderingMode = offscreenRenderingMode; - return this; - } - - public Builder withMultisampling(Multisampling multisampling) { - this.multisampling = multisampling; - return this; - } - - public Builder withAlwaysOffscreen(AlwaysOffscreen alwaysOffscreen) { - this.alwaysOffscreen = alwaysOffscreen; - return this; - } - - public Builder withStrictDrawOrdering(StrictDrawOrdering strictDrawOrdering) { - this.strictDrawOrdering = strictDrawOrdering; - return this; - } - - public Builder withRenderTargetModeLock(RenderTargetModeLock renderTargetModeLock) { - this.renderTargetModeLock = renderTargetModeLock; - return this; - } - - public Builder withMouseWarpOverride(MouseWarpOverride mouseWarpOverride) { - this.mouseWarpOverride = mouseWarpOverride; - return this; - } - public ContainerDTO build() { return new WinePrefixContainerDTO(this); } diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/DefaultWinePrefixContainerDisplayConfiguration.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/DefaultWinePrefixContainerDisplayConfiguration.java deleted file mode 100644 index 8613a4f788b..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/DefaultWinePrefixContainerDisplayConfiguration.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.configurations; - -import org.phoenicis.containers.wine.parameters.*; - -import java.io.File; - -public class DefaultWinePrefixContainerDisplayConfiguration implements WinePrefixContainerDisplayConfiguration { - @Override - public UseGLSL getGLSL(File registryFile) { - return UseGLSL.DEFAULT; - } - - @Override - public DirectDrawRenderer getDirectDrawRenderer(File registryFile) { - return DirectDrawRenderer.DEFAULT; - } - - @Override - public Multisampling getMultisampling(File registryFile) { - return Multisampling.DEFAULT; - } - - @Override - public OffscreenRenderingMode getOffscreenRenderingMode(File registryFile) { - return OffscreenRenderingMode.DEFAULT; - } - - @Override - public RenderTargetModeLock getRenderTargetModeLock(File registryFile) { - return RenderTargetModeLock.DEFAULT; - } - - @Override - public StrictDrawOrdering getStrictDrawOrdering(File registryFile) { - return StrictDrawOrdering.DEFAULT; - } - - @Override - public AlwaysOffscreen getAlwaysOffscreen(File registryFile) { - return AlwaysOffscreen.DEFAULT; - } - - @Override - public VideoMemorySize getVideoMemorySize(File registryFile) { - return new VideoMemorySize(true, 0); - } -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/DefaultWinePrefixContainerInputConfiguration.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/DefaultWinePrefixContainerInputConfiguration.java deleted file mode 100644 index 98f40e124de..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/DefaultWinePrefixContainerInputConfiguration.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.configurations; - -import org.phoenicis.containers.wine.parameters.MouseWarpOverride; - -import java.io.File; - -public class DefaultWinePrefixContainerInputConfiguration implements WinePrefixContainerInputConfiguration { - @Override - public MouseWarpOverride getMouseWarpOverride(File registryFile) { - return MouseWarpOverride.DEFAULT; - } -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/RegistryWinePrefixContainerDisplayConfiguration.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/RegistryWinePrefixContainerDisplayConfiguration.java deleted file mode 100644 index dffff83037f..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/RegistryWinePrefixContainerDisplayConfiguration.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.configurations; - -import org.phoenicis.containers.wine.parameters.*; -import org.phoenicis.win32.registry.AbstractRegistryNode; -import org.phoenicis.win32.registry.RegistryParser; -import org.phoenicis.win32.registry.RegistryValue; - -import java.io.File; - -public class RegistryWinePrefixContainerDisplayConfiguration implements WinePrefixContainerDisplayConfiguration { - private static final String READTEX = "readtex"; - private static final String READDRAW = "readdraw"; - private static final String PBUFFER = "pbuffer"; - private static final String BACKBUFFER = "backbuffer"; - private static final String FBO = "fbo"; - private static final String OPENGL = "opengl"; - private static final String GDI = "gdi"; - private static final String DISABLED = "disabled"; - private static final String ENABLED = "enabled"; - private static final String ALWAYS_OFFSCREEN = "AlwaysOffscreen"; - private static final String DIRECT3D = "Direct3D"; - private static final String DIRECT_DRAW_RENDERER = "DirectDrawRenderer"; - private static final String OFFSCREEN_RENDERING_MODE = "OffscreenRenderingMode"; - private static final String MULTISAMPLING = "Multisampling"; - private static final String RENDER_TARGET_MODE_LOCK = "RenderTargetModeLock"; - private static final String STRICT_DRAW_ORDERING = "StrictDrawOrdering"; - private static final String USE_GLSL = "UseGLSL"; - private static final String VIDEO_MEMORY_SIZE = "VideoMemorySize"; - private static final String WINE = "Wine"; - private static final String SOFTWARE = "Software"; - - private static final String HKEY_CURRENT_USER = "HKEY_CURRENT_USER"; - - private final RegistryParser registryParser; - private final WinePrefixContainerDisplayConfiguration defaultConfiguration; - - public RegistryWinePrefixContainerDisplayConfiguration(RegistryParser registryParser, - WinePrefixContainerDisplayConfiguration defaultConfiguration) { - this.defaultConfiguration = defaultConfiguration; - this.registryParser = registryParser; - } - - @Override - public UseGLSL getGLSL(File registryFile) { - if (!registryFile.exists()) { - return defaultConfiguration.getGLSL(registryFile); - } - - final AbstractRegistryNode registryChild = registryParser.parseFile(registryFile, HKEY_CURRENT_USER) - .getChild(SOFTWARE, WINE, DIRECT3D, USE_GLSL); - if (registryChild instanceof RegistryValue) { - switch (((RegistryValue) registryChild).getText()) { - case ENABLED: - return UseGLSL.ENABLED; - case DISABLED: - return UseGLSL.DISABLED; - default: - return UseGLSL.DEFAULT; - } - } - - return defaultConfiguration.getGLSL(registryFile); - } - - @Override - public DirectDrawRenderer getDirectDrawRenderer(File registryFile) { - if (!registryFile.exists()) { - return defaultConfiguration.getDirectDrawRenderer(registryFile); - } - - final AbstractRegistryNode registryChild = registryParser.parseFile(registryFile, HKEY_CURRENT_USER) - .getChild(SOFTWARE, WINE, DIRECT3D, DIRECT_DRAW_RENDERER); - if (registryChild instanceof RegistryValue) { - switch (((RegistryValue) registryChild).getText()) { - case GDI: - return DirectDrawRenderer.GDI; - case OPENGL: - return DirectDrawRenderer.OPENGL; - default: - return DirectDrawRenderer.DEFAULT; - } - } - return defaultConfiguration.getDirectDrawRenderer(registryFile); - } - - @Override - public Multisampling getMultisampling(File registryFile) { - if (!registryFile.exists()) { - return defaultConfiguration.getMultisampling(registryFile); - } - - final AbstractRegistryNode registryChild = registryParser.parseFile(registryFile, HKEY_CURRENT_USER) - .getChild(SOFTWARE, WINE, DIRECT3D, MULTISAMPLING); - if (registryChild instanceof RegistryValue) { - switch (((RegistryValue) registryChild).getText()) { - case ENABLED: - return Multisampling.ENABLED; - case DISABLED: - return Multisampling.DISABLED; - default: - return Multisampling.DEFAULT; - } - } - - return defaultConfiguration.getMultisampling(registryFile); - } - - @Override - public OffscreenRenderingMode getOffscreenRenderingMode(File registryFile) { - if (!registryFile.exists()) { - return defaultConfiguration.getOffscreenRenderingMode(registryFile); - } - - final AbstractRegistryNode registryChild = registryParser.parseFile(registryFile, HKEY_CURRENT_USER) - .getChild(SOFTWARE, WINE, DIRECT3D, OFFSCREEN_RENDERING_MODE); - if (registryChild instanceof RegistryValue) { - switch (((RegistryValue) registryChild).getText()) { - case FBO: - return OffscreenRenderingMode.FBO; - case BACKBUFFER: - return OffscreenRenderingMode.BACKBUFFER; - case PBUFFER: - return OffscreenRenderingMode.PBUFFER; - default: - return OffscreenRenderingMode.DEFAULT; - } - } - return defaultConfiguration.getOffscreenRenderingMode(registryFile); - } - - @Override - public RenderTargetModeLock getRenderTargetModeLock(File registryFile) { - if (!registryFile.exists()) { - return defaultConfiguration.getRenderTargetModeLock(registryFile); - } - - final AbstractRegistryNode registryChild = registryParser.parseFile(registryFile, HKEY_CURRENT_USER) - .getChild(SOFTWARE, WINE, DIRECT3D, RENDER_TARGET_MODE_LOCK); - if (registryChild instanceof RegistryValue) { - switch (((RegistryValue) registryChild).getText()) { - case DISABLED: - return RenderTargetModeLock.DISABLED; - case READDRAW: - return RenderTargetModeLock.READDRAW; - case READTEX: - return RenderTargetModeLock.READTEX; - default: - return RenderTargetModeLock.DEFAULT; - } - } - - return defaultConfiguration.getRenderTargetModeLock(registryFile); - } - - @Override - public StrictDrawOrdering getStrictDrawOrdering(File registryFile) { - if (!registryFile.exists()) { - return defaultConfiguration.getStrictDrawOrdering(registryFile); - } - - final AbstractRegistryNode registryChild = registryParser.parseFile(registryFile, HKEY_CURRENT_USER) - .getChild(SOFTWARE, WINE, DIRECT3D, STRICT_DRAW_ORDERING); - if (registryChild instanceof RegistryValue) { - switch (((RegistryValue) registryChild).getText()) { - case ENABLED: - return StrictDrawOrdering.ENABLED; - case DISABLED: - return StrictDrawOrdering.DISABLED; - default: - return StrictDrawOrdering.DEFAULT; - } - } - return defaultConfiguration.getStrictDrawOrdering(registryFile); - } - - @Override - public AlwaysOffscreen getAlwaysOffscreen(File registryFile) { - if (!registryFile.exists()) { - return defaultConfiguration.getAlwaysOffscreen(registryFile); - } - - final AbstractRegistryNode registryChild = registryParser.parseFile(registryFile, HKEY_CURRENT_USER) - .getChild(SOFTWARE, WINE, DIRECT3D, ALWAYS_OFFSCREEN); - if (registryChild instanceof RegistryValue) { - switch (((RegistryValue) registryChild).getText()) { - case ENABLED: - return AlwaysOffscreen.ENABLED; - case DISABLED: - return AlwaysOffscreen.DISABLED; - default: - return AlwaysOffscreen.DEFAULT; - } - } - return defaultConfiguration.getAlwaysOffscreen(registryFile); - } - - @Override - public VideoMemorySize getVideoMemorySize(File registryFile) { - if (!registryFile.exists()) { - return defaultConfiguration.getVideoMemorySize(registryFile); - } - - final AbstractRegistryNode registryChild = registryParser.parseFile(registryFile, HKEY_CURRENT_USER) - .getChild(SOFTWARE, WINE, DIRECT3D, VIDEO_MEMORY_SIZE); - if (registryChild instanceof RegistryValue) { - try { - int videoMemorySize = Integer.parseInt(((RegistryValue) registryChild).getText()); - return new VideoMemorySize(false, videoMemorySize); - } catch (NumberFormatException e) { - return new VideoMemorySize(true, 0); - } - } - - return defaultConfiguration.getVideoMemorySize(registryFile); - } -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/RegistryWinePrefixContainerInputConfiguration.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/RegistryWinePrefixContainerInputConfiguration.java deleted file mode 100644 index 98b447f2521..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/RegistryWinePrefixContainerInputConfiguration.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.configurations; - -import org.phoenicis.containers.wine.parameters.MouseWarpOverride; -import org.phoenicis.win32.registry.AbstractRegistryNode; -import org.phoenicis.win32.registry.RegistryParser; -import org.phoenicis.win32.registry.RegistryValue; - -import java.io.File; - -public class RegistryWinePrefixContainerInputConfiguration implements WinePrefixContainerInputConfiguration { - private final RegistryParser registryParser; - private final WinePrefixContainerInputConfiguration defaultConfiguration; - - public RegistryWinePrefixContainerInputConfiguration(RegistryParser registryParser, - WinePrefixContainerInputConfiguration defaultConfiguration) { - this.registryParser = registryParser; - this.defaultConfiguration = defaultConfiguration; - } - - @Override - public MouseWarpOverride getMouseWarpOverride(File registryFile) { - if (!registryFile.exists()) { - return defaultConfiguration.getMouseWarpOverride(registryFile); - } - final AbstractRegistryNode registryChild = registryParser.parseFile(registryFile, "HKEY_CURRENT_USER") - .getChild("Software", "Wine", "DirectInput", "MouseWarpOverride"); - if (registryChild instanceof RegistryValue) { - switch (((RegistryValue) registryChild).getText()) { - case "enable": - return MouseWarpOverride.ENABLED; - case "disable": - return MouseWarpOverride.DISABLED; - case "force": - return MouseWarpOverride.FORCE; - default: - return MouseWarpOverride.DEFAULT; - } - } - return defaultConfiguration.getMouseWarpOverride(registryFile); - } -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/WinePrefixContainerDisplayConfiguration.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/WinePrefixContainerDisplayConfiguration.java deleted file mode 100644 index 6522238874b..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/WinePrefixContainerDisplayConfiguration.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.configurations; - -import org.phoenicis.containers.wine.parameters.*; - -import java.io.File; - -public interface WinePrefixContainerDisplayConfiguration { - /** - * - * @return The {@link UseGLSL} value - */ - UseGLSL getGLSL(File registryFile); - - /** - * - * @return The {@link DirectDrawRenderer} value - */ - DirectDrawRenderer getDirectDrawRenderer(File registryFile); - - /** - * - * @return The {@link Multisampling} value - */ - Multisampling getMultisampling(File registryFile); - - /** - * - * @return The {@link OffscreenRenderingMode} value - */ - OffscreenRenderingMode getOffscreenRenderingMode(File registryFile); - - /** - * - * @return The {@link RenderTargetModeLock} value - */ - RenderTargetModeLock getRenderTargetModeLock(File registryFile); - - /** - * - * @return The {@link StrictDrawOrdering} value - */ - StrictDrawOrdering getStrictDrawOrdering(File registryFile); - - /** - * - * @return The {@link AlwaysOffscreen} value - */ - AlwaysOffscreen getAlwaysOffscreen(File registryFile); - - /** - * - * @return The {@link VideoMemorySize} value - */ - VideoMemorySize getVideoMemorySize(File registryFile); -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/WinePrefixContainerInputConfiguration.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/WinePrefixContainerInputConfiguration.java deleted file mode 100644 index df60cea3ee9..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/configurations/WinePrefixContainerInputConfiguration.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.configurations; - -import org.phoenicis.containers.wine.parameters.MouseWarpOverride; - -import java.io.File; - -public interface WinePrefixContainerInputConfiguration { - /** - * - * @return The {@link MouseWarpOverride} value - */ - MouseWarpOverride getMouseWarpOverride(File registryFile); -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java deleted file mode 100644 index 3c1a6138487..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.phoenicis.win32.registry.*; - -import static org.phoenicis.configuration.localisation.Localisation.tr; - -public enum AlwaysOffscreen implements RegistryParameter { - DEFAULT(tr("Default"), ""), DISABLED(tr("Disabled"), "disabled"), ENABLED(tr("Enabled"), "enabled"); - - private final String translatedName; - private final String registryValue; - - AlwaysOffscreen(String translatedName, String registryValue) { - this.translatedName = translatedName; - this.registryValue = registryValue; - } - - @Override - public String toString() { - return translatedName; - } - - @Override - public AbstractRegistryNode toRegistryPatch() { - final RegistryKey registryNode = new RegistryKey("HKEY_CURRENT_USER").addDeepChildren("Software", "Wine", - "Direct3D"); - - switch (this) { - case DEFAULT: - registryNode.addChild(new RegistryValue<>("AlwaysOffscreen", new RemoveValueType())); - break; - case ENABLED: - case DISABLED: - registryNode.addChild(new RegistryValue<>("AlwaysOffscreen", new StringValueType(registryValue))); - break; - } - - return registryNode; - } -} \ No newline at end of file diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/DirectDrawRenderer.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/DirectDrawRenderer.java deleted file mode 100644 index 4ac6c9e1953..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/DirectDrawRenderer.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.phoenicis.win32.registry.*; - -import static org.phoenicis.configuration.localisation.Localisation.tr; - -public enum DirectDrawRenderer implements RegistryParameter { - DEFAULT(tr("Default"), ""), GDI("GDI", "gdi"), OPENGL("OpenGL", "opengl"); - - private final String translatedName; - private final String registryValue; - - DirectDrawRenderer(String translatedName, String registryValue) { - this.translatedName = translatedName; - this.registryValue = registryValue; - } - - @Override - public String toString() { - return translatedName; - } - - @Override - public AbstractRegistryNode toRegistryPatch() { - final RegistryKey registryNode = new RegistryKey("HKEY_CURRENT_USER").addDeepChildren("Software", "Wine", - "Direct3D"); - - switch (this) { - case DEFAULT: - registryNode.addChild(new RegistryValue<>("DirectDrawRenderer", new RemoveValueType())); - break; - case GDI: - case OPENGL: - registryNode.addChild(new RegistryValue<>("DirectDrawRenderer", new StringValueType(registryValue))); - break; - } - - return registryNode; - } -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java deleted file mode 100644 index 74afe8497a4..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.phoenicis.win32.registry.*; - -import static org.phoenicis.configuration.localisation.Localisation.tr; - -public enum MouseWarpOverride implements RegistryParameter { - DEFAULT(tr("Default"), ""), DISABLED(tr("Disabled"), "disabled"), ENABLED(tr("Enabled"), - "enabled"), FORCE(tr("Force"), "force"); - - private final String translatedName; - private final String registryValue; - - MouseWarpOverride(String translatedName, String registryValue) { - this.translatedName = translatedName; - this.registryValue = registryValue; - } - - @Override - public String toString() { - return translatedName; - } - - @Override - public AbstractRegistryNode toRegistryPatch() { - final RegistryKey registryNode = new RegistryKey("HKEY_CURRENT_USER").addDeepChildren("Software", "Wine", - "DirectInput"); - - switch (this) { - case DEFAULT: - registryNode.addChild(new RegistryValue<>("MouseWarpOverride", new RemoveValueType())); - break; - case ENABLED: - case DISABLED: - case FORCE: - registryNode.addChild(new RegistryValue<>("MouseWarpOverride", new StringValueType(registryValue))); - break; - } - - return registryNode; - } -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java deleted file mode 100644 index 5d54d3d4a67..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.phoenicis.win32.registry.*; - -import static org.phoenicis.configuration.localisation.Localisation.tr; - -public enum Multisampling implements RegistryParameter { - DEFAULT(tr("Default"), ""), DISABLED(tr("Disabled"), "disabled"), ENABLED(tr("Enabled"), "enabled"); - - private final String translatedName; - private final String registryValue; - - Multisampling(String translatedName, String registryValue) { - this.translatedName = translatedName; - this.registryValue = registryValue; - } - - @Override - public String toString() { - return translatedName; - } - - @Override - public AbstractRegistryNode toRegistryPatch() { - final RegistryKey registryNode = new RegistryKey("HKEY_CURRENT_USER").addDeepChildren("Software", "Wine", - "Direct3D"); - - switch (this) { - case DEFAULT: - registryNode.addChild(new RegistryValue<>("Multisampling", new RemoveValueType())); - break; - case ENABLED: - case DISABLED: - registryNode.addChild(new RegistryValue<>("Multisampling", new StringValueType(registryValue))); - break; - } - - return registryNode; - } -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/OffscreenRenderingMode.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/OffscreenRenderingMode.java deleted file mode 100644 index 2f964c482c4..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/OffscreenRenderingMode.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.phoenicis.win32.registry.*; - -public enum OffscreenRenderingMode implements RegistryParameter { - DEFAULT("Default", ""), FBO("FBO", "fbo"), BACKBUFFER("Backbuffer", "backbuffer"), PBUFFER("PBuffer", "pbuffer"); - - private final String translatedName; - private final String registryValue; - - OffscreenRenderingMode(String translatedName, String registryValue) { - this.translatedName = translatedName; - this.registryValue = registryValue; - } - - @Override - public String toString() { - return translatedName; - } - - @Override - public AbstractRegistryNode toRegistryPatch() { - final RegistryKey registryNode = new RegistryKey("HKEY_CURRENT_USER").addDeepChildren("Software", "Wine", - "Direct3D"); - - switch (this) { - case DEFAULT: - registryNode.addChild(new RegistryValue<>("OffscreenRenderingMode", new RemoveValueType())); - break; - case FBO: - case BACKBUFFER: - case PBUFFER: - registryNode - .addChild(new RegistryValue<>("OffscreenRenderingMode", new StringValueType(registryValue))); - break; - } - - return registryNode; - } -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RegistryParameter.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RegistryParameter.java deleted file mode 100644 index a48190c7084..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RegistryParameter.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.phoenicis.win32.registry.AbstractRegistryNode; - -public interface RegistryParameter { - AbstractRegistryNode toRegistryPatch(); -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RenderTargetModeLock.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RenderTargetModeLock.java deleted file mode 100644 index 86237c77f7e..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RenderTargetModeLock.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.phoenicis.win32.registry.*; - -import static org.phoenicis.configuration.localisation.Localisation.tr; - -public enum RenderTargetModeLock implements RegistryParameter { - DEFAULT(tr("Default"), ""), DISABLED(tr("Disabled"), "disabled"), READDRAW("readdraw", - "readdraw"), READTEX("readtext", "readtext"); - - private final String translatedName; - private final String registryValue; - - RenderTargetModeLock(String translatedName, String registryValue) { - this.translatedName = translatedName; - this.registryValue = registryValue; - } - - @Override - public String toString() { - return translatedName; - } - - @Override - public AbstractRegistryNode toRegistryPatch() { - final RegistryKey registryNode = new RegistryKey("HKEY_CURRENT_USER").addDeepChildren("Software", "Wine", - "Direct3D"); - - switch (this) { - case DEFAULT: - registryNode.addChild(new RegistryValue<>("RenderTargetModeLock", new RemoveValueType())); - break; - case DISABLED: - case READDRAW: - case READTEX: - registryNode.addChild(new RegistryValue<>("RenderTargetModeLock", new StringValueType(registryValue))); - break; - } - - return registryNode; - } -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java deleted file mode 100644 index f9b43251f06..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.phoenicis.win32.registry.*; - -import static org.phoenicis.configuration.localisation.Localisation.tr; - -public enum StrictDrawOrdering implements RegistryParameter { - DEFAULT(tr("Default"), ""), DISABLED(tr("Disabled"), "disabled"), ENABLED(tr("Enabled"), "enabled"); - - private final String translatedName; - private final String registryValue; - - StrictDrawOrdering(String translatedName, String registryValue) { - this.translatedName = translatedName; - this.registryValue = registryValue; - } - - @Override - public String toString() { - return translatedName; - } - - @Override - public AbstractRegistryNode toRegistryPatch() { - final RegistryKey registryNode = new RegistryKey("HKEY_CURRENT_USER").addDeepChildren("Software", "Wine", - "Direct3D"); - - switch (this) { - case DEFAULT: - registryNode.addChild(new RegistryValue<>("StrictDrawOrdering", new RemoveValueType())); - break; - case DISABLED: - case ENABLED: - registryNode.addChild(new RegistryValue<>("StrictDrawOrdering", new StringValueType(registryValue))); - break; - } - - return registryNode; - } -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java deleted file mode 100644 index 50e53b5c551..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.phoenicis.win32.registry.*; - -import static org.phoenicis.configuration.localisation.Localisation.tr; - -public enum UseGLSL implements RegistryParameter { - DEFAULT(tr("Default"), ""), DISABLED(tr("Disabled"), "disabled"), ENABLED(tr("Enabled"), "enabled"); - - private final String translatedName; - private final String registryValue; - - UseGLSL(String translatedName, String registryValue) { - this.translatedName = translatedName; - this.registryValue = registryValue; - } - - @Override - public String toString() { - return translatedName; - } - - @Override - public AbstractRegistryNode toRegistryPatch() { - final RegistryKey registryNode = new RegistryKey("HKEY_CURRENT_USER").addDeepChildren("Software", "Wine", - "Direct3D"); - - switch (this) { - case DEFAULT: - registryNode.addChild(new RegistryValue<>("UseGLSL", new RemoveValueType())); - break; - case ENABLED: - case DISABLED: - registryNode.addChild(new RegistryValue<>("UseGLSL", new StringValueType(registryValue))); - break; - } - - return registryNode; - } -} diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/VideoMemorySize.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/VideoMemorySize.java deleted file mode 100644 index 48d7281220b..00000000000 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/VideoMemorySize.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.phoenicis.win32.registry.*; - -public class VideoMemorySize implements RegistryParameter { - private final boolean isDefault; - private final int videoSize; - - public VideoMemorySize(boolean isDefault, int videoSize) { - this.isDefault = isDefault; - this.videoSize = videoSize; - } - - public static VideoMemorySize[] possibleValues() { - return new VideoMemorySize[] { new VideoMemorySize(true, 0), new VideoMemorySize(false, 32), - new VideoMemorySize(false, 64), new VideoMemorySize(false, 128), new VideoMemorySize(false, 256), - new VideoMemorySize(false, 384), new VideoMemorySize(false, 512), new VideoMemorySize(false, 768), - new VideoMemorySize(false, 1024), new VideoMemorySize(false, 2048), new VideoMemorySize(false, 3072), - new VideoMemorySize(false, 4096), new VideoMemorySize(false, 5120), new VideoMemorySize(false, 6144), - new VideoMemorySize(false, 7168), new VideoMemorySize(false, 8192) }; - } - - public int getVideoSize() { - return videoSize; - } - - public boolean isDefault() { - return isDefault; - } - - @Override - public String toString() { - if (isDefault) { - return "Default"; - } else { - return Integer.toString(videoSize); - } - } - - @Override - public AbstractRegistryNode toRegistryPatch() { - final RegistryKey registryNode = new RegistryKey("HKEY_CURRENT_USER").addDeepChildren("Software", "Wine", - "Direct3D"); - - if (isDefault) { - registryNode.addChild(new RegistryValue<>("VideoMemorySize", new RemoveValueType())); - } else { - registryNode - .addChild(new RegistryValue<>("VideoMemorySize", new StringValueType(Integer.toString(videoSize)))); - } - - return registryNode; - } -} diff --git a/phoenicis-containers/src/test/java/org/phoenicis/containers/wine/parameters/AbstractRegistryParameterTest.java b/phoenicis-containers/src/test/java/org/phoenicis/containers/wine/parameters/AbstractRegistryParameterTest.java deleted file mode 100644 index df3bff6b4c7..00000000000 --- a/phoenicis-containers/src/test/java/org/phoenicis/containers/wine/parameters/AbstractRegistryParameterTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.phoenicis.win32.registry.RegistryWriter; - -import static org.junit.Assert.assertEquals; - -public abstract class AbstractRegistryParameterTest { - private final RegistryWriter registryWriter = new RegistryWriter(); - - protected void testStringValue(T value, String expected) { - assertEquals( - "WINE REGISTRY Version 2\n" + ";; Generated by Phoenicis\n" + "\n" - + "[HKEY_CURRENT_USER\\Software\\Wine\\Direct3D]\n" + "\"" + value.getClass().getSimpleName() - + "\"=\"" + expected + "\"", - registryWriter.generateRegFileContent(value.toRegistryPatch()).trim()); - } - - protected void testRemoveValue(T value) { - assertEquals("WINE REGISTRY Version 2\n" + ";; Generated by Phoenicis\n" + "\n" - + "[HKEY_CURRENT_USER\\Software\\Wine\\Direct3D]\n" + "\"" + value.getClass().getSimpleName() + "\"=-", - registryWriter.generateRegFileContent(value.toRegistryPatch()).trim()); - } -} diff --git a/phoenicis-containers/src/test/java/org/phoenicis/containers/wine/parameters/UseGLSLTest.java b/phoenicis-containers/src/test/java/org/phoenicis/containers/wine/parameters/UseGLSLTest.java deleted file mode 100644 index 001097d6afd..00000000000 --- a/phoenicis-containers/src/test/java/org/phoenicis/containers/wine/parameters/UseGLSLTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.containers.wine.parameters; - -import org.junit.Test; - -public class UseGLSLTest extends AbstractRegistryParameterTest { - @Test - public void testGenerateRegFileEnabledGLSL() { - testStringValue(UseGLSL.ENABLED, "enabled"); - } - - @Test - public void testGenerateRegFileDisabledGLSL() { - testStringValue(UseGLSL.DISABLED, "disabled"); - } - - @Test - public void testGenerateRegFileDefaultGLSL() { - testRemoveValue(UseGLSL.DEFAULT); - } - -} \ No newline at end of file diff --git a/phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSetting.java b/phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSetting.java new file mode 100644 index 00000000000..877e0bdb679 --- /dev/null +++ b/phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSetting.java @@ -0,0 +1,32 @@ +package org.phoenicis.engines; + +/** + * interface which must be implemented by all engine settings in Javascript + */ +public interface EngineSetting { + /** + * fetches the text which shall be shown for the setting + * @return text + */ + String getText(); + + /** + * fetches the available options for this setting + * @return options + */ + String[] getOptions(); + + /** + * fetches the currently used option + * @param container name of container for which the current setting shall be fetched + * @return option + */ + String getCurrentOption(String container); + + /** + * sets the selected option + * @param container name of container for which the setting shall be applied + * @param optionIndex index of selected option + */ + void setOption(String container, int optionIndex); +} diff --git a/phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSettingsManager.java b/phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSettingsManager.java new file mode 100644 index 00000000000..eb85b372424 --- /dev/null +++ b/phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSettingsManager.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2015-2017 PÂRIS Quentin + * + * 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 2 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.phoenicis.engines; + +import org.phoenicis.repository.dto.*; +import org.phoenicis.scripts.interpreter.InteractiveScriptSession; +import org.phoenicis.scripts.interpreter.ScriptInterpreter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +/** + * manages the engine settings + */ +public class EngineSettingsManager { + private final ScriptInterpreter scriptInterpreter; + + /** + * constructor + * @param scriptInterpreter + */ + public EngineSettingsManager(ScriptInterpreter scriptInterpreter) { + this.scriptInterpreter = scriptInterpreter; + } + + /** + * fetches the required setting + * @param engineId setting ID (e.g. "glsl") + * @param settingId setting ID (e.g. "glsl") + * @param doneCallback callback which will be executed with the fetched setting + * @param errorCallback callback which will be executed if an error occurs + */ + public void getSetting(String engineId, String settingId, Consumer doneCallback, + Consumer errorCallback) { + final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); + + interactiveScriptSession.eval( + "include([\"engines\", \"" + engineId + "\", \"settings\", \"" + settingId + "\"]); new Setting();", + output -> { + final EngineSetting setting = (EngineSetting) output; + doneCallback.accept(setting); + }, errorCallback); + } + + /** + * fetches the available engine settings + * @param repositoryDTO + * @param callback + * @param errorCallback callback which will be executed if an error occurs + */ + public void fetchAvailableEngineSettings(RepositoryDTO repositoryDTO, + Consumer>> callback, Consumer errorCallback) { + final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); + + interactiveScriptSession.eval(this.getFetchScript(repositoryDTO), + output -> callback.accept((Map>) output), errorCallback); + } + + /** + * retrieves a Javascript string which can be used to fetch the available settings + * @param repositoryDTO repository containing the settings + * @return Javascript + */ + private String getFetchScript(RepositoryDTO repositoryDTO) { + // get engine CategoryDTOs + List categoryDTOS = new ArrayList<>(); + for (TypeDTO typeDTO : repositoryDTO.getTypes()) { + if (typeDTO.getId().equals("engines")) { + categoryDTOS = typeDTO.getCategories(); + } + } + StringBuilder script = new StringBuilder(); + script.append("(function () {\n"); + script.append("var settings = {};\n"); + for (CategoryDTO engine : categoryDTOS) { + final String engineId = engine.getId(); + for (ApplicationDTO applicationDTO : engine.getApplications()) { + if (applicationDTO.getId().equals("settings")) { + for (ScriptDTO scriptDTO : applicationDTO.getScripts()) { + script.append("include([\"engines\", \"" + engineId + "\", \"settings\", \"" + scriptDTO.getId() + + "\"]);\n"); + script.append("if (!(\"" + engineId + "\" in settings))\n"); + script.append("{\n"); + script.append("settings[\"" + engineId + "\"] = new java.util.ArrayList();\n"); + script.append("}\n"); + script.append("settings[\"" + engineId + "\"].add(new Setting());\n"); + } + } + } + } + script.append("return settings;\n"); + script.append("})()\n;"); + + return script.toString(); + } +} diff --git a/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesConfiguration.java b/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesConfiguration.java index df3ec2a10cb..c167cc3b35c 100644 --- a/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesConfiguration.java +++ b/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesConfiguration.java @@ -38,6 +38,11 @@ public EnginesManager enginesSource() { phoenicisGlobalConfiguration.objectMapper()); } + @Bean + public EngineSettingsManager engineSettingsManager() { + return new EngineSettingsManager(scriptsConfiguration.scriptInterpreter()); + } + @Bean public EngineToolsManager engineToolsManager() { return new EngineToolsManager(scriptsConfiguration.scriptInterpreter()); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java index 07d9435c4bb..00ebc6500c2 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java @@ -85,9 +85,9 @@ public MainController mainController() { public ContainersController containersController() { return new ContainersController(viewsConfiguration.viewContainers(), containersConfiguration.backgroundContainersManager(), - viewsConfiguration.winePrefixContainerPanelFactory(), containersConfiguration.winePrefixContainerController(), repositoryConfiguration.repositoryManager(), + enginesConfiguration.engineSettingsManager(), enginesConfiguration.engineToolsManager()); } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java index 98a782d8ce5..387d6f2928e 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java @@ -22,18 +22,20 @@ import org.phoenicis.containers.ContainersManager; import org.phoenicis.containers.dto.ContainerDTO; import org.phoenicis.containers.dto.WinePrefixContainerDTO; -import org.phoenicis.containers.wine.ContainerEngineController; +import org.phoenicis.containers.ContainerEngineController; +import org.phoenicis.engines.EngineSetting; +import org.phoenicis.engines.EngineSettingsManager; import org.phoenicis.engines.EngineToolsManager; import org.phoenicis.javafx.views.common.ConfirmMessage; import org.phoenicis.javafx.views.common.ErrorMessage; -import org.phoenicis.javafx.views.mainwindow.containers.ContainerPanelFactory; -import org.phoenicis.javafx.views.mainwindow.containers.ContainersView; import org.phoenicis.javafx.views.mainwindow.containers.ContainerPanel; +import org.phoenicis.javafx.views.mainwindow.containers.ContainersView; import org.phoenicis.repository.RepositoryManager; import org.phoenicis.repository.dto.ApplicationDTO; import org.phoenicis.repository.dto.RepositoryDTO; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -42,23 +44,31 @@ public class ContainersController { private final ContainersView containersView; private final ContainersManager containersManager; + private EngineSettingsManager engineSettingsManager; private final EngineToolsManager engineToolsManager; + private Map> engineSettings; // engine settings per engine private Map engineTools; // engine tools per engine public ContainersController(ContainersView containersView, ContainersManager containersManager, - ContainerPanelFactory winePrefixContainerPanelFactory, ContainerEngineController containerEngineController, RepositoryManager repositoryManager, + EngineSettingsManager engineSettingsManager, EngineToolsManager engineToolsManager) { this.containersView = containersView; this.containersManager = containersManager; + this.engineSettingsManager = engineSettingsManager; this.engineToolsManager = engineToolsManager; - this.engineTools = new HashMap<>(); + this.engineSettings = new HashMap<>(); + repositoryManager.addCallbacks(this::updateEngineSettings, + e -> Platform.runLater( + () -> new ErrorMessage(tr("Loading engine settings failed."), e, this.containersView))); + this.engineTools = new HashMap<>(); repositoryManager.addCallbacks(this::updateEngineTools, - e -> Platform.runLater(() -> new ErrorMessage(tr("Loading engines failed."), e, this.containersView))); + e -> Platform + .runLater(() -> new ErrorMessage(tr("Loading engine tools failed."), e, this.containersView))); containersView.setOnSelectionChanged(event -> { if (containersView.isSelected()) { @@ -67,21 +77,17 @@ public ContainersController(ContainersView containersView, }); containersView.setOnSelectContainer((ContainerDTO containerDTO) -> { - // disabled fetching of available engines - // changing engine does not work currently - // querying Wine webservice causes performance issues on systems with slow internet connection - // List categoryDTOS = Collections.singletonList(new CategoryDTO.Builder().withName("Wine").build()); - // enginesSource.getAvailableEngines(categoryDTOS, engineCategoryDTOS -> { - final ContainerPanel panel = winePrefixContainerPanelFactory.createContainerPanel( + // TODO: better way to get engine ID + final String engineId = containerDTO.getEngine().toLowerCase(); + final ContainerPanel panel = new ContainerPanel( (WinePrefixContainerDTO) containerDTO, - /*engineCategoryDTOS.stream().flatMap(category -> category.getSubCategories().stream()) - .flatMap(subCategory -> subCategory.getPackages().stream()) - .collect(Collectors.toList()),*/ engineToolsManager, - Optional.ofNullable(engineTools.get("wine")), + Optional.ofNullable(engineSettings.get(engineId)), + Optional.ofNullable(engineTools.get(engineId)), containerEngineController); panel.setOnDeletePrefix( + // TODO rename to generic "container" winePrefixDTO -> new ConfirmMessage(tr("Delete {0} container", winePrefixDTO.getName()), tr("Are you sure you want to delete the {0} container?", winePrefixDTO.getName()), this.containersView.getContent().getScene().getWindow()) @@ -106,13 +112,20 @@ public ContainersView getView() { public void loadContainers() { this.containersView.showWait(); - containersManager.fetchContainers(containersView::populate, + this.containersManager.fetchContainers(containersView::populate, e -> this.containersView.showFailure(tr("Loading containers failed."), Optional .of(e))); } + private void updateEngineSettings(RepositoryDTO repositoryDTO) { + this.engineSettingsManager.fetchAvailableEngineSettings(repositoryDTO, + engineSettings -> Platform.runLater(() -> this.engineSettings = engineSettings), + e -> Platform + .runLater(() -> new ErrorMessage(tr("Loading engine tools failed."), e, this.containersView))); + } + private void updateEngineTools(RepositoryDTO repositoryDTO) { - engineToolsManager.fetchAvailableEngineTools(repositoryDTO, + this.engineToolsManager.fetchAvailableEngineTools(repositoryDTO, engineTools -> Platform.runLater(() -> this.engineTools = engineTools)); } } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java index 2b638757512..bfd9c78c276 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java @@ -18,14 +18,11 @@ package org.phoenicis.javafx.views; -import org.phoenicis.containers.dto.WinePrefixContainerDTO; import org.phoenicis.javafx.settings.JavaFxSettingsConfiguration; import org.phoenicis.javafx.views.common.ThemeConfiguration; import org.phoenicis.javafx.views.mainwindow.apps.ApplicationsView; import org.phoenicis.javafx.views.mainwindow.console.ConsoleTabFactory; -import org.phoenicis.javafx.views.mainwindow.containers.ContainerPanelFactory; import org.phoenicis.javafx.views.mainwindow.containers.ContainersView; -import org.phoenicis.javafx.views.mainwindow.containers.ContainerPanel; import org.phoenicis.javafx.views.mainwindow.engines.EnginesView; import org.phoenicis.javafx.views.mainwindow.installations.InstallationsView; import org.phoenicis.javafx.views.mainwindow.library.LibraryView; @@ -121,9 +118,4 @@ public LibraryView viewLibrary() { public ConsoleTabFactory consoleTabFactory() { return viewsConfigurationLibrary.consoleTabFactory(); } - - @Bean - public ContainerPanelFactory winePrefixContainerPanelFactory() { - return new ContainerPanelFactory<>(ContainerPanel.class, WinePrefixContainerDTO.class); - } } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java deleted file mode 100644 index 2406140bbd4..00000000000 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerDisplayTab.java +++ /dev/null @@ -1,174 +0,0 @@ -package org.phoenicis.javafx.views.mainwindow.containers; - -import com.sun.javafx.collections.ImmutableObservableList; -import com.sun.javafx.collections.ObservableListWrapper; -import javafx.application.Platform; -import javafx.collections.ObservableList; -import javafx.scene.Node; -import javafx.scene.control.ComboBox; -import javafx.scene.control.Tab; -import javafx.scene.layout.GridPane; -import javafx.scene.layout.Priority; -import javafx.scene.layout.Region; -import javafx.scene.layout.VBox; -import javafx.scene.text.Text; -import org.phoenicis.containers.dto.WinePrefixContainerDTO; -import org.phoenicis.containers.wine.ContainerEngineController; -import org.phoenicis.containers.wine.parameters.*; -import org.phoenicis.javafx.views.common.ErrorMessage; -import org.phoenicis.javafx.views.common.TextWithStyle; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.EnumSet; -import java.util.List; - -import static org.phoenicis.configuration.localisation.Localisation.tr; - -/** - * Created by marc on 27.05.17. - */ -public class ContainerDisplayTab extends Tab { - private static final String CAPTION_TITLE_CSS_CLASS = "captionTitle"; - private static final String CONFIGURATION_PANE_CSS_CLASS = "containerConfigurationPane"; - private static final String TITLE_CSS_CLASS = "title"; - - private final WinePrefixContainerDTO container; - private final ContainerEngineController containerEngineController; - - private final List lockableElements = new ArrayList<>(); - - public ContainerDisplayTab(WinePrefixContainerDTO container, - ContainerEngineController containerEngineController) { - super(tr("Display")); - - this.container = container; - this.containerEngineController = containerEngineController; - - this.setClosable(false); - - this.populate(); - } - - private void populate() { - final VBox displayPane = new VBox(); - final Text title = new TextWithStyle(tr("Display settings"), TITLE_CSS_CLASS); - - displayPane.getStyleClass().add(CONFIGURATION_PANE_CSS_CLASS); - displayPane.getChildren().add(title); - - final GridPane displayContentPane = new GridPane(); - displayContentPane.getStyleClass().add("grid"); - - final ComboBox glslComboBox = new ComboBox<>(); - glslComboBox.setMaxWidth(Double.MAX_VALUE); - glslComboBox.setValue(container.getUseGlslValue()); - glslComboBox.valueProperty().addListener((observable, oldValue, newValue) -> this.changeSettings(newValue)); - addItems(glslComboBox, UseGLSL.class); - displayContentPane.add(new TextWithStyle(tr("GLSL support"), CAPTION_TITLE_CSS_CLASS), 0, 0); - displayContentPane.add(glslComboBox, 1, 0); - - final ComboBox directDrawRendererComboBox = new ComboBox<>(); - directDrawRendererComboBox.setMaxWidth(Double.MAX_VALUE); - directDrawRendererComboBox.setValue(container.getDirectDrawRenderer()); - directDrawRendererComboBox.valueProperty() - .addListener((observable, oldValue, newValue) -> this.changeSettings(newValue)); - addItems(directDrawRendererComboBox, DirectDrawRenderer.class); - displayContentPane.add(new TextWithStyle(tr("Direct Draw Renderer"), CAPTION_TITLE_CSS_CLASS), 0, 1); - displayContentPane.add(directDrawRendererComboBox, 1, 1); - - final ComboBox videoMemorySizeComboBox = new ComboBox<>(); - videoMemorySizeComboBox.setMaxWidth(Double.MAX_VALUE); - videoMemorySizeComboBox.setValue(container.getVideoMemorySize()); - videoMemorySizeComboBox.valueProperty() - .addListener((observable, oldValue, newValue) -> this.changeSettings(newValue)); - addItemsVideoMemorySize(videoMemorySizeComboBox); - displayContentPane.add(new TextWithStyle(tr("Video memory size"), CAPTION_TITLE_CSS_CLASS), 0, 2); - displayContentPane.add(videoMemorySizeComboBox, 1, 2); - - final ComboBox offscreenRenderingModeComboBox = new ComboBox<>(); - offscreenRenderingModeComboBox.setMaxWidth(Double.MAX_VALUE); - offscreenRenderingModeComboBox.setValue(container.getOffscreenRenderingMode()); - offscreenRenderingModeComboBox.valueProperty() - .addListener((observable, oldValue, newValue) -> this.changeSettings(newValue)); - addItems(offscreenRenderingModeComboBox, OffscreenRenderingMode.class); - displayContentPane.add(new TextWithStyle(tr("Offscreen rendering mode"), CAPTION_TITLE_CSS_CLASS), 0, 3); - displayContentPane.add(offscreenRenderingModeComboBox, 1, 3); - - final ComboBox renderTargetModeLockComboBox = new ComboBox<>(); - renderTargetModeLockComboBox.setMaxWidth(Double.MAX_VALUE); - renderTargetModeLockComboBox.setValue(container.getRenderTargetModeLock()); - renderTargetModeLockComboBox.valueProperty() - .addListener((observable, oldValue, newValue) -> this.changeSettings(newValue)); - addItems(renderTargetModeLockComboBox, RenderTargetModeLock.class); - displayContentPane.add(new TextWithStyle(tr("Render target lock mode"), CAPTION_TITLE_CSS_CLASS), 0, 4); - displayContentPane.add(renderTargetModeLockComboBox, 1, 4); - - final ComboBox multisamplingComboBox = new ComboBox<>(); - multisamplingComboBox.setMaxWidth(Double.MAX_VALUE); - multisamplingComboBox.setValue(container.getMultisampling()); - multisamplingComboBox.valueProperty() - .addListener((observable, oldValue, newValue) -> this.changeSettings(newValue)); - addItems(multisamplingComboBox, Multisampling.class); - displayContentPane.add(new TextWithStyle(tr("Multisampling"), CAPTION_TITLE_CSS_CLASS), 0, 5); - displayContentPane.add(multisamplingComboBox, 1, 5); - - final ComboBox strictDrawOrderingComboBox = new ComboBox<>(); - strictDrawOrderingComboBox.setMaxWidth(Double.MAX_VALUE); - strictDrawOrderingComboBox.setValue(container.getStrictDrawOrdering()); - strictDrawOrderingComboBox.valueProperty() - .addListener((observable, oldValue, newValue) -> this.changeSettings(newValue)); - addItems(strictDrawOrderingComboBox, StrictDrawOrdering.class); - displayContentPane.add(new TextWithStyle(tr("Strict Draw Ordering"), CAPTION_TITLE_CSS_CLASS), 0, 6); - displayContentPane.add(strictDrawOrderingComboBox, 1, 6); - - final ComboBox alwaysOffscreenComboBox = new ComboBox<>(); - alwaysOffscreenComboBox.setMaxWidth(Double.MAX_VALUE); - alwaysOffscreenComboBox.setValue(container.getAlwaysOffscreen()); - alwaysOffscreenComboBox.valueProperty() - .addListener((observable, oldValue, newValue) -> this.changeSettings(newValue)); - addItems(alwaysOffscreenComboBox, AlwaysOffscreen.class); - displayContentPane.add(new TextWithStyle(tr("Always Offscreen"), CAPTION_TITLE_CSS_CLASS), 0, 7); - displayContentPane.add(alwaysOffscreenComboBox, 1, 7); - - Region spacer = new Region(); - GridPane.setHgrow(spacer, Priority.ALWAYS); - displayContentPane.add(spacer, 2, 0); - - displayPane.getChildren().addAll(displayContentPane); - this.setContent(displayPane); - - lockableElements.addAll(Arrays.asList(glslComboBox, directDrawRendererComboBox, offscreenRenderingModeComboBox, - renderTargetModeLockComboBox, multisamplingComboBox, strictDrawOrderingComboBox, - alwaysOffscreenComboBox, videoMemorySizeComboBox)); - } - - private void changeSettings(RegistryParameter newValue) { - this.lockAll(); - containerEngineController.changeSetting(container, newValue, this::unlockAll, - e -> Platform.runLater(() -> new ErrorMessage(tr("Error"), e).show())); - } - - private void addItems(ComboBox comboBox, Class clazz) { - final List possibleValues = new ArrayList<>(EnumSet.allOf(clazz)); - - final ObservableList possibleValuesObservable = new ObservableListWrapper<>(possibleValues); - comboBox.setItems(possibleValuesObservable); - } - - private void addItemsVideoMemorySize(ComboBox videoMemorySizeComboBox) { - videoMemorySizeComboBox.setItems(new ImmutableObservableList<>(VideoMemorySize.possibleValues())); - } - - public void unlockAll() { - for (Node element : lockableElements) { - element.setDisable(false); - } - } - - private void lockAll() { - for (Node element : lockableElements) { - element.setDisable(true); - } - } -} diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineSettingsTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineSettingsTab.java new file mode 100644 index 00000000000..a1f8346befa --- /dev/null +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineSettingsTab.java @@ -0,0 +1,88 @@ +package org.phoenicis.javafx.views.mainwindow.containers; + +import javafx.application.Platform; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.scene.Node; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Tab; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; +import org.phoenicis.containers.dto.ContainerDTO; +import org.phoenicis.engines.EngineSetting; +import org.phoenicis.javafx.views.common.TextWithStyle; + +import java.util.ArrayList; +import java.util.List; + +import static org.phoenicis.configuration.localisation.Localisation.tr; + +/** + * tab to show the engine settings + */ +public class ContainerEngineSettingsTab extends Tab { + private static final String CAPTION_TITLE_CSS_CLASS = "captionTitle"; + private static final String CONFIGURATION_PANE_CSS_CLASS = "containerConfigurationPane"; + + private final ContainerDTO container; + + private final List lockableElements = new ArrayList<>(); + + public ContainerEngineSettingsTab(ContainerDTO container, + List engineSettings) { + super(tr("Engine Settings")); + + this.container = container; + + this.setClosable(false); + + this.populate(engineSettings); + } + + private void populate(List engineSettings) { + final VBox displayPane = new VBox(); + displayPane.getStyleClass().add(CONFIGURATION_PANE_CSS_CLASS); + + final GridPane displayContentPane = new GridPane(); + displayContentPane.getStyleClass().add("grid"); + + int row = 0; + for (EngineSetting setting : engineSettings) { + final ComboBox comboBox = new ComboBox<>(); + comboBox.setMaxWidth(Double.MAX_VALUE); + ObservableList items = FXCollections.observableArrayList(setting.getOptions()); + comboBox.setItems(items); + comboBox.setValue(setting.getCurrentOption(this.container.getName())); + comboBox.valueProperty().addListener((observable, oldValue, newValue) -> Platform.runLater(() -> { + this.lockAll(); + setting.setOption(this.container.getName(), items.indexOf(newValue)); + this.unlockAll(); + })); + displayContentPane.add(new TextWithStyle(setting.getText(), CAPTION_TITLE_CSS_CLASS), 0, row); + displayContentPane.add(comboBox, 1, row); + lockableElements.add(comboBox); + ++row; + } + + Region spacer = new Region(); + GridPane.setHgrow(spacer, Priority.ALWAYS); + displayContentPane.add(spacer, 2, 0); + + displayPane.getChildren().addAll(displayContentPane); + this.setContent(displayPane); + } + + public void unlockAll() { + for (Node element : lockableElements) { + element.setDisable(false); + } + } + + private void lockAll() { + for (Node element : lockableElements) { + element.setDisable(true); + } + } +} diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java deleted file mode 100644 index 92a7e9a5661..00000000000 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInputTab.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.phoenicis.javafx.views.mainwindow.containers; - -import com.sun.javafx.collections.ObservableListWrapper; -import javafx.collections.ObservableList; -import javafx.scene.Node; -import javafx.scene.control.ComboBox; -import javafx.scene.control.Tab; -import javafx.scene.layout.GridPane; -import javafx.scene.layout.VBox; -import javafx.scene.text.Text; -import org.phoenicis.containers.dto.WinePrefixContainerDTO; -import org.phoenicis.containers.wine.parameters.MouseWarpOverride; -import org.phoenicis.javafx.views.common.ColumnConstraintsWithPercentage; -import org.phoenicis.javafx.views.common.TextWithStyle; - -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; - -import static org.phoenicis.configuration.localisation.Localisation.tr; - -/** - * Created by marc on 27.05.17. - */ -public class ContainerInputTab extends Tab { - private static final String CAPTION_TITLE_CSS_CLASS = "captionTitle"; - private static final String CONFIGURATION_PANE_CSS_CLASS = "containerConfigurationPane"; - private static final String TITLE_CSS_CLASS = "title"; - - private final WinePrefixContainerDTO container; - - private final List lockableElements = new ArrayList<>(); - - public ContainerInputTab(WinePrefixContainerDTO container) { - super(tr("Input")); - - this.container = container; - - this.setClosable(false); - - this.populate(); - } - - private void populate() { - final VBox inputPane = new VBox(); - final Text title = new TextWithStyle(tr("Input settings"), TITLE_CSS_CLASS); - - inputPane.getStyleClass().add(CONFIGURATION_PANE_CSS_CLASS); - inputPane.getChildren().add(title); - - final GridPane inputContentPane = new GridPane(); - inputContentPane.getStyleClass().add("grid"); - - final ComboBox mouseWarpOverrideComboBox = new ComboBox<>(); - mouseWarpOverrideComboBox.setValue(container.getMouseWarpOverride()); - addItems(mouseWarpOverrideComboBox, MouseWarpOverride.class); - inputContentPane.add(new TextWithStyle(tr("Mouse Warp Override"), CAPTION_TITLE_CSS_CLASS), 0, 0); - inputContentPane.add(mouseWarpOverrideComboBox, 1, 0); - - inputContentPane.getColumnConstraints().addAll(new ColumnConstraintsWithPercentage(30), - new ColumnConstraintsWithPercentage(70)); - - inputPane.getChildren().addAll(inputContentPane); - - this.setContent(inputPane); - - lockableElements.add(mouseWarpOverrideComboBox); - } - - private void addItems(ComboBox comboBox, Class clazz) { - final List possibleValues = new ArrayList<>(EnumSet.allOf(clazz)); - - final ObservableList possibleValuesObservable = new ObservableListWrapper<>(possibleValues); - comboBox.setItems(possibleValuesObservable); - } -} diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanel.java index 43443176914..814da4acb26 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanel.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanel.java @@ -18,33 +18,38 @@ package org.phoenicis.javafx.views.mainwindow.containers; +import org.phoenicis.containers.ContainerEngineController; import org.phoenicis.containers.dto.WinePrefixContainerDTO; -import org.phoenicis.containers.wine.ContainerEngineController; +import org.phoenicis.engines.EngineSetting; import org.phoenicis.engines.EngineToolsManager; import org.phoenicis.repository.dto.ApplicationDTO; +import java.util.List; import java.util.Optional; import java.util.function.Consumer; +// TODO: AbstractContainerPanel not needed anymore (ContainerPanel is generic) public class ContainerPanel extends AbstractContainerPanel { private ContainerInformationTab informationTab; public ContainerPanel(WinePrefixContainerDTO containerEntity, EngineToolsManager engineToolsManager, + Optional> engineSettings, Optional engineTools, ContainerEngineController containerEngineController) { super(containerEntity); this.informationTab = new ContainerInformationTab(containerEntity); this.tabPane.getTabs().add(this.informationTab); - ContainerDisplayTab displayTab = new ContainerDisplayTab(containerEntity, containerEngineController); - this.tabPane.getTabs().add(displayTab); - ContainerInputTab inputTab = new ContainerInputTab(containerEntity); - this.tabPane.getTabs().add(inputTab); + if (engineSettings.isPresent()) { + ContainerEngineSettingsTab settingsTab = new ContainerEngineSettingsTab(containerEntity, + engineSettings.get()); + this.tabPane.getTabs().add(settingsTab); + } if (engineTools.isPresent()) { - ContainerEngineToolsTab wineToolsTab = new ContainerEngineToolsTab(containerEntity, engineToolsManager, + ContainerEngineToolsTab engineToolsTab = new ContainerEngineToolsTab(containerEntity, engineToolsManager, engineTools.get()); - this.tabPane.getTabs().add(wineToolsTab); + this.tabPane.getTabs().add(engineToolsTab); } ContainerToolsTab toolsTab = new ContainerToolsTab(containerEntity, containerEngineController); this.tabPane.getTabs().add(toolsTab); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanelFactory.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanelFactory.java deleted file mode 100644 index 1b38eaf7c2a..00000000000 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanelFactory.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.javafx.views.mainwindow.containers; - -import org.phoenicis.containers.dto.ContainerDTO; -import org.phoenicis.containers.wine.ContainerEngineController; -import org.phoenicis.engines.EngineToolsManager; -import org.phoenicis.repository.dto.ApplicationDTO; - -import java.lang.reflect.InvocationTargetException; -import java.util.Optional; - -public class ContainerPanelFactory, C extends ContainerDTO> { - private final Class clazz; - private final Class entityClazz; - - public ContainerPanelFactory(Class viewClazz, Class entityClazz) { - this.clazz = viewClazz; - this.entityClazz = entityClazz; - } - - public T createContainerPanel(C containerDTO, - EngineToolsManager engineToolsManager, - Optional engineTools, - ContainerEngineController containerEngineController) { - try { - return this.clazz - .getConstructor(entityClazz, EngineToolsManager.class, Optional.class, - ContainerEngineController.class) - .newInstance(containerDTO, engineToolsManager, engineTools, - containerEngineController); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException - | NoSuchMethodException e) { - throw new IllegalStateException(e); - } - } -} diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java index 4c684bef3e7..9389f0354f3 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java @@ -8,8 +8,8 @@ import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.FileChooser; +import org.phoenicis.containers.ContainerEngineController; import org.phoenicis.containers.dto.WinePrefixContainerDTO; -import org.phoenicis.containers.wine.ContainerEngineController; import org.phoenicis.javafx.views.common.ErrorMessage; import org.phoenicis.javafx.views.common.TextWithStyle; diff --git a/phoenicis-win32/pom.xml b/phoenicis-win32/pom.xml index 0ab08f91e4a..502efb881bf 100644 --- a/phoenicis-win32/pom.xml +++ b/phoenicis-win32/pom.xml @@ -62,6 +62,12 @@ junit junit + + org.phoenicis + phoenicis-configuration + 5.0-SNAPSHOT + compile + \ No newline at end of file diff --git a/phoenicis-win32/src/main/java/org/phoenicis/win32/registry/RegistryParser.java b/phoenicis-win32/src/main/java/org/phoenicis/win32/registry/RegistryParser.java index d89d0c41086..0d9b552c3d9 100644 --- a/phoenicis-win32/src/main/java/org/phoenicis/win32/registry/RegistryParser.java +++ b/phoenicis-win32/src/main/java/org/phoenicis/win32/registry/RegistryParser.java @@ -19,6 +19,7 @@ package org.phoenicis.win32.registry; import org.apache.commons.lang.StringUtils; +import org.phoenicis.configuration.security.Safe; import java.io.BufferedReader; import java.io.File; @@ -30,6 +31,7 @@ * Registry parser class If someone wants to improve this code, feel free to do * it! */ +@Safe public class RegistryParser { private static final char QUOTE = '"'; private static final String PARSE_ERROR_MESSAGE = "Invalid registry file. Error found line %s"; From 9eb043e1f225ba2539c58aa9c972380cbca1c84b Mon Sep 17 00:00:00 2001 From: plata Date: Tue, 8 May 2018 10:11:40 +0200 Subject: [PATCH 40/76] Update Travis CI badge (#1320) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e0412c7e24..67b96d22a40 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Phoenicis PlayOnLinux and PlayOnMac 5 -[![Build Status](https://travis-ci.org/PhoenicisOrg/phoenicis.svg?branch=master)](https://travis-ci.org/PhoenicisOrg/phoenicis) +[![Build Status](https://travis-ci.com/PhoenicisOrg/phoenicis.svg?branch=master)](https://travis-ci.com/PhoenicisOrg/phoenicis) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/b667020df53c4b80a22d7e5a73f2b1b3)](https://www.codacy.com/app/PhoenicisOrg/phoenicis?utm_source=github.com&utm_medium=referral&utm_content=PhoenicisOrg/phoenicis&utm_campaign=Badge_Grade) [![Crowdin Badge](https://d322cqt584bo4o.cloudfront.net/phoenicis/localized.svg)](https://crowdin.com/project/phoenicis) From a42ba77fca6a30fa89328e41155279eedd42a7d4 Mon Sep 17 00:00:00 2001 From: plata Date: Tue, 8 May 2018 10:12:05 +0200 Subject: [PATCH 41/76] fix runInContainer() (#1319) --- .../org/phoenicis/containers/ContainerEngineController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainerEngineController.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainerEngineController.java index 460097ba538..98ee0768974 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainerEngineController.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainerEngineController.java @@ -37,7 +37,7 @@ public void runInContainer(ContainerDTO container, String command, Runnable done final String engineId = container.getEngine().toLowerCase(); this.enginesManager.getEngine(engineId, engine -> { engine.setWorkingContainer(container.getName()); - engine.run(command, null, container.getPath(), false, true, new HashMap<>()); + engine.run(command, new String[0], container.getPath(), false, true, new HashMap<>()); doneCallback.run(); }, errorCallback); } From 13f8b086a3436d0229aceff85fb16dff72ee4c4d Mon Sep 17 00:00:00 2001 From: plata Date: Tue, 8 May 2018 10:12:34 +0200 Subject: [PATCH 42/76] Add .gitignore for docs (#1318) --- docs/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 docs/.gitignore diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000000..df531c49fed --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +/_site/ +/Gemfile.lock \ No newline at end of file From a476469f7c2b74256e54bc88666afa8ebd8aa30f Mon Sep 17 00:00:00 2001 From: plata Date: Tue, 8 May 2018 10:12:51 +0200 Subject: [PATCH 43/76] Make more generic and delete unused (#1317) --- i18n/keys.pot | 40 +++++++++---------- .../containers/ContainersConfiguration.java | 2 +- .../controller/ControllerConfiguration.java | 2 +- .../containers/ContainersController.java | 7 ++-- .../containers/AbstractContainerPanel.java | 34 ---------------- .../containers/ContainerEngineToolsTab.java | 10 ++--- .../containers/ContainerInformationTab.java | 6 ++- .../mainwindow/containers/ContainerPanel.java | 20 ++++++---- .../containers/ContainerToolsTab.java | 6 +-- .../views/mainwindow/engines/EnginesView.java | 4 +- 10 files changed, 51 insertions(+), 80 deletions(-) delete mode 100644 phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/AbstractContainerPanel.java diff --git a/i18n/keys.pot b/i18n/keys.pot index a6eaeb3b969..73d32d4d94e 100644 --- a/i18n/keys.pot +++ b/i18n/keys.pot @@ -90,21 +90,21 @@ msgid "Loading engine settings failed." msgstr "" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:71 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:124 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:123 msgid "Loading engine tools failed." msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:91 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:90 #, java-format msgid "Delete {0} container" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:92 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:91 #, java-format msgid "Are you sure you want to delete the {0} container?" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:116 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:115 msgid "Loading containers failed." msgstr "" @@ -191,7 +191,7 @@ msgstr "" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:68 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java:69 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:51 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:52 msgid "Name:" msgstr "" @@ -508,51 +508,51 @@ msgstr "" msgid "Containers" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:32 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:43 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:33 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:44 msgid "Information" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:56 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:57 msgid "Path:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:61 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:62 msgid "Installed shortcuts:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:67 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:69 msgid "Wine version:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:72 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:74 msgid "Wine architecture:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:77 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:79 msgid "Wine distribution:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:105 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:107 msgid "Delete container" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:36 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:48 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:37 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:49 msgid "Tools" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:57 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:58 msgid "Run executable" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:62 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:63 msgid "Choose executable" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:36 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:48 -msgid "Wine tools" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:37 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:49 +msgid "Engine tools" msgstr "" #: phoenicis-scripts/src/main/java/org/phoenicis/scripts/wizard/UiSetupWizardImplementation.java:151 diff --git a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java index 35fae873da2..a8752eb80b0 100644 --- a/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java +++ b/phoenicis-containers/src/main/java/org/phoenicis/containers/ContainersConfiguration.java @@ -66,7 +66,7 @@ public ContainersManager backgroundContainersManager() { } @Bean - public ContainerEngineController winePrefixContainerController() { + public ContainerEngineController containerEngineController() { return new ContainerEngineController(enginesConfiguration.enginesSource()); } } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java index 00ebc6500c2..a1544696263 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/ControllerConfiguration.java @@ -85,7 +85,7 @@ public MainController mainController() { public ContainersController containersController() { return new ContainersController(viewsConfiguration.viewContainers(), containersConfiguration.backgroundContainersManager(), - containersConfiguration.winePrefixContainerController(), + containersConfiguration.containerEngineController(), repositoryConfiguration.repositoryManager(), enginesConfiguration.engineSettingsManager(), enginesConfiguration.engineToolsManager()); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java index 387d6f2928e..87b2e0e7851 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java @@ -87,12 +87,11 @@ public ContainersController(ContainersView containersView, containerEngineController); panel.setOnDeletePrefix( - // TODO rename to generic "container" - winePrefixDTO -> new ConfirmMessage(tr("Delete {0} container", winePrefixDTO.getName()), - tr("Are you sure you want to delete the {0} container?", winePrefixDTO.getName()), + containerToDelete -> new ConfirmMessage(tr("Delete {0} container", containerToDelete.getName()), + tr("Are you sure you want to delete the {0} container?", containerToDelete.getName()), this.containersView.getContent().getScene().getWindow()) .ask(() -> { - containersManager.deleteContainer(winePrefixDTO, + containersManager.deleteContainer(containerToDelete, e -> Platform.runLater( () -> new ErrorMessage("Error", e, this.containersView) .show())); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/AbstractContainerPanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/AbstractContainerPanel.java deleted file mode 100644 index 0355ce01b92..00000000000 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/AbstractContainerPanel.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2015-2017 PÂRIS Quentin - * - * 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 2 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.phoenicis.javafx.views.mainwindow.containers; - -import javafx.scene.control.TabPane; -import org.phoenicis.containers.dto.ContainerDTO; -import org.phoenicis.javafx.views.common.widgets.lists.DetailsView; - -abstract class AbstractContainerPanel extends DetailsView { - protected final TabPane tabPane; - - AbstractContainerPanel(T containerEntity) { - this.tabPane = new TabPane(); - - this.setTitle(containerEntity.getName()); - this.setCenter(tabPane); - } -} diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java index 983d02c7684..4bd94c93c1c 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java @@ -7,7 +7,7 @@ import javafx.scene.layout.TilePane; import javafx.scene.layout.VBox; import javafx.scene.text.Text; -import org.phoenicis.containers.dto.WinePrefixContainerDTO; +import org.phoenicis.containers.dto.ContainerDTO; import org.phoenicis.engines.EngineToolsManager; import org.phoenicis.javafx.views.common.ErrorMessage; import org.phoenicis.javafx.views.common.TextWithStyle; @@ -26,14 +26,14 @@ public class ContainerEngineToolsTab extends Tab { private static final String CONFIGURATION_PANE_CSS_CLASS = "containerConfigurationPane"; private static final String TITLE_CSS_CLASS = "title"; - private final WinePrefixContainerDTO container; + private final ContainerDTO container; private EngineToolsManager engineToolsManager; private final List lockableElements = new ArrayList<>(); - public ContainerEngineToolsTab(WinePrefixContainerDTO container, EngineToolsManager engineToolsManager, + public ContainerEngineToolsTab(ContainerDTO container, EngineToolsManager engineToolsManager, ApplicationDTO engineTools) { - super(tr("Wine tools")); + super(tr("Engine tools")); this.container = container; this.engineToolsManager = engineToolsManager; @@ -45,7 +45,7 @@ public ContainerEngineToolsTab(WinePrefixContainerDTO container, EngineToolsMana private void populate(ApplicationDTO engineTools) { final VBox toolsPane = new VBox(); - final Text title = new TextWithStyle(tr("Wine tools"), TITLE_CSS_CLASS); + final Text title = new TextWithStyle(tr("Engine tools"), TITLE_CSS_CLASS); toolsPane.getStyleClass().add(CONFIGURATION_PANE_CSS_CLASS); toolsPane.getChildren().add(title); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java index 20e8b222794..938afce2117 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java @@ -8,6 +8,7 @@ import javafx.scene.layout.Region; import javafx.scene.layout.VBox; import javafx.scene.text.Text; +import org.phoenicis.containers.dto.ContainerDTO; import org.phoenicis.containers.dto.WinePrefixContainerDTO; import org.phoenicis.javafx.views.common.TextWithStyle; @@ -26,7 +27,7 @@ public class ContainerInformationTab extends Tab { private final WinePrefixContainerDTO container; - private Consumer onDeletePrefix; + private Consumer onDeletePrefix; public ContainerInformationTab(WinePrefixContainerDTO container) { super(tr("Information")); @@ -64,6 +65,7 @@ private void populate() { installedShortcuts.setWrapText(true); informationContentPane.add(installedShortcuts, 1, 2); + // TODO: find generic solution which works for all container types informationContentPane.add(new TextWithStyle(tr("Wine version:"), CAPTION_TITLE_CSS_CLASS), 0, 3); Label version = new Label(container.getVersion()); version.setWrapText(true); @@ -109,7 +111,7 @@ public EngineVersionDTO fromString(String string) { this.setContent(informationPane); } - public void setOnDeletePrefix(Consumer onDeletePrefix) { + public void setOnDeletePrefix(Consumer onDeletePrefix) { this.onDeletePrefix = onDeletePrefix; } } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanel.java index 814da4acb26..b1c791f0a80 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanel.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerPanel.java @@ -18,18 +18,20 @@ package org.phoenicis.javafx.views.mainwindow.containers; +import javafx.scene.control.TabPane; import org.phoenicis.containers.ContainerEngineController; +import org.phoenicis.containers.dto.ContainerDTO; import org.phoenicis.containers.dto.WinePrefixContainerDTO; import org.phoenicis.engines.EngineSetting; import org.phoenicis.engines.EngineToolsManager; +import org.phoenicis.javafx.views.common.widgets.lists.DetailsView; import org.phoenicis.repository.dto.ApplicationDTO; import java.util.List; import java.util.Optional; import java.util.function.Consumer; -// TODO: AbstractContainerPanel not needed anymore (ContainerPanel is generic) -public class ContainerPanel extends AbstractContainerPanel { +public class ContainerPanel extends DetailsView { private ContainerInformationTab informationTab; public ContainerPanel(WinePrefixContainerDTO containerEntity, @@ -37,25 +39,27 @@ public ContainerPanel(WinePrefixContainerDTO containerEntity, Optional> engineSettings, Optional engineTools, ContainerEngineController containerEngineController) { - super(containerEntity); + TabPane tabPane = new TabPane(); + this.setTitle(containerEntity.getName()); + this.setCenter(tabPane); this.informationTab = new ContainerInformationTab(containerEntity); - this.tabPane.getTabs().add(this.informationTab); + tabPane.getTabs().add(this.informationTab); if (engineSettings.isPresent()) { ContainerEngineSettingsTab settingsTab = new ContainerEngineSettingsTab(containerEntity, engineSettings.get()); - this.tabPane.getTabs().add(settingsTab); + tabPane.getTabs().add(settingsTab); } if (engineTools.isPresent()) { ContainerEngineToolsTab engineToolsTab = new ContainerEngineToolsTab(containerEntity, engineToolsManager, engineTools.get()); - this.tabPane.getTabs().add(engineToolsTab); + tabPane.getTabs().add(engineToolsTab); } ContainerToolsTab toolsTab = new ContainerToolsTab(containerEntity, containerEngineController); - this.tabPane.getTabs().add(toolsTab); + tabPane.getTabs().add(toolsTab); } - public void setOnDeletePrefix(Consumer onDeletePrefix) { + public void setOnDeletePrefix(Consumer onDeletePrefix) { this.informationTab.setOnDeletePrefix(onDeletePrefix); } } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java index 9389f0354f3..cfc1d548068 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java @@ -9,7 +9,7 @@ import javafx.scene.text.Text; import javafx.stage.FileChooser; import org.phoenicis.containers.ContainerEngineController; -import org.phoenicis.containers.dto.WinePrefixContainerDTO; +import org.phoenicis.containers.dto.ContainerDTO; import org.phoenicis.javafx.views.common.ErrorMessage; import org.phoenicis.javafx.views.common.TextWithStyle; @@ -26,12 +26,12 @@ public class ContainerToolsTab extends Tab { private static final String CONFIGURATION_PANE_CSS_CLASS = "containerConfigurationPane"; private static final String TITLE_CSS_CLASS = "title"; - private final WinePrefixContainerDTO container; + private final ContainerDTO container; private final ContainerEngineController containerEngineController; private final List lockableElements = new ArrayList<>(); - public ContainerToolsTab(WinePrefixContainerDTO container, + public ContainerToolsTab(ContainerDTO container, ContainerEngineController containerEngineController) { super(tr("Tools")); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java index 6ad836ed133..9d75500ebd3 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java @@ -113,7 +113,7 @@ public EnginesView(ThemeManager themeManager, String enginesPath, JavaFxSettings }); this.initFailure(); - this.initWineVersions(); + this.initEngineVersions(); this.sidebar.bindEngineCategories(engineCategories); Bindings.bindContent(availableEngines.getTabs(), filteredEngineSubTabs); @@ -149,7 +149,7 @@ private void initFailure() { } - private void initWineVersions() { + private void initEngineVersions() { availableEngines = new TabPane(); availableEngines.getStyleClass().add("rightPane"); From be6a66d1f244d3602c8333044220610e2b603f63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 9 May 2018 14:16:42 +0200 Subject: [PATCH 44/76] Bump spring.version from 5.0.5.RELEASE to 5.0.6.RELEASE (#1328) Bumps `spring.version` from 5.0.5.RELEASE to 5.0.6.RELEASE. Updates `org.springframework:spring-context` from 5.0.5.RELEASE to 5.0.6.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.0.5.RELEASE...v5.0.6.RELEASE) Updates `org.springframework:spring-core` from 5.0.5.RELEASE to 5.0.6.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.0.5.RELEASE...v5.0.6.RELEASE) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9b4406f46a5..3efa57dcaab 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,7 @@ 1.2.3 4.12 2.18.3 - 5.0.5.RELEASE + 5.0.6.RELEASE From 5f2199d6a6c8de2645bf465639d3045dd24697b4 Mon Sep 17 00:00:00 2001 From: plata Date: Wed, 9 May 2018 18:14:44 +0200 Subject: [PATCH 45/76] Themes: fix sidebar text colors (#1323) --- .../org/phoenicis/javafx/themes/breezeDark/main.less | 9 +++++++-- .../org/phoenicis/javafx/themes/dark/main.less | 8 ++++++-- .../org/phoenicis/javafx/themes/mint-x/main.less | 2 -- .../org/phoenicis/javafx/themes/unity/main.less | 10 ++++++++-- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/breezeDark/main.less b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/breezeDark/main.less index 3eaf0130ac3..ae867369a03 100644 --- a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/breezeDark/main.less +++ b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/breezeDark/main.less @@ -287,11 +287,16 @@ .sidebarTitle { -fx-font-size: 1.2em; - -fx-fill: @inactive-text-color; + + .text { + -fx-fill: @inactive-text-color; + } } .sidebarButton { - -fx-text-fill: @text-color; + .text { + -fx-fill: @text-color; + } &:hover, &:selected { -fx-background-color: @focus-color; diff --git a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/dark/main.less b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/dark/main.less index ac774afb56b..32bf6a2694f 100644 --- a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/dark/main.less +++ b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/dark/main.less @@ -61,11 +61,15 @@ } .sidebarTitle { - -fx-text-fill: @text-color; + .text { + -fx-fill: @text-color; + } } .sidebarButton { - -fx-text-fill: @text-color; + .text { + -fx-fill: @text-color; + } &:hover, &:selected { -fx-background-color: #9f9da6; diff --git a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/main.less b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/main.less index 78df8448f99..ab1eed54ac6 100644 --- a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/main.less +++ b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/mint-x/main.less @@ -32,8 +32,6 @@ -fx-text-inner-color: @text-color; } - - .text { -fx-fill: @text-color; } diff --git a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/unity/main.less b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/unity/main.less index 26858e5cf25..a23878efcdd 100644 --- a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/unity/main.less +++ b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/unity/main.less @@ -293,17 +293,23 @@ .sidebarTitle { -fx-padding: 0.83em 0.83em 0.4em 0.83em; -fx-font-size: 1.2em; - -fx-fill: #3c3b37; + + .text { + -fx-fill: #3c3b37; + } } .sidebarButton { -fx-border-color: transparent; - -fx-text-fill: @text-color; -fx-border-radius: 0; -fx-background-radius: 0; -fx-label-padding: 0 1.5em 0 3.03em; -fx-background-position: 0.83em 0.1em; + .text { + -fx-fill: @text-color; + } + &:hover { -fx-border-color: transparent; } From 87cf9dc9eaeaf390fa3af300ed11081114fa16f1 Mon Sep 17 00:00:00 2001 From: plata Date: Wed, 9 May 2018 18:15:35 +0200 Subject: [PATCH 46/76] Unlock "run executable" button (#1324) --- i18n/keys.pot | 12 ++++++------ .../mainwindow/containers/ContainerToolsTab.java | 3 +++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/i18n/keys.pot b/i18n/keys.pot index 73d32d4d94e..7bd012d5e64 100644 --- a/i18n/keys.pot +++ b/i18n/keys.pot @@ -537,21 +537,21 @@ msgstr "" msgid "Delete container" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:37 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:49 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:36 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:48 msgid "Tools" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:58 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:57 msgid "Run executable" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:63 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:62 msgid "Choose executable" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:37 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:49 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:36 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:48 msgid "Engine tools" msgstr "" diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java index cfc1d548068..5b49948f604 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java @@ -64,6 +64,9 @@ private void populate() { if (file != null) { containerEngineController.runInContainer(container, file.getAbsolutePath(), this::unlockAll, e -> Platform.runLater(() -> new ErrorMessage("Error", e).show())); + } else { + // unlock if file chooser is closed + this.unlockAll(); } }); From 9af74c1c73436596a56c2d368578c4497fa5d6fe Mon Sep 17 00:00:00 2001 From: plata Date: Wed, 9 May 2018 18:16:05 +0200 Subject: [PATCH 47/76] Set button icon for engine installation (#1325) for now simply use the Wine icon --- .../org/phoenicis/javafx/themes/breezeDark/main.less | 4 ++++ .../resources/org/phoenicis/javafx/themes/default/main.less | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/breezeDark/main.less b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/breezeDark/main.less index ae867369a03..084221e4b55 100644 --- a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/breezeDark/main.less +++ b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/breezeDark/main.less @@ -599,6 +599,10 @@ } /*********************** engines ***********************/ +#enginesButton { + -fx-background-image: url('/org/phoenicis/javafx/themes/breezeDark/icons/mainwindow/engines/wine.png'); +} + #wineButton { -fx-background-image: url('/org/phoenicis/javafx/themes/breezeDark/icons/mainwindow/engines/wine.png'); } diff --git a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/default/main.less b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/default/main.less index 7d0d5016ea3..a6a3c06ed5b 100644 --- a/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/default/main.less +++ b/phoenicis-javafx/src/main/resources/org/phoenicis/javafx/themes/default/main.less @@ -677,6 +677,10 @@ } /*********************** engines ***********************/ +#enginesButton { + -fx-background-image: url('/org/phoenicis/javafx/themes/default/icons/mainwindow/engines/wine.png'); +} + #wineButton { -fx-background-image: url('/org/phoenicis/javafx/themes/default/icons/mainwindow/engines/wine.png'); } From 53353100c3a36f71c60ff547ae7cdd437d274652 Mon Sep 17 00:00:00 2001 From: plata Date: Wed, 9 May 2018 18:16:42 +0200 Subject: [PATCH 48/76] Update .travis.yml (#1327) --- .travis.yml | 47 +++++++++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/.travis.yml b/.travis.yml index b97001cc2ec..f992375efba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,41 +6,36 @@ branches: only: master -addons: - apt: - packages: - - oracle-java8-installer - - oracle-java9-installer - -env: - global: - - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer - -matrix: +jobs: include: - # The normal tests - - jdk: oraclejdk8 - os: linux - dist: trusty - - jdk: oraclejdk9 + # Check format + - stage: Check format + # do not use default install (runs formatter) + install: true + script: mvn -Pcheck-formatted validate formatter:validate + + # build + test + - stage: Build + test os: linux dist: trusty - - os: osx - osx_image: xcode9.2 - - # Check the format - - stage: Check format jdk: oraclejdk8 + addons: + apt: + packages: oracle-java8-installer + - stage: Build + test os: linux dist: trusty - # do not use default install (runs formatter) - install: true - script: - - mvn -Pcheck-formatted validate formatter:validate + jdk: oraclejdk9 + addons: + apt: + packages: oracle-java9-installer + - stage: Build + test + os: osx + osx_image: xcode9.2 # Check GitHub Pages - stage: Check GitHub Pages - os: linux + env: NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer language: ruby rvm: - 2.5 From c3b91e8099ee62297db4f9bee6acbb4e16de7235 Mon Sep 17 00:00:00 2001 From: plata Date: Wed, 9 May 2018 18:38:58 +0200 Subject: [PATCH 49/76] Check if engine is installed (#1331) --- i18n/keys.pot | 23 ++-- .../engines/EngineSettingsManager.java | 6 +- .../org/phoenicis/engines/EnginesManager.java | 47 +++++++- .../controller/engines/EnginesController.java | 9 +- .../views/mainwindow/engines/EnginePanel.java | 11 +- .../engines/EngineSubCategoryTab.java | 18 ++-- .../views/mainwindow/engines/EnginesView.java | 100 ++++++++++-------- 7 files changed, 145 insertions(+), 69 deletions(-) diff --git a/i18n/keys.pot b/i18n/keys.pot index 7bd012d5e64..021eed1c03b 100644 --- a/i18n/keys.pot +++ b/i18n/keys.pot @@ -51,26 +51,27 @@ msgstr "" msgid "Error while creating shortcut" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:61 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:63 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:64 msgid "Loading engines failed." msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:78 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:81 #, java-format msgid "Install {0}" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:79 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:82 #, java-format msgid "Are you sure you want to install {0}?" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:92 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:95 #, java-format msgid "Delete {0}" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:93 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:96 #, java-format msgid "Are you sure you want to delete {0}" msgstr "" @@ -308,7 +309,7 @@ msgid "About" msgstr "" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java:72 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:56 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:59 msgid "Version:" msgstr "" @@ -428,24 +429,24 @@ msgstr "" msgid "Network" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:70 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:73 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationPanel.java:181 msgid "Install" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:76 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:79 msgid "Error while trying to install the engine" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:80 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:86 msgid "Delete" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:86 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:92 msgid "Error while trying to delete the engine" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java:78 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java:82 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:120 msgid "Engines" msgstr "" diff --git a/phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSettingsManager.java b/phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSettingsManager.java index eb85b372424..a41a00a9d04 100644 --- a/phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSettingsManager.java +++ b/phoenicis-engines/src/main/java/org/phoenicis/engines/EngineSettingsManager.java @@ -70,7 +70,7 @@ public void fetchAvailableEngineSettings(RepositoryDTO repositoryDTO, Consumer>> callback, Consumer errorCallback) { final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); - interactiveScriptSession.eval(this.getFetchScript(repositoryDTO), + interactiveScriptSession.eval(this.createFetchScript(repositoryDTO), output -> callback.accept((Map>) output), errorCallback); } @@ -79,7 +79,7 @@ public void fetchAvailableEngineSettings(RepositoryDTO repositoryDTO, * @param repositoryDTO repository containing the settings * @return Javascript */ - private String getFetchScript(RepositoryDTO repositoryDTO) { + private String createFetchScript(RepositoryDTO repositoryDTO) { // get engine CategoryDTOs List categoryDTOS = new ArrayList<>(); for (TypeDTO typeDTO : repositoryDTO.getTypes()) { @@ -107,7 +107,7 @@ private String getFetchScript(RepositoryDTO repositoryDTO) { } } script.append("return settings;\n"); - script.append("})()\n;"); + script.append("})();\n"); return script.toString(); } diff --git a/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesManager.java b/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesManager.java index 8d0bfd10365..c0fad62e541 100644 --- a/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesManager.java +++ b/phoenicis-engines/src/main/java/org/phoenicis/engines/EnginesManager.java @@ -23,7 +23,7 @@ import org.phoenicis.configuration.security.Safe; import org.phoenicis.engines.dto.EngineCategoryDTO; import org.phoenicis.engines.dto.EngineSubCategoryDTO; -import org.phoenicis.repository.dto.CategoryDTO; +import org.phoenicis.repository.dto.*; import org.phoenicis.scripts.interpreter.InteractiveScriptSession; import org.phoenicis.scripts.interpreter.ScriptInterpreter; import org.slf4j.Logger; @@ -33,6 +33,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.function.Consumer; /** @@ -117,4 +118,48 @@ private List unSerialize(Object json) { } } + /** + * fetches the available engines + * @param repositoryDTO + * @param callback + * @param errorCallback callback which will be executed if an error occurs + */ + public void fetchAvailableEngines(RepositoryDTO repositoryDTO, + Consumer> callback, Consumer errorCallback) { + final InteractiveScriptSession interactiveScriptSession = scriptInterpreter.createInteractiveSession(); + + interactiveScriptSession.eval(this.createFetchScript(repositoryDTO), + output -> callback.accept((Map) output), errorCallback); + } + + /** + * retrieves a Javascript string which can be used to fetch the available engines + * @param repositoryDTO repository containing the engines + * @return Javascript + */ + private String createFetchScript(RepositoryDTO repositoryDTO) { + // get engine CategoryDTOs + List categoryDTOS = new ArrayList<>(); + for (TypeDTO typeDTO : repositoryDTO.getTypes()) { + if (typeDTO.getId().equals("engines")) { + categoryDTOS = typeDTO.getCategories(); + } + } + StringBuilder script = new StringBuilder(); + script.append("(function () {\n"); + script.append("var engines = {};\n"); + for (CategoryDTO engine : categoryDTOS) { + final String engineId = engine.getId(); + script.append("include([\"engines\", \"" + engineId + "\", \"engine\", \"implementation\"]);\n"); + script.append("if (!(\"" + engineId + "\" in engines))\n"); + script.append("{\n"); + script.append("engines[\"" + engineId + "\"] = new Engine();\n"); + script.append("}\n"); + } + script.append("return engines;\n"); + script.append("})();\n"); + + return script.toString(); + } + } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java index 224ec4f2eb0..2dc2602d449 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java @@ -19,6 +19,7 @@ package org.phoenicis.javafx.controller.engines; import javafx.application.Platform; +import org.phoenicis.engines.Engine; import org.phoenicis.engines.EnginesManager; import org.phoenicis.engines.dto.EngineSubCategoryDTO; import org.phoenicis.javafx.controller.apps.AppsController; @@ -57,7 +58,9 @@ public EnginesController(EnginesView enginesView, RepositoryManager repositoryMa this.enginesManager = enginesManager; this.themeManager = themeManager; - this.repositoryManager.addCallbacks(this::populateView, + this.repositoryManager.addCallbacks(repositoryDTO -> this.enginesManager.fetchAvailableEngines(repositoryDTO, + engines -> this.populateView(repositoryDTO, engines), + e -> Platform.runLater(() -> enginesView.showFailure(tr("Loading engines failed."), Optional.of(e)))), e -> Platform.runLater(() -> enginesView.showFailure(tr("Loading engines failed."), Optional.of(e)))); this.enginesView.setOnSelectEngineCategory(engineCategoryDTO -> { @@ -107,7 +110,7 @@ public EnginesView getView() { return enginesView; } - private void populateView(RepositoryDTO repositoryDTO) { + private void populateView(RepositoryDTO repositoryDTO, Map engines) { Platform.runLater(() -> { List categoryDTOS = new ArrayList<>(); for (TypeDTO typeDTO : repositoryDTO.getTypes()) { @@ -116,7 +119,7 @@ private void populateView(RepositoryDTO repositoryDTO) { } } setDefaultEngineIcons(categoryDTOS); - this.enginesView.populate(this.enginesManager.getAvailableEngines(categoryDTOS)); + this.enginesView.populate(this.enginesManager.getAvailableEngines(categoryDTOS), engines); }); } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java index 29fbbd37b42..8136daf2279 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java @@ -21,6 +21,7 @@ import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.*; +import org.phoenicis.engines.Engine; import org.phoenicis.engines.dto.EngineDTO; import org.phoenicis.javafx.views.common.ErrorMessage; import org.phoenicis.javafx.views.common.TextWithStyle; @@ -37,14 +38,16 @@ final class EnginePanel extends DetailsView { private static final String CAPTION_TITLE_CSS_CLASS = "captionTitle"; private final Logger LOGGER = LoggerFactory.getLogger(EnginePanel.class); private final EngineDTO engineDTO; + private Engine engine; private Consumer onEngineInstall; private Consumer onEngineDelete; - public EnginePanel(EngineDTO engineDTO) { + public EnginePanel(EngineDTO engineDTO, Engine engine) { super(); this.engineDTO = engineDTO; + this.engine = engine; this.populateContent(); } @@ -76,6 +79,9 @@ private void populateContent() { new ErrorMessage(tr("Error while trying to install the engine"), e).show(); } }); + if (this.engine.isInstalled(this.engineDTO.getSubCategory(), this.engineDTO.getVersion())) { + installButton.setDisable(true); + } Button deleteButton = new Button(tr("Delete")); deleteButton.setOnMouseClicked(evt -> { @@ -86,6 +92,9 @@ private void populateContent() { new ErrorMessage(tr("Error while trying to delete the engine"), e).show(); } }); + if (!this.engine.isInstalled(this.engineDTO.getSubCategory(), this.engineDTO.getVersion())) { + deleteButton.setDisable(true); + } Region spacer = new Region(); spacer.getStyleClass().add("engineSpacer"); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EngineSubCategoryTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EngineSubCategoryTab.java index 665b3eb851a..b24c89dab0d 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EngineSubCategoryTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EngineSubCategoryTab.java @@ -4,6 +4,7 @@ import javafx.collections.ObservableList; import javafx.collections.transformation.SortedList; import javafx.scene.control.Tab; +import org.phoenicis.engines.Engine; import org.phoenicis.engines.dto.EngineCategoryDTO; import org.phoenicis.engines.dto.EngineDTO; import org.phoenicis.engines.dto.EngineSubCategoryDTO; @@ -16,7 +17,7 @@ import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; -import java.util.function.Consumer; +import java.util.function.BiConsumer; import java.util.function.Predicate; /** @@ -30,6 +31,7 @@ public class EngineSubCategoryTab extends Tab { private EngineCategoryDTO engineCategory; private EngineSubCategoryDTO engineSubCategory; private String enginesPath; + private Engine engine; private Predicate filterPredicate; @@ -39,7 +41,7 @@ public class EngineSubCategoryTab extends Tab { private SortedList sortedEngineVersions; private PhoenicisFilteredList filteredEngineVersions; - private Consumer onSelectEngine; + private BiConsumer onSelectEngine; /** * Constructor @@ -48,13 +50,17 @@ public class EngineSubCategoryTab extends Tab { * @param engineSubCategory The engine sub category to be shown in this tab * @param enginesPath The path to the engines */ - public EngineSubCategoryTab(EngineCategoryDTO engineCategory, EngineSubCategoryDTO engineSubCategory, - String enginesPath, EnginesFilter filter) { + public EngineSubCategoryTab(EngineCategoryDTO engineCategory, + EngineSubCategoryDTO engineSubCategory, + String enginesPath, + EnginesFilter filter, + Engine engine) { super(engineSubCategory.getDescription()); this.engineCategory = engineCategory; this.engineSubCategory = engineSubCategory; this.enginesPath = enginesPath; + this.engine = engine; this.filterPredicate = filter.createFilter(engineCategory, engineSubCategory); @@ -89,7 +95,7 @@ private void populate() { .withSubCategory(engineSubCategory.getName()).withVersion(engineVersionDTO.getVersion()) .withUserData(userData).build(); - onSelectEngine.accept(engineDTO); + onSelectEngine.accept(engineDTO, engine); }); this.engineVersionsView.bind(filteredEngineVersions); @@ -100,7 +106,7 @@ private void populate() { * * @param onSelectEngine */ - public void setOnSelectEngine(Consumer onSelectEngine) { + public void setOnSelectEngine(BiConsumer onSelectEngine) { this.onSelectEngine = onSelectEngine; } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java index 9d75500ebd3..a3b5905ce54 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java @@ -24,6 +24,8 @@ import javafx.collections.ObservableList; import javafx.collections.transformation.SortedList; import javafx.scene.control.TabPane; +import java.util.Map; +import org.phoenicis.engines.Engine; import org.phoenicis.engines.dto.EngineCategoryDTO; import org.phoenicis.engines.dto.EngineDTO; import org.phoenicis.engines.dto.EngineSubCategoryDTO; @@ -48,6 +50,7 @@ */ public class EnginesView extends MainWindowView { private final EnginesFilter filter; + private JavaFxSettingsManager javaFxSettingsManager; private TabPane availableEngines; @@ -67,6 +70,7 @@ public class EnginesView extends MainWindowView { }; private Consumer onSelectEngineCategory = (engineCategory) -> { }; + private String enginesPath; /** * constructor @@ -77,48 +81,10 @@ public class EnginesView extends MainWindowView { public EnginesView(ThemeManager themeManager, String enginesPath, JavaFxSettingsManager javaFxSettingsManager) { super(tr("Engines"), themeManager); - this.filter = new EnginesFilter(enginesPath); - - /* - * initialize the engine categories list - */ - this.engineCategories = FXCollections.observableArrayList(); - - // initialize the engines sub category tabs - this.engineSubCategoryTabs = new ExpandedList<>(engineCategories, - engineCategory -> engineCategory.getSubCategories().stream() - .map(engineSubCategory -> { - EngineSubCategoryTab result = new EngineSubCategoryTab(engineCategory, engineSubCategory, - enginesPath, - filter); + this.enginesPath = enginesPath; + this.javaFxSettingsManager = javaFxSettingsManager; - result.setOnSelectEngine(this::showEngineDetails); - - return result; - }).collect(Collectors.toList())); - // sort the engine sub category tabs alphabetically - this.sortedEngineSubTabs = new SortedList<>(engineSubCategoryTabs, - Comparator.comparing(engineSubCategoryTab -> engineSubCategoryTab.getEngineSubCategory().getName())); - // filter the engine sub category tabs, so that only the visible tabs remain - this.filteredEngineSubTabs = new PhoenicisFilteredList<>(sortedEngineSubTabs, filter::filter); - this.filter.addOnFilterChanged(filteredEngineSubTabs::trigger); - - this.mappedListWidgets = new MappedList<>(filteredEngineSubTabs, EngineSubCategoryTab::getEngineVersionsView); - - this.sidebar = new EnginesSidebar(mappedListWidgets, filter, javaFxSettingsManager); - - this.sidebar.setOnCategorySelection(engineCategoryDTO -> { - this.onSelectEngineCategory.accept(engineCategoryDTO); - this.filter.setSelectedEngineCategory(engineCategoryDTO); - }); - - this.initFailure(); - this.initEngineVersions(); - - this.sidebar.bindEngineCategories(engineCategories); - Bindings.bindContent(availableEngines.getTabs(), filteredEngineSubTabs); - - this.setSidebar(this.sidebar); + this.filter = new EnginesFilter(enginesPath); } /** @@ -160,7 +126,53 @@ private void initEngineVersions() { * inits the view with the given engines * @param engineCategoryDTOS */ - public void populate(List engineCategoryDTOS) { + public void populate(List engineCategoryDTOS, Map engines) { + + /* + * initialize the engine categories list + */ + this.engineCategories = FXCollections.observableArrayList(); + + // initialize the engines sub category tabs + this.engineSubCategoryTabs = new ExpandedList<>(engineCategories, + engineCategory -> engineCategory + .getSubCategories() + .stream() + .map(engineSubCategory -> { + EngineSubCategoryTab result = new EngineSubCategoryTab(engineCategory, engineSubCategory, + enginesPath, + filter, + engines.get(engineCategory.getName().toLowerCase())); + + result.setOnSelectEngine(this::showEngineDetails); + + return result; + }) + .collect(Collectors.toList())); + // sort the engine sub category tabs alphabetically + this.sortedEngineSubTabs = new SortedList<>(engineSubCategoryTabs, + Comparator.comparing(engineSubCategoryTab -> engineSubCategoryTab.getEngineSubCategory().getName())); + // filter the engine sub category tabs, so that only the visible tabs remain + this.filteredEngineSubTabs = new PhoenicisFilteredList<>(sortedEngineSubTabs, filter::filter); + this.filter.addOnFilterChanged(filteredEngineSubTabs::trigger); + + this.mappedListWidgets = new MappedList<>(filteredEngineSubTabs, EngineSubCategoryTab::getEngineVersionsView); + + this.sidebar = new EnginesSidebar(mappedListWidgets, filter, javaFxSettingsManager); + + this.sidebar.setOnCategorySelection(engineCategoryDTO -> { + this.onSelectEngineCategory.accept(engineCategoryDTO); + this.filter.setSelectedEngineCategory(engineCategoryDTO); + }); + + this.initFailure(); + this.initEngineVersions(); + + this.sidebar.bindEngineCategories(engineCategories); + Bindings.bindContent(availableEngines.getTabs(), filteredEngineSubTabs); + + this.setSidebar(this.sidebar); + Platform.runLater(() -> { this.engineCategories.setAll(engineCategoryDTOS); @@ -192,8 +204,8 @@ public void updateVersions(EngineCategoryDTO engineCategoryDTO, List Date: Wed, 9 May 2018 18:41:51 +0200 Subject: [PATCH 50/76] Update "run in container" (#1321) open file chooser in container directory --- .../views/mainwindow/containers/ContainerToolsTab.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java index 5b49948f604..4b25a00e6a8 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java @@ -60,6 +60,13 @@ private void populate() { this.lockAll(); FileChooser fileChooser = new FileChooser(); fileChooser.setTitle(tr("Choose executable")); + + // open in container directory if it exists + File containerDir = new File(this.container.getPath()); + if (containerDir.canRead()) { + fileChooser.setInitialDirectory(containerDir); + } + File file = fileChooser.showOpenDialog(this.getContent().getScene().getWindow()); if (file != null) { containerEngineController.runInContainer(container, file.getAbsolutePath(), this::unlockAll, From 6ec09d7d1897c4491c446b93ef33db81def40978 Mon Sep 17 00:00:00 2001 From: plata Date: Wed, 9 May 2018 18:42:53 +0200 Subject: [PATCH 51/76] Update "create shortcut" (#1322) open file choosers for miniature and executable in containers directory (usually ~/.Phoenicis/containers) --- i18n/keys.pot | 30 +++++++++---------- .../library/CreateShortcutPanel.java | 30 +++++++++++++++---- .../views/mainwindow/library/LibraryView.java | 7 +++-- .../library/ViewsConfigurationLibrary.java | 4 +++ 4 files changed, 49 insertions(+), 22 deletions(-) diff --git a/i18n/keys.pot b/i18n/keys.pot index 021eed1c03b..0bcd3b3f6d2 100644 --- a/i18n/keys.pot +++ b/i18n/keys.pot @@ -182,65 +182,65 @@ msgstr "" msgid "Uninstall" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:78 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:81 msgid "Library" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:151 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:154 msgid "My applications" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:68 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:71 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java:69 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:52 msgid "Name:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:76 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:79 msgid "Please specify a name!" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:79 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:82 msgid "Category:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:87 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:90 msgid "Please specify a category!" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:90 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:93 msgid "Description:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:99 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:102 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java:105 msgid "Miniature:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:106 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:129 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:109 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:141 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java:112 msgid "Choose" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:109 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:119 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java:115 msgid "Images" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:119 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:131 msgid "Please specify a valid miniature!" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:122 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:134 msgid "Executable:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:141 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:161 msgid "Please specify a valid executable!" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:146 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:166 msgid "Create" msgstr "" diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java index 7989eb8c1fe..77a8c6bce4e 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java @@ -39,15 +39,18 @@ */ final class CreateShortcutPanel extends DetailsView { private static final String CAPTION_TITLE_CSS_CLASS = "captionTitle"; + private final String containersPath; // consumer called when a shortcut shall be created private Consumer onCreateShortcut; /** * constructor + * @param containersPath path to containers (usually ~/.Phoenicis/containers) */ - public CreateShortcutPanel() { + public CreateShortcutPanel(String containersPath) { super(); + this.containersPath = containersPath; this.populate(); } @@ -106,10 +109,19 @@ public void populate() { Button openMiniatureBrowser = new Button(tr("Choose")); openMiniatureBrowser.setOnAction(event -> { FileChooser chooser = new FileChooser(); + + // open in containers directory if it exists + File containersDir = new File(this.containersPath); + if (containersDir.canRead()) { + chooser.setInitialDirectory(containersDir); + } + chooser.setSelectedExtensionFilter(new FileChooser.ExtensionFilter(tr("Images"), "*.miniature, *.png")); - File newMiniature = chooser.showOpenDialog(null); - miniature.setText(newMiniature.toString()); + File newMiniature = chooser.showOpenDialog(this.getScene().getWindow()); + if (newMiniature != null) { + miniature.setText(newMiniature.toString()); + } }); HBox miniatureHbox = new HBox(miniature, openMiniatureBrowser); @@ -130,8 +142,16 @@ public void populate() { openExecutableBrowser.setOnAction(event -> { FileChooser chooser = new FileChooser(); - File newMiniature = chooser.showOpenDialog(null); - executable.setText(newMiniature.toString()); + // open in containers directory if it exists + File containersDir = new File(this.containersPath); + if (containersDir.canRead()) { + chooser.setInitialDirectory(containersDir); + } + + File newExecutable = chooser.showOpenDialog(this.getScene().getWindow()); + if (newExecutable != null) { + executable.setText(newExecutable.toString()); + } }); HBox executableHbox = new HBox(executable, openExecutableBrowser); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java index 95d94be07f4..b324df3370f 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java @@ -73,7 +73,10 @@ public class LibraryView extends MainWindowView { private Consumer onShortcutEdit = shortcut -> { }; - public LibraryView(String applicationName, ThemeManager themeManager, ObjectMapper objectMapper, + public LibraryView(String applicationName, + String containersPath, + ThemeManager themeManager, + ObjectMapper objectMapper, JavaFxSettingsManager javaFxSettingsManager) { super(tr("Library"), themeManager); this.getStyleClass().add("mainWindowScene"); @@ -155,7 +158,7 @@ public LibraryView(String applicationName, ThemeManager themeManager, ObjectMapp this.setCenter(this.libraryTabs); this.libraryPanel = new LibraryPanel(objectMapper); - this.createShortcutPanel = new CreateShortcutPanel(); + this.createShortcutPanel = new CreateShortcutPanel(containersPath); this.editShortcutPanel = new EditShortcutPanel(objectMapper); } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/ViewsConfigurationLibrary.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/ViewsConfigurationLibrary.java index 83c016fa703..93e375eb11f 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/ViewsConfigurationLibrary.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/ViewsConfigurationLibrary.java @@ -32,6 +32,9 @@ public class ViewsConfigurationLibrary { @Value("${application.name}") private String applicationName; + @Value("${application.user.containers}") + private String containersPath; + @Autowired private ThemeConfiguration themeConfiguration; @@ -44,6 +47,7 @@ public class ViewsConfigurationLibrary { @Bean public LibraryView viewLibrary() { return new LibraryView(applicationName, + containersPath, themeConfiguration.themeManager(), phoenicisGlobalConfiguration.objectMapper(), javaFxSettingsConfiguration.javaFxSettingsManager()); From 44d637ca9a93983fb0fbab42a89e53659889ef67 Mon Sep 17 00:00:00 2001 From: plata Date: Wed, 9 May 2018 18:43:38 +0200 Subject: [PATCH 52/76] Add sortpom Maven plugin (#1329) --- phoenicis-cli/pom.xml | 22 +--- phoenicis-configuration/pom.xml | 26 +--- phoenicis-containers/pom.xml | 20 +--- phoenicis-dist/pom.xml | 74 ++++++------ phoenicis-engines/pom.xml | 13 +- phoenicis-entities/pom.xml | 13 +- phoenicis-javafx/pom.xml | 200 +++++++++++++------------------ phoenicis-library/pom.xml | 20 +--- phoenicis-multithreading/pom.xml | 15 +-- phoenicis-repository/pom.xml | 33 ++--- phoenicis-scripts/pom.xml | 19 +-- phoenicis-settings/pom.xml | 20 +--- phoenicis-tests/pom.xml | 18 +-- phoenicis-tools/pom.xml | 32 +---- phoenicis-win32/pom.xml | 17 +-- pom.xml | 70 ++++++----- 16 files changed, 203 insertions(+), 409 deletions(-) diff --git a/phoenicis-cli/pom.xml b/phoenicis-cli/pom.xml index dc17f92c99b..d09602e32f0 100644 --- a/phoenicis-cli/pom.xml +++ b/phoenicis-cli/pom.xml @@ -16,97 +16,79 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-cli - ${project.basedir}/../settings - org.phoenicis phoenicis-configuration ${project.version} - org.phoenicis phoenicis-repository ${project.version} - org.phoenicis phoenicis-scripts ${project.version} - org.phoenicis phoenicis-library ${project.version} - org.phoenicis phoenicis-engines ${project.version} - org.slf4j slf4j-api ${slf4j.version} - ch.qos.logback logback-classic ${logback.version} - org.springframework spring-context ${spring.version} - org.springframework spring-core ${spring.version} - com.github.jankroken commandline 1.7.0 - junit junit ${junit.version} test - org.mockito mockito-core test - org.jsoup jsoup diff --git a/phoenicis-configuration/pom.xml b/phoenicis-configuration/pom.xml index 4ab05a30329..0a959817174 100644 --- a/phoenicis-configuration/pom.xml +++ b/phoenicis-configuration/pom.xml @@ -16,37 +16,28 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-configuration - ${project.basedir}/../settings - - org.springframework spring-context ${spring.version} - org.springframework spring-core ${spring.version} - org.fedorahosted.tennera jgettext @@ -57,52 +48,44 @@ guava 25.0-jre - com.fasterxml.jackson.core jackson-databind - com.googlecode.gettext-commons gettext-commons 0.9.8 - junit junit - org.mockito mockito-core - org.powermock powermock-module-junit4 2.0.0-beta.5 test - org.powermock powermock-api-mockito2 2.0.0-beta.5 test - - src/main/resources - src/main/resources-filtered true + src/main/resources-filtered @@ -129,5 +112,4 @@ - - \ No newline at end of file + diff --git a/phoenicis-containers/pom.xml b/phoenicis-containers/pom.xml index 5c18dc1ae25..a83915213a4 100644 --- a/phoenicis-containers/pom.xml +++ b/phoenicis-containers/pom.xml @@ -16,76 +16,62 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-containers - ${project.basedir}/../settings - org.springframework spring-context ${spring.version} - org.springframework spring-core ${spring.version} - junit junit - org.phoenicis phoenicis-engines 5.0-SNAPSHOT compile - org.phoenicis phoenicis-entities ${project.version} - org.phoenicis phoenicis-library ${project.version} - org.phoenicis phoenicis-scripts ${project.version} - org.phoenicis phoenicis-settings 5.0-SNAPSHOT - org.phoenicis phoenicis-tools ${project.version} - \ No newline at end of file + diff --git a/phoenicis-dist/pom.xml b/phoenicis-dist/pom.xml index 729359d7a3d..7c0cbc30217 100644 --- a/phoenicis-dist/pom.xml +++ b/phoenicis-dist/pom.xml @@ -1,3 +1,4 @@ + - - - 4.0.0 - - org.phoenicis - phoenicis - 5.0-SNAPSHOT - - phoenicis-dist - + + 4.0.0 + + phoenicis + org.phoenicis + 5.0-SNAPSHOT + + phoenicis-dist ${project.basedir}/../settings - org.phoenicis @@ -42,30 +39,29 @@ ${project.version} - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.0 - - - distribution - package - - single - - - false - ${project.name} - - src/assembly/distribution.xml - - - - - + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + distribution + package + + single + + + false + ${project.name} + + src/assembly/distribution.xml + + + + + maven-dependency-plugin @@ -81,8 +77,8 @@ - jdeb org.vafer + jdeb 1.6 @@ -148,5 +144,5 @@ - - \ No newline at end of file + + diff --git a/phoenicis-engines/pom.xml b/phoenicis-engines/pom.xml index af76d854b16..e6895a4b536 100644 --- a/phoenicis-engines/pom.xml +++ b/phoenicis-engines/pom.xml @@ -16,23 +16,17 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-engines - ${project.basedir}/../settings - org.phoenicis @@ -40,5 +34,4 @@ ${project.version} - - \ No newline at end of file + diff --git a/phoenicis-entities/pom.xml b/phoenicis-entities/pom.xml index d72edcf1e17..319b5daf1f1 100644 --- a/phoenicis-entities/pom.xml +++ b/phoenicis-entities/pom.xml @@ -16,22 +16,15 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-entities - ${project.basedir}/../settings - - - \ No newline at end of file + diff --git a/phoenicis-javafx/pom.xml b/phoenicis-javafx/pom.xml index 31d298db11c..83b0dd303ff 100644 --- a/phoenicis-javafx/pom.xml +++ b/phoenicis-javafx/pom.xml @@ -16,23 +16,98 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-javafx - ${project.basedir}/../settings 4.0.12-alpha - + + + org.phoenicis + phoenicis-configuration + ${project.version} + + + org.phoenicis + phoenicis-repository + ${project.version} + + + org.phoenicis + phoenicis-scripts + ${project.version} + + + org.phoenicis + phoenicis-library + ${project.version} + + + org.phoenicis + phoenicis-engines + ${project.version} + + + org.phoenicis + phoenicis-containers + ${project.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-core + ${spring.version} + + + junit + junit + ${junit.version} + test + + + org.testfx + testfx-core + ${testfx.version} + test + + + org.testfx + testfx-junit + ${testfx.version} + test + + + org.phoenicis + phoenicis-settings + ${project.version} + + + me.xdrop + fuzzywuzzy + 1.1.10 + + @@ -41,11 +116,9 @@ 2.21.0 -Djava.awt.headless=true -Dtestfx.robot=glass -Dtestfx.headless=true -Dprism.order=sw - -Dprism.text=t2k - + -Dprism.text=t2k - biz.gabrys.maven.plugins lesscss-maven-plugin @@ -62,7 +135,6 @@ - org.codehaus.mojo exec-maven-plugin @@ -73,7 +145,6 @@ - - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-library - ${project.basedir}/../settings - org.phoenicis phoenicis-scripts ${project.version} - org.slf4j slf4j-api ${slf4j.version} - org.springframework spring-context ${spring.version} - org.springframework spring-core ${spring.version} - com.fasterxml.jackson.core jackson-databind 2.8.8.1 - commons-io commons-io 2.6 - - - - \ No newline at end of file + diff --git a/phoenicis-multithreading/pom.xml b/phoenicis-multithreading/pom.xml index 60e53cf9444..3327bca7f96 100644 --- a/phoenicis-multithreading/pom.xml +++ b/phoenicis-multithreading/pom.xml @@ -16,36 +16,28 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-multithreading - ${project.basedir}/../settings - org.slf4j slf4j-api ${slf4j.version} - org.springframework spring-context ${spring.version} - org.springframework spring-core @@ -56,7 +48,6 @@ commons-lang 2.6 - junit junit @@ -66,4 +57,4 @@ mockito-core - \ No newline at end of file + diff --git a/phoenicis-repository/pom.xml b/phoenicis-repository/pom.xml index ca1c3a61894..0f680ed2b2b 100644 --- a/phoenicis-repository/pom.xml +++ b/phoenicis-repository/pom.xml @@ -16,98 +16,79 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-repository - ${project.basedir}/../settings - - org.phoenicis phoenicis-entities ${project.version} - org.phoenicis phoenicis-multithreading ${project.version} - org.phoenicis phoenicis-tools ${project.version} - org.slf4j slf4j-api ${slf4j.version} - org.springframework spring-context ${spring.version} - org.springframework spring-core ${spring.version} - - junit junit 4.12 test - org.mockito mockito-all 1.10.19 test - commons-lang commons-lang 2.6 - commons-io commons-io 2.6 - com.fasterxml.jackson.core jackson-databind 2.8.8.1 - - - org.eclipse.jgit - org.eclipse.jgit - 4.11.0.201803080745-r - - + + org.eclipse.jgit + org.eclipse.jgit + 4.11.0.201803080745-r + diff --git a/phoenicis-scripts/pom.xml b/phoenicis-scripts/pom.xml index 95a3514fc73..7cfc8507b18 100644 --- a/phoenicis-scripts/pom.xml +++ b/phoenicis-scripts/pom.xml @@ -16,54 +16,43 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-scripts - ${project.basedir}/../settings - org.springframework spring-context ${spring.version} - org.springframework spring-core ${spring.version} - org.phoenicis phoenicis-tools ${project.version} - org.phoenicis phoenicis-repository ${project.version} - org.phoenicis phoenicis-configuration ${project.version} - commons-io commons-io @@ -79,7 +68,5 @@ phoenicis-multithreading 5.0-SNAPSHOT - - - \ No newline at end of file + diff --git a/phoenicis-settings/pom.xml b/phoenicis-settings/pom.xml index 293e284f4fd..73f23336f3d 100644 --- a/phoenicis-settings/pom.xml +++ b/phoenicis-settings/pom.xml @@ -16,61 +16,47 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-settings - ${project.basedir}/../settings - org.phoenicis phoenicis-scripts ${project.version} - org.slf4j slf4j-api ${slf4j.version} - org.springframework spring-context ${spring.version} - org.springframework spring-core ${spring.version} - com.fasterxml.jackson.core jackson-databind 2.8.8.1 - commons-io commons-io 2.6 - - - - \ No newline at end of file + diff --git a/phoenicis-tests/pom.xml b/phoenicis-tests/pom.xml index 1c205ce40ab..155565e5207 100644 --- a/phoenicis-tests/pom.xml +++ b/phoenicis-tests/pom.xml @@ -16,59 +16,47 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-tests - ${project.basedir}/../settings - org.springframework spring-core ${spring.version} - org.springframework spring-context ${spring.version} - org.phoenicis phoenicis-repository ${project.version} - org.phoenicis phoenicis-cli ${project.version} - org.phoenicis phoenicis-scripts ${project.version} - junit junit test - - \ No newline at end of file + diff --git a/phoenicis-tools/pom.xml b/phoenicis-tools/pom.xml index bd17bbcdc4e..93544e318cf 100644 --- a/phoenicis-tools/pom.xml +++ b/phoenicis-tools/pom.xml @@ -16,107 +16,87 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-tools - ${project.basedir}/../settings - org.phoenicis phoenicis-entities ${project.version} - org.phoenicis phoenicis-configuration ${project.version} - org.phoenicis phoenicis-win32 ${project.version} - - commons-codec commons-codec 1.11 - commons-io commons-io 2.6 - jmimemagic jmimemagic 0.1.2 - log4j log4j + log4j - org.apache.commons commons-compress 1.16.1 - commons-lang commons-lang 2.6 - com.fasterxml.jackson.core jackson-databind 2.8.8.1 - org.bouncycastle bcpg-jdk16 ${org.bouncycastle.version} - org.bouncycastle bcmail-jdk16 ${org.bouncycastle.version} - junit junit - org.mockito mockito-core - org.mock-server mockserver-netty @@ -124,12 +104,10 @@ test - org.bouncycastle bcprov-jdk15on + org.bouncycastle - - - \ No newline at end of file + diff --git a/phoenicis-win32/pom.xml b/phoenicis-win32/pom.xml index 502efb881bf..ff1a05e627a 100644 --- a/phoenicis-win32/pom.xml +++ b/phoenicis-win32/pom.xml @@ -16,48 +16,38 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + + 4.0.0 phoenicis org.phoenicis 5.0-SNAPSHOT - 4.0.0 - phoenicis-win32 - ${project.basedir}/../settings - commons-io commons-io 2.6 - commons-lang commons-lang 2.6 - org.springframework spring-core ${spring.version} - org.springframework spring-context ${spring.version} - junit junit @@ -69,5 +59,4 @@ compile - - \ No newline at end of file + diff --git a/pom.xml b/pom.xml index 3efa57dcaab..f60d95b2ea9 100644 --- a/pom.xml +++ b/pom.xml @@ -16,18 +16,12 @@ ~ with this program; if not, write to the Free Software Foundation, Inc., ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --> - - + 4.0.0 - org.phoenicis phoenicis - pom 5.0-SNAPSHOT - - scm:git:https://github.com/PhoenicisOrg/phoenicis.git - + pom phoenicis-javafx phoenicis-win32 @@ -45,7 +39,9 @@ phoenicis-containers phoenicis-tests - + + scm:git:https://github.com/PhoenicisOrg/phoenicis.git + ${project.basedir}/settings UTF-8 @@ -56,7 +52,6 @@ 2.18.3 5.0.6.RELEASE - @@ -65,28 +60,24 @@ ${junit.version} test - org.mockito mockito-core ${mockito.version} test - com.fasterxml.jackson.core jackson-databind 2.9.5 - - - com.googlecode.gettext-commons - gettext-commons - 0.9.8 - + + com.googlecode.gettext-commons + gettext-commons + 0.9.8 + - @@ -103,8 +94,7 @@ org.jacoco jacoco-maven-plugin - [0.5,) - + [0.5,) prepare-agent @@ -119,14 +109,13 @@ org.codehaus.mojo buildnumber-maven-plugin - [1.4,) - + [1.4,) create - + @@ -135,8 +124,24 @@ - + + com.github.ekryd.sortpom + sortpom-maven-plugin + 2.8.0 + + + validate + + sort + + + + + 4 + false + + org.codehaus.mojo versions-maven-plugin @@ -192,13 +197,6 @@ org.jacoco jacoco-maven-plugin 0.8.0 - - - - **/org/phoenicis/javafx/** - **/org/phoenicis/app/** - - agent @@ -207,6 +205,12 @@ + + + **/org/phoenicis/javafx/** + **/org/phoenicis/app/** + + com.google.code.maven-replacer-plugin @@ -236,7 +240,7 @@ check-formatted - false + false From 1c79b1d244f98ff1269c7723371f0d6b0fc4e9bb Mon Sep 17 00:00:00 2001 From: plata Date: Wed, 9 May 2018 19:03:30 +0200 Subject: [PATCH 53/76] Update formatter-maven-plugin to 2.7.2 (#1330) --- i18n/keys.pot | 12 ++--- .../localisation/Localisation.java | 3 +- .../localisation/Translatable.java | 4 +- .../localisation/TranslatableCreator.java | 3 +- .../configuration/localisation/Translate.java | 8 +-- .../containers/ContainersController.java | 2 +- .../javafx/views/common/lists/AdhocList.java | 6 ++- .../common/lists/PhoenicisFilteredList.java | 16 +++--- .../AdditionalListWidgetInformation.java | 5 +- .../widgets/lists/CombinedListWidget.java | 3 +- .../common/widgets/lists/ListWidgetEntry.java | 28 +++++----- .../lists/compact/CompactListElement.java | 9 ++-- .../lists/compact/CompactListWidget.java | 6 ++- .../lists/details/DetailsListElement.java | 10 ++-- .../lists/details/DetailsListWidget.java | 3 +- .../widgets/lists/icons/IconsListElement.java | 6 +-- .../widgets/lists/icons/IconsListWidget.java | 3 +- .../mainwindow/apps/ApplicationFilter.java | 2 +- .../mainwindow/apps/ApplicationPanel.java | 6 +-- .../mainwindow/apps/ApplicationsSidebar.java | 2 +- .../mainwindow/apps/ApplicationsView.java | 6 +-- .../containers/ContainerInformationTab.java | 37 +++++++------ .../containers/ContainersSidebar.java | 3 +- .../mainwindow/containers/ContainersView.java | 8 +-- .../engines/EngineSubCategoryTab.java | 7 +-- .../mainwindow/engines/EnginesFilter.java | 5 +- .../mainwindow/engines/EnginesSidebar.java | 8 +-- .../installations/InstallationsUtils.java | 3 +- .../mainwindow/library/EditShortcutPanel.java | 6 +-- .../mainwindow/library/LibraryPanel.java | 9 ++-- .../mainwindow/library/LibrarySidebar.java | 13 +++-- .../views/mainwindow/settings/AboutPanel.java | 8 +-- .../settings/RepositoriesPanel.java | 2 +- .../mainwindow/settings/SettingsSidebar.java | 4 +- .../settings/UserInterfacePanel.java | 2 +- .../views/mainwindow/ui/MainWindowView.java | 3 +- .../javafx/views/mainwindow/ui/SearchBox.java | 2 +- .../views/mainwindow/ui/SidebarGroup.java | 2 +- .../mainwindow/ui/SidebarToggleButton.java | 3 +- .../mainwindow/ui/SidebarToggleGroup.java | 52 ++++++++++++------- .../views/scriptui/SetupUiFactoryJavaFX.java | 3 +- .../repository/RepositoryManager.java | 24 +++++---- .../location/RepositoryLocation.java | 9 ++-- .../repository/types/MergeableRepository.java | 18 ++++--- .../repository/types/MultipleRepository.java | 2 +- .../wizard/UiSetupWizardImplementation.java | 22 ++++---- .../java/org/phoenicis/tools/archive/Zip.java | 2 +- .../phoenicis/tools/archive/cab/CFData.java | 2 +- .../phoenicis/tools/archive/cab/CFFolder.java | 2 +- .../phoenicis/tools/archive/cab/CFHeader.java | 21 ++++---- .../phoenicis/tools/files/FileAnalyser.java | 8 +-- pom.xml | 4 +- settings/POL_Formatter_Settings.xml | 8 +-- 53 files changed, 252 insertions(+), 193 deletions(-) diff --git a/i18n/keys.pot b/i18n/keys.pot index 0bcd3b3f6d2..f74cf1db729 100644 --- a/i18n/keys.pot +++ b/i18n/keys.pot @@ -253,7 +253,7 @@ msgstr "" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibrarySidebar.java:162 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/installations/InstallationsSidebar.java:138 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:168 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:142 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:143 msgid "All" msgstr "" @@ -447,15 +447,15 @@ msgid "Error while trying to delete the engine" msgstr "" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java:82 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:120 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:122 msgid "Engines" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:128 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:130 msgid "Installed" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:132 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:134 msgid "Not installed" msgstr "" @@ -505,7 +505,7 @@ msgid "Engine Settings" msgstr "" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersView.java:72 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:116 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:117 msgid "Containers" msgstr "" @@ -534,7 +534,7 @@ msgstr "" msgid "Wine distribution:" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:107 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:110 msgid "Delete container" msgstr "" diff --git a/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Localisation.java b/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Localisation.java index 951edbb2f77..b19b9d66b90 100644 --- a/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Localisation.java +++ b/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Localisation.java @@ -51,7 +51,8 @@ private static I18n getI18n() { /** * add a ResourceBundle containing additional translations for the localisation * - typically used to add translations for the scripts - * - only one additional ResourceBundle can be set at a time (calling the method again will override the old ResourceBundle) + * - only one additional ResourceBundle can be set at a time (calling the method again will override the old + * ResourceBundle) * * @param resourceBundle Resource bundle */ diff --git a/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Translatable.java b/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Translatable.java index c3983e1dd01..75539955b84 100644 --- a/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Translatable.java +++ b/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Translatable.java @@ -9,8 +9,8 @@ * Tells Phoenicis localisation module that the annotated class can be translated. * This requires: *

*/ @Retention(RetentionPolicy.RUNTIME) diff --git a/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/TranslatableCreator.java b/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/TranslatableCreator.java index 0ce608b47ea..9705aba94b8 100644 --- a/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/TranslatableCreator.java +++ b/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/TranslatableCreator.java @@ -8,7 +8,8 @@ /** * Use this if your {@link Translatable} class has a simple constructor. * Annotate the constructor with this annotation. - * The parameters of the constructor has to be named with either {@link ParameterName} or {@link com.fasterxml.jackson.annotation.JsonProperty} + * The parameters of the constructor has to be named with either {@link ParameterName} or + * {@link com.fasterxml.jackson.annotation.JsonProperty} */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.CONSTRUCTOR) diff --git a/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Translate.java b/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Translate.java index cf8df2cbd05..1a7450e89c8 100644 --- a/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Translate.java +++ b/phoenicis-configuration/src/main/java/org/phoenicis/configuration/localisation/Translate.java @@ -8,10 +8,10 @@ /** * Annotate a getter of a translatable object that will be translated. *
    - *
  • If the getter returns a string, it will be directly translated
  • - *
  • If the getter returns a {@link Translatable}, it will be recursively translated
  • - *
  • If the getter returns a set or a list, each item of them will be translated
  • - *
  • In any other case, nothing will happen
  • + *
  • If the getter returns a string, it will be directly translated
  • + *
  • If the getter returns a {@link Translatable}, it will be recursively translated
  • + *
  • If the getter returns a set or a list, each item of them will be translated
  • + *
  • In any other case, nothing will happen
  • *
*/ @Retention(RetentionPolicy.RUNTIME) diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java index 87b2e0e7851..7116078de0f 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java @@ -101,7 +101,7 @@ public ContainersController(ContainersView containersView, panel.setOnClose(containersView::closeDetailsView); Platform.runLater(() -> containersView.showDetailsView(panel)); - //}); + // }); }); } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/lists/AdhocList.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/lists/AdhocList.java index ee367409d46..046d9598be2 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/lists/AdhocList.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/lists/AdhocList.java @@ -6,7 +6,8 @@ import java.util.stream.IntStream; /** - * This class combines an {@link ObservableList} and a number of non exchangeable objects called others to a single {@link ObservableList}. + * This class combines an {@link ObservableList} and a number of non exchangeable objects called others to + * a single {@link ObservableList}. * These others are prepended to the given {@link ObservableList}. * * @author marc @@ -22,7 +23,8 @@ public class AdhocList extends PhoenicisTransformationList { * Constructor * * @param source An observable list which should be part of this list - * @param others A number of objects of the same type as source that should be prepended to source + * @param others A number of objects of the same type as source that should be prepended to + * source */ public AdhocList(ObservableList source, E... others) { super(source); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/lists/PhoenicisFilteredList.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/lists/PhoenicisFilteredList.java index 576bc4dca7b..908b5681307 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/lists/PhoenicisFilteredList.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/lists/PhoenicisFilteredList.java @@ -13,8 +13,10 @@ /** * A filtered observable list taking a {@link Predicate} to filter elements of a given input {@link ObservableList}. - * This class is based on the implementation of {@link FilteredList}, included in javafx, and extends its functionality with a trigger method. - * This trigger method can be used to recheck the all elements included in the source list to only marks the elements as invalid, + * This class is based on the implementation of {@link FilteredList}, included in javafx, and extends its functionality + * with a trigger method. + * This trigger method can be used to recheck the all elements included in the source list to only marks the elements as + * invalid, * that were previously added and now aren't, or the other way. * * @param The type of the elements contained in the filtered list @@ -33,7 +35,7 @@ public class PhoenicisFilteredList extends PhoenicisTransformationList * The provided predicate will match the elements in the source list that will be visible. * If the predicate is null, all elements will be matched and the list is equal to the source list. * - * @param source the source list + * @param source the source list * @param predicate the predicate to match the elements or null to match all elements. */ public PhoenicisFilteredList(@NamedArg("source") ObservableList source, @@ -121,7 +123,7 @@ public int size() { /** * Returns the element at the specified position in this list. * - * @param index index of the element to return + * @param index index of the element to return * @return the element at the specified position in this list * @throws IndexOutOfBoundsException {@inheritDoc} */ @@ -142,7 +144,8 @@ public int getSourceIndex(int index) { } /** - * Taken from: https://github.com/teamfx/openjfx-9-dev-rt/blob/master/modules/javafx.base/src/main/java/javafx/collections/transformation/FilteredList.java + * Taken from: + * https://github.com/teamfx/openjfx-9-dev-rt/blob/master/modules/javafx.base/src/main/java/javafx/collections/transformation/FilteredList.java * * @apiNote This method is required to make Phoenicis compile with Java 9 */ @@ -306,7 +309,8 @@ private void refilter() { /** * Triggers a check of all elements inside the source list to check if they still match the predicate function. * Only if they are now contained inside this filtered list and were not contained previously, - * or the other way around, will a {@link javafx.collections.ListChangeListener.Change} event be triggered for the element. + * or the other way around, will a {@link javafx.collections.ListChangeListener.Change} event be triggered for the + * element. */ public void trigger() { Predicate pred = getPredicateImpl(); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/AdditionalListWidgetInformation.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/AdditionalListWidgetInformation.java index 5de4c1cfa30..877343a502c 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/AdditionalListWidgetInformation.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/AdditionalListWidgetInformation.java @@ -1,7 +1,8 @@ package org.phoenicis.javafx.views.common.widgets.lists; /** - * An additional information to be shown in a {@link org.phoenicis.javafx.views.common.widgets.lists.compact.CompactListWidget} + * An additional information to be shown in a + * {@link org.phoenicis.javafx.views.common.widgets.lists.compact.CompactListWidget} * or in a {@link org.phoenicis.javafx.views.common.widgets.lists.details.DetailsListWidget}. * * @author marc @@ -22,7 +23,7 @@ public class AdditionalListWidgetInformation { * Constructor * * @param content The content of this information object. This content is then shown in the list widget - * @param width The width, in percent, this information needs + * @param width The width, in percent, this information needs */ public AdditionalListWidgetInformation(String content, int width) { this.content = content; diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/CombinedListWidget.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/CombinedListWidget.java index 35943904693..3f83d5fed38 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/CombinedListWidget.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/CombinedListWidget.java @@ -50,7 +50,8 @@ public class CombinedListWidget extends VBox implements ListWidget { /** * Constructor * - * @param converter A converter function, that takes an object of type E and returns a {@link ListWidgetEntry} for it + * @param converter A converter function, that takes an object of type E and returns a + * {@link ListWidgetEntry} for it * @param setOnMouseClicked An event listener function to be called when an entry has been selected/clicked */ public CombinedListWidget(Function> converter, BiConsumer setOnMouseClicked) { diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/ListWidgetEntry.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/ListWidgetEntry.java index c9d64954460..10f77cc153b 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/ListWidgetEntry.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/ListWidgetEntry.java @@ -66,14 +66,16 @@ public class ListWidgetEntry { /** * An optional list of additional information for this entry. - * These information are only shown inside a {@link org.phoenicis.javafx.views.common.widgets.lists.compact.CompactListWidget} or a + * These information are only shown inside a + * {@link org.phoenicis.javafx.views.common.widgets.lists.compact.CompactListWidget} or a * {@link org.phoenicis.javafx.views.common.widgets.lists.details.DetailsListWidget} */ private Optional> additionalInformation; /** * An optional list of additional detailed information for this entry. - * These information are only shown inside a {@link org.phoenicis.javafx.views.common.widgets.lists.details.DetailsListWidget} + * These information are only shown inside a + * {@link org.phoenicis.javafx.views.common.widgets.lists.details.DetailsListWidget} */ private Optional> detailedInformation; @@ -86,12 +88,12 @@ public class ListWidgetEntry { * Constructor. * This constructor assumes that the entry is enabled * - * @param item The item from which the entry should be created - * @param iconUri An optional uri to a miniature to this entry - * @param defaultIconUri An uri to a fallback miniature - * @param title The title to this entry + * @param item The item from which the entry should be created + * @param iconUri An optional uri to a miniature to this entry + * @param defaultIconUri An uri to a fallback miniature + * @param title The title to this entry * @param additionalInformation An optional list of additional information to this entry - * @param detailedInformation An optional list of additional detailed information to this entry + * @param detailedInformation An optional list of additional detailed information to this entry */ public ListWidgetEntry(E item, Optional iconUri, URI defaultIconUri, String title, Optional> additionalInformation, @@ -102,13 +104,13 @@ public ListWidgetEntry(E item, Optional iconUri, URI defaultIconUri, String /** * Constructor * - * @param item The item from which the entry should be created - * @param iconUri An optional uri to a miniature to this entry - * @param defaultIconUri An uri to a fallback miniature - * @param title The title to this entry + * @param item The item from which the entry should be created + * @param iconUri An optional uri to a miniature to this entry + * @param defaultIconUri An uri to a fallback miniature + * @param title The title to this entry * @param additionalInformation An optional list of additional information to this entry - * @param detailedInformation An optional list of additional detailed information to this entry - * @param enabled True if this entry is enabled + * @param detailedInformation An optional list of additional detailed information to this entry + * @param enabled True if this entry is enabled */ public ListWidgetEntry(E item, Optional iconUri, URI defaultIconUri, String title, Optional> additionalInformation, diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/compact/CompactListElement.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/compact/CompactListElement.java index f7bc397835e..999f5a381f0 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/compact/CompactListElement.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/compact/CompactListElement.java @@ -38,10 +38,11 @@ public class CompactListElement extends GridPane { /** * Constructor * - * @param item The item for which a CompactListElement should be created - * @param miniatureUri An uri to the miniature which is shown inside this CompactListElement - * @param title The title which is shown inside this CompactListElement - * @param additionalInformation An optional list of additional information to be shown inside this CompactListElement + * @param item The item for which a CompactListElement should be created + * @param miniatureUri An uri to the miniature which is shown inside this CompactListElement + * @param title The title which is shown inside this CompactListElement + * @param additionalInformation An optional list of additional information to be shown inside this + * CompactListElement */ public CompactListElement(E item, URI miniatureUri, String title, Optional> additionalInformation) { diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/compact/CompactListWidget.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/compact/CompactListWidget.java index 63b195d25ed..bffdd99a334 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/compact/CompactListWidget.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/compact/CompactListWidget.java @@ -15,7 +15,8 @@ import java.util.stream.Collectors; /** - * A {@link ListWidget} for a compact list containing a small miniature image, a title and a set of additional information for each list entry. + * A {@link ListWidget} for a compact list containing a small miniature image, a title and a set of additional + * information for each list entry. * * @author marc * @since 14.05.17 @@ -34,7 +35,8 @@ public class CompactListWidget extends ListView> implem /** * Constructor * - * @param converter A converter function used to convert a value of input type E to {@link CompactListElement} + * @param converter A converter function used to convert a value of input type E to + * {@link CompactListElement} * @param setOnMouseClicked An event listener function to be called when a list element has been selected/clicked */ public CompactListWidget(Function> converter, diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/details/DetailsListElement.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/details/DetailsListElement.java index 2965be7b5e5..3b55f36983a 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/details/DetailsListElement.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/details/DetailsListElement.java @@ -31,10 +31,12 @@ public class DetailsListElement extends GridPane { /** * Constructor * - * @param item The item for which a DetailsListElement should be created - * @param title The title which is shown inside this DetailsListElement - * @param additionalInformation An optional list of additional information to be shown inside this DetailsListElement - * @param detailedInformation An optional list of additional detailed information to be shown inside this DetailsListElement + * @param item The item for which a DetailsListElement should be created + * @param title The title which is shown inside this DetailsListElement + * @param additionalInformation An optional list of additional information to be shown inside this + * DetailsListElement + * @param detailedInformation An optional list of additional detailed information to be shown inside this + * DetailsListElement */ public DetailsListElement(E item, String title, Optional> additionalInformation, diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/details/DetailsListWidget.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/details/DetailsListWidget.java index 94fc470a53e..009bd35aa8a 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/details/DetailsListWidget.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/details/DetailsListWidget.java @@ -34,7 +34,8 @@ public class DetailsListWidget extends ListView> implem /** * Constructor * - * @param converter A converter function used to convert a value of input type E to {@link DetailsListElement} + * @param converter A converter function used to convert a value of input type E to + * {@link DetailsListElement} * @param setOnMouseClicked An event listener function to be called when a list element has been selected/clicked */ public DetailsListWidget(Function> converter, diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/icons/IconsListElement.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/icons/IconsListElement.java index 8c6690c4036..e183847f5bc 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/icons/IconsListElement.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/icons/IconsListElement.java @@ -58,10 +58,10 @@ public boolean isSelected() { /** * Constructor * - * @param item The item for which a IconsListElement should be created + * @param item The item for which a IconsListElement should be created * @param miniatureUri An uri to the miniature which is shown inside this IconsListElement - * @param title The title which is shown inside this IconsListElement - * @param enabled True if this element should be shown as enabled, false otherwise + * @param title The title which is shown inside this IconsListElement + * @param enabled True if this element should be shown as enabled, false otherwise */ public IconsListElement(E item, URI miniatureUri, String title, boolean enabled) { super(); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/icons/IconsListWidget.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/icons/IconsListWidget.java index 61bccd687cf..22037acb860 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/icons/IconsListWidget.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/widgets/lists/icons/IconsListWidget.java @@ -65,7 +65,8 @@ public final class IconsListWidget extends ScrollPane implements ListWidgetE to {@link IconsListElement} + * @param converter A converter function used to convert a value of input type E to + * {@link IconsListElement} * @param setOnMouseClicked An event listener function to be called when a list element has been selected/clicked */ public IconsListWidget(Function> converter, BiConsumer setOnMouseClicked) { diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationFilter.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationFilter.java index c0b89cb555e..d92300a2686 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationFilter.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationFilter.java @@ -141,7 +141,7 @@ public boolean filter(ApplicationDTO application) { /** * Filter function for {@link ApplicationDTO} objects * - * @param application The application which should checked + * @param application The application which should checked * @param ignoreFilterCategoryTest True if an optional filter category should be ignored, false otherwise * @return True if the given application fulfills the filter conditions, false otherwise */ diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationPanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationPanel.java index 8b056c5d4ec..95632424b60 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationPanel.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationPanel.java @@ -101,9 +101,9 @@ final class ApplicationPanel extends DetailsView { /** * Constructor - * @param application The application to be shown inside this {@link ApplicationPanel} - * @param filter The filter to be used for filtering the shown scripts for the application - * @param themeManager The theme manager + * @param application The application to be shown inside this {@link ApplicationPanel} + * @param filter The filter to be used for filtering the shown scripts for the application + * @param themeManager The theme manager * @param javaFxSettingsManager The settings manager */ public ApplicationPanel(ApplicationDTO application, ApplicationFilter filter, ThemeManager themeManager, diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java index 74885e11568..e538f054c96 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java @@ -71,7 +71,7 @@ public class ApplicationsSidebar extends Sidebar { /** * Constructor * - * @param combinedListWidget The list widget to be managed by the ListWidgetChooser in the sidebar + * @param combinedListWidget The list widget to be managed by the ListWidgetChooser in the sidebar * @param javaFxSettingsManager The settings manager for the JavaFX GUI */ public ApplicationsSidebar(CombinedListWidget combinedListWidget, ApplicationFilter filter, diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsView.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsView.java index e01d0809dc5..a46ea22d1da 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsView.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsView.java @@ -74,9 +74,9 @@ public class ApplicationsView extends MainWindowView { /** * Constructor * - * @param themeManager The theme manager + * @param themeManager The theme manager * @param javaFxSettingsManager The javafx settings manager - * @param toolsConfiguration The tools configuration + * @param toolsConfiguration The tools configuration */ public ApplicationsView(ThemeManager themeManager, JavaFxSettingsManager javaFxSettingsManager, ToolsConfiguration toolsConfiguration) { @@ -169,7 +169,7 @@ public void setOnRetryButtonClicked(EventHandler event) { /** * Displays the application details view on the right side for a given application. * - * @param application The application, whose details should be shown + * @param application The application, whose details should be shown * @param javaFxSettingsManager The javafx settings manager */ private void showAppDetails(ApplicationDTO application, JavaFxSettingsManager javaFxSettingsManager) { diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java index 938afce2117..ff53e4c36c6 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java @@ -87,27 +87,30 @@ private void populate() { // changing engine does not work currently // disabled combobox to avoid confusion of users - /*ComboBox changeEngineComboBox = new ComboBox( - FXCollections.observableList(engineVersions)); - changeEngineComboBox.setConverter(new StringConverter() { - @Override - public String toString(EngineVersionDTO object) { - return object.getVersion(); - } - - @Override - public EngineVersionDTO fromString(String string) { - return engineVersions.stream().filter(engineVersion -> engineVersion.getVersion().equals(string)) - .findFirst().get(); - } - }); - changeEngineComboBox.getSelectionModel().select(engineVersions.stream() - .filter(engineVersion -> engineVersion.getVersion().equals(container.getVersion())).findFirst().get());*/ + /* + * ComboBox changeEngineComboBox = new ComboBox( + * FXCollections.observableList(engineVersions)); + * changeEngineComboBox.setConverter(new StringConverter() { + * + * @Override + * public String toString(EngineVersionDTO object) { + * return object.getVersion(); + * } + * + * @Override + * public EngineVersionDTO fromString(String string) { + * return engineVersions.stream().filter(engineVersion -> engineVersion.getVersion().equals(string)) + * .findFirst().get(); + * } + * }); + * changeEngineComboBox.getSelectionModel().select(engineVersions.stream() + * .filter(engineVersion -> engineVersion.getVersion().equals(container.getVersion())).findFirst().get()); + */ Button deleteButton = new Button(tr("Delete container")); deleteButton.setOnMouseClicked(event -> this.onDeletePrefix.accept(container)); - informationPane.getChildren().addAll(informationContentPane, spacer, /*changeEngineComboBox,*/ deleteButton); + informationPane.getChildren().addAll(informationContentPane, spacer, /* changeEngineComboBox, */ deleteButton); this.setContent(informationPane); } diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java index fe9725359f6..4d5a42e8fa9 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java @@ -90,7 +90,8 @@ public void selectAllCategories() { } /** - * This method takes an {@link ObservableList} of container categories and binds it to the container categories button group + * This method takes an {@link ObservableList} of container categories and binds it to the container categories + * button group * * @param categories The list of container categories */ diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersView.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersView.java index 619ffcc5dcb..2774e2e19da 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersView.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersView.java @@ -43,9 +43,9 @@ * This view is partitioned in three sections: * *
    - *
  • A sidebar, that allows the user to filter between the container categories
  • - *
  • A list widget, which contains the installed containers
  • - *
  • An optional details view showing details about the selected container in the list widget
  • + *
  • A sidebar, that allows the user to filter between the container categories
  • + *
  • A list widget, which contains the installed containers
  • + *
  • An optional details view showing details about the selected container in the list widget
  • *
*/ public class ContainersView extends MainWindowView { @@ -65,7 +65,7 @@ public class ContainersView extends MainWindowView { /** * Constructor * - * @param themeManager The theme manager + * @param themeManager The theme manager * @param javaFxSettingsManager The javafx settings manager */ public ContainersView(ThemeManager themeManager, JavaFxSettingsManager javaFxSettingsManager) { diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EngineSubCategoryTab.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EngineSubCategoryTab.java index b24c89dab0d..de843e53051 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EngineSubCategoryTab.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EngineSubCategoryTab.java @@ -46,9 +46,9 @@ public class EngineSubCategoryTab extends Tab { /** * Constructor * - * @param engineCategory The engine category, which contains the engine sub category + * @param engineCategory The engine category, which contains the engine sub category * @param engineSubCategory The engine sub category to be shown in this tab - * @param enginesPath The path to the engines + * @param enginesPath The path to the engines */ public EngineSubCategoryTab(EngineCategoryDTO engineCategory, EngineSubCategoryDTO engineSubCategory, @@ -76,7 +76,8 @@ public EngineSubCategoryTab(EngineCategoryDTO engineCategory, } /** - * This method populates the engines version miniature list widget and binds the filtered engine versions list to it. + * This method populates the engines version miniature list widget and binds the filtered engine versions list to + * it. */ private void populate() { this.engineVersionsView = new CombinedListWidget<>( diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesFilter.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesFilter.java index fa01e7ea16e..cbe918fb8fe 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesFilter.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesFilter.java @@ -132,9 +132,10 @@ private boolean isInstalled(EngineCategoryDTO engineCategory, EngineSubCategoryD /** * Creates a new filter predicate for a {@link EngineCategoryDTO} and {@link EngineSubCategoryDTO}. - * This predicate then accepts a {@link EngineVersionDTO} object and returns true if the given object fulfills the filter predicate and false otherwise + * This predicate then accepts a {@link EngineVersionDTO} object and returns true if the given object fulfills the + * filter predicate and false otherwise * - * @param engineCategory The engine category + * @param engineCategory The engine category * @param engineSubCategory The engine sub category * @return A new filter predicate */ diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java index befcfb4108e..3de250c5ce6 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java @@ -28,7 +28,8 @@ * *
  • * A button group containing a button for all known engine groups. - * After pressing on one such button all engines belonging to the selected engine group are shown in the main window panel. + * After pressing on one such button all engines belonging to the selected engine group are shown in the main window + * panel. *
  • *
  • * A button group containing buttons to filter for installed and uninstalled engines. @@ -71,7 +72,7 @@ public class EnginesSidebar extends Sidebar { * Constructor * * @param enginesVersionListWidgets The list widget to be managed by the ListWidgetChooser in the sidebar - * @param javaFxSettingsManager The settings manager for the JavaFX GUI + * @param javaFxSettingsManager The settings manager for the JavaFX GUI */ public EnginesSidebar(List> enginesVersionListWidgets, EnginesFilter filter, JavaFxSettingsManager javaFxSettingsManager) { @@ -94,7 +95,8 @@ public EnginesSidebar(List> enginesVersionL } /** - * This method takes an {@link ObservableList} of engine categories and binds it to the engine categories button group + * This method takes an {@link ObservableList} of engine categories and binds it to the engine categories button + * group * * @param engineCategories The list of engine categories */ diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/installations/InstallationsUtils.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/installations/InstallationsUtils.java index aa632ba061c..e510dbfec56 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/installations/InstallationsUtils.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/installations/InstallationsUtils.java @@ -50,7 +50,8 @@ public List addInstallationToList(List removeInstallationFromList(List list, InstallationDTO toRemove) { diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java index c9c0cb594ee..5ae5b65f9b1 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java @@ -89,9 +89,9 @@ public EditShortcutPanel(ObjectMapper objectMapper) { } /** - * sets the shortcut which can be edited in this view - * @param shortcutDTO - */ + * sets the shortcut which can be edited in this view + * @param shortcutDTO + */ public void setShortcutDTO(ShortcutDTO shortcutDTO) { this.editedShortcut = shortcutDTO; diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryPanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryPanel.java index 6a21316195f..9bdac5e7c77 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryPanel.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryPanel.java @@ -142,7 +142,8 @@ private String unCamelize(String s) { } /** - * This method updates the consumer, that is called when the "Run" button for the currently selected shortcut has been clicked. + * This method updates the consumer, that is called when the "Run" button for the currently selected shortcut has + * been clicked. * * @param onShortcutRun The new consumer to be called */ @@ -151,7 +152,8 @@ public void setOnShortcutRun(Consumer onShortcutRun) { } /** - * This method updates the consumer, that is called when the "Stop" button for the currently selected shortcut has been clicked. + * This method updates the consumer, that is called when the "Stop" button for the currently selected shortcut has + * been clicked. * * @param onShortcutStop The new consumer to be called */ @@ -160,7 +162,8 @@ public void setOnShortcutStop(Consumer onShortcutStop) { } /** - * This method updates the consumer, that is called when the "Uninstall" button for the currently selected shortcut has been clicked. + * This method updates the consumer, that is called when the "Uninstall" button for the currently selected shortcut + * has been clicked. * * @param onShortcutUninstall The new consumer to be called */ diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibrarySidebar.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibrarySidebar.java index 6cb4ecc6e35..0a28e62c27c 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibrarySidebar.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibrarySidebar.java @@ -80,7 +80,7 @@ public class LibrarySidebar extends Sidebar { /** * Constructor * - * @param applicationName The name of this application (normally "PlayOnLinux") + * @param applicationName The name of this application (normally "PlayOnLinux") * @param availableShortcuts The list widget to be managed by the ListWidgetChooser in the sidebar * @param javaFxSettingsManager The settings manager for the JavaFX GUI */ @@ -209,7 +209,7 @@ private void populateAdvancedTools() { this.runConsole.getStyleClass().add("consoleButton"); this.runConsole.setOnMouseClicked(event -> onOpenConsole.run()); - this.advancedToolsGroup = new SidebarGroup(tr("Advanced tools"), createShortcut, /*runScript, */runConsole); + this.advancedToolsGroup = new SidebarGroup(tr("Advanced tools"), createShortcut, /* runScript, */runConsole); } public void search(String searchTerm) { @@ -239,7 +239,8 @@ public void setOnCategorySelection(Consumer onCategorySelec } /** - * This method updates the runnable, that is called when the "Create shortcut" button in the advanced tools section has been clicked. + * This method updates the runnable, that is called when the "Create shortcut" button in the advanced tools section + * has been clicked. * * @param onCreateShortcut The new runnable to be called */ @@ -248,7 +249,8 @@ public void setOnCreateShortcut(Runnable onCreateShortcut) { } /** - * This method updates the consumer, that is called when the "Run a script" button in the advanced tools section has been clicked. + * This method updates the consumer, that is called when the "Run a script" button in the advanced tools section has + * been clicked. * * @param onScriptRun The new consumer to be called */ @@ -257,7 +259,8 @@ public void setOnScriptRun(Consumer onScriptRun) { } /** - * This methdo updates the consumer that is called when the "PlayOnLinux console" button ins the advanced tools section has been clicked. + * This methdo updates the consumer that is called when the "PlayOnLinux console" button ins the advanced tools + * section has been clicked. * * @param onOpenConsole The new consumer to be called */ diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java index e73295441db..33e50cc5e5b 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java @@ -43,7 +43,7 @@ public class AboutPanel extends VBox { * Constructor * * @param buildInformation The information of the used build of POL 5 - * @param opener The opener util object to be used to open websites + * @param opener The opener util object to be used to open websites */ public AboutPanel(ApplicationBuildInformation buildInformation, Opener opener) { super(); @@ -116,9 +116,9 @@ public static class ApplicationBuildInformation { /** * Constructor * - * @param applicationName the name of the application - * @param applicationVersion the version of the application - * @param applicationGitRevision the git revision/commit used to build POL 5 + * @param applicationName the name of the application + * @param applicationVersion the version of the application + * @param applicationGitRevision the git revision/commit used to build POL 5 * @param applicationBuildTimestamp the timestamp when POL 5 was built */ public ApplicationBuildInformation(String applicationName, String applicationVersion, diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/RepositoriesPanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/RepositoriesPanel.java index 9b3ef8bcc5c..b6b0c856ec0 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/RepositoriesPanel.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/RepositoriesPanel.java @@ -57,7 +57,7 @@ public class RepositoriesPanel extends StackPane { /** * Constructor * - * @param settingsManager The settings manager + * @param settingsManager The settings manager * @param repositoryManager The repository manager */ public RepositoriesPanel(SettingsManager settingsManager, RepositoryManager repositoryManager) { diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/SettingsSidebar.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/SettingsSidebar.java index 3d4f169c4cc..54830ffe835 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/SettingsSidebar.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/SettingsSidebar.java @@ -98,9 +98,9 @@ public static class SettingsSidebarItem { /** * Constructor * - * @param panel The corresponding panel for this settings category + * @param panel The corresponding panel for this settings category * @param iconClass The css class containing the icon for this settings category - * @param name The displayed name of this settings category + * @param name The displayed name of this settings category */ public SettingsSidebarItem(Node panel, String iconClass, String name) { this.panel = panel; diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/UserInterfacePanel.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/UserInterfacePanel.java index 84ddaf07af2..b3a4732aa65 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/UserInterfacePanel.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/UserInterfacePanel.java @@ -40,7 +40,7 @@ public class UserInterfacePanel extends VBox { /** * Constructor - * @param javaFxSettingsManager The settings manager + * @param javaFxSettingsManager The settings manager * @param themeManager The theme manager */ public UserInterfacePanel(JavaFxSettingsManager javaFxSettingsManager, ThemeManager themeManager) { diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/MainWindowView.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/MainWindowView.java index 05dc7b7114c..ce53b92e645 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/MainWindowView.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/MainWindowView.java @@ -32,7 +32,8 @@ * It encloses common functionality (e.g. the library) inside a Tab which is presented in the main menu. * Every MainWindowView is split into the basic components Sidebar, content and DetailsView. * - * The Sidebar is shown on the left side. It shall allow a quick navigation in the categories which structure the content. + * The Sidebar is shown on the left side. It shall allow a quick navigation in the categories which structure the + * content. * * The content is the main content which presents the functionality of this particular MainWindowView. * diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SearchBox.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SearchBox.java index 1099d6f5b10..a2ce98673f4 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SearchBox.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SearchBox.java @@ -43,7 +43,7 @@ public SearchBox(Consumer onSearch) { * Constructor * * @param onSearch The onSearch callback - * @param onClear The onClear callback + * @param onClear The onClear callback */ public SearchBox(Consumer onSearch, Runnable onClear) { super(); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarGroup.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarGroup.java index a5901dc31d9..6f118ef66cc 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarGroup.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarGroup.java @@ -56,7 +56,7 @@ private SidebarGroup() { /** * Constructor * - * @param title The title string to be used for this group. If no title string is to be set null can be used. + * @param title The title string to be used for this group. If no title string is to be set null can be used. * @param content Zero or more nodes, which make up the content of this group. */ public SidebarGroup(String title, Node... content) { diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarToggleButton.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarToggleButton.java index f3332196848..c05a90e3aa7 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarToggleButton.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarToggleButton.java @@ -46,7 +46,8 @@ public SidebarToggleButton(String name) { /** * This method is called whenever the {@link SidebarToggleButton} has been clicked. - * It is overriden to ensure that the button only fires an event ({@link javafx.event.ActionEvent} or {@link javafx.scene.input.MouseEvent}) + * It is overriden to ensure that the button only fires an event ({@link javafx.event.ActionEvent} or + * {@link javafx.scene.input.MouseEvent}) * if it is either currently not selected or it isn't part of a {@link javafx.scene.control.ToggleGroup}. * * @see ToggleButton diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarToggleGroup.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarToggleGroup.java index e5f404b76a9..2e59efd2c05 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarToggleGroup.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/ui/SidebarToggleGroup.java @@ -16,9 +16,12 @@ /** * This class represents a group of toggle buttons in the sidebar. - * This class must be used together with an {@link ObservableList}, containing the objects which are to be shown in this SidebarToggleGroup. - * For every object inside the {@link ObservableList} a {@link ToggleButton} is created, which is then shown inside this SidebarToggleGroup. - * For the creation of the {@link ToggleButton}s a converter function is used, which must be passed to the constructor of this class. + * This class must be used together with an {@link ObservableList}, containing the objects which are to be shown in this + * SidebarToggleGroup. + * For every object inside the {@link ObservableList} a {@link ToggleButton} is created, which is then shown inside this + * SidebarToggleGroup. + * For the creation of the {@link ToggleButton}s a converter function is used, which must be passed to the constructor + * of this class. * * @author marc * @since 28.03.17 @@ -41,17 +44,20 @@ public class SidebarToggleGroup extends SidebarGroup { private final VBox toggleButtonBox; /** - * An {@link ObservableList} containing all objects for which a {@link ToggleButton} is to be shown in this SidebarToggleGroup + * An {@link ObservableList} containing all objects for which a {@link ToggleButton} is to be shown in this + * SidebarToggleGroup */ private final ObservableList elements; /** - * An {@link ObservableList} that takes all objects in elements and converts them to a {@link ToggleButton} + * An {@link ObservableList} that takes all objects in elements and converts them to a + * {@link ToggleButton} */ private final MappedList mappedToggleButtons; /** - * An {@link ObservableList} containing both the allButton, if it's available, and the {@link ToggleButton}s + * An {@link ObservableList} containing both the allButton, if it's available, and the + * {@link ToggleButton}s * inside mappedToggleButtons */ private final AdhocList adhocToggleButtons; @@ -59,9 +65,10 @@ public class SidebarToggleGroup extends SidebarGroup { /** * Constructor * - * @param name The title of this SidebarToggleGroup - * @param allButtonSupplier A supplier function used to create the optional "all" ToggleButton. If no such button is needed null can be used - * @param converter A converter function used to convert the source objects to ToggleButtons + * @param name The title of this SidebarToggleGroup + * @param allButtonSupplier A supplier function used to create the optional "all" ToggleButton. If no such button is + * needed null can be used + * @param converter A converter function used to convert the source objects to ToggleButtons */ private SidebarToggleGroup(String name, Supplier allButtonSupplier, Function converter) { @@ -109,7 +116,7 @@ public void onChanged(Change change) { /** * Constructor * - * @param name The title of this SidebarToggleGroup + * @param name The title of this SidebarToggleGroup * @param converter A converter function used to convert the source objects to ToggleButtons */ private SidebarToggleGroup(String name, Function converter) { @@ -119,9 +126,10 @@ private SidebarToggleGroup(String name, Function conv /** * This method creates a new SidebarToggleGroup without an "all" categories ToggleButton using the given arguments * - * @param name The title of the new SidebarToggleGroup - * @param converter The converter function used by the new SidebarToggleGroup to convert the source objects to ToggleButtons - * @param The type of the source objects in the new SidebarToggleGroup + * @param name The title of the new SidebarToggleGroup + * @param converter The converter function used by the new SidebarToggleGroup to convert the source objects to + * ToggleButtons + * @param The type of the source objects in the new SidebarToggleGroup * @return The newly created SidebarToggleGroup with the given arguments */ public static SidebarToggleGroup create(String name, Function converter) { @@ -131,10 +139,11 @@ public static SidebarToggleGroup create(String name, Function The type of the source objects in the new SidebarToggleGroup + * @param converter The converter function used by the new SidebarToggleGroup to convert the source objects to + * ToggleButtons + * @param The type of the source objects in the new SidebarToggleGroup * @return The newly created SidebarToggleGroup with the given arguments */ public static SidebarToggleGroup create(String name, Supplier allButtonSupplier, @@ -143,7 +152,8 @@ public static SidebarToggleGroup create(String name, SupplierelementIndex - * is outside the range of the elements contained in this SidebarToggleGroup + * is outside the range of the elements contained in this SidebarToggleGroup */ public void select(int elementIndex) { if (elementIndex < 0 || elementIndex >= this.elements.size()) { @@ -177,11 +187,13 @@ public void select(int elementIndex) { } /** - * This method selects the ToggleButton belonging to a given element contained in the elements {@link ObservableList} + * This method selects the ToggleButton belonging to a given element contained in the elements + * {@link ObservableList} * inside this SidebarToggleGroup. * * @param element The element, whose corresponding {@link javafx.scene.control.ToggleButton} is to be selected - * @throws IllegalArgumentException This exception is thrown, if the given element doesn't exist in this SidebarToggleGroup + * @throws IllegalArgumentException This exception is thrown, if the given element doesn't exist in + * this SidebarToggleGroup */ public void select(E element) { this.select(this.elements.indexOf(element)); diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/SetupUiFactoryJavaFX.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/SetupUiFactoryJavaFX.java index 46fd026f663..73852406e3c 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/SetupUiFactoryJavaFX.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/SetupUiFactoryJavaFX.java @@ -58,7 +58,8 @@ public SetupUiFactoryJavaFX(OperatingSystemFetcher operatingSystemFetcher, Theme /** * creates a setup UI to install an application * @param title title of the setup UI - * @param miniature miniature which is shown in the "Installations" tab (usually the miniature of the installed application) + * @param miniature miniature which is shown in the "Installations" tab (usually the miniature of the installed + * application) * @param installationType apps/engines * @return setup window */ diff --git a/phoenicis-repository/src/main/java/org/phoenicis/repository/RepositoryManager.java b/phoenicis-repository/src/main/java/org/phoenicis/repository/RepositoryManager.java index 0525d5bf3a4..5d46a47662b 100644 --- a/phoenicis-repository/src/main/java/org/phoenicis/repository/RepositoryManager.java +++ b/phoenicis-repository/src/main/java/org/phoenicis/repository/RepositoryManager.java @@ -19,13 +19,15 @@ public interface RepositoryManager { /** * This method adds a corresponding pair of callbacks to this repository manager * - * @param onRepositoryChange The callback that should be called with the new RepositoryDTO when the repository change succeeded - * @param onError The callback that should be called when the repository change failed + * @param onRepositoryChange The callback that should be called with the new RepositoryDTO when the repository + * change succeeded + * @param onError The callback that should be called when the repository change failed */ void addCallbacks(Consumer onRepositoryChange, Consumer onError); /** - * This method returns the {@link org.phoenicis.repository.dto.ApplicationDTO}, which can be found at the given path. + * This method returns the {@link org.phoenicis.repository.dto.ApplicationDTO}, which can be found at the given + * path. * * @param path The path, where the searched ApplicationDTO can be found * @return The found ApplicationDTO @@ -46,21 +48,23 @@ public interface RepositoryManager { * After this method has been called {@link #triggerRepositoryChange()} will be called once. * * @param repositoryUrl The repository url belonging to the repository that should be moved to @param toIndex - * @param toIndex The index, to which the repository should be moved + * @param toIndex The index, to which the repository should be moved */ void moveRepository(RepositoryLocation repositoryUrl, int toIndex); /** - * This method adds a number of given repositories to this manager. This is done by inserting the repositories at the given position. + * This method adds a number of given repositories to this manager. This is done by inserting the repositories at + * the given position. * After this method has been called {@link #triggerRepositoryChange()} will be called once. * - * @param index The start position, where the repositories should be added + * @param index The start position, where the repositories should be added * @param repositoryUrls An array containing the urls to the to be added repositories */ void addRepositories(int index, RepositoryLocation... repositoryUrls); /** - * This method adds a number of given repositories to this manager. This is done by appending the repositories at the end, which makes them the lowest priority. + * This method adds a number of given repositories to this manager. This is done by appending the repositories at + * the end, which makes them the lowest priority. * After this method has been called {@link #triggerRepositoryChange()} will be called once. * * @param repositoryUrls An array containing the urls to the to be added repositories @@ -76,8 +80,10 @@ public interface RepositoryManager { void removeRepositories(RepositoryLocation... repositoryUrls); /** - * This method will fetch a new list of {@link org.phoenicis.repository.dto.CategoryDTO}s from the managed repositories. - * After the new category dtos have been fetched, this method will call the previously added onRepositoryChange callbacks with the newly fetched category dtos. + * This method will fetch a new list of {@link org.phoenicis.repository.dto.CategoryDTO}s from the managed + * repositories. + * After the new category dtos have been fetched, this method will call the previously added onRepositoryChange + * callbacks with the newly fetched category dtos. * If an error appeared, the onError callbacks will be called, with the error. */ void triggerRepositoryChange(); diff --git a/phoenicis-repository/src/main/java/org/phoenicis/repository/location/RepositoryLocation.java b/phoenicis-repository/src/main/java/org/phoenicis/repository/location/RepositoryLocation.java index 983be97d940..53c6d4532f2 100644 --- a/phoenicis-repository/src/main/java/org/phoenicis/repository/location/RepositoryLocation.java +++ b/phoenicis-repository/src/main/java/org/phoenicis/repository/location/RepositoryLocation.java @@ -21,9 +21,9 @@ public abstract class RepositoryLocation { /** * The repository location type. Currently the following are available: *
      - *
    • local
    • - *
    • classpath
    • - *
    • git
    • + *
    • local
    • + *
    • classpath
    • + *
    • git
    • *
    */ private final String type; @@ -50,7 +50,8 @@ public abstract E createRepository(String cacheDirectoryPath, LocalRepository.Fa ClasspathRepository.Factory classPathRepositoryFactory, FileUtilities fileUtilities); /** - * Returns a String to be displayed to the user, containing all available information about the location of the repository + * Returns a String to be displayed to the user, containing all available information about the location of the + * repository * * @return The to be displayed String */ diff --git a/phoenicis-repository/src/main/java/org/phoenicis/repository/types/MergeableRepository.java b/phoenicis-repository/src/main/java/org/phoenicis/repository/types/MergeableRepository.java index 1a300728cfe..b2b9585aba4 100644 --- a/phoenicis-repository/src/main/java/org/phoenicis/repository/types/MergeableRepository.java +++ b/phoenicis-repository/src/main/java/org/phoenicis/repository/types/MergeableRepository.java @@ -29,12 +29,12 @@ abstract class MergeableRepository implements Repository { * application source is taken. * * @param repositoriesMap A map containing a binding between the application sources and - * their repository DTO - * @param repositories A list containing all application sources in the order in - * which they should be merged + * their repository DTO + * @param repositories A list containing all application sources in the order in + * which they should be merged * @return A list containing category dtos of the merged application - * sources. If no application sources were given, an empty list is - * returned + * sources. If no application sources were given, an empty list is + * returned */ protected RepositoryDTO mergeRepositories(Map repositoriesMap, List repositories) { @@ -169,11 +169,13 @@ protected ApplicationDTO mergeApplications(ApplicationDTO leftApplication, Appli /** * Takes two lists of {@link URI}s leading to miniature images and merges them into a single list. - * During the merging all duplicates are removed, while the miniatures inside leftMiniatures have a higher priority + * During the merging all duplicates are removed, while the miniatures inside leftMiniatures have a + * higher priority * - * @param leftMiniatures The first list of miniature {@link URI}s + * @param leftMiniatures The first list of miniature {@link URI}s * @param rightMiniatures The first list of miniature {@link URI}s - * @return A list containing the merged miniature {@link URI}s from both leftMiniatures and rightMiniatures + * @return A list containing the merged miniature {@link URI}s from both leftMiniatures and + * rightMiniatures */ protected List mergeMiniatures(List leftMiniatures, List rightMiniatures) { HashMap mergedMiniatures = new HashMap<>(); diff --git a/phoenicis-repository/src/main/java/org/phoenicis/repository/types/MultipleRepository.java b/phoenicis-repository/src/main/java/org/phoenicis/repository/types/MultipleRepository.java index ee1f78773a2..cdf99f088b3 100644 --- a/phoenicis-repository/src/main/java/org/phoenicis/repository/types/MultipleRepository.java +++ b/phoenicis-repository/src/main/java/org/phoenicis/repository/types/MultipleRepository.java @@ -46,7 +46,7 @@ public RepositoryDTO fetchInstallableApplications() { LOGGER.info(String.format("Fetching applications for: %s", this.toString())); /* - * This step is needed because we need a mapping between the CategoryDTO + * This step is needed because we need a mapping between the CategoryDTO * list and its application source, to preserve the order in the * reduction step */ diff --git a/phoenicis-scripts/src/main/java/org/phoenicis/scripts/wizard/UiSetupWizardImplementation.java b/phoenicis-scripts/src/main/java/org/phoenicis/scripts/wizard/UiSetupWizardImplementation.java index 5c3ec60585b..8ec902bb8d3 100644 --- a/phoenicis-scripts/src/main/java/org/phoenicis/scripts/wizard/UiSetupWizardImplementation.java +++ b/phoenicis-scripts/src/main/java/org/phoenicis/scripts/wizard/UiSetupWizardImplementation.java @@ -140,10 +140,10 @@ public Void presentationHtml(String htmlToShow) { /** * Show a default script presentation * - * @param programName the name of the program + * @param programName the name of the program * @param programEditor the editor of the program * @param applicationHomepage homepage of the application - * @param scriptorName the scriptor name + * @param scriptorName the scriptor name */ @Override public Void presentation(String programName, String programEditor, String applicationHomepage, @@ -173,7 +173,7 @@ public Void presentation(String textToShow) { /** * Show the content of a licence file * - * @param textToShow a message above the licence + * @param textToShow a message above the licence * @param licenceFile the licence file to display (with 'from java.io import File') */ @Override @@ -192,7 +192,7 @@ public Void licenceFile(String textToShow, File licenceFile) { /** * Show the content of a licence file * - * @param textToShow a message above the licence + * @param textToShow a message above the licence * @param licenceFilePath the path of the licence file to display */ @Override @@ -203,7 +203,7 @@ public Void licenceFile(String textToShow, String licenceFilePath) { /** * Show a custom licence message * - * @param textToShow a message above the licence + * @param textToShow a message above the licence * @param licenceText the licence text to showRightView */ @Override @@ -225,7 +225,7 @@ public String textbox(String textToShow) { /** * Asks the user to enter a value * - * @param textToShow a text that will be shown + * @param textToShow a text that will be shown * @param defaultValue a default value * @return the value the user entered */ @@ -238,7 +238,7 @@ public String textbox(String textToShow, String defaultValue) { * Displays a showMenuStep so that the user can make a choice * * @param textToShow a text that will be shown - * @param menuItems a list containing the elements of the showMenuStep + * @param menuItems a list containing the elements of the showMenuStep * @return the value the user entered (as string) */ @Override @@ -250,7 +250,7 @@ public MenuItem menu(String textToShow, List menuItems) { * Displays a showMenuStep so that the user can make a choice * * @param textToShow a text that will be shown - * @param menuItems a list containing the elements of the showMenuStep + * @param menuItems a list containing the elements of the showMenuStep * @param defaultValue item which is selected by default * @return the value the user entered (as string) */ @@ -273,10 +273,10 @@ public String browse(String textToShow) { /** * Ask the user to choose a file * - * @param textToShow text to show - * @param directory default directory to browse in + * @param textToShow text to show + * @param directory default directory to browse in * @param allowedExtensions A list containing allowed extensions. All extensions will be allowed if this parameter - * is set to null + * is set to null * @return The path of the file */ @Override diff --git a/phoenicis-tools/src/main/java/org/phoenicis/tools/archive/Zip.java b/phoenicis-tools/src/main/java/org/phoenicis/tools/archive/Zip.java index 9f2759b3b3e..9ff0b216482 100644 --- a/phoenicis-tools/src/main/java/org/phoenicis/tools/archive/Zip.java +++ b/phoenicis-tools/src/main/java/org/phoenicis/tools/archive/Zip.java @@ -55,7 +55,7 @@ List uncompressZipFile(File inputFile, File outputDir, Consumer net.revelc.code.formatter formatter-maven-plugin - 2.0.1 + 2.7.2 @@ -247,7 +247,7 @@ net.revelc.code.formatter formatter-maven-plugin - 2.0.1 + 2.7.2 validate diff --git a/settings/POL_Formatter_Settings.xml b/settings/POL_Formatter_Settings.xml index 26d45d3cafc..b656b739a11 100644 --- a/settings/POL_Formatter_Settings.xml +++ b/settings/POL_Formatter_Settings.xml @@ -8,12 +8,12 @@ - + - + @@ -64,7 +64,7 @@ - + @@ -280,7 +280,7 @@ - + From 40c7f88c557a2352d67f1f118f87aacd79549d1e Mon Sep 17 00:00:00 2001 From: plata Date: Thu, 17 May 2018 19:34:34 +0200 Subject: [PATCH 54/76] Implement ls (#1336) --- .../phoenicis/tools/files/FileUtilities.java | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/phoenicis-tools/src/main/java/org/phoenicis/tools/files/FileUtilities.java b/phoenicis-tools/src/main/java/org/phoenicis/tools/files/FileUtilities.java index 41b4de596a6..edf3fa1a38e 100644 --- a/phoenicis-tools/src/main/java/org/phoenicis/tools/files/FileUtilities.java +++ b/phoenicis-tools/src/main/java/org/phoenicis/tools/files/FileUtilities.java @@ -38,11 +38,34 @@ public class FileUtilities extends FilesManipulator { @Value("${application.user.tmp}") private String tmpDirectory; + /** + * lists files and directories in given directory (non-recursive) + * @param directory + * @return list of files and directories + */ + public String[] ls(File directory) { + assertInDirectory(directory); + File[] files = directory.listFiles(); + return Arrays.stream(files) + .map(file -> file.getName()) + .toArray(String[]::new); + } + + /** + * creates a directory + * @param directoryToCreate + */ public void mkdir(File directoryToCreate) { assertInDirectory(directoryToCreate); directoryToCreate.mkdirs(); } + /** + * creates symbolic link + * @param destination + * @param target + * @throws IOException + */ public void createSymbolicLink(File destination, File target) throws IOException { assertInDirectory(destination); assertInDirectory(target); @@ -50,6 +73,12 @@ public void createSymbolicLink(File destination, File target) throws IOException Files.createSymbolicLink(destination.toPath(), target.toPath()); } + /** + * copies file + * @param source + * @param target + * @throws IOException + */ public void copy(File source, File target) throws IOException { assertInDirectory(source); assertInDirectory(target); @@ -66,7 +95,7 @@ public void copy(File source, File target) throws IOException { } /** - * Delete a file only if it is inside Phoenicis root + * deletes a file only if it is inside Phoenicis root * @param fileToDelete fileOrDirectoryToDelete */ public void remove(File fileToDelete) throws IOException { @@ -79,12 +108,24 @@ public void remove(File fileToDelete) throws IOException { } } + /** + * fetches content of the given file + * @param file + * @return content string + * @throws IOException + */ public String getFileContent(File file) throws IOException { assertInDirectory(file); return FileUtils.readFileToString(file, "UTF-8"); } + /** + * computes file size of the given file + * @param file + * @return file size + * @throws IOException + */ public long getSize(File file) throws IOException { assertInDirectory(file); @@ -92,12 +133,24 @@ public long getSize(File file) throws IOException { return Files.walk(folder).filter(p -> p.toFile().isFile()).mapToLong(p -> p.toFile().length()).sum(); } + /** + * writes content to file + * @param file + * @param content + * @throws IOException + */ public void writeToFile(File file, String content) throws IOException { assertInDirectory(file); FileUtils.writeStringToFile(file, content, "UTF-8"); } + /** + * creates temporary file + * @param extension + * @return + * @throws IOException + */ public File createTmpFile(String extension) throws IOException { final File tmpDirectoryFile = new File(tmpDirectory); tmpDirectoryFile.mkdirs(); From cf90e1bb37a51829fbeb4d3958b820ef3a363fe5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 21 May 2018 22:15:06 +0200 Subject: [PATCH 55/76] Bump net.revelc.code.formatter:formatter-maven-plugin from 2.7.2 to 2.7.3 (#1332) * Bump net.revelc.code.formatter:formatter-maven-plugin from 2.7.2 to 2.7.3 Bumps [net.revelc.code.formatter:formatter-maven-plugin](https://github.com/revelc/formatter-maven-plugin) from 2.7.2 to 2.7.3. - [Release notes](https://github.com/revelc/formatter-maven-plugin/releases) - [Changelog](https://github.com/revelc/formatter-maven-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/revelc/formatter-maven-plugin/compare/formatter-maven-plugin-2.7.2...formatter-maven-plugin-2.7.3) Signed-off-by: dependabot[bot] * Use property --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f494fabe62e..a71752264b5 100644 --- a/pom.xml +++ b/pom.xml @@ -51,6 +51,7 @@ 4.12 2.18.3 5.0.6.RELEASE + 2.7.3 @@ -172,7 +173,7 @@ net.revelc.code.formatter formatter-maven-plugin - 2.7.2 + ${formatter-maven-plugin.version} @@ -247,7 +248,7 @@ net.revelc.code.formatter formatter-maven-plugin - 2.7.2 + ${formatter-maven-plugin.version} validate From bff0514169ce51a94aea15da78a2d03c314651da Mon Sep 17 00:00:00 2001 From: plata Date: Tue, 22 May 2018 19:26:22 +0200 Subject: [PATCH 56/76] Use CloudCannon "Edition" template for docs (#1339) --- .../_code.scssc | Bin 0 -> 9414 bytes .../_layout.scssc | Bin 0 -> 98042 bytes .../_mixins.scssc | Bin 0 -> 6006 bytes .../_normalize.scssc | Bin 0 -> 51905 bytes .../_pygments.scssc | Bin 0 -> 49327 bytes .../_tables.scssc | Bin 0 -> 4257 bytes .../_typography.scssc | Bin 0 -> 45459 bytes docs/404.md | 7 + docs/Gemfile | 16 +- docs/LICENSE | 21 + docs/_config.yml | 98 ++-- docs/_data/navigation.yml | 31 -- .../Developers}/intellij-idea.md | 5 +- .../Developers}/maven-modules.md | 3 +- .../Developers}/release-process.md | 5 +- .../{_pages => _docs/Developers}/test-plan.md | 3 +- docs/{_pages => _docs/Developers}/themes.md | 46 +- .../Developers}/translation.md | 3 +- docs/{_pages => _docs/Users}/build.md | 3 +- docs/{_pages => _docs/Users}/configuration.md | 12 +- docs/{_pages => _docs/Users}/installation.md | 5 +- docs/{_pages => _docs/Users}/packages.md | 3 +- docs/{_pages => _docs/Users}/repository.md | 3 +- docs/{_pages => _docs/Users}/run.md | 3 +- docs/{_pages => _docs/Users}/shortcuts.md | 3 +- docs/_docs/_defaults.md | 6 + docs/_includes/head/custom.html | 9 - docs/_includes/toc.html | 85 ++++ docs/_layouts/default.html | 89 ++++ docs/_plugins/replace-regex.rb | 10 + docs/_posts/2018-04-12-oop-interfaces.md | 8 + docs/_posts/2018-05-18-generic-engines.md | 12 + docs/_posts/_defaults.md | 14 + docs/_sass/_code.scss | 37 ++ docs/_sass/_layout.scss | 466 ++++++++++++++++++ docs/_sass/_mixins.scss | 34 ++ docs/_sass/_normalize.scss | 427 ++++++++++++++++ docs/_sass/_pygments.scss | 81 +++ docs/_sass/_tables.scss | 21 + docs/_sass/_typography.scss | 253 ++++++++++ docs/apple-touch-icon.png | Bin 0 -> 12286 bytes docs/assets/images/android-chrome-192x192.png | Bin 32067 -> 0 bytes docs/assets/images/android-chrome-384x384.png | Bin 81722 -> 0 bytes docs/assets/images/apple-touch-icon.png | Bin 17352 -> 0 bytes docs/assets/images/browserconfig.xml | 9 - docs/assets/images/favicon-16x16.png | Bin 1434 -> 0 bytes docs/assets/images/favicon-32x32.png | Bin 2507 -> 0 bytes docs/assets/images/favicon.ico | Bin 15086 -> 0 bytes docs/assets/images/mstile-150x150.png | Bin 6668 -> 0 bytes docs/assets/images/phoenicis.png | Bin 10683 -> 0 bytes docs/assets/images/safari-pinned-tab.svg | 69 --- docs/assets/images/site.webmanifest | 19 - docs/changelog.html | 21 + docs/css/main.scss | 32 ++ docs/images/emblem.svg | 325 ++++++++++++ docs/images/favicon.png | Bin 0 -> 2985 bytes .../{assets => }/images/intellij-idea-run.png | Bin docs/images/menu.svg | 4 + .../images/themes/appDescription.png | Bin .../images/themes/appDescriptionMiniature.png | Bin .../images/themes/appDescriptionTitle.png | Bin docs/{assets => }/images/themes/apps.png | Bin docs/{assets => }/images/themes/console.png | Bin .../{assets => }/images/themes/containers.png | Bin docs/{assets => }/images/themes/footer.png | Bin docs/{assets => }/images/themes/header.png | Bin .../images/themes/leftBarTitle.png | Bin .../{assets => }/images/themes/leftButton.png | Bin docs/{assets => }/images/themes/leftPane.png | Bin .../images/themes/listChooser.png | Bin docs/{assets => }/images/themes/logo.png | Bin .../images/themes/mainWindowScene.png | Bin docs/{assets => }/images/themes/menuPane.png | Bin docs/{assets => }/images/themes/miniature.png | Bin .../images/themes/presentation.png | Bin docs/{assets => }/images/themes/rightPane.png | Bin docs/{assets => }/images/themes/searchBar.png | Bin .../images/themes/wineToolButton.png | Bin .../images/themes/wineToolCaption.png | Bin docs/{_pages/home.md => index.md} | 9 +- docs/robots.txt | 7 + docs/scripts/lunr.min.js | 7 + docs/scripts/search.js | 105 ++++ docs/search.html | 32 ++ docs/siteicon.png | Bin 0 -> 38017 bytes docs/touch-icon.png | Bin 0 -> 13315 bytes 86 files changed, 2232 insertions(+), 229 deletions(-) create mode 100644 docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_code.scssc create mode 100644 docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_layout.scssc create mode 100644 docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_mixins.scssc create mode 100644 docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_normalize.scssc create mode 100644 docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_pygments.scssc create mode 100644 docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_tables.scssc create mode 100644 docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_typography.scssc create mode 100644 docs/404.md create mode 100644 docs/LICENSE delete mode 100644 docs/_data/navigation.yml rename docs/{_pages => _docs/Developers}/intellij-idea.md (77%) rename docs/{_pages => _docs/Developers}/maven-modules.md (97%) rename docs/{_pages => _docs/Developers}/release-process.md (89%) rename docs/{_pages => _docs/Developers}/test-plan.md (99%) rename docs/{_pages => _docs/Developers}/themes.md (59%) rename docs/{_pages => _docs/Developers}/translation.md (92%) rename docs/{_pages => _docs/Users}/build.md (99%) rename docs/{_pages => _docs/Users}/configuration.md (86%) rename docs/{_pages => _docs/Users}/installation.md (82%) rename docs/{_pages => _docs/Users}/packages.md (84%) rename docs/{_pages => _docs/Users}/repository.md (99%) rename docs/{_pages => _docs/Users}/run.md (96%) rename docs/{_pages => _docs/Users}/shortcuts.md (94%) create mode 100644 docs/_docs/_defaults.md delete mode 100644 docs/_includes/head/custom.html create mode 100644 docs/_includes/toc.html create mode 100755 docs/_layouts/default.html create mode 100644 docs/_plugins/replace-regex.rb create mode 100644 docs/_posts/2018-04-12-oop-interfaces.md create mode 100644 docs/_posts/2018-05-18-generic-engines.md create mode 100644 docs/_posts/_defaults.md create mode 100644 docs/_sass/_code.scss create mode 100644 docs/_sass/_layout.scss create mode 100755 docs/_sass/_mixins.scss create mode 100755 docs/_sass/_normalize.scss create mode 100755 docs/_sass/_pygments.scss create mode 100644 docs/_sass/_tables.scss create mode 100644 docs/_sass/_typography.scss create mode 100644 docs/apple-touch-icon.png delete mode 100644 docs/assets/images/android-chrome-192x192.png delete mode 100644 docs/assets/images/android-chrome-384x384.png delete mode 100644 docs/assets/images/apple-touch-icon.png delete mode 100644 docs/assets/images/browserconfig.xml delete mode 100644 docs/assets/images/favicon-16x16.png delete mode 100644 docs/assets/images/favicon-32x32.png delete mode 100644 docs/assets/images/favicon.ico delete mode 100644 docs/assets/images/mstile-150x150.png delete mode 100644 docs/assets/images/phoenicis.png delete mode 100644 docs/assets/images/safari-pinned-tab.svg delete mode 100644 docs/assets/images/site.webmanifest create mode 100644 docs/changelog.html create mode 100755 docs/css/main.scss create mode 100644 docs/images/emblem.svg create mode 100644 docs/images/favicon.png rename docs/{assets => }/images/intellij-idea-run.png (100%) create mode 100644 docs/images/menu.svg rename docs/{assets => }/images/themes/appDescription.png (100%) rename docs/{assets => }/images/themes/appDescriptionMiniature.png (100%) rename docs/{assets => }/images/themes/appDescriptionTitle.png (100%) rename docs/{assets => }/images/themes/apps.png (100%) rename docs/{assets => }/images/themes/console.png (100%) rename docs/{assets => }/images/themes/containers.png (100%) rename docs/{assets => }/images/themes/footer.png (100%) rename docs/{assets => }/images/themes/header.png (100%) rename docs/{assets => }/images/themes/leftBarTitle.png (100%) rename docs/{assets => }/images/themes/leftButton.png (100%) rename docs/{assets => }/images/themes/leftPane.png (100%) rename docs/{assets => }/images/themes/listChooser.png (100%) rename docs/{assets => }/images/themes/logo.png (100%) rename docs/{assets => }/images/themes/mainWindowScene.png (100%) rename docs/{assets => }/images/themes/menuPane.png (100%) rename docs/{assets => }/images/themes/miniature.png (100%) rename docs/{assets => }/images/themes/presentation.png (100%) rename docs/{assets => }/images/themes/rightPane.png (100%) rename docs/{assets => }/images/themes/searchBar.png (100%) rename docs/{assets => }/images/themes/wineToolButton.png (100%) rename docs/{assets => }/images/themes/wineToolCaption.png (100%) rename docs/{_pages/home.md => index.md} (90%) create mode 100644 docs/robots.txt create mode 100644 docs/scripts/lunr.min.js create mode 100644 docs/scripts/search.js create mode 100644 docs/search.html create mode 100644 docs/siteicon.png create mode 100644 docs/touch-icon.png diff --git a/docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_code.scssc b/docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_code.scssc new file mode 100644 index 0000000000000000000000000000000000000000..07fd170f6617f1c5eae7fdd66e0794c15ddeca22 GIT binary patch literal 9414 zcmb`N&2AgX5r8Ekph$`mWy!K7TefGpP;6%{ijpP&Oao4DHWnaYV|Z7>=AZ*HB1h81 zvD?^n?)<3h`<);>b)I%k{kxUjj<@r0tG%=HaCi4n`%!0m>(SQE*4BfE4<6rd z?lvDiKHlE-?w{PRe6J+j)dMe%UH35Zeb@a`h~$~*_*HkFx6guZC-TFi5uriXN1>Wq z;SoF^75D3l{m8%PwBhYNCrOHK@#&$v$opOt`<)gF#lo#;mJa-`-%dp2x}S+&&pYtH z9{6F~FS&EP=l72NC`OAn^1@1PhE

    !u@#Ud(i85eI+%UNv-9jo_777A0}mRJ@k71 ze!T>a7g_nxt)(yGzSs7f@UI-*8x{$tv7RI+_uofp?l(hN+R9rVjo{Kn00uj!zMev}?#mPzR zC-6AO{jif(Vb{}-Y%M?%bg>DpLJNo}@uMbIWJ~EE!RE3SWAj;?uv(cd?AOcKR|w87 zY4OWVwk+6{BD)G8Y(=ouGP@?o)-1a*RI0I?O?FFH29x7#&A^CwKTDSkOG_h`B%php z$8t2aj8@NkUNrPwW;gfiZ1YU?{LL3#FY-1U&(DM(2JIl;?CYnFXvdqa7^cT&3tOuZ zx8pbkxg}gD>$82?KwpcmrTapLz%&?gbhr2TsHJ&b_nJs1~}?{!<>srI3}!ebbz zEgY_`b1w=ZB*eNy!KuVMj)N&yJetqV`{$A9PDGe&oOr#U`x=4WS^m=N z4q&Eh@Pl>~^b-{~J`Z5ndEFAbJtFWGR&?EiBm!^B?Dl^B`F_|IVJx~{;@xvT%N}EV z8bpB~-E->l$$93V*P-}%08zoiDdGG?gaTgm;7>YLQ}5=u=;PP;%@jhu?)z>n=)g1& zPC%bq=N%trdD}}M76l=A+HXP72>=OXZ~)Kb2Kx+5tjl`HV5!A!av1G=i>(J!?j_!b z25ZHy!^C^#mO}p=+H?wM+z0eCYs#V>*`|PyO$7@1Oe5oW-RaCkmagzXIY7vZ$0F+Z(MIHTf%lUn&=dc+(kt z{x05~W^naZGf~^E>Dq3nEb|~0P zjg>GzQ=1l65p1@UZgs|_`C2l~@)yziq%7aemCHK!PAf0M9LE2k$1xV+Mev+zVyU8$ zF(1I3Q)eNyWASPOk`TxU?XwvK(nSp9Mu+&4YB-thEP=5l-Go@WVVE9CMQjSF!%YRc z!~bhoxTGzZLtOg8r~jt}hbM;E|jMY6LZ>x2`!!Bh03&&AnM9_&`Hkh(B-XWbA7afmvgYofJZS5OSF(! zb4{B9f;AOr*y{v~661oHbcPq!EU?wS*TI9BvADLp>q-vy3Rqvz4UZ)XFIHTe0>U*F zXxt6LMTvRUbGb}YI>QSM3+|-dM5WnyY}-s+%@JP(2WT^aC0a18#5M&)Y%0*iKO|z5 z7`L5}&hP@a5KrDv=!k1AaY*RqQrUFg;1rehJ%^Gw5N@sZCOAGOw zcko< z&@2}{MX3hinI8q&e$?1sC^0U1kyja#=V`)OlW>Y}erUH%qN5V!4I7YUH1L+Je{Kws~}WUxfx$x3TeK(wX;P5V!xMTv2ljC6(<{$-)HByMmXI_@z0 z*#PgUD(p6FY@h+$WgZTCctkCt)*uX$_-G2wb>ReB^n%cMJI_TFz$U=!?$?W$=kGx{ z`Y6|I9{~j|mRO=5T!JBNZ91D0YPvconb9LnH{HLf>Cnu$1yef23;)qgNBh_{kuv8^-OSz3wN+UD1B=^*|)P^CY`rtaJnY*q2Y~I8`fGNvQ--}MZ77XT|1UahQ$v>hMMX25KDA>m^yg@vSM~bf3YsZI{^a25{&+#ru&@F-z;{vjDh8MmlsK`XblhcjaP}uKn?&hHHf)BLj zVrfE-Wm7=VrUDIpOwcGn5!=ker8B(H*3c9h*OlkI@F}S?$A%82aN!Sk&3(8HUFQSdxiYC5ZxLN5yD)@zLsxCCqi)sUy>TDqI&k#_FNZE|TsZdH zQ984G4cCDy46K?v`ga|9$`9Yt({Xr_9fYIs@V%F`^R`j}Pp~oQ#L;!=a1p9yhjPF% zbp8gf(^D&O4GyTFB#(8loVu@XQIQ{xIIsfUG^Y6QO6{Co2RF&^BIhFPB3T7VvR}=h zn^~u2Eh{$>P;W$edSi(nsD)f-C=pFRrS0K5n5tn}Gc+sZw-sm^S_}1RYFSv(D_vCv h8c=88W;2n2(sb>?U!RQrdW6C;u53j$<=OV({{h4?D8neLvZXQq=*x~Cs=FAhJnLc`V?nD=6sV0)l`mD*I4(*!jt4>v&sycP*JpSWTC#FtJ9DY`()tYZFpP#sQ{(S4!+VRFLvV zo|u_gxZ~9E*6CAsHjgdLwC3k#=4NN7r|0HR%*~vbU6`wV%Sg9=?b+t)YQ6qouhpv8 zU)b%gJzx)>+EuTWJ^20b@R|LG+siBKYxVl%((2?~ zr`7Bosi~Y^>q4v98LkiC`(S;%Txs@JTl43z>1wyW-}QgC)oIPGb$j*t-QA_7=GoSx z>#gOv)<}Ivxzt*kZS__k-qx+(7*`JUwl%gtJlw4xsFb&tRywUvYYb`ulpEq&_jX!K zt>v{*AZWR{)H<`@AwS$0eXzcZvQ}4`bFFD8@3fa&?O|ZgLc7z#%G2HY^)bBXueR3b zyJPiz8OTtoW0jh&ABja{Qiy>Pg(C$#G}_Kh{JY+QxqyO29x zZlHPN>gmQcpBe>4#`VLE8-Vi0jorpgqm8F_9dg?Mx#7lsmAbldV7hUT8zWae zXRl{wpEJzU@P;e!u4x=Nv;W(UE_Rn%M<3}ld(ER$&tL4emfLgf)uSu?YrZ?Tdi2~X zXxGtmo#tcR^|h(hxz$xtH6B=(BUZ_6k@FXLO#^2H9zLMjA&d6<&l5>-Dp1J-}qN zapcVYeaqeD*2K+D5O_B`lWd!gOx)%Tb4t(9JDuDJ$g zr@ailt(*h<(gw7k4hqIdBt#=H=(|~nF!j{Nf%3M-!SeRTZS5=Sd&(6c_#A2XrTWNn z>mu;v3Q*R@(eiW#-nKNn`qgA$5&~G>Wm@bE7{DkILlaHB)O+;HXM`q#*>Iq=Jj~Eh zWk9GMePBqyq?`-Z9~5`nuEq!s>ga5Do<_7$>o&$l$l^LJ2W=UM$BJTkZ3UBr}a8Adihn z6uQO~N!Dm{eXUE{iDNk3m}wkC(bygs=6Smvy4c06!_;2W;qk^DRu)nKL>4T76OOiW z!E~^LJ2+`*_o$TTL%C48t9zlaQK+`KT^UGcJ! zQ+05og8RUp+w+^?F0PG$>#(}Mu+YAQ>a!bEzgxe~j{#S`y94v$2r_?%>CQFSq^;P^ zwgP*jPCXoJD|Q1Z0@wb@R0?h)dSnar+? zg!4-1WSo)3l-P`ZEG{DP^F6HbpyIrK%Qn*FK00q=6?zcDb&p;O9J(b5s5 z7kEc2l8W@|$~45+Y+iu3^AJfQ+sM5JtDyJ;Wn|HH08L>3C$yV$Tqh%;S4az`QJm z1f1p1sRxmt&cEKx^@o0zd$$H%%frq?_4;fJ6uCuA%ZUUSxcW!~T)*-5jnJ1~j*hA3 zVJV7rHaSxPbG*r+#@LVRD>4N)0wZOn!j$+#PEK|xQ!v+sHH}*eRZYRR{rjtua#P@+ zmz0~RhcHQDs*h8f0wC7a0$@pL$k1YqoTPYU%HruPDMD=C(QBM0XYNMNjif)N7c{00_Yr026#p2*w(@*})@I7OzYYJhIkZNz*bfPDN6T8l6VDtTcB_8XfV}ho=O1_Vl4nB_Sc12 ztReigqw0|DhN}BVAam0_VVP#_Wasnm1&1V*M4$8Of&=u!IaD@5P~?fe_MUR_26dEJxkqL z2t`lMLL}L(Az;?@ndc;Pyq)SuW=ibnX)Gr`)&bPqN*F^Z_X_&q+!+<5+rHAA$IUEP z4Wq^fQxTl!v{%=Bs%Gn--@>&q8AB?{hsOdR7HBe#*kf8#I4Z%N%=3k=4G*0z*#2gCFgapUKdnq2h4B)ZoQ9OxQ#W(eL?*Xyejz*) zhSkrNGt@&6NKA>HO?p!)03whU01M=cMS`$~IN??xJu+qS5*A1yc8iO=V-dl}pnsWI zFeT1GlHe2oA=m<7f?p*BV~v~!dSuGtkp#h;TjU*&=sXVH?qoB7DY52BI#U3IP78qP ze6`StHF9pUN2V;EOwhUMrOzD^sdo^EgA8NJ>P%(nlL8>5S^!Myn}t-YA>6bw?2##p zA54(Cg%!bxh}aWEULY1zeH1nYK!~*fnAo=pu~;LgupXJRcpDRoR@%iZj|R-k;*5Z^ zCQZ*EJHiY?W*^L4a?4#!8mIeD8dzn^lLj>&Z{zs}`e`loY2b@kYD|fiJ4>xL*EYH4 zy)&@RTj@Iiy2LRsB_onl<`e)KbPIq7{dZ)PutqM9;gKne-{nCUD_s*8nc{E*yVLcE zz(|$83}q3v&_LM#P&2 zpm;soc1%qV#+wu%;f)2vy!n#w25ZP^2y6H}Qf2XF=8f2b(}4mA9tb$AG};#2bYKVpNFwov|mC&E8w=reZH~^*iz*lJEcorVL+P31NW_Lrd0Kx>d z$(d=NGu}>hA=-dlOlWN|T~G`p6M{&=y_vNP;qK4E-IYasv=8P7Ob;f0WH7%B<{UO% zOd2BMsF91y-M79x*X(q5L7WNy#e+lBcy?v9cYd~sgAS(-;q6$z5W24S!s6KkGJNZ+g#ZO$26hdxm7wnif2Pd%cbTD{5w|S=~OsR z4He*+>-lponZabrU{Y!_iK=@W_cgvfM}}4QYU8B4lH!NVOQ?DRi07s5Qw*LGyRq{U zwg#liV&y49N$^qc3g!x;90JZ7Nj)!Zeq;Ua$oQw?30P;7UMegpV9M;IW ztsbee_$ihH<+g5eqw(H|;(MWEIX{glJIPj-peX=CsRh84{=86%HF936N2V-(Awg+h zFEtz&$a<=wLe5)_FDTpxsLK3|DP!r$q$I6E3Xt%~0%9J0NO*)bMDVOt@JN-#hnYvH zgl^?}cNpEWc%y)`%A-%`r1pj6Gz;zv-O8p%w;SVrzLQOvJ<+XgPi<(q*gZ~Sj zTYSdLMbSsO>UjJ9&081PtoPQ18Y2u3$6A;BfiyXcjwy)%xiv6&=-~w4t|gdxU>8rH zUEteL=CJbfR&av~?l<5@7o5z68$RiexWt-|qwrsH@<8q?`$Zgr`Wl}L5Al=G(QhI-^W6NDL6O_kqv+6 zrg}m?1wiI@3xG%W>TfY!$n0-N*CSIF*L({j!S*o4L=h`wV%omlA1E%1KN2CcWN^Zl57kHJ+ZQx7 z6?AL^q~ayhjh9A(km^?i0kL2(K@e{8g0KjOMIMK9xm8hc!=WbXc-nqZG|Vr8ehx6T zm=g06mJbQ!Q(y#n14f*ZKD&xL;QnW~v%coeQ6ty*p4^KgtX~Xx%1IbZi5e!|+Y|t? zsulp7^H+BB@@pcGRgS4m1!0EAKtfGPbIp%iP#O2H1PN2V;^m!Nd(*F0Yq(fl$% zLDmMC>Z7hH07A0`z%+kCXvP{j-`XQn7QdCCdE-sv;lwG@mq)a|9J-e11f~R$EsH*zxtql*NBZ(AqaTvE@CqS42E{1)z8>n=wpPmT2iURtk{t#sXsA zd_j1FHRRBj<&8(GEWW6C6Rx9gTkp`Sx36a$Dw0?H%FTPlBfR>j#^dc*f@eWLtyla? zphPIgl$dE0t6_M1gjfHSQ?7m2OU-D+n$Uqvu$Yp?Oj3$d0K_4%0C=Q!ek%(F)(}Hz zN6I5p7Q4PROie=Tm|GswXjN{bq?U%W5vjA#vnVX4`Y3D)fRJhdFsTzlD%Qv;tVgCS zZe~&?RQAe%d0G4)k#Q>vdWpAf(b=p1LhLJ&5VtNzh^g^-y9Gi_KdlhAfN~LHOvOTc zr3`FUh-q&W#N0W#8?K7L?e*p7!m8< ziK9M1@3*lsVDI+?QRkcdycN_R^=jj!(xw23BwH+4lFy1HV~w2BVi}!Vevlnbv_xUZemCFDxMDMN4>rHF8?*kt&OY1TWk%fcE41 zR)VqDPyr$ey-7GOKvvGIj20vM7Xb|kbYbcy7NjKIDF8yZ1;BJ)6uPm7%njCXdt}Pu zQiATj?#CWDtnXjkSa+B4L9<*Yy^7&8$J_0Q2W>z};*OZA#2wS_MhcMd!UAGmyis_8 zH6)g5dEt>Ni|UwE&pZe5it9EofGG+16 z1j)Pc5j(w?QxRx5n{m1-&r1=-OMrl!Z@`pjR#Ki*0EA)-fGPfcp%`n3%2Oj&#_Me$ne z(i)tQ#E0JoUu&#H^sX3sF(vFz3UvyA&}#uOz1w8_1Z(8z^~jXP$Z&8G;wz)=OYLQP zjT5&a_V{=ACKo#Xp6&f`V(>ZL#&fqd9(dx4#`EC6=TA3Y5XHG4jd<`Vpd=(`0boFXH=GhXzdQ*q4=%YE87sJt&4C#C7lsV_s}cIE0RKitA5)t|KLt?GM}P|b zaC%^zJx=>Z3@yOm43j&YN;@mV*=@9u8Qw)(i>O+IZsqzWrjiF$-P3tB*c50dUX(}y zm7^~RG&-7kW>@3c_GD$_e!kJ$|4?PBze7AU*q`w-4VN}L3Y&s^tATr45HOV3%Yu8v zz@5y&U8qe@O`keZ-86IgppSSWF@^Y1(}CSFOsQHLikt*Sww};v5>C7lPN850tJ*ke zXH$SgO)M5{XW`g(n5?meoG7p}DV70JunH18%kN%}w3pmv^jhW)4xEH=d+=P7qBIva zAEg=PP$M-Sr%g=yX`?h30AHaUQ?h-4%rnOrGb{N4H-s-nhT$S~CSgZR-B=m?xWBAR*rZV)EZ3 z>j&7Vk}vzsDcWiH>x-6A67cqaTate+`li>aRW#*^>Hqiid2YvKUTwhfwI1hW1kPyxX4VV<&Eqx6d}=S@NFSG=VUU zNsqUm3|)DiJPCBj>ra?64gd`*543Xwt~^SeuO5Xb&ex|_FF317&QpENox*o->ZbY< z7Yh42YLx1s#*1LsxfR?u6XsQGV~2_J5Zqi5D3NXhMqY2&IfXBwPQpP)@^Ckp0sM0f zruumMyEZ=ufQ|EqO{p=$@Nn!L@Lj+r!5>o+3~+P6xI}YxBu^xS*8OLK&ovT+gM48p zG?7Sw*wDit0%E-Vnn-Y71DM>zvo59%o5954N&6WoND?GONR@bhTEA0(WV*C~SikoQ zGqHxOa;>X?Wq?#!?AsQ|O0#)`c;W6f2%ADI0-wtzxgs42FHR3V5pfhUbhMO`w}j5q z97w|u9z-yh3AYFns7j6tR7h+%lwiYE@;EZQ;lI*qX4d07m%F;$a^cl67hVlqkk!Kw zCV63$;X)FI;(~?2TsWn;fK?>MV`YJG0F=t&bb<@}6c_k}T_w~87viRGNeDq~u7=P; z$qqdwW$H~%b5O^A8-W@r@)4xKVDir>^07*8dp@947SB$Qe_3wV(09eCqk)s)Ih3O? zgi}!A7+jhSNmz;v78bMNVZ{cll8dAhE`VBDyez?n%k#d6Vp9eg+5x5HfF5WXmf{0~ z7Ff)OCB+AP!^yVohw2O6IZt(N$pMFK!W&&f-v_G<_o70*HiutUzzBU!V1zfrsNyDX z*23`l<%nxN-iCka58Q{bD-tNsVJS+A^*~13BXICZB;1KiPYI*=p`V0b^!j*oUk{xs z%ZSN7J2pc}7!m-0at(t=_seQ@v5L?ZSw@diS^Tvc-4Kq_OR;E;z)LZHSYT7(@1Zxu zymferZq^pH*Uw8Z2V1Pbz{@TEtJHkV+0>l-|Tfsd0|%ku+y}gmt!VkEk^a@0)Op zDG}MDHvu(@U6>T&oIO&v82=wC<_`pJ``FXa4*)7kF)?W(or5c860}lG1ieMYOoCR5 ziJ-HJSr)H&N;UGU9{m6wM5|MTr?e82M?`c%gwtW8G$5sw2*|28It*#8Od_SU(!ye` zTvTF)RkB)%g`|}rm{qNOQ(#G1z~mlwu0Xc6;OYP|FKx@>A0#GvxmWeMtZi$|HG0`N~~SRxe6#pxF96OrNOSTVhVU1<+C0 zVNzBfY3WMBPy=mYuynm8sv-=J91o8YEXi29WCflM$WVk=Ua1QaUdaL5`ol5lKMb@g zA;6?a{KgBfBrHXrg~cp*M^q)ds_>}6!YjpsXcJ5if9A>Jp&yBf{}D?(CguE2dfbyR z6h#&W6aA}El`PR7C0I%&h~Dr)(Hzx38dLqFK&EVb4q?JzjrH-X-bl@rtTFx910p`|-ahL~telXpMa-9+Xtbg0S zEG``u=MH-@-f6dSxp9Ex@E^BbnuA}4dz&8^d0>zRW@|4DriVk`7$nfyM+W;ZH$nEZY}S;nKGSwuSZE+n_5szc++Qaoy8GmV}`O&B9aB`bSS7pV?ooq> zFA}_p@2EKjjfXEHO0*ePc_G()y?W>!F)Q8y$jEmSpj>YeZ_J7$EX4{7i&^n2iWOKz zPPRs3<57c`F%&C;`@d`P_@LkXbZ2+BEgq-PCLP@!dMBvAexo||Oes~`Wb_i;;9w)L z3-lM?>Ha_>vJvkD;uX6v8Ltr3W2MG`Rkq5KUjZF@S3KJ9fa|gTJ|DEsp&04yqwbP+!yoq z-O#04&0Bv>W8?)E5^#n*XA6u;gXC@72HQxL8A>X{v8KVIa$Mzye$qMqBY4|DsG z+SCdhclFOxnym@gA5FgnY7_Yz>%1LdiKOF<*ll`lX18kb%haoQg@aEwRB)SrV4Aj20Hl^O2hEE*paIsFlSe zzjYycoO$EIUa{J6$@HF>74HGsmGQx(MC)lWKH%Z}p(JRzgbd}{y9?7bAKQK=eul7e zKA&c#BxHHRl_1N}L4@oMX$wkaagQ1R#KhKz2v2yeV}r-=1YU4p5zeWM*d9^B!ey1@BO9_+3gN5mJN|>;UtbQZ+7z+V4_`Wg=lbWS}F^EK2+^8Vh zIYQ65d$KbvOmXR%HZ|qFZ}YRQn)0YM%y#d?DUTA-l=nU$TIOn~Ql0W@a=T;u;xYJ^ zj(7YapT4lQtx8TOJxs2C)@o0dG$`)fhyf-V0w=t0?HOv+4{w!ujl%DJ^LSZ#h! z2{~5D+F*}TS$v8~7iVCAmosLjoRpyA^W&&P|2n4pUjq&*=7&ky)lE~LgrO+6FqrZ` zQIum9S6hx~b+FWj1bYc*!O2SA61=m*PgO_Dhs5R*J2T{Q( z5h?fwfdgV5ph{K2RoJoL(>SBYk`LnyeJC(1sQHJWALW%|QUYA*;ZDL(!);;ka9=$p zt_M~TYZ48&M+qKy=Z!d}=KjiTr?rr|xs;Ri567f`7?4nUj>&%E)+7u?x`n}{->OK* zDp@`ED3!%+3DV;bqPFRy2Tq?(JPS1R8!^$p0o^OF2$OM_FzL@#q+^w=W%DSN#RE*bvTPp= z6u=`h3ZgX)*0MQ|WB|*iU6+qtmSv;XVAMW_mW>jTW&0R#Kv_0SiXBIhGe^(+TDCjV zmhIz#S;4Y>9Qsj~4U_#WTM~vEZVQ8ldtD6@j6k5XA&;Njk!WxFGJtKt(e>7M{3 zlx4$YKS@u*P^4QJO#15;=~zWt*{}Fypa3?;6hzCiZ-PPp)Mbr0wT8j|6plD0q7nZTa6pYX zCWYEfkNDV$sf|{e6I~Od=*XHi=g*tamzYV`6f) z*J?gOK^WM4paQq+a83$9oRWPi(};cE&gA)UXYL%iGApSswwY&uM^A*$64~|dAH+=f z1HeGZ7$$`YX&FnxPzqvUu#D}KZ<7pRm8^_;l*-~t*>D#bOR`i+46;-Xu^C}|UmzZy znpI0@8=BMh=xTUv995QbyupdQD(+~BqD6lHcWx@ zqpEh_7{TE2uGvCIk-r5=E{~E+27>NH0y{MQVCT*wHTmDHHN;)kJ z){TdhZeW#cOwglL7B6DmxC}4xk7A1d2>O;m8p5PlgUj<0lYJ>uh!CUOicP`pnrAX1e3CkO&h`_3}px{3?A&q)nH?l?12-HQdvB~gN=p+2?1S6 zGE|8gGE`5Us_CZ#@nvzJLdI&9HiSFCo`C_(eCGsqpsgW_%-?4(%lu*MoE0)3R2dqm zAE7roKS8a5ub)NcQX;ZJp9O}Bt%NFi=$s!2tC!&UXLjqM#-Lm3e;P(9*rPv%9+f@9 zq==|@9vXH_eWP#L4JA8J5Bp#T;&5UI4>ewf+~J1skh$;^vg7(7s)O&cGE_~k+GR!X z5}QYKWIHt3HsY0Si&~Uc>m)3tSQZaf>)(nvk+tF29#AWbf6Hnui{7zA6SohbXZ+y8 z=Qgif+hpFw)}ULrr)GGoTLbkYP8I5w@+7D=2+rqFdMFX;*5{zUVlgI#e@?fQ%?}^B z&>t*rZ1uh2q0h&9_Ic=C`NWu%P#VZx5NWr&pL=pR4Oc~E5w1Cia{1RSlBB46B-o`n z>l8@oe+D86`jEtz5ww}VFB9~w7W8d;m83yK2rWD-tv=Xk-X2bm#1Y%UjP4+J;UdWd zd14ScN}bOZGnH%~iP|xPNZw2(VJYv!;=*R?Y3i9Gtdd=ZVIiPa7KddkL%fgA1*IvA zKUap&Dy~_5eO6k$Rkg6wsCGJbPJ!1!52Kq!7ubRHArEv?q&gUyzu3HO1YazyNvJhJ z37{gI^%uY(6{y}`ArE)4d>!*Gpa4k%VU!ZPy!y1!vU@ASKC1EIQ zYhkdYyg*3`RuO|7MFBlZW${9m6rtOF{b8ZG)b2c%ru~Nf@LBogiL>w!<^CfRtMJd{ zYOB{ye8y(zi!nF82zV*|!KB1f(%eYGP~5OEm>YA78(1Z)Hy)+3m``z|?*~s(pN$;) z%b4!Jv~**#pA;lvD7q~Srh8q{ja9OAdz4_eCqeh-Pw4zrO!8kr=W1<=Nvm$v)p!zy zBH6-Vl3%Y##wtutBNBX%672GD74hV50drJe?yeo4qOc*P+UMbJRCoE-i9`9d6dZb> zwG^xqlA)w8flc$*LFg@;5$J)`3SY8;b7R9UAhg5(yK~f~pFWHa-|UMpp@#hqoXedX zbn4&(VZlHmDw{m64j=E(t!3TF{_H?N<-Hn23642xpo6Uy2kPe_y9n6NA=?kSvR`t4 zs`08XL474?m^{q$dc~jJIEInCQ~%{yL%s~Xs1ODw`x%8K4CO>v7_1@xUTFwc$%ZgI zN@ejMSVK^1d5`*}85yLV_J( z-E!ICmZ{?wnE;UFfjYE$2f?MFci4I`y&I?>am`Whrfff`a$j+Os(SYosIT-6lha$( zyR1+4)gZRPC;KXNqZAL55|~MQAxRiY@hl8hylcf84`G$8;(3(H;yQ8LMDe~7C@71X zf@s;L6>sFOi6)6kE&B4vw%o7}yZUZ-;BN;JXQ3WPU2T9+YZ&#v#Zjk32p?+F_F`eVFz;5MFpa{VOd;M z%&OK0ZPq~}IE9D${Vcd%dv{s<$x!1SFk^TLmLBP3s6p8gp1N^{Ns)F62woN|RR9S= zn*bf*xrvy568EREA3KB{h$ot6<(nf`+WN%G%c56>_7I(;JVAf6MCX{L_qgfcp?Ynt zz0_L8$%MHD-)oA9wvA9)B#g(+w16lF0I90BPn*RgEM*%kEVd256rr1S1h74zRu=C` z*@mqJrM?jxgm1V`0y{9-&jCupP;^@uO!r3>-B=|{w@0Zgev|1&CjMNeOy7b zo`ZIPZa<{f7fraU1rAZY316JN(DDg+R5tiXurErH%CJ8QYkKy@{}GUp7hkL|j%Ay4 z{(%j_7su8EIb{QNBNwI7DFYWrcY~b#$3P_XNvBexzB!O#970F_zOlxY?n&M;$4c@_ z_)Xrv2;wOcIoyURm?Hn*AXt;(9UQ+AgCC|KVpYM9xQIg@dA0ut^_5rqe;j$R?Rl`g zowhE`yL=mawKFp_Rj;OjOGy|_szZt;{MrMWv9261=1?TR<4 zydt!&d89#nzDsM+fE`I}9Mu=1L0z{ zmjR053I`wu-3XQeN)LF5BL_}#A_B*pSX7*#I&$VOl7)a^StvJzZ4#;rI~gYwP*N*V zBeO~R7t-WeDk5t47PTF_VQLjVC=U!@om^=yw>p!pOUHSg#<=DV4nvD<4AjxPsMsZKGN=h>_+g;qmHtJg;T5tU&G;RqVhkH9E>l`I zh|Eh$SlJJacUfI?nQdK~n}?5eZ}F?<#r8^nkYj8srD1c$(H;65=-cLF@S58ClKb#E zy0>CicT~EC9Q|fVL23KwNa|^O%e@R(#XSNG`z3*zaHVI*)TYF9yRHoqv}+6U2;P5? zN7vlJVQ7&&LLD;@o9KqD>3Kou8a-j=*Ut*>3$YJ14h}o z2n^e~-&M*&b#mb)hX{nc;2Eui#oyprM9qlp2Ns(6zXU7xR9FEyc$AP$Kc(e4ll0`5 z0i#$Efniqsv0??)5w1rjpGpBS2pT0=vFTmzV!T2+HppY_5Hp6)RC6r$_o9EV?16;_X#8Az$p47FiihJML*Tadb|O#vbZHd|JJ_`S6o%$ z0pwsToedwQ(pkzDiI>Eyg4HWy>?8^x7M2N&MHybcg?k3*9HdPczI5( zYwqAMw8*K2I{FGTcByw0-QYl=)(y_+LZ{`1pFY2?q$Y9Dnru7nniV%y#szYWF{88* z&H=_H16IPm*s-QRFYO!)l5S<}sTEov$IwD)*^^A0r3@H_djy8f(z}&e zqB>c_Or>O)e=cQ~V5r$Fy1Fh>Hfkj5@{?H8I7g1>^VD)g|JQty^ecXpY5)#b=@W9$}F68Ll3Zggee7bFx1Ku zFs1vPa40fhl%z*sSkgbQgp%rr#}~OER0@cd#h;}l9azMY{+|@kh;>@hFEbo*XbS?a z!V#`HNC5nBf2(o;MMe%NEspxemOF7HYNK-x#nYIBK^7p#SUpM`3qJ6viX3z~MT9k? z3xo!Gab(D!+DP~;5@rEbW(bkHgsv;|MIhPU&ovi?PBq5~q<`ovgPGD3VgiRcM8o?9 znnq`)r*9!+Xs5Enl|h9ZeQBbgv8XoPUv`g&U;m%O7dQr-wo3mg3;XL>y%F)1*x@3*(DR_VD4abCY#)XSpkC> zrWe;7v;cm%zg4pWMJDP_Y2i7Wl`y^R?)wa3a&nns{sn^qIY#ycbgQ4F9u*&qj% z(zf2C%mCc|L2Kf~h*jZv3TPxbS{23@kE0`bvDsUO{i&ojgbjAy;x^wtDUNMH6Xa=Q z*F5JzZr6ALfrIrWuNv9oFuu8i!_Xq94!ST}M`;`2Ge@1Tm#w?B1xB1g^R9!43N&GaEtD~cK%j0pzbp$I|-KiuD{frla^ zYLu4HzBBOK#lY>FZO%P%zSmt}o+oC|;=yg&UyIjjrFhbOy9o==Nul|KQ*oMyE|`DF zF+xb`%JI_ly9_ySN*E(>ER27sb-2L15i`GTG!WPKU zHw>_bJ{g^!Co^CaJ0dX5j;||rP#rm+5lIM@!lI=t{w~1|ciZ`53j-&jNO~)5{NLObM`O;AcR zyEFD714hvvfnnOOSF}?dv6Rv1Qz@)H%HoCu?fq_<)Mln;lGF9KRX6}SW*dak{YF0n zMsXkl!yK4Y9H2T9VTm|ErL+w)mEgb@Hv{jg&<{CA`YGLSp^yQi=#RiK{m)SJQyr!) zHiuM7(qBp)aaUlXWq0Kh%BVyWuy$9*z+G9rkam#!cq`AmJa2`X$KJ|Fz{NQ$gLPq@ z6?yrmaLvI@fgkQ~)meceYPB5f~P>6(wv`N8~zEHY%my{-Z2x!iND?r6VVk zhmY>AumEz*x|GuWf%aA@$LlaqYLd$C+%l#KXB|`{2!HC18`r3e8|Bi z7L!kDyE3mDfD9N#eguZe|9~Q&>d0;7h0gdJlJ=gA>>a`wS zZ}(bmncH`>eut?J6WFu2Fyn$=hqb$F?%*)AC`<%(%ydX;tBWQ~bQw1Ae&%493L(eX zKuY(sff+DL79ub#3tv^kMs>0_kV?r0{!L02fJrP1pI1O5=4n~Dl4YS@Z!WC0dSohc zA_1P5+j_2u!~-Z2`V-AHffnwH6;x@HN9iFf9OT9|2Z@0n?r+tNf+8a~l(tKT;fGbs z$9#Ua;y>-$|H6A;@X(nT-h0pfgb95fvpWb5Zau1coVpp`x7XWF06fB?szkg7Ph{*Uwhyha9tB zr?jkV()4G*DEcEXO#i&1pX$h*5J^9k(t5p>pg$ea-80*3F3(duciqhj@R0|XN#R_d z35NK=3L_xL#B(Vv2gSk@2Wf_6z$u1A;Fuv76ho*^Hl9nR6wkewU`Xcvo?caCbmE~3 zD3sSP+3>7Q8{Rfa)-LaSVq_X-)Y?sUtBQm^j&&*r9+%6RP$l_8nMl zHG6Z5lfBmJdS|WgQPA%gp<}R#Mj%u#-hz(_sup|&*WAHjXpxTzb&Rh-X**e6-WOJj zmoO89hX6TdnL%lpwbB}q0i(nr0>k3)UNv%5C%ep`Qd(yGGK+(F2wMnfzqCR- zcg;a`;fMQMb#|f1+|#49OoAv(bZ<1AVA<7audYq5u07^Mf)#%^^Ym5m^2%63j+yEx z-OsFLz^LQp5f~oJFQ~DkI@zg?N@=S5q8iJ3(9I0i#Hdz%c3G zP^43xtQb=%iSa)qNZ*1ApR3RgImWl8w2VdCd}Y8W+9NPb`*s+}U^%IdIFpfwL#5=~ z?%+)fC`8~UrTIS0|aJQa4$L3!ba`&(6EC^BbTDJ_vOr^4!tbKj*}`Xj)_Y-K1R z$7nF6`)P0njO=`1NBWTp9?D~CD5;J}O*E8LN*a8ehf)Q+fJ5w<98f?b&S}TQpUCe! z`sU<*YYT&~PVT$rFzoQd{jCl@6q&)NbZo!X;P+psjLb}>-WFM4o&{}!9P_ROrTZ;X zGho!{M__pLU#bR*>d44Oqfe#q;6+(HEOo>!1s3t>->-m1tTQKAVOr!i|4mubXu33Q zz!&5;Z&Pg|A5lx$cyNE)%PZ^d;KK$I=bYa?-uaa#AS<0MNFEsc;QG4e4h}<$TwkbT zTwh8Hzn$3`7ys|-$&0PoN7`$X&6O4K@tezYE*3Jd2eHKb3=#-A_@E)%cS_3*y7W|% z0i(RZ2nkjtD0HkSZKh?>)5mZWU#7`yY-@FIat&k2mW)Vc`ev6Y5q2MmK?X=_cscOgd_|QsD;V7(t-4+}unnLI#ZDMg)er@gcbi2g%@ zc=-6zrAc_~Ae`y0a3Fl03F;+w4tfgbU$m50i#Hdz%c1wRism$tTmugvIc*X zAU!;J5Z^XTTsR9?hO1Y$MrP!a`C5fDkYk)QO3SF|2^>uX_dc&)9nO<*^IiGsvCz2Y9pl8+^M>c$*I7idr2)caz z@tXnt_6YhBeZgLHW`HkpPa-hPlQW7ZR7d8>$Y4_`*toKIc7iAU z;s=0q=fJoiF{1(0Jldnw&7f{+2DSP+3>7Cfw2Ky_q}h*&_SwAuTz1PcZ@o_;cU zJpE#Y1CV2cfYSD~LG{Q~28`lB1co`Vq&PrzvO++mBm~PT4)py17sL@xC)D6lg#(ad zI6&!s9LRuC9EiX$2VSE%Ky|Vlpi<(%YZV7VOn>{K`a*YZed8@EIPDUisxBVKHM#!g zR889R`4+0Q$@4AXeT0R(YYxU7ez?EYkP#G_kUym*DvD;ueg(X{zJ{Zn@za;PzQ`VG zc%m}SkYfVBlxD_eE+b^XsK9RohR69`YMiN#kQnJYl~UmM-HeV*0avLhKwV8DSJhoy z8ho4k)fJ{djtOBN*!eNA57V^9d7fpW=+jgV;!)c0UomROFB>b>mE$CF;i5*VCB$T1NV zO535UPQw{6O8+7-tbc`aiK$LDfH%wv?Z-g%{Toi#9(hg)nj|(jOZv=1yy~+7Az0!LI(Tk znmafQEmC}_V-%m#vEqYu3|sN>sWZJU8$EFPbjtsHBeN{1KIE9-5v6(eJL8vRz^K8G z!0_Ndpa!4n2!YYyQz-?Hp2veP#P4#irRGm!jJ4O`Ue{d02mk&G4KwKy|VTK&7MrP3D180FV$?fM+P6k>nWn17>Az^M^`lqS;z2&DhjzbN;;Z zfct7qP3nT6zj+I4qvlK3+`(aJk=j5V<91M5q{_{g>aFc>=BK2KA7pL@eS#b#OO(Ey zqekiJBm+jR=OQpHOW&`Co$6#|iAqV9-o&yb`n2&>x*d+MPo%eFeyG9$$T7|YrTeXD zGhh@4A~4K>f2ue@b+XO`m69{@vk4CDrEeQj6lRY|o6OFLnG#g$Iyhwjn4j zYtFP7WWXpML|~W)f1r3kb+X}KDuvo*@rMZ>B%gD!UPh~xQiLC^Z~$`5?i{82*@O%j z#eoP6bKuVu2dIv$Wg28Jm@#7 z*CnY=cF?Jm2K^>hL-7VSURo?HEF|3OpQJpWbF1?h+Npxvr&wA%ZN1gt8g$Iyhd}~Vg z^CU806b~XW%!5Z152#Mox296^tvd-G^ndxYHkmo@_0|dxAjil7rTg(914i*60>eCb zQt^Q5WaWTLNe;d%!Gi(bSpg=bUy^@Yg$a;jZpBf$U&tZ@Mlm4*!%X-=#RRG&W<0X3 zR0?s0viP9{6E=A0%}u&j>r0c9^mIH~5V$(&iu~2db5aCW>+Kc(K#qC&jnd|@$p#Z} z2Atwk1djRiHpM5Z!#s#jUQj8$0QYvTBSvG7x1jP&;+A&Y-cjKT4Hi9g_?= z#g_;i^W}YtFH|QhKU7Nc^M1vb;EnECsdt)i1#51x?cMHNKni?3H*1iwpgJ{AJ_qRH&LXq)RDJ^R?H?6AM3tN7k|6LU^fE*K;pme{* zNCu2@%_1;7{GU<7Pj#|^2`Yu!W%0*6{K_>07O|W4DFrlQ9lBW?e;=oLX;O~g+NImS zSTkVR7%0nlEp{# zXX6*bn(J%bL_FY^E7U`dF{6|gl};;928^OU0>jk5Kv7S1vhe^arFg&#nR=x>ARjFL z(+X%LH(LDnOtt3QYuz4ru*=T$=lm3y-`#fe?zjbr@B6o)49W>{%^e(u76r_pj!_0m z+d(mJIBa}SDA%D6(Gl~WGOA?EiDWgFiIFAFf0s@sd1w^*_AAn(n|Jm76ws; zzOU&gCz4;QkPkT~AWrFiJ{ic(U%dJC${<3Hkzq;; zXVWsA0i(Qu2n-M6FRMYMI$0T}Qj+0cQG*x`j$Fpx*1xIn0CLPqg3|p05g9Ow2N4+N z!N(O3s7`hzL8Y{k_(XySTe*Dq!3yz^V`el;TjNyT9@&8#7Pj#|08kN$F z_UQ!i{T!OwiOlE5KUCoWA155B+xfM>DTs{6>WV zkYfaa(*0IO88C_g5g2B`nEK)y)yWD1m69NA=OD2N!ah3nG2fc&_L^($Zsr;AoLlpe z3L7BD#2qQ!?;2_bjABCshS_kVVguC?jz{`Hr4(;88C|U2n>_{Ohr1? z$$A7-N*=+p5~TMv12dY7-m3AF@Wl1C4fpv z0u~Ys*kEHupZM8+VBu72`lS2Tm1V^zDy)DU{1PW$MWwVHf=J6k28?1w1cq60QL%#R z@O&5Vy-+D2Ru-2Mtl0SQ!|~(C6Tyz(st^x3#xH#tBZ(cXbN1|@b`>Cdz zTK1E${7fmVJ2TYWAQDd9M2`R{rfqoHKLcG|Kqu&;Kg6pum-)m%rq`!MG?_bjhILz^ z>9z>E+0(de=#vrjDfYr6=~@_>o;v17{))!kW$`CNjeE}Q$6Qcx`W$_RJ=0Ma$8{IE z7X~u0_D8VpFtE_Z$_oP-5a8a2uo~1zJyMXiwHa{A+(h8m+*9Ce^4o{KR&O_ zO^7GKHR8oCe29lkYA&P%p?E%B_{n$!wX?sqD-6mrb%SxU=ZetOI^VAKjoxXZ6<)A z@Mgj{lomw-WcJ@6mdS12u4c6;#%bC>9G}~~O0|jN`+C#j;MCmG>ZIR>XwI#*FSI85 z?qh&*+PlYBRe+FkgChOMEkuFAhYM;+&EwuuyC#G6BfQ5iquvtrgNhGu80#q73`J(w zgwpa3k5hkjbYtUPlkB5+zt4jh>^tNbv8S}eK+`&(0i*T}A}}oW&sSnkb+Telr6l$* zNQpf#h{f@l3TVVQ7UBBNa;>$r(t+EWXZ9Dra2>txSg%ilfX;Q`0mUOVmD6ioXf-<% zPt-=|+pEy#vHAqQ%P?_sdugTHTWc<_HEK`RYO~$>$FP$7-cfx5H!d5sQJjAkI^Bzt zm+BLX@VU3vGGxlvXx*y^^@)Snyz&X#My)n_XbL}W+g)ibBXou*&>$0Pz-@Qvx(Tm+ zP24qsSB$8(piIYsq3cmVm1`nExMQ%k)?KPkOuJI5aHw9NZ2^=PL7D5q0(E(UY^IG*pZS-Jk zX|~f^!j}bG^@-zf${gy1O#a{_i{0TWDif0vp*{k+b>is6F$H6>+iO1#QU#xlWGId> zq(KxZeDDUEvMPzVC>|%R4~rhEQ!FfA$l`45f1QlrC}Tzj!?Db1FskO_jMcqBZpNzH$bLuqZwbmeJH;F>$ObljHYxiO0`UE^ug?Y3Cfc6XRC*_pw<+;xKd~3o_CzA`E z)}_OwMqGqhlk@NmIPjCY%ZGd2i?*CTDmvMQNo@7-9Dr{1sGND>EIPbi=$}uEwRZZ{ z31|T5!9gmg{9)P(XA6aLP6=Z;9X=G zfaNZH{RDqT<3#8QAE%Oe=*SUUzG>J^>d* zX$<{iS#BKtgHp~%LCBg7Ui2%{fWqKC1HWW;z!V2FO@sNT32ZPUTLl`8TVTJL>^y_Q z+#Gxbmj>jm0Eyp&t{M~PjgzwK!Pb~J3#$d`$(yR?RZo2f{9;r>OfG)zMNM0h~y%f$VgMJ3wI1ieO zrJp#=^XrLQC&HA(9r{8X4Dc4*nBYVm^|yEooQ}ogBwGPjGKt2*&Oq1Ox``VdTu#3brPR( zL~O9+TI)-IC=6U3Q2T~K#aQ*))^Lq16F;9YvPqQ{*NP_L0Bjk*8N-!7Pzi z4=iw&4AvxT;BKvgcf8!{OtvmHVG&Pj)L;l#pe}n+6$gt;BL525y}qvQ5SxgnbC!6W0PpLF^}&{{7l*p;_@9%aaZu3^3bWG^;*%OE*Ot~QV0GRE2EP?%MC;`B4NY8w{i*1a)8e~K0fMo^TT%uLPDBw=;OQFX@z zc+Q9`dy}*#s81|Gkg0{Q!w!w`W96_ma^EF~bntocL*3Lde~=ja zPJshfavdK#!K&WB0ISU3?8WY2vFn%9_z_#k5s>jB*Ue-xFL)fHWuCPo)D|!c5fJ|g zL_|!htR4uQC9oX+314LsyQ>=+J%{=rN7zi$7TgoS0L+3bwuCr?7{r|Mq%b7buYTZ# zk*Q3A8abwjB02W+7mZq2>3B8EF01tl$4}Wo!~4$KzP@wGU>vFsdIKI>4(NsJkY{Iy zh-atCn{ZDB6H_aTAJuu##)FZdcpo`Dfr@bW=}-cy*=fc)DH=G$^b8=i4fD8nJsp|& ztQRfd#d}$Fl&CePXIU!LLa{nPRYeUJ3F%bL@PhP2T}{ zfG4yK1A#Bn5Zm3uEkvbm6SFtyrw_LfvE*pb(-hcTjZqyb@dAP`H$dl1CqHEXnQlnD z;itR(lIe{vo~LECwA#>1m#|%+ zN@g!78a_nB3$r?eV<}D%Y_qJl)FmH8k}ZSxQ9aIN?*U;DRJcXqMv$oYA&jJ4M5Y3e z^>4`X4a*W(W*b5L3IN1~Jv?FNN0N<5c&w;S?*$_1&=za4i cYks?PIBaE){O4oO3&TkW^*|>?Df|8h)HqDNJ5u!zr00m+dq+D1Vdp4QY*)_Wx z(x~bkyaK!lyaK!lyaL>CX1z1BGag3{H%-s(+3$ScIiF{D=JD>6-6z)eXMI9?)H}1D z_s+<}!hY+~sq5~$&z#f!ee%(>gC_?cb{}^i5!ZFe(}SM-=m7qC`nd33-nZ`_J7H+s z?SK&5{?_-Sul*h=*=5{4r~O_)ypxh|ucec|qHn18IdNHH*)Cwuxgdv)Ik!*V?DS|r zx)JrgoSl2#hMP`s7M|ozrhR*3h;iHv=pf<+UpfJGPWz;Y@`sJ$k52!RggG?RwiofG z*CRpL^#juD3`?Z%7jU0?gy!rT4*koZOFDt$oe|$&PRhg=K@qz;W8cAHQ_(B#rS2>y8Q+`k}uulr8m?Cl<% z`^2MN8tx6m|9XBm-0OtU-@VQSYg)J)cEh2*GNu;;KZr=++t!fJVR8Yc@d7G@*I`61 z@=z~;sT?+1x2Oj#d;yvR;`BTJ>*=<=j6;}f-1*Lx6L?@RXkGr8L^+^z?u6&>re1(e zSTopoa25LH4_G6^w^J>4b*>n&^TmG*s{FVvOKhGNpNJ*J4j1&c|iSJF6?pz4ay&!P>k|K{nLfaLU4AU?hCltRm* zkUG7D68@gwm%i0nKdI!L?KmlLJ7YT_l0Fm zwvm=)wz0%RP2tjt)2Cj!y*=ocWt4NSDf%PpY`CDXxRYS;2!v^SsQ> z)-(Z0#VU|c{Et$pC@QIn6HYkuuSgKqG#N%(lNm<77Nj++J<4`f*YQ>VmhmBEhCYz`00kQAU9<1@yr6jN$ zxJL$X2;fApZ>O;M2ZIjz;gZ7k269@kk+QVWSs=C|8pmrdnwV`EAENis2TbmUCU--T%OdGiqg)e!l&b;= zxm!{$%NQp&A%n9`Ay@8r*EQzr03aio5TUu4=sQBvCp_B%1X*9Qh znDi5i8kuX{$|*`6d8KTd_#atJzMTgOeuM`>+!wIC{%|k;UVL8S8OXiESQYA&Qeif6e9K0*ft}j cGSYy`<#&bn6$!__nk93JC5I6|IBd5617XC4h5!Hn literal 0 HcmV?d00001 diff --git a/docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_normalize.scssc b/docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_normalize.scssc new file mode 100644 index 0000000000000000000000000000000000000000..fc44d6e4fdd38ed59e737a72535fcf434c01ca00 GIT binary patch literal 51905 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±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 literal 0 HcmV?d00001 diff --git a/docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_tables.scssc b/docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_tables.scssc new file mode 100644 index 0000000000000000000000000000000000000000..f6ec9bdd2e2910ab06f75433a536f56411d92161 GIT binary patch literal 4257 zcmbtX>uwuG6pkh2d*aki8mH;SN-0gD@g*d*nGwdNomu15u0X4}e}8V@odh0F zttzqA?OCfMk59NCl>oADO}GY3OMOyPKgqzdc^CFQ*XM2?3NUg#j>cU;C@+TJ0ebZ) zE&eW<(?;dY|+8K)p?>zUc(CV~L#)A8K=6I(r6)&YKO(ucW0a817 zX@x#CjuiA}o^BwEWd?ajcZufD3Nyk#2}OXyU!|)`^DkW|8e^)Y!d_V31$2T=`P2^G zAWHk{OBcwoydr%#XYdUkB;+&-0Y`~GJl-z#y4?rL?J^Sq>OsCe#`AaCn5(?@=wsVEQ!eW19L$%cc&9Sy|0+bdb0Af@X7aU21nZReA^oXDz zBxKYlR(S6EyF(F0Vxsi-5a^&gSabSF6}HlAKRMv>Cg$@IeN1<;OvRZp6`?RUHAr0D zP9tKOXq$G-x-4>#)x~tsjTvFg2(YFD^bE!lDC{%6ugS=#s996H$^+J{pmm&0gLIJh z1ufKQ5v5y*LRF%&pp~K;nRGcGuyiFJp|n<_tC`^qEK>!Au-2vPx?55NQ-i}CBSm_* zOYiB!=p*sdGSaL7?(8J4N;+YzcpkabTn|O)@bFr$8@=GNC57iYt@}quM=D!`^Xd%t zD#Xk<$JP4=f;r9?ImkFS9i*I(HBq>K73T>Q=4t?%^Gb@EeXCuW)!Lh)c_RvmAB}gF z0(STd?mxPg_JUYMdktvMt}1e|l9t2VUk=jWlg@EujHxj9n3 zKeF*p?HZz5P3cJ*Vih7aG*P&^WyGBm)glL(s7wc`sB%9V5pL)R<|Ik5u-s4DK+CF@ z;%2!Yv@^3z)4Hle&f`{m_0e>MfOf7LA#oYi2x+`K$Jq!`hwEPYG~rf(mqtdmU! zXELnPNT4S5XsW4Us0mlgx}>q1pcv_}ss@&W@8*l8RD2p-&dX>mr6ZBi8iZKYP;u2T z0?x^3k%LS|rUNabUyKMVI)W*q1Pjakni^!e)*^lx?OL9DuKJtKbxz6Sqi8uwW-tR77vHzDtAEaK{#Tep!2`Pyr@xW7oxn`xaAJ#Q*TQ+{#v zFJp0$gN$F(f#&xwO$i#TYx+z*Cs48fCzQW+6Ch*{8 z{CGR}oB9}Py)Kv3M*?Z#J3TFzjJH(yRlShX@|$uw3ennlvw?l%B_^?(z0%b=ePxkW zay!M=YEYv^!X9bC!~q~#r;-*nWo$j3vP^g;Eua*4Romh>rTIyLgEP}myh=YQ_WJ(- Db%+4^ literal 0 HcmV?d00001 diff --git a/docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_typography.scssc b/docs/.sass-cache/0002de66b5ca522fb2af29d0f29231f0e66ffac4/_typography.scssc new file mode 100644 index 0000000000000000000000000000000000000000..e1e4e1ebb429a5bca9888d2cc9d85c693983d4c6 GIT binary patch literal 45459 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 AIRF3v literal 0 HcmV?d00001 diff --git a/docs/404.md b/docs/404.md new file mode 100644 index 00000000000..aa65c1c3db9 --- /dev/null +++ b/docs/404.md @@ -0,0 +1,7 @@ +--- +title: Not Found +permalink: /404.html +sitemap: false +--- + +This page doesn't exist! diff --git a/docs/Gemfile b/docs/Gemfile index bbb65e14f67..2520cb5eb8e 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -1,11 +1,11 @@ -source "https://rubygems.org" +source 'https://rubygems.org' -gem "jekyll" -gem "jekyll-remote-theme" +gem 'jekyll', '3.7.2' -gem "github-pages", group: :jekyll_plugins +group :jekyll_plugins do + gem 'jekyll-feed', '0.9.3' + gem 'jekyll-seo-tag', '2.4.0' + gem 'jekyll-sitemap', '1.2.0' +end -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] - -gem "html-proofer" +gem "html-proofer" \ No newline at end of file diff --git a/docs/LICENSE b/docs/LICENSE new file mode 100644 index 00000000000..3a4a2fb8700 --- /dev/null +++ b/docs/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 CloudCannon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docs/_config.yml b/docs/_config.yml index 60115e8784e..f247e03f7d6 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,51 +1,71 @@ -title : Phoenicis Documentation -name : phoenicis.org -description : The documentation for Phoenicis. -repository : PhoenicisOrg/phoenicis +title: Phoenicis Documentation +baseurl: +google_analytics_key: +show_full_navigation: true -remote_theme : mmistakes/minimal-mistakes -minimal_mistakes_skin : air +# Values for the jekyll-seo-tag gem (https://github.com/jekyll/jekyll-seo-tag) +logo: /siteicon.png +description: The documentation for Phoenicis. +author: + name: + email: + twitter: # twitter username without the @ symbol +social: + name: Phoenicis Documentation + links: + - https://github.com/PhoenicisOrg/phoenicis + +# ----- +# Build + +timezone: Etc/UTC -markdown : kramdown -permalink : /:categories/:title/ +permalink: pretty plugins: - - jekyll-paginate - jekyll-sitemap - - jekyll-gist + - jekyll-seo-tag - jekyll-feed - - jemoji - - jekyll-remote-theme -# mimic GitHub Pages with --safe -whitelist: - - jekyll-paginate - - jekyll-sitemap - - jekyll-gist - - jekyll-feed - - jemoji +exclude: + - Gemfile + - Gemfile.lock + - LICENCE -include: - - _pages +collections: + docs: + title: Documentation + permalink: /:path/ + output: true -encoding: "utf-8" -markdown_ext: "markdown,mkdown,mkdn,mkd,md" - defaults: - # _pages - - scope: - path: "_pages" - type: pages + - + scope: + path: "" values: - layout: single - author_profile: false - sidebar: - nav: "docs" - -author: - name: Phoenicis - github: PhoenicisOrg + layout: default + - + scope: + path: "" + type: "docs" + values: + seo: + type: Article + _comments: + category: Group navigation links with this field + order: Used to sort links in the navigation + _options: + content: + width: 800 + height: 2000 + - + scope: + path: "" + type: "posts" + values: + _comments: + type: Marks the impact of this release -# HTML Compression -compress_html: - clippings: all +types: + - minor + - major diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml deleted file mode 100644 index d5958a4f7c9..00000000000 --- a/docs/_data/navigation.yml +++ /dev/null @@ -1,31 +0,0 @@ -docs: - - title: Users - children: - - title: "Build" - url: /build/ - - title: "Packages" - url: /packages/ - - title: "Installation" - url: /installation/ - - title: "Run" - url: /run/ - - title: "Configuration" - url: /configuration/ - - title: "Repository" - url: /repository/ - - title: "Shortcuts" - url: /shortcuts/ - - title: Developers - children: - - title: "IntelliJ IDEA" - url: /intellij-idea/ - - title: "Maven Modules" - url: /maven-modules/ - - title: "Themes" - url: /themes/ - - title: "Translation" - url: /translation/ - - title: "Release process" - url: /release-process/ - - title: "Test plan" - url: /test-plan/ diff --git a/docs/_pages/intellij-idea.md b/docs/_docs/Developers/intellij-idea.md similarity index 77% rename from docs/_pages/intellij-idea.md rename to docs/_docs/Developers/intellij-idea.md index dcb101bb498..b8b7f0e2f74 100644 --- a/docs/_pages/intellij-idea.md +++ b/docs/_docs/Developers/intellij-idea.md @@ -1,6 +1,7 @@ --- title: "IntelliJ IDEA" -permalink: /intellij-idea/ +category: Developers +order: 1 toc: true --- @@ -14,7 +15,7 @@ Build phoenicis (root) → Lifecycle → package ### Run Run → Edit Configurations add: JavaFXApplication with main class org.phoenicis.javafx.JavaFXApplication -{% include figure image_path="/assets/images/intellij-idea-run.png" alt="IntelliJ IDEA configuration" caption="IntelliJ IDEA configuration" %} +![IntelliJ IDEA configuration](/images/intellij-idea-run.png) ### Code Style File → Settings → Editor → Code Style → Scheme: Manage... → Import → Eclipse XML Profile: select [settings/POL_Formatter_Settings.xml](https://github.com/PhoenicisOrg/phoenicis/blob/master/settings/POL_Formatter_Settings.xml) diff --git a/docs/_pages/maven-modules.md b/docs/_docs/Developers/maven-modules.md similarity index 97% rename from docs/_pages/maven-modules.md rename to docs/_docs/Developers/maven-modules.md index 2b5453042fb..37f46d20c10 100644 --- a/docs/_pages/maven-modules.md +++ b/docs/_docs/Developers/maven-modules.md @@ -1,6 +1,7 @@ --- title: "Maven Modules" -permalink: /maven-modules/ +category: Developers +order: 2 toc: true --- diff --git a/docs/_pages/release-process.md b/docs/_docs/Developers/release-process.md similarity index 89% rename from docs/_pages/release-process.md rename to docs/_docs/Developers/release-process.md index 3a96ed36bdd..9c9619ab4a7 100644 --- a/docs/_pages/release-process.md +++ b/docs/_docs/Developers/release-process.md @@ -1,6 +1,7 @@ --- title: "Release process" -permalink: /release-process/ +category: Developers +order: 5 toc: false --- @@ -14,7 +15,7 @@ The following steps must be executed to release a new version of Phoenicis: * Specify scripts release branch in configuration (`application.repository.default.git.url`) * Set release version for Maven in `pom.xml` files * Set release version in .deb control files -* [Test]({{ site.baseurl }}{% link _pages/test-plan.md %}) +* [Test]({{ site.baseurl }}{% link _docs/Developers/test-plan.md %}) * Create GitHub release from the release branches for phoenicis and scripts * Announce release on phoenicis.org * Showcase new features diff --git a/docs/_pages/test-plan.md b/docs/_docs/Developers/test-plan.md similarity index 99% rename from docs/_pages/test-plan.md rename to docs/_docs/Developers/test-plan.md index 7fbc74b04cf..ff3d5046961 100644 --- a/docs/_pages/test-plan.md +++ b/docs/_docs/Developers/test-plan.md @@ -1,6 +1,7 @@ --- title: "Test plan" -permalink: /test-plan/ +category: Developers +order: 6 toc: true --- diff --git a/docs/_pages/themes.md b/docs/_docs/Developers/themes.md similarity index 59% rename from docs/_pages/themes.md rename to docs/_docs/Developers/themes.md index 16caf6fc7d5..d6711f03897 100644 --- a/docs/_pages/themes.md +++ b/docs/_docs/Developers/themes.md @@ -1,7 +1,7 @@ --- title: "Themes" -permalink: /themes/ -excerpt: "About themes" +category: Developers +order: 3 toc: true --- @@ -15,13 +15,13 @@ phoenicis-javafx/src/main/resources/com/playonlinux/javafx/themes/ ### Main Window Scene - mainWindowScene

    - mainWindowScene + mainWindowScene
    ### Logo - logoText
    - logo + logo
    ### Menu @@ -33,7 +33,7 @@ phoenicis-javafx/src/main/resources/com/playonlinux/javafx/themes/ - menuPane > .tab-header-area .tab:selected .focus-indicator - menuPane > .tab-header-area .tab:disabled
    - menuPane + menuPane
    ### Left @@ -48,25 +48,25 @@ phoenicis-javafx/src/main/resources/com/playonlinux/javafx/themes/ - leftSpacer
    - leftPane + leftPane
    - searchBar - searchBar:hover - searchCleanButton
    - searchBar + searchBar
    - leftBarTitle
    - leftBarTitle + leftBarTitle
    - leftButton - leftButton:hover, .leftButton:selected
    - leftButton + leftButton
    - listChooser - listIcon @@ -75,14 +75,14 @@ phoenicis-javafx/src/main/resources/com/playonlinux/javafx/themes/ - iconsList
    - listChooser + listChooser
    ### Right - rightPane - rightPane > .viewport
    - rightPane + rightPane
    ### Apps @@ -92,30 +92,30 @@ phoenicis-javafx/src/main/resources/com/playonlinux/javafx/themes/ - appPanelMiniaturesPaneWrapper - appPanelMiniaturesPaneWrapper > .viewport
    - apps + apps
    #### App Description - descriptionTitle
    - appDescriptionTitle + appDescriptionTitle
    The app description text is HTML in a WebView. It can be customized in the file description.css.
    - appDescription + appDescription
    - appMiniature
    - appDescriptionMiniature + appDescriptionMiniature
    ### Containers - containerConfigurationPane - containerConfigurationPane > .grid
    - containers + containers
    ### Miniature @@ -125,7 +125,7 @@ The app description text is HTML in a WebView. It can be customized in the file - miniatureImage - miniatureText
    - miniature + miniature
    ### Installation Wizard @@ -135,7 +135,7 @@ The app description text is HTML in a WebView. It can be customized in the file - presentationTextTitle - presentationText
    - presentation + presentation
    @@ -143,11 +143,11 @@ The app description text is HTML in a WebView. It can be customized in the file - panelForTopheader - header
    - header + header
    - footer
    - footer + footer
    - stepScrollPane - stepText @@ -163,17 +163,17 @@ The app description text is HTML in a WebView. It can be customized in the file - consoleText.default - consoleText.error
    - console + console
    ### Wine Tools - wineToolButton
    - wineToolButton + wineToolButton
    - wineToolCaption
    - wineToolCaption + wineToolCaption
    ## Icons diff --git a/docs/_pages/translation.md b/docs/_docs/Developers/translation.md similarity index 92% rename from docs/_pages/translation.md rename to docs/_docs/Developers/translation.md index 2957815d3c2..7afeb5b643e 100644 --- a/docs/_pages/translation.md +++ b/docs/_docs/Developers/translation.md @@ -1,6 +1,7 @@ --- title: "Translation" -permalink: /translation/ +category: Developers +order: 4 --- 1. run `mvn package` to update the `.pot` and `.po` files diff --git a/docs/_pages/build.md b/docs/_docs/Users/build.md similarity index 99% rename from docs/_pages/build.md rename to docs/_docs/Users/build.md index 9ec97124923..df3f3ab54fd 100644 --- a/docs/_pages/build.md +++ b/docs/_docs/Users/build.md @@ -1,6 +1,7 @@ --- title: "Build" -permalink: /build/ +category: Users +order: 1 toc: true --- diff --git a/docs/_pages/configuration.md b/docs/_docs/Users/configuration.md similarity index 86% rename from docs/_pages/configuration.md rename to docs/_docs/Users/configuration.md index 1c0f9c9a55f..24bba10c744 100644 --- a/docs/_pages/configuration.md +++ b/docs/_docs/Users/configuration.md @@ -1,6 +1,7 @@ --- title: "Configuration" -permalink: /configuration/ +category: Users +order: 5 toc: true --- @@ -24,7 +25,10 @@ Default for Mac OS X: ${user.home}/Library/Phoenicis ``` -### [Scripts repository]({{ site.baseurl }}{% link _pages/repository.md %}) +### Scripts repository +Configures the [scripts repository]({{ site.baseurl }}{% link _docs/Users/repository.md %}). + +__application.repository.configuration__ __application.repository.configuration__ Specifies the path where the [scripts](https://github.com/PhoenicisOrg/Scripts) can be found. @@ -58,7 +62,9 @@ Default for Mac OS X: ${user.home}/Library/PlayOnMac-5 ``` -### [Scripts repository](https://github.com/PlayOnLinux/POL-POM-5/wiki/Repository) +### Scripts repository + +Configures the [scripts repository]({{ site.baseurl }}{% link _docs/Users/repository.md %}). __application.repository.configuration__ Specifies the path where the [scripts](https://github.com/PlayOnLinux/Scripts) can be found. diff --git a/docs/_pages/installation.md b/docs/_docs/Users/installation.md similarity index 82% rename from docs/_pages/installation.md rename to docs/_docs/Users/installation.md index ba2266a652e..1c3f5f85bf1 100644 --- a/docs/_pages/installation.md +++ b/docs/_docs/Users/installation.md @@ -1,13 +1,14 @@ --- title: "Installation" -permalink: /installation/ +category: Users +order: 3 toc: true --- In addition to running the `jar` file directly, you can also install POL 5 on your operating system. ## Ubuntu 16.04 -To install POL 5 on Ubuntu, you need to execute the `deb` file inside the `target` folder of the `phoenicis-dist` project (see [Build]({{ site.baseurl }}{% link _pages/build.md %}) for more information). +To install POL 5 on Ubuntu, you need to execute the `deb` file inside the `target` folder of the `phoenicis-dist` project (see [Build]({{ site.baseurl }}{% link _docs/Users/build.md %}) for more information). If you already have POL 5 installed through a `deb` file, you can simply override your old installation by executing a newer `deb` POL 5 installation file. This will replace the old installation with a newer one. diff --git a/docs/_pages/packages.md b/docs/_docs/Users/packages.md similarity index 84% rename from docs/_pages/packages.md rename to docs/_docs/Users/packages.md index 9cd65ab6224..c0fde74b2cb 100644 --- a/docs/_pages/packages.md +++ b/docs/_docs/Users/packages.md @@ -1,6 +1,7 @@ --- title: "Packages" -permalink: /packages/ +category: Users +order: 2 --- The packaging is done in phoenicis-dist. diff --git a/docs/_pages/repository.md b/docs/_docs/Users/repository.md similarity index 99% rename from docs/_pages/repository.md rename to docs/_docs/Users/repository.md index 8ac12d1cd5a..c6d80879169 100644 --- a/docs/_pages/repository.md +++ b/docs/_docs/Users/repository.md @@ -1,6 +1,7 @@ --- title: "Repository" -permalink: /repository/ +category: Users +order: 6 toc: true --- diff --git a/docs/_pages/run.md b/docs/_docs/Users/run.md similarity index 96% rename from docs/_pages/run.md rename to docs/_docs/Users/run.md index 0fdf50effbf..4f443d3ed40 100644 --- a/docs/_pages/run.md +++ b/docs/_docs/Users/run.md @@ -1,6 +1,7 @@ --- title: "Run" -permalink: /run/ +category: Users +order: 4 toc: true --- diff --git a/docs/_pages/shortcuts.md b/docs/_docs/Users/shortcuts.md similarity index 94% rename from docs/_pages/shortcuts.md rename to docs/_docs/Users/shortcuts.md index 83b6cc7ae53..d9bf938e805 100644 --- a/docs/_pages/shortcuts.md +++ b/docs/_docs/Users/shortcuts.md @@ -1,6 +1,7 @@ --- title: "Shortcuts" -permalink: /shortcuts/ +category: Users +order: 7 --- **Shortcuts** are entries in your libraries which allow you to run your installed apps. By default, they are defined in `~/.Phoenicis/shortcuts/`. diff --git a/docs/_docs/_defaults.md b/docs/_docs/_defaults.md new file mode 100644 index 00000000000..f392ebd98aa --- /dev/null +++ b/docs/_docs/_defaults.md @@ -0,0 +1,6 @@ +--- +title: +category: +order: 1 +toc: false +--- diff --git a/docs/_includes/head/custom.html b/docs/_includes/head/custom.html deleted file mode 100644 index a04d93809d6..00000000000 --- a/docs/_includes/head/custom.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/docs/_includes/toc.html b/docs/_includes/toc.html new file mode 100644 index 00000000000..b222dda483f --- /dev/null +++ b/docs/_includes/toc.html @@ -0,0 +1,85 @@ +{% capture tocWorkspace %} +{% comment %} +Version 1.0.4 +https://github.com/allejo/jekyll-toc + +"...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe + +Usage: +{% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %} + +Parameters: +* html (string) - the HTML of compiled markdown generated by kramdown in Jekyll + +Optional Parameters: +* sanitize (bool) : false - when set to true, the headers will be stripped of any HTML in the TOC +* class (string) : '' - a CSS class assigned to the TOC +* id (string) : '' - an ID to assigned to the TOC +* h_min (int) : 1 - the minimum TOC header level to use; any header lower than this value will be ignored +* h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored +* ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list +* item_class (string) : '' - add custom class for each list item; has support for '%level%' placeholder, which is the current heading level + +Output: +An ordered or unordered list representing the table of contents of a markdown block. This snippet will only generate the table of contents and will NOT output the markdown given to it +{% endcomment %} + +{% capture my_toc %}{% endcapture %} +{% assign orderedList = include.ordered | default: false %} +{% assign minHeader = include.h_min | default: 1 %} +{% assign maxHeader = include.h_max | default: 6 %} +{% assign nodes = include.html | split: ' maxHeader %} +{% continue %} +{% endif %} + +{% if firstHeader %} +{% assign firstHeader = false %} +{% assign minHeader = headerLevel %} +{% endif %} + +{% assign indentAmount = headerLevel | minus: minHeader | add: 1 %} +{% assign _workspace = node | split: '' | first }}>{% endcapture %} +{% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} + +{% assign space = '' %} +{% for i in (1..indentAmount) %} +{% assign space = space | prepend: ' ' %} +{% endfor %} + +{% unless include.item_class == blank %} +{% capture listItemClass %}{:.{{ include.item_class | replace: '%level%', headerLevel }}}{% endcapture %} +{% endunless %} + +{% capture my_toc %}{{ my_toc }} +{{ space }}{{ listModifier }} {{ listItemClass }} [{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}](#{{ html_id }}){% endcapture %} + +{% endfor %} + +{% if include.class %} +{% capture my_toc %}{:.{{ include.class }}} +{{ my_toc | lstrip }}{% endcapture %} +{% endif %} + +{% if include.id %} +{% capture my_toc %}{: #{{ include.id }}} +{{ my_toc | lstrip }}{% endcapture %} +{% endif %} +{% endcapture %}{% assign tocWorkspace = '' %}{{ my_toc | markdownify | strip }} \ No newline at end of file diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html new file mode 100755 index 00000000000..6407083de6b --- /dev/null +++ b/docs/_layouts/default.html @@ -0,0 +1,89 @@ + + + + + + + + {% seo %} + {% feed_meta %} + + + + + + + + {% if jekyll.environment == 'production' and site.google_analytics_key != '' %} + + + {% endif %} + + + +
    +

    + {{ site.title }} logo + {{ site.title }} + +

    + +
    + + +
    + + +
    + +
    + +
    + {% if page.toc %}{% include toc.html html=content %}{% endif %} + {{ content }} +
    +
    + + + + diff --git a/docs/_plugins/replace-regex.rb b/docs/_plugins/replace-regex.rb new file mode 100644 index 00000000000..9a5b4047360 --- /dev/null +++ b/docs/_plugins/replace-regex.rb @@ -0,0 +1,10 @@ +module Jekyll + module RegexFilter + def replace_regex(input, regex_string, replace_string) + regex = Regexp.new regex_string + input.gsub regex, replace_string + end + end +end + +Liquid::Template.register_filter(Jekyll::RegexFilter) diff --git a/docs/_posts/2018-04-12-oop-interfaces.md b/docs/_posts/2018-04-12-oop-interfaces.md new file mode 100644 index 00000000000..43af3a102ee --- /dev/null +++ b/docs/_posts/2018-04-12-oop-interfaces.md @@ -0,0 +1,8 @@ +--- +title: OOP interfaces +type: major +--- + +The Javascript implementations for apps and engine tools must now implement Java interfaces. + +This provides a clearer API definition. diff --git a/docs/_posts/2018-05-18-generic-engines.md b/docs/_posts/2018-05-18-generic-engines.md new file mode 100644 index 00000000000..a1939fa5c83 --- /dev/null +++ b/docs/_posts/2018-05-18-generic-engines.md @@ -0,0 +1,12 @@ +--- +title: Generic engines +type: major +--- + +Support for generic engines. Engines can be implemented in Javascript as long as they implement the `Engine` interface. + +**Features:** + +* List engine versions +* Install/delete engine versions +* Run executables for any engine diff --git a/docs/_posts/_defaults.md b/docs/_posts/_defaults.md new file mode 100644 index 00000000000..806ca97d248 --- /dev/null +++ b/docs/_posts/_defaults.md @@ -0,0 +1,14 @@ +--- +title: +type: major +--- + +This release introduces + +**Features:** + +* + +**Fixes:** + +* diff --git a/docs/_sass/_code.scss b/docs/_sass/_code.scss new file mode 100644 index 00000000000..bec7db62ace --- /dev/null +++ b/docs/_sass/_code.scss @@ -0,0 +1,37 @@ +pre, code, tt { + font-family: Inconsolata, Consolas, Courier, "Courier New", "Liberation Mono", monospace; + font-size: 0.85em; + white-space: pre-wrap; + border-radius: 2px; + line-height: 1.4; + font-weight: 400; + background-color: #404145; + color: #FAFAFA; + border-radius: 2px; +} + +pre { + box-sizing: border-box; + margin: 0 0 1.75em 0; + width: 100%; + padding: 10px; + font-size: 0.9em; + white-space: pre; + overflow: auto; + border-radius: 3px; + + code, tt { + font-size: inherit; + white-space: pre-wrap; + background: transparent; + border: none; + padding: 0 + } +} + +blockquote > code, +li > code, +p > code { + padding: 4px 6px; + white-space: nowrap; +} diff --git a/docs/_sass/_layout.scss b/docs/_sass/_layout.scss new file mode 100644 index 00000000000..7a538482d48 --- /dev/null +++ b/docs/_sass/_layout.scss @@ -0,0 +1,466 @@ +input::-ms-clear, +input::-ms-reveal { + display: none !important; +} + +body { + height: auto; + overflow-x: hidden; + background-color: $body-background-color; + + &.nav-open { + overflow: hidden; + + nav, + header > form { + display: block; + } + + header { + bottom: 0; + } + } + + &::before { + content: ""; + background-color: $content-background-color; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; + } + + @media (min-width: $mobile-break) { + padding: 0 0 0 $nav-width; + + &.nav-open { + overflow: auto; + } + + &::after, + &::before { + content: ""; + position: fixed; + top: 0; + bottom: 0; + z-index: -1; + } + + &::after { + left: 0; + width: $nav-width; + background-color: $nav-background-color; + } + + #search-input, + &::after { + box-shadow: inset -10px 0 10px -10px rgba(0, 0, 0, 0.1); + } + + &::before { + left: $nav-width; + right: 0; + background-color: $content-background-color; + } + } +} + +.main { + margin-top: $space + $nav-header-height; + + @media (min-width: $mobile-break) { + margin-top: 0; + } +} + +header { + $emblem-size: 35px; + $emblem-vertical-padding: ($nav-header-height - $emblem-size) / 2; + $emblem-horizontal-padding: $space; + + position: absolute; + top: 0; + left: 0; + right: 0; + overflow-x: hidden; + z-index: 1; + background-color: $nav-background-color; + + ul { + padding: 0; + margin: 0; + } + + h1 { + padding: $emblem-vertical-padding $emblem-horizontal-padding; + height: $nav-header-height; + box-sizing: border-box; + background-color: $brand-colour; + color: #fff; + margin: 0; + font-size: 1.7rem; + line-height: 0.8; + letter-spacing: 0; + font-weight: 600; + text-indent: 0; + @include display-flex(); + @include flex-direction(row); + @include align-items(center); + border-bottom: 1px solid rgba(0, 0, 0, 0.075); + + img { + height: $emblem-size; + width: $emblem-size; + margin-right: $space - 5; + } + } + +$nav-image: $baseurl + "/images/menu.svg"; + .open-nav { + background-image: url($nav-image); + background-color: transparent; + background-repeat: no-repeat; + background-size: 100%; + width: $emblem-size; + height: $emblem-size; + border: 0; + position: absolute; + top: $emblem-vertical-padding; + right: $emblem-horizontal-padding; + border-radius: 2px; + + &:focus { + outline: none; + background-color: rgba(0, 0, 0, 0.05); + } + + &:hover { + background-color: rgba(0, 0, 0, 0.1); + } + } + + @media (min-width: $mobile-break) { + background-color: transparent; + width: $nav-width; + right: auto; + bottom: auto; + + .open-nav { + display: none; + } + + h1 { + box-shadow: inset -10px 0 10px -10px rgba(0, 0, 0, 0.1); + } + } +} + +.content { + position: relative; + background-color: $content-background-color; + color: $content-color; + + h3::before { + content: ""; + @extend hr; + margin: 60px 0; + } +} + +.content, +.page-header { + max-width: $content-max-width; + padding: 0 ($space + 5) $space; + margin: $space auto 0 auto; +} + +.page-header { + h2, + h3 { + margin: 0; + line-height: 1.2; + letter-spacing: -1px; + } + + h2 { + font-size: 2rem; + margin-left: -1px; + color: #888; + letter-spacing: 0; + } + + h3 { + font-size: 4rem; + margin-left: -4px; + } + + @media (min-width: $mobile-break) { + h2 { + font-size: 2.65rem; + } + + h3 { + font-size: 5.4rem; + } + } + + @media (min-width: $full-width-break) { + margin-top: 55px; + } +} + +nav, +header > form { + display: none; + + @media (min-width: $mobile-break) { + display: block; + } +} + +nav > ul { + padding: $space / 2 0; + + & + ul { + border-top: 1px solid rgba(0, 0, 0, 0.075); + } +} + +.nav-item { + display: block; + font-family: "Open Sans", sans-serif; + line-height: 1; + margin: 0; + + nav:not(.full-navigation) & > ul { + display: none; + } + + nav:not(.full-navigation) &.current > ul { + display: block; + } + + > a { + color: #666; + text-decoration: none; + font-size: 1.4rem; + padding: $space / 2 0 $space / 2 $space * 2; + display: block; + } + + &.current > a, + > a:active, + > a:hover { + color: #111; + } + + &.top-level > a { + line-height: 1.5; + font-weight: 600; + padding-left: $space; + } +} + +.settings-panel-example { + @extend p; + @include display-flex(); + @include flex-direction(column); + + .example { + max-width: 300px; + background-color: #fafafa; + margin: 0; + padding: 0; + font-size: 0; + line-height: 1; + border-radius: 2px; + overflow: hidden; + } + + @media (min-width: 960px) { + @include flex-direction(row); + + .details { + @include flex(1); + margin-right: 20px; + } + + p + .highlight > pre { + margin-bottom: 0; + } + + .example { + @include flex(0 0 300px); + max-width: 100%; + } + } +} + +.highlight { + margin-left: 0; + margin-right: 0; +} + +h3 + .warning { + margin-top: 1.75em; +} + + +h4 code { + background: $nav-background-color; + color: $content-color; + background-color: transparent; + font-weight: 700; + padding: 0; + font-size: 1.1em; + line-height: 1; +} + +h4 svg { + vertical-align: middle; + margin-right: 6px; + position: relative; + top: -2px; + fill: #2E2E2E; + height: 23px; +} + +.required { + position: relative; +} + +.required::after { + content: "REQUIRED"; + font-size: 12px; + position: absolute; + top: 5px; + line-height: 1; + color: $brand-colour; + padding-left: 5px; +} + +#search-results { + margin: 0; + padding: 0; + + li { + list-style: none; + margin: 0; + padding: 0; + + h4 { + font-size: 2rem; + } + + p { + line-height: 1.5; + } + } +} + + +#search-input { + -webkit-appearance: none; + display: block; + margin: 0; + padding: 10px 20px 10px 15px; + width: 100%; + box-sizing: border-box; + border: 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.075); + border-left: 5px solid transparent; + font-size: 1.5rem; + font-weight: 600; + line-height: 1.8; + + &:focus { + outline: none; + border-left-color: $brand-colour; + } +} + +.changelog { + &, + > div { + margin: 0; + padding: 0; + list-style: none; + } + + .date { + color: #888; + font-style: italic; + } +} + +.badge { + font-family: "Open Sans", sans-serif; + padding: 2px 5px; + text-transform: uppercase; + font-size: 0.8rem; + border-radius: 2px; + background: #eee; + font-weight: bold; + + &.major { + background: $brand-colour; + color: #fff; + } +} + +blockquote { + border-left: 5px solid #FD0; + padding: 10px 15px; + margin-left: -15px; + margin-right: -10px; + background-color: $brand-colour-light; + border-color: $brand-colour; + + p:last-child { + margin-bottom: 0; + } + + @media (max-width: $full-width-break) { + margin-left: 0; + margin-right: 0; + } +} + +img { + max-width: 100%; + height: auto; +} + +.editor-link { + display: none; + margin-top: 0; + + .btn { + border: 0; + border-radius: 2px; + width: 100%; + max-width: 500px; + box-sizing: border-box; + font-size: 2rem; + text-decoration: none; + padding: 10px 15px; + margin: 0; + font-size: 18px; + cursor: pointer; + background-color: #f7e064; + color: #333; + box-shadow: 1px 1px 5px 0 rgba(0, 0, 0, 0.2); + + &:hover { + background-color: #f4d525; + color: #333; + } + } + +} + +.cms-editor-active .editor-link { + display: block; +} diff --git a/docs/_sass/_mixins.scss b/docs/_sass/_mixins.scss new file mode 100755 index 00000000000..e60b23610ba --- /dev/null +++ b/docs/_sass/_mixins.scss @@ -0,0 +1,34 @@ +@mixin flex-direction($values) { + -webkit-flex-direction: $values; + flex-direction: $values; +} + +@mixin flex-flow($values) { + -webkit-flex-flow: $values; + flex-flow: $values; +} + +@mixin align-items($values) { + -webkit-align-items: $values; + align-items: $values; +} + +@mixin justify-content($values) { + -webkit-justify-content: $values; + justify-content: $values; +} + +@mixin flex($values) { + -webkit-flex: $values; + flex: $values; +} + +@mixin display-flex() { + display: -webkit-flex; + display: flex; +} + +@mixin display-inline-flex() { + display: -webkit-inline-flex; + display: inline-flex; +} diff --git a/docs/_sass/_normalize.scss b/docs/_sass/_normalize.scss new file mode 100755 index 00000000000..458eea1ea3d --- /dev/null +++ b/docs/_sass/_normalize.scss @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/docs/_sass/_pygments.scss b/docs/_sass/_pygments.scss new file mode 100755 index 00000000000..e7e4ec7c5bd --- /dev/null +++ b/docs/_sass/_pygments.scss @@ -0,0 +1,81 @@ +.highlight { + .hll { background-color: #ffffcc } + .c { color: #87ceeb} /* Comment */ + .err { color: #ffffff} /* Error */ + .g { color: #ffffff} /* Generic */ + .k { color: #f0e68c} /* Keyword */ + .l { color: #ffffff} /* Literal */ + .n { color: #ffffff} /* Name */ + .o { color: #ffffff} /* Operator */ + .x { color: #ffffff} /* Other */ + .p { color: #ffffff} /* Punctuation */ + .cm { color: #87ceeb} /* Comment.Multiline */ + .cp { color: #cd5c5c} /* Comment.Preproc */ + .c1 { color: #87ceeb} /* Comment.Single */ + .cs { color: #87ceeb} /* Comment.Special */ + .gd { color: #0000c0; font-weight: bold; background-color: #008080 } /* Generic.Deleted */ + .ge { color: #c000c0; text-decoration: underline} /* Generic.Emph */ + .gr { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Error */ + .gh { color: #cd5c5c} /* Generic.Heading */ + .gi { color: #ffffff; background-color: #0000c0 } /* Generic.Inserted */ + span.go { color: #add8e6; font-weight: bold; background-color: #4d4d4d } /* Generic.Output, qualified with span to prevent applying this style to the Go language, see #1153. */ + .gp { color: #ffffff} /* Generic.Prompt */ + .gs { color: #ffffff} /* Generic.Strong */ + .gu { color: #cd5c5c} /* Generic.Subheading */ + .gt { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Traceback */ + .kc { color: #f0e68c} /* Keyword.Constant */ + .kd { color: #f0e68c} /* Keyword.Declaration */ + .kn { color: #f0e68c} /* Keyword.Namespace */ + .kp { color: #f0e68c} /* Keyword.Pseudo */ + .kr { color: #f0e68c} /* Keyword.Reserved */ + .kt { color: #bdb76b} /* Keyword.Type */ + .ld { color: #ffffff} /* Literal.Date */ + .m { color: #EAB289} /* Literal.Number */ + .s { color: #EAB289} /* Literal.String */ + .na { color: #8CF0E8} /* Name.Attribute */ + .nb { color: #ffffff} /* Name.Builtin */ + .nc { color: #ffffff} /* Name.Class */ + .no { color: #ffa0a0} /* Name.Constant */ + .nd { color: #ffffff} /* Name.Decorator */ + .ni { color: #ffdead} /* Name.Entity */ + .ne { color: #ffffff} /* Name.Exception */ + .nf { color: #ffffff} /* Name.Function */ + .nl { color: #ffffff} /* Name.Label */ + .nn { color: #ffffff} /* Name.Namespace */ + .nx { color: #ffffff} /* Name.Other */ + .py { color: #ffffff} /* Name.Property */ + .nt { color: #f0e68c} /* Name.Tag */ + .nv { color: #98fb98} /* Name.Variable */ + .ow { color: #ffffff} /* Operator.Word */ + .w { color: #ffffff} /* Text.Whitespace */ + .mf { color: #ffffff} /* Literal.Number.Float */ + .mh { color: #ffffff} /* Literal.Number.Hex */ + .mi { color: #ffffff} /* Literal.Number.Integer */ + .mo { color: #ffffff} /* Literal.Number.Oct */ + .sb { color: #ffffff} /* Literal.String.Backtick */ + .sc { color: #ffffff} /* Literal.String.Char */ + .sd { color: #ffffff} /* Literal.String.Doc */ + .s2 { color: #ffffff} /* Literal.String.Double */ + .se { color: #ffffff} /* Literal.String.Escape */ + .sh { color: #ffffff} /* Literal.String.Heredoc */ + .si { color: #ffffff} /* Literal.String.Interpol */ + .sx { color: #ffffff} /* Literal.String.Other */ + .sr { color: #ffffff} /* Literal.String.Regex */ + .s1 { color: #ffffff} /* Literal.String.Single */ + .ss { color: #ffffff} /* Literal.String.Symbol */ + .bp { color: #ffffff} /* Name.Builtin.Pseudo */ + .vc { color: #98fb98} /* Name.Variable.Class */ + .vg { color: #98fb98} /* Name.Variable.Global */ + .vi { color: #98fb98} /* Name.Variable.Instance */ + .il { color: #ffffff} /* Literal.Number.Integer.Long */ + .bash .nv { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; + } + .language-bash & .nb { + color: #99D4FF; + } +} diff --git a/docs/_sass/_tables.scss b/docs/_sass/_tables.scss new file mode 100644 index 00000000000..8a50538ea1a --- /dev/null +++ b/docs/_sass/_tables.scss @@ -0,0 +1,21 @@ +table { + width: 100%; + margin-bottom: 1.75em; +} + +tr { + border-bottom: 1px solid #EEE; +} + +tr:nth-child(even) { + background: #fcfcfc; +} + +td, th { + padding: 8px; + text-align: left; +} + +th { + padding-bottom: 4px; +} diff --git a/docs/_sass/_typography.scss b/docs/_sass/_typography.scss new file mode 100644 index 00000000000..38e5c973349 --- /dev/null +++ b/docs/_sass/_typography.scss @@ -0,0 +1,253 @@ +html { + height: 100%; + max-height: 100%; + font-size: 10px; + -webkit-tap-highlight-color: transparent; +} + +body { + height: 100%; + max-height: 100%; + font-family: "Merriweather", serif; + letter-spacing: 0.01rem; + font-size: 1.8em; + line-height: 1.75em; + color: #3A4145; + font-weight: 400; + -webkit-font-feature-settings: 'kern' 1; + -moz-font-feature-settings: 'kern' 1; + -o-font-feature-settings: 'kern' 1; + text-rendering: geometricPrecision; +} + +h1, +h2, +h3, +h4, +h5, +h6, +input, +label, +select, +textarea, +table { + -webkit-font-feature-settings: 'dlig' 1, 'liga' 1, 'lnum' 1, 'kern' 1; + -moz-font-feature-settings: 'dlig' 1, 'liga' 1, 'lnum' 1, 'kern' 1; + -o-font-feature-settings: 'dlig' 1, 'liga' 1, 'lnum' 1, 'kern' 1; + font-family: "Open Sans", sans-serif; + text-rendering: geometricPrecision; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: #2E2E2E; + line-height: 1.15em; + margin: 0 0 0.4em 0; + font-weight: 600; +} + +h1 { + font-size: 5rem; + letter-spacing: -2px; + text-indent: -3px; +} + +h2 { + font-size: 3.6rem; + letter-spacing: -1px; +} + +h3 { + font-size: 3rem; +} + +h4 { + font-size: 2.3rem; +} + +h5 { + font-size: 2rem; +} + +h6 { + font-size: 2rem; +} + +a { + color: #4A4A4A; + transition: color 0.2s ease; +} + +a:hover { + color: #111; +} + +p, +ul, +ol, +dl, +figure { + -webkit-font-feature-settings: 'liga' 1, 'onum' 1, 'kern' 1; + -moz-font-feature-settings: 'liga' 1, 'onum' 1, 'kern' 1; + -o-font-feature-settings: 'liga' 1, 'onum' 1, 'kern' 1; + margin: 0 0 1.75em 0; + text-rendering: geometricPrecision; +} + +ol, +ul { + padding-left: 3rem; +} + +ol ol, +ul ul, +ul ol, +ol ul { + margin: 0 0 0.4em 0; + padding-left: 2em; +} + +dl dt { + float: left; + width: 180px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + font-weight: 700; + margin-bottom: 1em; +} + +dl dd { + margin-left: 200px; + margin-bottom: 1em; +} + +li { + margin: 0.4em 0; +} + +li li { + margin: 0; +} + +hr { + display: block; + height: 1px; + border: 0; + border-top: #eee 1px solid; + margin: 3.2em 0; + padding: 0; +} + +mark { + background-color: #fdffb6 +} + +kbd { + display: inline-block; + margin-bottom: 0.4em; + padding: 1px 8px; + border: #CCC 1px solid; + color: #666; + text-shadow: #FFF 0 1px 0; + font-size: 0.9em; + font-weight: 700; + background: #F4F4F4; + border-radius: 4px; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 1px 0 0 #fff inset; +} + +@media only screen and (max-width: 900px) { + blockquote { + margin-left: 0; + } + + hr { + margin: 2.4em 0; + } + + ol, + ul { + padding-left: 2em; + } + + h1 { + font-size: 4.5rem; + text-indent: -2px; + } + + h2 { + font-size: 3.6rem; + } + + h3 { + font-size: 3.1rem; + } + + h4 { + font-size: 2.5rem; + } + + h5 { + font-size: 2.2rem; + } + + h6 { + font-size: 1.8rem; + } +} + +@media only screen and (max-width: 500px) { + hr { + margin: 1.75em 0; + } + + p, + ul, + ol, + dl { + font-size: 0.95em; + margin: 0 0 2.5rem 0; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + margin: 0 0 0.3em 0; + } + + h1 { + font-size: 2.8rem; + letter-spacing: -1px; + } + + h2 { + font-size: 2.4rem; + letter-spacing: 0; + } + + h3 { + font-size: 2.1rem; + } + + h4 { + font-size: 1.9rem; + } + + h5 { + font-size: 1.8rem; + } + + h6 { + font-size: 1.8rem; + } +} diff --git a/docs/apple-touch-icon.png b/docs/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7760c093284310ec706ec3b158d8bedf3ee7e3ea GIT binary patch literal 12286 zcmW++16ZD48-KHF84Jr=SPQF#Wm^lYwrtyOVcE6(&$exQxt8sg`%YiiRbBP!Ip?|0 z{nPzZK~5YEnFtvIfuKoBh$w;IHLu@@@ZcxkC_EeZ1#2%Pse%Z;JP-{+z~4wV5*qdp z2sHNVH&n{>UlH(6LI=^W4$9U>4$j~03?a_W&djD(=JxvEZ48;M?Tk}Tc!?m8cMwSt zK^2#@<8RImDzkGhqg1hMk`m-XbV7S?py>j#2`I4Wk^SN%#Qn1ALK|jo-@GAfqm`dQ zP-6Fsd-p8`ivOL@8>*l;XiPYwhye+(5_J0?tJ?*FlDT3VJx|gz4Y@~n(S^=@?0i{+QGi{agK0uq z=kW=H*g>?RZE$@QD`{O3vlLUIxWo~C#vnY95RWgItc-<>3h?XfKFSz-us*1eKxU%$ z#VoO`<4NK#@(_9GJ@`!AWqC2!_4hsw5L1X3{8?fVaU4GE<@!Z-)=->n z4Cc?1&kYQnT4Fj;1C|>E213=@@+&VmTndT`h5#iqL58i^H?V(V(5`WgRzg{T3R z6e0$Fi*~>$>zE}2p@f)F4>ZFg3!>-|_I@k9ftOe5wkpB22bU#uL+ zzCfGJ%~xfS_~>Rm_bf(dWRUG&yDdD-9$s(l?&jZLeweUkO%+}tI(aOpro8^b$8yoc3W<7 z#fJA6yg3)iB=tFGWf7gyQ?sl0Z$2^V{?1SEQ%&EdR4wcm$>(h6)78DjT1I4K0!UZgGD%H*q!8B&b_;O*(y9v&4Gj$m z88Bg=DpD;jaJ}3qVl4V<2KJ~_r!^&9j1m(Q7Y}c0Do?slzyDX+)+X1?Cq9iy>>U># z(ZI4vlfA~>-#JeY|6-XqEf+;FF)@o6|Er#%ZEmkJpPN%7lVTy{st7bzJTs@Oq;e@Ehx zqjOn4rI_vjJRBT_)74g0^-t=G?OsoNbER5N zY^+2PH6C|%$S5evZjXjGr}pR?>u`FMI5=CE;{x(5oG|P|##oC@Lr@ z=&(0Ij?kDSLz5!l&F|{!O3(d_&KqFFrweh4N%ROBN-YR`jJ);9*&BPh^X)_c{vao8k+9o z$5=(R_Lt|+fk8nG+|O3Lu)`P_ki*QVsDt@(`F!~dqqNLo^>U?^CP!6u3g?{r>%-}Y zw_F5J^61qUQD(sW{3CjZB&n z{+8>PBb%L_-SVv9YU#k*S_ZRj+XzEH_!vg+Hl*1-kxE(|-Z6A^bfcP&TC84=F0=7@ zO%pvou{E}nGBV0*3ae3PJO1Thj>s{DBK=rxaV?3p*`K1$oA<`R-FM(=ayh3c=KWUT z&nCU~j$Nj} zuC5F|ch2Io2(cW-fR_oy9I*%jd3B~FZu|cjZ*SqPg3c9gvuZV&c4>AdvV@Bm#U1l> zy`SP$%kY`CZQ=#4O$H#`F;^ULthzy7pD?kp{l&>VT;egdNzOA-7q=!Evuo%{cn)c0jLQv4Nonm*&9jsFo!F zeHIYw`4tlnF9=k8pSe75C*R2abpG~_P3z!~#$z@*r*oxmH`@{5;j;x{G(HA826Ict zGMHdwLbH|SG;qGVySpnnY`M6wyEr>j@MO~bCYe87Ng9Zq+&!B+k}Oi>)9CS=O2Sjv z9LfWwnl}CY-h4Tkher}0Djy#oCK1t)+bO6KJ@&bo{J7AeA*rqH?Mj_;t$Jp5BBOsO ztvZpbt?t8vztD}slBHuSi189&iyqJtyHUi2gk|DsqO%|Q|$Zq z?^h!q#}&$TTD39zX_Lp&Kljt?*QHVOr2h&H3p1T5P_(;Lfz9OC_TjK&E1NajzuKR! z@qY1|+SAy37#p{;k{>LB#Q+ zm5YNTe(X12agUZ8HIA72z>z4I%b6YpMaoBGbn{dm#{(PWhnwT2B1TxfU*;ayv+5)l zKUm3`m_|#X-+&w3KggmUGKa70At;h7@*5j_q;?M17rujq?V}6=1}POqHYkbey7Tk% z4V=0`1B!IH{1i45b|NBP7uIxc`ylmbOWUJAA2{qLxueR953&8>+}w66Ezw7tAZ zsNQTgG`4>@k>zqMNA&z|N09<8=nEo8giA--zJwY$l;}he@VL0R4IX!F##;QF-e7s# z1`+t3ot=Lw^%2mCKlzk>YnD1O9!dJZW=D-i!sD>sGUjaJ2#y{BDm=J&@E&qVt8>Bh!Jh!44N&_G`z8igJ+S3e3l@-dWNlkyR3CIBdtmBq)mcZcQeE=$G+1~xj8 zp`kH>EFV5O9^m}_`}YkvaA|48lAZvWJIBZ6b^1iI0dl3yN0RalE%gVY;6otM(a|QW z%cf+MG#;qQ=vrbzzK%;c}$j}DN@cyw-#VjE2&t$ygw{w?6oF#c_*@&k8DCoR7a}qe6qY@>Al&9 zHYTt8K;lLhClF^Z=+f9QN{H-mZq#3xEX2l;Kw13{Fqg1(>IT zfpF9R$tp+4M~HP3Qb~)vVz;1Y>&x@QoO`%fPE2nCr!S1Q_1=FFc$<~?xB%guR<(rq zw&gPTBf!2^>R@1CIIB9q(SimZZrz57N8@~Z_C2uiySR)DYFBr+M!B((5%RO&ALi5= z&C-~;RNwUwoL!|oB;I-I9MD^xyxm=0k=hciBY2!j+_zXXDu2LPrvhd}%xx#)YV@_k z7)G~Isev)Dyxg;Ixyb%KC9mGE?}o6cU2YJCk-ubkct-!~>+8?xZnlRL?X4&_K?%Ic zbP*w78B62#&(5Y8smdjgQKsV-^oLlEn&R{mPVrlcHDSP_4) z{VOt4q#Aa8U%%!R_VDi%<)r+8I4B@MVn-H21RY}7)bZa$Nx1{}`cb)SrypDzb!fg! zGPJz>b#+}rLV}%+`fyj)^!^!WM3p)$EG+$9fheNa8trYZhgC_2xgtFupD1I65Fjpc zl5#~1sei83tgM)^u(37DgM)+h&-6N<--r6jXXX87<_T+P_#~IiqFIADU-k`q*0?(e z?fCiTOrb?b!8?hv_qZc>g5}G`1(fQ1g!UchA6EAp3%Q4D&>OR6o7mrvLY)*$kdl(# z_6t0Bx;=p+za95}rfgd4i+H>AH2Uv|?F&W_KFf4CiXF5qyee)bK+|l_Ac%s3f)6;9 zl{(h*Wh7$1i0OX{GtAi4ovkfl)5R9okBru4J%VnouD0;q zI!z9eN><09yMDg9{u{<3HH8+ff_j;{7+Pe#rxR5OtL_hvHj#@|{q*p7cZvQo*I0ck zks1?&)$(xCTr%I?-F-g9SRQhs&TP|~HT%^{CWZZ{qZ~xE#cjAM~Dy zhE1lXyVD|!SE1tCgl+!umc@G$QuQrF!dXFDYzn>~GJm2wza}-s^1-&hirvCot)6=T%fF*fIP_ zmlFpy?DS-7sJU2gow2-OXWZ$BXNNoyla|J$>C*p;1l{j=p*nx-yy2jXAVSRT?@wCo zqA!p=KxK`$_v6)dYzfI$nw@vAsGVu@#VjmJguMlxuCVo&*4Ool3JTU`e!hz?Iiy>n z?w^jr6crVn*mo!y{uLL86YOo@=hR}iEoHITa}<&{YgTEqA*B9C?6{+LYh9|9nwFQB zw*vfYZv3&%a;d`Y+HCOYFRD6{GJk6ldEN8n`u28# zl}7vithEFtEw(y&IXN2t&dh)?mK>HIjmAI?6%`SHXIBH1k*qq#LjwZfxaRjA0ghx& zk^q{F*?d{LG!7D^_337*WC(|pwCwg4v^W(_&7n_TqM~q)r>iT4&ubo+vcX>Vc6J0y zbA`&m42+EXKru-19@47_TGA<~PsF%vm)5WTXlVlrNAOMKb)DLeQ>q)=QH@Sc-mfBP zQ`hy3kH>%`Sw~{Ep7VNna-KU6gjcPI4h}}p|B-%ox%;usdpF&=cI5-g&7oMZx;Ji3MbFO=4yS%(4#Kv}WcmH^=ucD%&07^f7hn$Tq=JiC~ z)=A09sj(N_?B{0~5j%qu6dImCY4X+H9|wq9{Ybu@D*~|G?;a1jEiTcOq2-_rZEtUD zEOFb6bQT13wj2Ly0aobUCQl;@YN+k$geQS0yjOcQ5vhU$y#%_B! z`7GM^uLqqhZ;qPrfasa>l$UkkI;YsuG)naD|F!zI{ z`ts=~^IFZtCP&82%iR3@YOj4ZHnx)E=f_L=-m4=h4#>!$0nS?kfB;Sy<7(p6G&Dhq zUqzM&CwdjMwTbm>^8p29RASB+4Z{l`zwAUH8{m-xcZ4vu)9G1Q@q*TASCkPS37HLZG(wRv`a{{6kB1zYmoth#QzVR%3Q?3}Aci_3>YPt_+!9rt67*DH;H_DPmP{~;M< z$!Nlj{-ZhgBT+;e_w@VzT#HZ6Cu#3#0P((8w6(4Lwg&I-dw;c0 zIc#svPSm#@LA+B99^yViI9Y3FK{*9S>}of|+it8AP)?0g0GsLE_-A0TPJu$@2tFC{ zqy^vzphGXzm}2kp>3Uw{=6{J0qXhR*sZ_Hz?Qf}cBD2Hgj%;(=>2f1w*c6nW1G?QD zSp%p?bh&GQ3UXTJkB^Tgfc~Tz#{3+S7AW&dDk0}{yRr!sI)(GWmcqydnrJAV(Fwx@ zl%#-$W@*A)x$ZdqSBh+42uyuGZP|>gmIp+WpOuDEi(oa0_1lKEW8#&SPs&$AoF4nPl3n-Q=n;z6{XI=_S)WdP5{ z9=U&MDb?wCv6s<+;!<)eobV&n{Ifg2OOu!9CnrxMV`F6-n+oOeZ`Z*}8XEMj`fmvc zBxvQ*Dh^M9(2kM)1r%f+;YT9{FR!+Dgr|Qh{mG=6|YMd7e6myO^!@%c7Jr0)Ki}AVNlXfjzYH%u;y zo0`%C8!zmjdwxEVMkc9apK>&arR~=5UoqC3HysTIlCrXn@od;WLSO#tVG{}&O}}V= zc`DC*05*f8qBSlGaGXr~!U?mxB7oJo7b);uaZ_nBNg*j6NGbm7&v}>AXWJe&3 z5DWeJ6LZEJs7OGZrLVT$Bnwx>#Ke5nUoDD>jEr0<)7`@uPXKaIufH3ZqarIW8846h z3^_eLBAsKJ8yg$!-p?Lm$m-g!qO8_>O=sdO*a8FI0v_iR;@w19D0y-JBjizIo+_qY zqc9YFX2ey%H*Y5ZPWBRg9tZ}`f@ZZ58i)0&_Jj*4>^z_wDJbsuaw0_rH(#DlUyk~8 zYR%%;-Hpf6OjVh)ppcj}Ycc^LxJX(3qX00>es>J_2!4Hcch|n!%yAE}%!0I!DA5NiP%Z!=QhKlgtplX3LQu$K*{ z(=^Q=0!dk0F2_DQoUZbve9#Yiw_WtDnR7JxWAOQvGM$o=5-dJa)dcWK2_Ig~r&A+M z2~R0NO$S=&ms{Pr_#Td`(=7k|I1UNX@wzjd)W12H4ZAs68BUe~gkMxNE-LDs$>rC2 zt8e!Q#pNb{D!%)-lP#{7 z#B!4XfB*J|wFroz+&w&?Xu_ynzuR(e25sx&-#`2wVW2Me!HQyjUjr1n0(~55RbC~p zpVWP%)3U=4)Y{n)4X{Y2mE|c`AO`$jT{k1RLPGWm^MC)f=-+!}G$)onr}_u_+CkPE($Y2U;7%87!|F>dJ@<+vgN^3NCgTuqgtg z?9;=9S?!!QJ#zZHG8i12vzJ|g7gJ9Ka`V2T=P6a&^$w`~xfu@}LPAN<_BU1V3Z9 zXLC~+2<|lK&)&~1TlJ|5M4T2${?;{cfQH8;kd?PwgnkqFv5A-Ax=Vnm62f9n*TcEeP?4ggsVH(`7uif9${k=_ zeRqx&dY;UIWCmk(Rb2mS2KR@`aZi*Zg@ zpfaPe(#1tZ7x*55UWM}{3PyWNGhpTMaAWEAbUlwN8}Zp;PeE+=H^4N+lN^vC%st4Z zeImbYljpzd`MwO?glS+G;kv&X18(4K!IH=jqQVQd0K&M~>|DOmDrKpC{%$h-M`4FW z_0Ahi*(6rM2~YjLa7+(^nAlih<^N=Cd8z^;NWC9zo4lTyR+4&qd;PkrEij@0^{3kV zeRgJpz_sw20tBOz;JEfhMZIwYIs`U@hY0Y%4?hAj+jId_Yjy|bSy3FDma;FDk$=sR zKY;GOlkcF~DZgThMUpZd1eAm3!fCxK1KdnMk9R!^VCPBF<^hpm+FJ!;?dvJ#0Z)_F z3J-!|f}6;w*ej9)yY*Gvn(!RV zmBlB(sb`uT%{6vj-F|k%A)MEiNu}=J`L5wdf>@4i2m+|8q8RBO!#d=rHX(o3oj*zJ zrZMXex-J`VtJ5F&wSh9&8PAZftgMtnVh2?C#FB=}wcc{4z`Fe@p}w_LwymXQxiFU< z*v~)o_4fgj+qr6e;|Jv11W?;7E=NT-&J-uwq-;^&Bsch_(0byITeGwMI7}(AU(fUG zPwn@>4K)P}m;FZ%q9iw;#dP;-qkZuFZoQyC{M?Pl-FqO;R%ld0DU|^OH0cS!tN}X- zsA-I-k@w?yaKXn{SC+@1y~$xeX3B9sqgHkA9Yib-UZ3H2Y-}tg!}b>m2}EEAh$kRb zW!BWFC3esO#!~1gx#iC-qhWt0Tws6V)ozrjmy_y4 z`ftxS<5i3(eZHu466V3rnAL{U`X(nQXA`UN^6~BKzT79~UXziblkyH6-k6Ys<15QB zSkHZReqQH9FwylZuh`f4;2y-ZgWcW2XOFk{_iSVKVq!rB zUQ`o5i-u4kYmA@XIi4&hPnuPN?mBt6SWrM0d)QV>NAg4_~#;jS=( z#s96_Kp+^_ud@J5sV%mfeYVegAT0#RCbH%)!01DrPFG7qP=ApLFfXc=Oz-dIXL#A| z4ePN^0I)C1Wy2nMmOytA-4N6WYqVZ&P;}UE11<}Qiqev$@<7xWfQ5zSBER|m?WZ;o z2E0_Z`ASc4Xn?eSb@eC75Cl9AMMX?&hw9#qpTn&eqg-pbU0p(Q z#^ZzJn{GMv9}?eV&vrH zC02Preuk!7sAYY$05>8`y91IFG36)leA``E{p<^aFa;tL!}Kc<+g30$Ub*oBRvR5l zD-BOmHr)mymddtK5U{)QVfOw7fgQVE2V~IhS7_*8_Pn;cozyY~BWTu0=`39vOze_7 z;*gQ{lS1WusT;a!vsxS=eP2oQD23heB8M7=KwAoZ0vBUqDzz5b_2Inns6GWAfKtG= zUKvtMDLRlYtL~?KW3AFZeq7Fm4ET=%s$^e@``!qJjcGmB3zI+-ySm6EgoXsSmS_rh<6)3+8cwDm2PBI_L#ql)z zv%8%LPK1I$STMpoOp6c1jp9PQnvhshs4edjG0NI;(YuzH){&*3VSvmfjkFhy12SPMd(sgqdjG}x5y~Bp` z!-E4A9_H!!;j{)Qh|tK$d?1j(KtNPle-1c9?5-CEa~5){wpV+KiliQ(1SmmjCurjy zA*LVkYeyIuLbAVkHSAUre0(6_WtqUJNB|=ZrsscqCoI`SdBqa{` zWx5!a6anu=4A?Z-??pJlB**kdcd#i?Gcj1bJ$-#ubJcZ$NdwWU#cGObY6rkL)GB*!Hr(9jz@s6K+eV%Cz31fBR6k2fFM9|t7$QSu8KRJ63pA|e5F z{4FglCP0X%xw6Wo^HASbKLaa&5*!J*+Uv8k^+&;YAou}zh-B=Diiz>4I62}0%J0~O zoQyq_Djs~C85kCdq)MGG*Pog%{2rKo^yK7%H96j|bZYZ3z$hOih5XdCv?yl7YTG^o z#NzaG0-8CK6W}eWcEgOi=XJf0uZ*UVh61@A6ma-ee`-K~0V5u7aEYj3K^@>*DusrJ z*9_Bs4+BmX^1){HIR9qJZ*ysj!a5L)i|kULUtClbk5V82bBH>RHzApSV?s-f-FIZ+ zsaHuv1h#xd`8_Z^sP0FxFfqU5dl~u;8eqj$nt(0xQ|ey~GGF)$z%TnB3~=?)D}Rpt z1wFisXKaU}8)hXgV3gsbJU}e|rz_>bZQ7(WFqRU!lVd(#7S1gkaCHp|Vj46tm!;7R zfwim`V4zDPkuHSZN(cg1)bnDHwv3l`BRisGkpVJkbq0Y=8kV=AM!|uJ9TX7`Ld6_~ zQ6^~vi@YSIl>g0}%;g>@m#;5#{n==QVA7+nw|9_&mLl8p;f6kiOCFkUFuT~#wg-*0 zOA5U9yQ3hkKX4o+i+F}rVB=VJS3vOM0wV(0(CNe}m{JhE1hj&05Es=VIz7GAWsw6Z zuCpME;zJi2Y0od9vC#-vJ4^+Fff@`Y{Y*zUKj}k%TS_{9CrqzB>RmI~C!;M&K?q4_xYq#8}ty>Xd3BK-VkaI#&JHZ76JH z^dD7waM8KFcA)UX)qc0Bz{zZJ;x}C|!-F>(saA~pE$Rx~Dt3^_3b51b{Xa(CR=qB}lCZ=)+v#Nby>oYIdUdlOkLpryEsZc5^?0Y-J{hOSbY*X`;Uynkn*PzJ-aNW&XV zNHDGoV(&g+eY+~qh32MV>X}K}_y9P7k6-CrxryZZ`Q=deMd{lr7Ci}a(*ErP`j^1i z@a8l?b6tf?blmo-C!aK9c1Kb;q|f*gp!2L-&V%;OErxqPkbnNHRf*h!tjz6$SP-xe zP2lkPRa6`2I$K$l?eWZjYJVLE>x`y{n1ER@6&)SsCaE%=^4<4mz;{j?dMs!2M8wU4 zvw<9-2(p)ct@OJ@qs?6wQ3Z2aC@T%N!Zr^rExfDjKV)8UKyJ1D<=K69n=u+)P{<^H z*~HJxQxS0|M5c52(Jc8-=Jlp9-v6Gy1Ka`UtCw{0fLog)CvYy?3fin zQ_9C~2j;frN|P$902uyo*pdb(EcOB;ji z0XuQ$ed=ctL1z?2qO_^9UxL*E8^b;$c8r$bX$>QdJNpRP2w4oryre@$g2QwP4 zAUN^r-ExPy-t12Yf8h86JkdE|dXD|%8|5ID z<+Y~MVhRbfKn_lW*t%F><{e*>JDD6>VbB?T1>6COI{Pe$;z0;4`ReonUqCHST2>Z! zwp=V{Lz@d97k3iyz*qfbMuX>^PzQ5ns2+BJM&fg=pgRyV2zcOcU`o6ikDEKTppW=H zxb5d95}$Appw@sK^R>~ZAoXr%J7VlSW(6S>WnKIKT&ywOjKaJIsXZ97>~=3tOiUEc z$^}+av+%QFqY3?T2kuOKlAoE=ZI{?)e`LKDLOTeeTmHS)*4zzf-LnhQWemxB{QeWH zBX`1)pCEY(-dJh>fn-@rT77G0$8M(sM5c3yS0J(hj&!=pt}YD&3~P#E*$Za~lmg_M zw%Zg8azt~?o}6uTYbQ{zI;w$qCypR3M{;Gk1(M8Y16j3Yd z=Eei=m?EfB)m?QO9^`jvu4XT7XYj0K2lBtBuYfL71~a6!CX-zonwLAHg}`WTy4Pb> zq*xxvSV(uu5`#2D9^u~M&EBfe)6ycq`$K`DnokaUQ7g4vYaZD2^z>h=jUuF$2ZKIC z{z7@cUoOx3z(hb12i#ke4Q_302m;gB;r1UK3Z9Di+ICSKd?w*8>RbmDDdfK_BAV(- z1yI8DtgI9F&Oq|+RrZrAr?b!&5bv}Qo?IE0JDDKq3Cv{3NE(>86$kBGSnlIPEM1L@ z;r%jwxmCNE3Ir;>xfuNJ-i&NF?mVLxVCYd7X-r+4Nr@$W!_iKdx;YL1Rj`vP#+9!N z<$%rmmLm#HSg$N9w+@>3y#q8d-d>?Es|ge;Bns{tH@iuRbHqK4=rHiDAWC($GW?8s z)Paz=9`n3<^@hE@19TK@Ce{ICL~}Ie4#D`>!KqSTGZX0b3<$HZr>IgYvp|$+!$;^+ zU-vI4nJgn4y3`7~joPBUtigiUf}>S`vjSO0QU|CY&RK0!gR<1DEcAWQh*6S8v+&-- ztb}j(zRMB(LHJ?~DV=$p@rM2bV}B9`!^(KQhUM)XSQcsnk%!qsUq^yiu6t#eVf#$8 zy0_$YmUJY}7!0H<E6`#(%*N>)Gc3ssQcXRj0Rk=cE2aM_OXnOK0o9a{=Wam?P%5S`aJ#+fxn*H>bm~ f;1UsH&kIZpUMy@~iU0?g)rUxm%88T->G}N+g@!F( literal 0 HcmV?d00001 diff --git a/docs/assets/images/android-chrome-192x192.png b/docs/assets/images/android-chrome-192x192.png deleted file mode 100644 index 984b1cc9ea70ee727c37490bc65e55a2d6257ab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32067 zcmV)%K#jkNP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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

    5V^( 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
    TJk#_4rIoGCu9Y%msnPAVHC98GtuN=v<0=(LI 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 diff --git a/docs/assets/images/apple-touch-icon.png b/docs/assets/images/apple-touch-icon.png deleted file mode 100644 index 8113b7e486fb0cd1cf48dc33e30d8ebeb2489aee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17352 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 GpTHdhv`Yp%5|y><&^a6vj}n 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 YUWp5qd~!0K3bca3)78&qol`;+020y30ssI2 diff --git a/docs/assets/images/browserconfig.xml b/docs/assets/images/browserconfig.xml deleted file mode 100644 index 3baac445c3b..00000000000 --- a/docs/assets/images/browserconfig.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - #da532c - - - diff --git a/docs/assets/images/favicon-16x16.png b/docs/assets/images/favicon-16x16.png deleted file mode 100644 index e45f6df988c2c372d906bb3a293f4f6231815929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1434 zcmaJb{TSQcG>^_@kZaGUtQ8g11$Sssm4e#%+1qbEryF=u7-6V<=PrC+5mGMEC*nzg{cyzQj8YC)CfC41J0LC zm!*_N0wiYs3?sD|+l#RZ7Cks8RD5XCEgXtLDgl;~1 z*P(}tZZ_q1GI4=P5mFM7SeKHZUjjV~dM3VEh;s|k#iYuvuxY}?`9&1E7NK(yzMWnj z4#(7YV=HMO*xihsRP{vdn!}cB+$qdvM?ar};6by}eGY^;;EnY$dlj zYPG9?$E$UrEoC{^B*qC{eX=Y4@>1P&U(k}3^FNgNx@_HYNGuD?Y^ZY^{TNZ-3| zSJkTI?JHEVdomUTY%I{^#7YHr^t29tptn4r-;xpt!7Yd3*&bb#)3u@M<3Ql(C zyEuh5SB8l;EGbvNP4m&FM=ej)&5LYGh>!AQ&)H|?hLG=Y%1cS)nd_XBvq|Bq;-@9J zPSU+SSNJVE@s}^LXYzTm;Dsw@TEa&c?UFzvsn#SHP2zPNQ z3X;X_39k1zSgref?z{B1j{Rr+*CwqqJQ%rlpdohR-qJm+Gi$+jWS!(;O6+h=9nAB~Qssk^s5T*Hs?2CXjp=}~7{8;d?8 ziT`?S$uAStqt`@2Cl~*_%*4aNjZO3pCpt&yDDYnMg#4#aRf1HNpQ}Nr1I^Pn9&S4%VPUp(`#Ar(2y~`66mvOZQ>$s-i~o r>C8?s!+z(6#W-#ZG`iZWlG>BQG37T`^(KznL|y@Yf`E4}PG0jjL979? diff --git a/docs/assets/images/favicon-32x32.png b/docs/assets/images/favicon-32x32.png deleted file mode 100644 index 42f831bf2a8c917743eae8c13b8155ec45889959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2507 zcmV;+2{iVJP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 diff --git a/docs/assets/images/safari-pinned-tab.svg b/docs/assets/images/safari-pinned-tab.svg deleted file mode 100644 index 13c6c73cfba..00000000000 --- a/docs/assets/images/safari-pinned-tab.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - -Created by potrace 1.11, written by Peter Selinger 2001-2013 - - - - - - - - - - - - - - diff --git a/docs/assets/images/site.webmanifest b/docs/assets/images/site.webmanifest deleted file mode 100644 index 96d830f8e84..00000000000 --- a/docs/assets/images/site.webmanifest +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "Phoenicis", - "short_name": "Phoenicis", - "icons": [ - { - "src": "android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "android-chrome-384x384.png", - "sizes": "384x384", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/docs/changelog.html b/docs/changelog.html new file mode 100644 index 00000000000..111342ca54b --- /dev/null +++ b/docs/changelog.html @@ -0,0 +1,21 @@ +--- +title: Change Log +toc: false +--- + +

    Subscribe with RSS to keep up with the latest changes.

    + + + +
    + {% for change in site.posts %} +
    +

    {{ change.title }}

    +

    {{ change.date | date: "%B %d, %Y" }} {{ change.type }}

    + + {{ change.content }} + + +
    + {% endfor %} +
    diff --git a/docs/css/main.scss b/docs/css/main.scss new file mode 100755 index 00000000000..11494d6ec87 --- /dev/null +++ b/docs/css/main.scss @@ -0,0 +1,32 @@ +--- +layout: null +sitemap: false +--- + +$baseurl: "{{ site.baseurl }}"; +$body-background-color: #2B2E31; + +$content-max-width: 800px; +$content-color: #222; +$content-background-color: #fff; + +$brand-colour: #3583d6; +$brand-colour-light: mix($brand-colour, $content-background-color, 10%); + +$nav-header-background-color: $brand-colour; +$nav-header-height: 60px; +$nav-background-color: #f5f5f5; +$nav-width: 300px; + +$space: 20px; + +$mobile-break: 700px; +$full-width-break: $nav-width + ($space * 4) + $content-max-width; + +@import "mixins"; +@import "normalize"; +@import "pygments"; +@import "typography"; +@import "code"; +@import "tables"; +@import "layout"; diff --git a/docs/images/emblem.svg b/docs/images/emblem.svg new file mode 100644 index 00000000000..3d0e63be734 --- /dev/null +++ b/docs/images/emblem.svg @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/favicon.png b/docs/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..e7002918c2c847d572f13e5f51933a0fed227bf7 GIT binary patch literal 2985 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 + + + diff --git a/docs/assets/images/themes/appDescription.png b/docs/images/themes/appDescription.png similarity index 100% rename from docs/assets/images/themes/appDescription.png rename to docs/images/themes/appDescription.png diff --git a/docs/assets/images/themes/appDescriptionMiniature.png b/docs/images/themes/appDescriptionMiniature.png similarity index 100% rename from docs/assets/images/themes/appDescriptionMiniature.png rename to docs/images/themes/appDescriptionMiniature.png diff --git a/docs/assets/images/themes/appDescriptionTitle.png b/docs/images/themes/appDescriptionTitle.png similarity index 100% rename from docs/assets/images/themes/appDescriptionTitle.png rename to docs/images/themes/appDescriptionTitle.png diff --git a/docs/assets/images/themes/apps.png b/docs/images/themes/apps.png similarity index 100% rename from docs/assets/images/themes/apps.png rename to docs/images/themes/apps.png diff --git a/docs/assets/images/themes/console.png b/docs/images/themes/console.png similarity index 100% rename from docs/assets/images/themes/console.png rename to docs/images/themes/console.png diff --git a/docs/assets/images/themes/containers.png b/docs/images/themes/containers.png similarity index 100% rename from docs/assets/images/themes/containers.png rename to docs/images/themes/containers.png diff --git a/docs/assets/images/themes/footer.png b/docs/images/themes/footer.png similarity index 100% rename from docs/assets/images/themes/footer.png rename to docs/images/themes/footer.png diff --git a/docs/assets/images/themes/header.png b/docs/images/themes/header.png similarity index 100% rename from docs/assets/images/themes/header.png rename to docs/images/themes/header.png diff --git a/docs/assets/images/themes/leftBarTitle.png b/docs/images/themes/leftBarTitle.png similarity index 100% rename from docs/assets/images/themes/leftBarTitle.png rename to docs/images/themes/leftBarTitle.png diff --git a/docs/assets/images/themes/leftButton.png b/docs/images/themes/leftButton.png similarity index 100% rename from docs/assets/images/themes/leftButton.png rename to docs/images/themes/leftButton.png diff --git a/docs/assets/images/themes/leftPane.png b/docs/images/themes/leftPane.png similarity index 100% rename from docs/assets/images/themes/leftPane.png rename to docs/images/themes/leftPane.png diff --git a/docs/assets/images/themes/listChooser.png b/docs/images/themes/listChooser.png similarity index 100% rename from docs/assets/images/themes/listChooser.png rename to docs/images/themes/listChooser.png diff --git a/docs/assets/images/themes/logo.png b/docs/images/themes/logo.png similarity index 100% rename from docs/assets/images/themes/logo.png rename to docs/images/themes/logo.png diff --git a/docs/assets/images/themes/mainWindowScene.png b/docs/images/themes/mainWindowScene.png similarity index 100% rename from docs/assets/images/themes/mainWindowScene.png rename to docs/images/themes/mainWindowScene.png diff --git a/docs/assets/images/themes/menuPane.png b/docs/images/themes/menuPane.png similarity index 100% rename from docs/assets/images/themes/menuPane.png rename to docs/images/themes/menuPane.png diff --git a/docs/assets/images/themes/miniature.png b/docs/images/themes/miniature.png similarity index 100% rename from docs/assets/images/themes/miniature.png rename to docs/images/themes/miniature.png diff --git a/docs/assets/images/themes/presentation.png b/docs/images/themes/presentation.png similarity index 100% rename from docs/assets/images/themes/presentation.png rename to docs/images/themes/presentation.png diff --git a/docs/assets/images/themes/rightPane.png b/docs/images/themes/rightPane.png similarity index 100% rename from docs/assets/images/themes/rightPane.png rename to docs/images/themes/rightPane.png diff --git a/docs/assets/images/themes/searchBar.png b/docs/images/themes/searchBar.png similarity index 100% rename from docs/assets/images/themes/searchBar.png rename to docs/images/themes/searchBar.png diff --git a/docs/assets/images/themes/wineToolButton.png b/docs/images/themes/wineToolButton.png similarity index 100% rename from docs/assets/images/themes/wineToolButton.png rename to docs/images/themes/wineToolButton.png diff --git a/docs/assets/images/themes/wineToolCaption.png b/docs/images/themes/wineToolCaption.png similarity index 100% rename from docs/assets/images/themes/wineToolCaption.png rename to docs/images/themes/wineToolCaption.png diff --git a/docs/_pages/home.md b/docs/index.md similarity index 90% rename from docs/_pages/home.md rename to docs/index.md index a66cf3ab682..42c8ce5bad1 100644 --- a/docs/_pages/home.md +++ b/docs/index.md @@ -1,5 +1,5 @@ --- -permalink: / +title: Welcome --- **Phoenicis** is a tool to manage non-native (e.g. Windows) applications in Non-Windows environments (e.g. Linux/Mac OS). It is the successor of PlayOnLinux/PlayOnMac 4. @@ -11,7 +11,7 @@ Phoenicis aims at being the one stop shop platform for non-native applications. Currently, Phoenicis comes in two flavors: * Phoenicis PlayOnLinux * Phoenicis PlayOnMac -It is planned to eventually support Android in the future as well. +> It is planned to eventually support Android in the future as well. First, let's look at some terminology: * **App** any non-native application which shall be managed by Phoenicis @@ -23,9 +23,8 @@ First, let's look at some terminology: Knowing PlayOnLinux 4, you might wonder why I said that Phoenicis is first and foremost a _platform_ (and not e.g. a GUI). The heart of Phoenicis is a Java interface to the apps and engines which are written in JavaScript. Based on this, anyone can provide custom repositories and user interfaces. Want to provide a restricted set of Windows applications to a client using MAC OSX? Just collect the apps on a website or even on a DVD and you're ready to go! -Of course Phoenicis also provides some UIs out of the box (see [here]({{ site.baseurl }}{% link _pages/run.md %})): +Of course Phoenicis also provides some UIs out of the box (see [here]({{ site.baseurl }}{% link _docs/Users/run.md %})): * Phoenicis CLI * Phoenicis JavaFX -And the Phoenicis repository [here](https://github.com/PlayOnLinux/Scripts). - +And the Phoenicis repository [here](https://github.com/PlayOnLinux/Scripts). \ No newline at end of file diff --git a/docs/robots.txt b/docs/robots.txt new file mode 100644 index 00000000000..e31728c87c9 --- /dev/null +++ b/docs/robots.txt @@ -0,0 +1,7 @@ +--- +layout: null +sitemap: false +--- +User-agent: * +Sitemap: {{ site.url }}/sitemap.xml +Disallow: /search/ \ No newline at end of file diff --git a/docs/scripts/lunr.min.js b/docs/scripts/lunr.min.js new file mode 100644 index 00000000000..884d1f2a8dc --- /dev/null +++ b/docs/scripts/lunr.min.js @@ -0,0 +1,7 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.7.0 + * Copyright (C) 2016 Oliver Nightingale + * MIT Licensed + * @license + */ +!function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.7.0",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.utils.asString=function(t){return void 0===t||null===t?"":t.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(e){return arguments.length&&null!=e&&void 0!=e?Array.isArray(e)?e.map(function(e){return t.utils.asString(e).toLowerCase()}):e.toString().trim().toLowerCase().split(t.tokenizer.seperator):[]},t.tokenizer.seperator=/[\s\-]+/,t.tokenizer.load=function(t){var e=this.registeredFunctions[t];if(!e)throw new Error("Cannot load un-registered function: "+t);return e},t.tokenizer.label="default",t.tokenizer.registeredFunctions={"default":t.tokenizer},t.tokenizer.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing tokenizer: "+n),e.label=n,this.registeredFunctions[n]=e},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,r=0;n>r;r++){for(var o=t[r],s=0;i>s&&(o=this._stack[s](o,r,t),void 0!==o&&""!==o);s++);void 0!==o&&""!==o&&e.push(o)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(o===t)return r;t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r]}return o===t?r:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;)t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r];return o>t?r:t>o?r+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,r=0,o=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>o-1||r>s-1)break;a[i]!==h[r]?a[i]h[r]&&r++:(n.add(a[i]),i++,r++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone();for(var r=0,o=n.toArray();rp;p++)c[p]===a&&d++;h+=d/f*l.boost}}this.tokenStore.add(a,{ref:o,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(this.tokenizerFn(e)),i=new t.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*o,h=this,u=this.tokenStore.expand(e).reduce(function(n,r){var o=h.corpusTokens.indexOf(r),s=h.idf(r),u=1,l=new t.SortedSet;if(r!==e){var c=Math.max(3,r.length-e.length);u=1/Math.log(c)}o>-1&&i.insert(o,a*s*u);for(var f=h.tokenStore.get(r),d=Object.keys(f),p=d.length,v=0;p>v;v++)l.add(f[d[v]].ref);return n.union(l)},new t.SortedSet);r.push(u)},this);var a=r.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,r=new t.Vector,o=0;i>o;o++){var s=n.elements[o],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);r.insert(this.corpusTokens.indexOf(s),a*h)}return r},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,tokenizer:this.tokenizerFn.label,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",r=n+"[^aeiouy]*",o=i+"[aeiou]*",s="^("+r+")?"+o+r,a="^("+r+")?"+o+r+"("+o+")?$",h="^("+r+")?"+o+r+o+r,u="^("+r+")?"+i,l=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(u),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),k=new RegExp("^"+r+i+"[^aeiouwxy]$"),x=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,F=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,z=/^(.+?)e$/,O=/ll$/,P=new RegExp("^"+r+i+"[^aeiouwxy]$"),T=function(n){var i,r,o,s,a,h,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=p,a=v,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=g,a=m,s.test(n)){var T=s.exec(n);s=l,s.test(T[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,u=k,a.test(n)?n+="e":h.test(n)?(s=y,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=x,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+t[r])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+e[r])}if(s=F,a=_,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=z,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=P,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=O,a=c,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.generateStopWordFilter=function(t){var e=t.reduce(function(t,e){return t[e]=e,t},{});return function(t){return t&&e[t]!==t?t:void 0}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){return t.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t.charAt(0),r=t.slice(1);return i in n||(n[i]={docs:{}}),0===r.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(r,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n= 0) { + break; + } + + match = content.toLowerCase().indexOf(parts[i].toLowerCase()); + matchLength = parts[i].length; + } + + // Create preview + if (match >= 0) { + var start = match - (previewLength / 2), + end = start > 0 ? match + matchLength + (previewLength / 2) : previewLength; + + preview = content.substring(start, end).trim(); + + if (start > 0) { + preview = "..." + preview; + } + + if (end < content.length) { + preview = preview + "..."; + } + + // Highlight query parts + preview = preview.replace(new RegExp("(" + parts.join("|") + ")", "gi"), "$1"); + } else { + // Use start of content if no match found + preview = content.substring(0, previewLength).trim() + (content.length > previewLength ? "..." : ""); + } + + return preview; + } + + function displaySearchResults(results, query) { + var searchResultsEl = document.getElementById("search-results"), + searchProcessEl = document.getElementById("search-process"); + + if (results.length) { + var resultsHTML = ""; + results.forEach(function (result) { + var item = window.data[result.ref], + contentPreview = getPreview(query, item.content, 170), + titlePreview = getPreview(query, item.title); + + resultsHTML += "
  • " + titlePreview + "

    " + contentPreview + "

  • "; + }); + + searchResultsEl.innerHTML = resultsHTML; + searchProcessEl.innerText = "Showing"; + } else { + searchResultsEl.style.display = "none"; + searchProcessEl.innerText = "No"; + } + } + + window.index = lunr(function () { + this.field("id"); + this.field("title", {boost: 10}); + this.field("category"); + this.field("url"); + this.field("content"); + }); + + var query = decodeURIComponent((getQueryVariable("q") || "").replace(/\+/g, "%20")), + searchQueryContainerEl = document.getElementById("search-query-container"), + searchQueryEl = document.getElementById("search-query"), + searchInputEl = document.getElementById("search-input"); + + searchInputEl.value = query; + searchQueryEl.innerText = query; + searchQueryContainerEl.style.display = "inline"; + + for (var key in window.data) { + window.index.add(window.data[key]); + } + + displaySearchResults(window.index.search(query), query); // Hand the results off to be displayed +})(); \ No newline at end of file diff --git a/docs/search.html b/docs/search.html new file mode 100644 index 00000000000..833d5597cc9 --- /dev/null +++ b/docs/search.html @@ -0,0 +1,32 @@ +--- +title: Search +sitemap: false +--- + +

    Loading results

    +
      + + + + diff --git a/docs/siteicon.png b/docs/siteicon.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0372ff684a9516473493286a75124c18cdbf42 GIT binary patch literal 38017 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%0Dk$ZYy)c@~?TTx{j@;i1SFy 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 literal 0 HcmV?d00001 From 9fddbfd00d4faffde195849589d878d9e8a8980b Mon Sep 17 00:00:00 2001 From: plata Date: Tue, 22 May 2018 19:26:42 +0200 Subject: [PATCH 57/76] Fix RegistryParser (#1337) missing dependency for @Safe --- phoenicis-win32/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/phoenicis-win32/pom.xml b/phoenicis-win32/pom.xml index ff1a05e627a..c2b50da77ef 100644 --- a/phoenicis-win32/pom.xml +++ b/phoenicis-win32/pom.xml @@ -58,5 +58,11 @@ 5.0-SNAPSHOT compile
      + + org.phoenicis + phoenicis-configuration + 5.0-SNAPSHOT + compile + From a6a1ac87f0a8c9c1d84d2a4f84d7fd961cfdab7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Sun, 27 May 2018 10:50:48 +0200 Subject: [PATCH 58/76] Bump guava from 25.0-jre to 25.1-jre (#1341) Bumps [guava](https://github.com/google/guava) from 25.0-jre to 25.1-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) Signed-off-by: dependabot[bot] --- phoenicis-configuration/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-configuration/pom.xml b/phoenicis-configuration/pom.xml index 0a959817174..7ade7173f8c 100644 --- a/phoenicis-configuration/pom.xml +++ b/phoenicis-configuration/pom.xml @@ -46,7 +46,7 @@ com.google.guava guava - 25.0-jre + 25.1-jre com.fasterxml.jackson.core From a9bc3b1ba75a6eb19e5c43038d888f81e745a6f1 Mon Sep 17 00:00:00 2001 From: plata Date: Sun, 27 May 2018 12:25:05 +0200 Subject: [PATCH 59/76] Update view after engine install/delete (#1333) --- i18n/keys.pot | 12 ++-- .../controller/engines/EnginesController.java | 64 +++++++++++-------- 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/i18n/keys.pot b/i18n/keys.pot index f74cf1db729..9698e10aed6 100644 --- a/i18n/keys.pot +++ b/i18n/keys.pot @@ -51,27 +51,27 @@ msgstr "" msgid "Error while creating shortcut" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:63 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:64 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:65 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:66 msgid "Loading engines failed." msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:81 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:83 #, java-format msgid "Install {0}" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:82 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:84 #, java-format msgid "Are you sure you want to install {0}?" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:95 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:97 #, java-format msgid "Delete {0}" msgstr "" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:96 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:98 #, java-format msgid "Are you sure you want to delete {0}" msgstr "" diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java index 2dc2602d449..3040eac98d3 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java @@ -48,6 +48,8 @@ public class EnginesController { private final RepositoryManager repositoryManager; private final EnginesManager enginesManager; private ThemeManager themeManager; + private RepositoryDTO repositoryCache = null; + private Map enginesCache = new HashMap<>(); private Map> versionsCache = new HashMap<>(); public EnginesController(EnginesView enginesView, RepositoryManager repositoryManager, @@ -77,33 +79,33 @@ public EnginesController(EnginesView enginesView, RepositoryManager repositoryMa } }); - this.enginesView.setOnInstallEngine(engineDTO -> { - new ConfirmMessage(tr("Install {0}", engineDTO.getVersion()), - tr("Are you sure you want to install {0}?", engineDTO.getVersion()), - this.enginesView.getContent().getScene().getWindow()) - .ask(() -> { - this.enginesManager.getEngine(engineDTO.getId(), - engine -> engine.install(engineDTO.getSubCategory(), engineDTO.getVersion()), - e -> Platform - .runLater(() -> new ErrorMessage("Error", e, this.enginesView).show())); - // invalidate cache to show installed version correctly - this.versionsCache.remove(engineDTO.getId()); - }); - }); + this.enginesView.setOnInstallEngine(engineDTO -> new ConfirmMessage( + tr("Install {0}", engineDTO.getVersion()), + tr("Are you sure you want to install {0}?", engineDTO.getVersion()), + this.enginesView.getContent().getScene().getWindow()) + .ask(() -> this.enginesManager.getEngine(engineDTO.getId(), + engine -> { + engine.install(engineDTO.getSubCategory(), engineDTO.getVersion()); + // invalidate cache and force view update to show installed version correctly + this.versionsCache.remove(engineDTO.getId()); + this.forceViewUpdate(); + }, + e -> Platform.runLater( + () -> new ErrorMessage("Error", e, this.enginesView).show())))); - this.enginesView.setOnDeleteEngine(engineDTO -> { - new ConfirmMessage(tr("Delete {0}", engineDTO.getVersion()), - tr("Are you sure you want to delete {0}", engineDTO.getVersion()), - this.enginesView.getContent().getScene().getWindow()) - .ask(() -> { - this.enginesManager.getEngine(engineDTO.getId(), - engine -> engine.delete(engineDTO.getSubCategory(), engineDTO.getVersion()), - e -> Platform - .runLater(() -> new ErrorMessage("Error", e, this.enginesView).show())); - // invalidate cache to show deleted version correctly - this.versionsCache.remove(engineDTO.getId()); - }); - }); + this.enginesView.setOnDeleteEngine(engineDTO -> new ConfirmMessage( + tr("Delete {0}", engineDTO.getVersion()), + tr("Are you sure you want to delete {0}", engineDTO.getVersion()), + this.enginesView.getContent().getScene().getWindow()) + .ask(() -> this.enginesManager.getEngine(engineDTO.getId(), + engine -> { + engine.delete(engineDTO.getSubCategory(), engineDTO.getVersion()); + // invalidate cache and force view update to show deleted version correctly + this.versionsCache.remove(engineDTO.getId()); + this.forceViewUpdate(); + }, + e -> Platform.runLater( + () -> new ErrorMessage("Error", e, this.enginesView).show())))); } public EnginesView getView() { @@ -111,7 +113,10 @@ public EnginesView getView() { } private void populateView(RepositoryDTO repositoryDTO, Map engines) { + this.repositoryCache = repositoryDTO; + this.enginesCache = engines; Platform.runLater(() -> { + this.enginesView.showWait(); List categoryDTOS = new ArrayList<>(); for (TypeDTO typeDTO : repositoryDTO.getTypes()) { if (typeDTO.getId().equals("engines")) { @@ -123,6 +128,13 @@ private void populateView(RepositoryDTO repositoryDTO, Map engin }); } + /** + * forces an update of the view + */ + private void forceViewUpdate() { + this.populateView(this.repositoryCache, this.enginesCache); + } + private void setDefaultEngineIcons(List categoryDTOS) { try { StringBuilder cssBuilder = new StringBuilder(); From 56738b142191e87fc6cb636e4e5cd827e754c919 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 5 Jun 2018 23:20:16 +0200 Subject: [PATCH 60/76] Bump commons-compress from 1.16.1 to 1.17 (#1345) Bumps commons-compress from 1.16.1 to 1.17. Signed-off-by: dependabot[bot] --- phoenicis-tools/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-tools/pom.xml b/phoenicis-tools/pom.xml index 93544e318cf..1151c521759 100644 --- a/phoenicis-tools/pom.xml +++ b/phoenicis-tools/pom.xml @@ -67,7 +67,7 @@ org.apache.commons commons-compress - 1.16.1 + 1.17 commons-lang From 745b04852f02faf532f1cf0a93a85bb87e964ddc Mon Sep 17 00:00:00 2001 From: plata Date: Tue, 12 Jun 2018 21:42:54 +0200 Subject: [PATCH 61/76] Fix build if Maven project is not a git repository (#1349) --- .../java/org/phoenicis/javafx/views/ViewsConfiguration.java | 6 +++--- pom.xml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java index bfd9c78c276..9bb4b37647a 100644 --- a/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java +++ b/phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/ViewsConfiguration.java @@ -43,13 +43,13 @@ public class ViewsConfiguration { @Value("${application.name}") private String applicationName; - @Value("${application.version}") + @Value("${application.version}:unknown") private String applicationVersion; - @Value("${application.gitRevision}") + @Value("${application.gitRevision}:unknown") private String applicationGitRevision; - @Value("${application.buildTimestamp}") + @Value("${application.buildTimestamp}:unknown") private String applicationBuildTimestamp; @Value("${application.user.engines}") diff --git a/pom.xml b/pom.xml index a71752264b5..520a0f6b436 100644 --- a/pom.xml +++ b/pom.xml @@ -164,6 +164,7 @@
      + unknown true false false From b7d2925c1a03851ec6544b79b2c16109bcc36739 Mon Sep 17 00:00:00 2001 From: plata Date: Tue, 12 Jun 2018 21:46:33 +0200 Subject: [PATCH 62/76] New Crowdin translations (#1315) * New translations keys.pot (French) [Crowdin] Update translations * New translations keys.pot (German) [Crowdin] Update translations * New translations keys.pot (French) [Crowdin] Update translations * New translations keys.pot (German) [Crowdin] Update translations * New translations keys.pot (German) [Crowdin] Update translations * New translations keys.pot (French) [Crowdin] Update translations * New translations keys.pot (German) [Crowdin] Update translations * New translations keys.pot (French) [Crowdin] Update translations * New translations keys.pot (German) [Crowdin] Update translations * New translations keys.pot (French) [Crowdin] Update translations * New translations keys.pot (German) [Crowdin] Update translations * New translations keys.pot (French) [Crowdin] Update translations * New translations keys.pot (German) [Crowdin] Update translations * New translations keys.pot (French) [Crowdin] Update translations * New translations keys.pot (German) [Crowdin] Update translations * New translations keys.pot (French) [Crowdin] Update translations * New translations keys.pot (German) [Crowdin] Update translations * New translations keys.pot (French) [Crowdin] Update translations * New translations keys.pot (German) [Crowdin] Update translations * New translations keys.pot (French) [Crowdin] Update translations * New translations keys.pot (German) [Crowdin] Update translations --- i18n/de.po | 223 +++++++++++++++++++---------------------------------- i18n/fr.po | 223 +++++++++++++++++++---------------------------------- 2 files changed, 156 insertions(+), 290 deletions(-) diff --git a/i18n/de.po b/i18n/de.po index 7cfbf0bf6a2..67f6540c8a5 100644 --- a/i18n/de.po +++ b/i18n/de.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: phoenicis\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-16 10:04+0100\n" -"PO-Revision-Date: 2018-03-03 06:30-0500\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: 2018-05-29 12:22-0400\n" "Last-Translator: plata \n" "Language-Team: German\n" "Language: de_DE\n" @@ -25,55 +25,23 @@ msgstr "Eingabe" msgid "Please wait while we are verifying the file ..." msgstr "Bitte warten Sie während wir die Datei überprüfen ..." -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/DirectDrawRenderer.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RenderTargetModeLock.java:26 -msgid "Default" -msgstr "Standard" - -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RenderTargetModeLock.java:26 -msgid "Disabled" -msgstr "Deaktiviert" - -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java:26 -msgid "Enabled" -msgstr "Aktiviert" - -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:27 -msgid "Force" -msgstr "Erzwingen" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:78 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:75 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:136 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/ErrorMessage.java:71 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:149 msgid "Error" msgstr "Fehler" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:82 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:79 #, java-format msgid "Uninstall {0}" msgstr "{0} deinstallieren" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:83 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:80 #, java-format msgid "Are you sure you want to uninstall {0}?" msgstr "Sind Sie sicher, dass Sie {0} deinstallieren möchten?" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:98 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:96 msgid "Error while running script" msgstr "Fehler beim Ausführen des Skripts" @@ -82,27 +50,27 @@ msgstr "Fehler beim Ausführen des Skripts" msgid "Error while creating shortcut" msgstr "Fehler beim Erstellen der Verknüpfung" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:68 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:72 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:65 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:66 msgid "Loading engines failed." msgstr "Laden der Engines fehlgeschlagen." -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:71 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:83 #, java-format msgid "Install {0}" msgstr "{0} installieren" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:72 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:84 #, java-format msgid "Are you sure you want to install {0}?" msgstr "Sind Sie sicher, dass Sie {0} installieren möchten?" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:79 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:97 #, java-format msgid "Delete {0}" msgstr "{0} löschen" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:80 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:98 #, java-format msgid "Are you sure you want to delete {0}" msgstr "Sind Sie sicher, dass Sie alle {0} löschen möchten?" @@ -113,21 +81,30 @@ msgid "Connecting to the repository failed.\n" msgstr "Verbindung mit dem Repository fehlgeschlagen.\n" "Bitte überprüfen Sie Ihre Verbindung und versuchen es nochmal." -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/apps/AppsController.java:94 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/apps/AppsController.java:96 msgid "The script ended unexpectedly" msgstr "Das Skript wurde unerwartet beendet" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:97 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:66 +msgid "Loading engine settings failed." +msgstr "Laden der Engineeinstellungen fehlgeschlagen." + +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:71 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:123 +msgid "Loading engine tools failed." +msgstr "Laden der Enginewerkzeuge fehlgeschlagen." + +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:90 #, java-format msgid "Delete {0} container" msgstr "Container {0} löschen" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:98 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:91 #, java-format msgid "Are you sure you want to delete the {0} container?" msgstr "Sind Sie sicher, dass Sie den Container {0} löschen möchten?" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:121 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:115 msgid "Loading containers failed." msgstr "Laden der Container fehlgeschlagen." @@ -156,6 +133,10 @@ msgstr "Breeze Dunkel" msgid "Unity theme" msgstr "Unity" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/themes/Themes.java:19 +msgid "Mint-X theme" +msgstr "Mint-X" + #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/AbstractStepRepresentation.java:104 msgid "Cancel" msgstr "Abbrechen" @@ -164,7 +145,7 @@ msgstr "Abbrechen" msgid "Next" msgstr "Weiter" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/JavaFxUiConfiguration.java:63 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/JavaFxUiConfiguration.java:62 msgid "Question" msgstr "Frage" @@ -200,17 +181,17 @@ msgstr "Schließen" msgid "Uninstall" msgstr "Deinstallieren" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:79 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:81 msgid "Library" msgstr "Bibliothek" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:153 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:154 msgid "My applications" msgstr "Meine Anwendungen" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:71 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java:69 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:55 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:52 msgid "Name:" msgstr "Name:" @@ -236,42 +217,42 @@ msgid "Miniature:" msgstr "Bild:" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:109 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:132 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:141 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java:112 msgid "Choose" msgstr "Wählen" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:112 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:119 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java:115 msgid "Images" msgstr "Bilder" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:122 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:131 msgid "Please specify a valid miniature!" msgstr "Bitte ein gültiges Bild angeben!" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:125 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:134 msgid "Executable:" msgstr "Ausführbare Datei:" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:144 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:161 msgid "Please specify a valid executable!" msgstr "Bitte eine gültige Executable angeben!" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:149 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:166 msgid "Create" msgstr "Erstellen" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibrarySidebar.java:136 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/installations/InstallationsSidebar.java:112 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:126 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:122 msgid "Categories" msgstr "Kategorien" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibrarySidebar.java:162 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/installations/InstallationsSidebar.java:138 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:172 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:142 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:168 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:143 msgid "All" msgstr "Alle" @@ -327,7 +308,7 @@ msgid "About" msgstr "Über" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java:72 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:56 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:59 msgid "Version:" msgstr "Version:" @@ -351,7 +332,7 @@ msgstr "Repositorytyp:" msgid "Choose the repository type" msgstr "Repositorytyp wählen" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/addrepository/AddRepositoryDialog.java:59 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/addrepository/AddRepositoryDialog.java:42 msgid "Add a new Repository" msgstr "Repository hinzufügen" @@ -444,33 +425,33 @@ msgstr "Dateizuordnungen" msgid "Network" msgstr "Netzwerk" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:70 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:73 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationPanel.java:181 msgid "Install" msgstr "Installieren" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:76 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:79 msgid "Error while trying to install the engine" msgstr "Fehler beim Installieren der Engine" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:80 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:86 msgid "Delete" msgstr "Löschen" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:86 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:92 msgid "Error while trying to delete the engine" msgstr "Fehler beim Löschen der Engine" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java:66 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:120 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java:82 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:122 msgid "Engines" msgstr "Engines" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:128 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:130 msgid "Installed" msgstr "Installiert" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:132 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:134 msgid "Not installed" msgstr "Nicht installiert" @@ -482,7 +463,7 @@ msgstr "Konsole" msgid "Installations" msgstr "Installationen" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsView.java:86 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsView.java:83 msgid "Apps" msgstr "Anwendungen" @@ -499,125 +480,77 @@ msgstr "Quelle: {0}" msgid "Error while trying to download the installer" msgstr "Fehler beim Herunterladen des Skripts" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:133 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:129 msgid "Testing" msgstr "In Testphase" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:136 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:132 msgid "Requires patch" msgstr "Patch benötigt" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:139 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:135 msgid "Commercial" msgstr "Kommerziell" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:143 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:139 msgid "All Operating Systems" msgstr "Alle Betriebssysteme" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineSettingsTab.java:35 +msgid "Engine Settings" +msgstr "Engineeinstellungen" + #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersView.java:72 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:116 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:117 msgid "Containers" msgstr "Container" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java:35 -msgid "Input" -msgstr "Eingabe" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java:46 -msgid "Input settings" -msgstr "Eingabeeinstellungen" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java:57 -msgid "Mouse Warp Override" -msgstr "Mouse Warp Override" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:35 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:47 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:33 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:44 msgid "Information" msgstr "Informationen" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:60 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:57 msgid "Path:" msgstr "Pfad:" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:65 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:62 msgid "Installed shortcuts:" msgstr "Installierte Verknüpfungen:" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:71 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:69 msgid "Wine version:" msgstr "Wine Version:" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:76 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:74 msgid "Wine architecture:" msgstr "Wine Architektur:" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:81 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:79 msgid "Wine distribution:" msgstr "Wine Distribution:" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:109 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:110 msgid "Delete container" msgstr "Container löschen" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerWineToolsTab.java:39 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerWineToolsTab.java:52 -msgid "Wine tools" -msgstr "Wine Werkzeuge" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:40 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:53 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:36 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:48 msgid "Tools" msgstr "Werkzeuge" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:62 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:57 msgid "Run executable" msgstr "Executable ausführen" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:67 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:62 msgid "Choose executable" msgstr "Executable auswählen" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:43 -msgid "Display" -msgstr "Bildschirm" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:55 -msgid "Display settings" -msgstr "Bildschirmeinstellungen" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:68 -msgid "GLSL support" -msgstr "GLSL Unterstützung" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:77 -msgid "Direct Draw Renderer" -msgstr "Direct Draw Renderer" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:86 -msgid "Video memory size" -msgstr "Videospeichergröße" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:95 -msgid "Offscreen rendering mode" -msgstr "Offscreen rendering mode" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:104 -msgid "Render target lock mode" -msgstr "Render target lock mode" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:113 -msgid "Multisampling" -msgstr "Multisampling" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:122 -msgid "Strict Draw Ordering" -msgstr "Feste Darstellungsreihenfolge" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:131 -msgid "Always Offscreen" -msgstr "Immer offscreen" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:36 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:48 +msgid "Engine tools" +msgstr "Engine Werkzeuge" #: phoenicis-scripts/src/main/java/org/phoenicis/scripts/wizard/UiSetupWizardImplementation.java:151 #, java-format diff --git a/i18n/fr.po b/i18n/fr.po index 1cb6c7a898c..42aa84cd836 100644 --- a/i18n/fr.po +++ b/i18n/fr.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: phoenicis\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-16 10:04+0100\n" -"PO-Revision-Date: 2018-03-16 03:51-0400\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: 2018-05-29 12:22-0400\n" "Last-Translator: plata \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -25,55 +25,23 @@ msgstr "entrée" msgid "Please wait while we are verifying the file ..." msgstr "Veuillez patienter pendant que nous vérifions le fichier ..." -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/DirectDrawRenderer.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RenderTargetModeLock.java:26 -msgid "Default" -msgstr "Défaut" - -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/RenderTargetModeLock.java:26 -msgid "Disabled" -msgstr "Désactivée" - -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/StrictDrawOrdering.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/Multisampling.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/UseGLSL.java:26 -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/AlwaysOffscreen.java:26 -msgid "Enabled" -msgstr "Activée" - -#: phoenicis-containers/src/main/java/org/phoenicis/containers/wine/parameters/MouseWarpOverride.java:27 -msgid "Force" -msgstr "Forcer" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:78 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:75 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:136 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/ErrorMessage.java:71 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:149 msgid "Error" msgstr "Erreur" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:82 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:79 #, java-format msgid "Uninstall {0}" msgstr "Désinstalle {0}" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:83 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:80 #, java-format msgid "Are you sure you want to uninstall {0}?" msgstr "Êtes-vous sûr de vouloir désinstaller {0}?" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:98 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/library/LibraryController.java:96 msgid "Error while running script" msgstr "Une erreur est survenue pendant l'exécution du script" @@ -82,27 +50,27 @@ msgstr "Une erreur est survenue pendant l'exécution du script" msgid "Error while creating shortcut" msgstr "Une erreur est survenue lors de la création du raccourci" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:68 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:72 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:65 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:66 msgid "Loading engines failed." msgstr "Le chargement des moteurs a échoué." -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:71 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:83 #, java-format msgid "Install {0}" msgstr "Installation de {0}" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:72 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:84 #, java-format msgid "Are you sure you want to install {0}?" msgstr "Êtes-vous sûr de vouloir installer {0} ?" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:79 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:97 #, java-format msgid "Delete {0}" msgstr "Suppression de {0}" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:80 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/engines/EnginesController.java:98 #, java-format msgid "Are you sure you want to delete {0}" msgstr "Êtes-vous sûr de vouloir supprimer {0}" @@ -113,21 +81,30 @@ msgid "Connecting to the repository failed.\n" msgstr "La connexion au dépôt a échoué.\n" "Veuillez vérifier votre connexion et réessayer." -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/apps/AppsController.java:94 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/apps/AppsController.java:96 msgid "The script ended unexpectedly" msgstr "Le script s'est terminé de façon inattendue" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:97 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:66 +msgid "Loading engine settings failed." +msgstr "" + +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:71 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:123 +msgid "Loading engine tools failed." +msgstr "" + +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:90 #, java-format msgid "Delete {0} container" msgstr "Suppression du conteneur {0}" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:98 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:91 #, java-format msgid "Are you sure you want to delete the {0} container?" msgstr "Êtes-vous sûr de vouloir supprimer le conteneur {0} ?" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:121 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/controller/containers/ContainersController.java:115 msgid "Loading containers failed." msgstr "Le chargement des conteneurs a échoué." @@ -156,6 +133,10 @@ msgstr "Thème sombre Breeze" msgid "Unity theme" msgstr "Thème Unity" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/common/themes/Themes.java:19 +msgid "Mint-X theme" +msgstr "" + #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/AbstractStepRepresentation.java:104 msgid "Cancel" msgstr "Annuler" @@ -164,7 +145,7 @@ msgstr "Annuler" msgid "Next" msgstr "Suivant" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/JavaFxUiConfiguration.java:63 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/scriptui/JavaFxUiConfiguration.java:62 msgid "Question" msgstr "Question" @@ -200,17 +181,17 @@ msgstr "Fermer" msgid "Uninstall" msgstr "Désinstaller" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:79 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:81 msgid "Library" msgstr "Bibliothèque" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:153 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibraryView.java:154 msgid "My applications" msgstr "Mes applications" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:71 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java:69 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:55 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:52 msgid "Name:" msgstr "Nom :" @@ -236,42 +217,42 @@ msgid "Miniature:" msgstr "Miniature :" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:109 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:132 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:141 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java:112 msgid "Choose" msgstr "Choisissez" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:112 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:119 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/EditShortcutPanel.java:115 msgid "Images" msgstr "Images" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:122 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:131 msgid "Please specify a valid miniature!" msgstr "Veuillez spécifier une miniature valide !" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:125 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:134 msgid "Executable:" msgstr "Executable :" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:144 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:161 msgid "Please specify a valid executable!" msgstr "Veuillez spécifier un exécutable valide !" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:149 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/CreateShortcutPanel.java:166 msgid "Create" msgstr "Créer" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibrarySidebar.java:136 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/installations/InstallationsSidebar.java:112 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:126 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:122 msgid "Categories" msgstr "Catégories" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/library/LibrarySidebar.java:162 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/installations/InstallationsSidebar.java:138 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:172 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:142 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:168 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:143 msgid "All" msgstr "Tous" @@ -327,7 +308,7 @@ msgid "About" msgstr "À propos" #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/AboutPanel.java:72 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:56 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:59 msgid "Version:" msgstr "Version :" @@ -351,7 +332,7 @@ msgstr "Type de dépôt :" msgid "Choose the repository type" msgstr "Choisissez le type de dépôt" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/addrepository/AddRepositoryDialog.java:59 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/settings/addrepository/AddRepositoryDialog.java:42 msgid "Add a new Repository" msgstr "Ajouter un nouveau dépôt" @@ -444,33 +425,33 @@ msgstr "Associations de fichier" msgid "Network" msgstr "Réseau" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:70 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:73 #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationPanel.java:181 msgid "Install" msgstr "Installer" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:76 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:79 msgid "Error while trying to install the engine" msgstr "Une erreur est survenue pendant l'installation du moteur" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:80 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:86 msgid "Delete" msgstr "Supprimer" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:86 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginePanel.java:92 msgid "Error while trying to delete the engine" msgstr "Une erreur est survenue pendant la suppression du moteur" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java:66 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:120 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesView.java:82 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:122 msgid "Engines" msgstr "Moteurs" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:128 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:130 msgid "Installed" msgstr "Installé" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:132 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/engines/EnginesSidebar.java:134 msgid "Not installed" msgstr "Non installé" @@ -482,7 +463,7 @@ msgstr "Console" msgid "Installations" msgstr "Installations" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsView.java:86 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsView.java:83 msgid "Apps" msgstr "Apps" @@ -499,125 +480,77 @@ msgstr "Source : {0}" msgid "Error while trying to download the installer" msgstr "Une erreur est survenue lors du téléchargement de l'installeur" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:133 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:129 msgid "Testing" msgstr "En test" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:136 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:132 msgid "Requires patch" msgstr "Requiert un patch" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:139 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:135 msgid "Commercial" msgstr "Commerciale" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:143 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/apps/ApplicationsSidebar.java:139 msgid "All Operating Systems" msgstr "Tous les OS" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineSettingsTab.java:35 +msgid "Engine Settings" +msgstr "" + #: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersView.java:72 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:116 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainersSidebar.java:117 msgid "Containers" msgstr "Conteneurs" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java:35 -msgid "Input" -msgstr "Entrée" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java:46 -msgid "Input settings" -msgstr "Paramètres d'entrée" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInputTab.java:57 -msgid "Mouse Warp Override" -msgstr "Mouse Warp Override" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:35 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:47 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:33 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:44 msgid "Information" msgstr "Information" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:60 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:57 msgid "Path:" msgstr "Chemin :" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:65 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:62 msgid "Installed shortcuts:" msgstr "Raccourcis installés :" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:71 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:69 msgid "Wine version:" msgstr "Version de wine :" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:76 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:74 msgid "Wine architecture:" msgstr "Architecture de wine :" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:81 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:79 msgid "Wine distribution:" msgstr "Distribution de wine :" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerInformationTab.java:109 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerInformationTab.java:110 msgid "Delete container" msgstr "Supprimer le conteneur" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerWineToolsTab.java:39 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerWineToolsTab.java:52 -msgid "Wine tools" -msgstr "Outils wine" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:40 -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:53 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:36 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:48 msgid "Tools" msgstr "Outils" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:62 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:57 msgid "Run executable" msgstr "Exécuter" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerToolsTab.java:67 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerToolsTab.java:62 msgid "Choose executable" msgstr "Choisir l'exécutable" -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:43 -msgid "Display" -msgstr "Afficher" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:55 -msgid "Display settings" -msgstr "Paramètres d'affichage" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:68 -msgid "GLSL support" -msgstr "Prise en charge du GLSL" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:77 -msgid "Direct Draw Renderer" -msgstr "Rendu Direct Draw" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:86 -msgid "Video memory size" -msgstr "Taille de la mémoire vidéo" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:95 -msgid "Offscreen rendering mode" -msgstr "Mode de rendu offscreen" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:104 -msgid "Render target lock mode" -msgstr "Verrouillage du mode de cible de rendu" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:113 -msgid "Multisampling" -msgstr "Multisampling" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:122 -msgid "Strict Draw Ordering" -msgstr "Ordonnancement Strict Draw" - -#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/WinePrefixContainerDisplayTab.java:131 -msgid "Always Offscreen" -msgstr "Toujours Offscreen" +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:36 +#: phoenicis-javafx/src/main/java/org/phoenicis/javafx/views/mainwindow/containers/ContainerEngineToolsTab.java:48 +msgid "Engine tools" +msgstr "" #: phoenicis-scripts/src/main/java/org/phoenicis/scripts/wizard/UiSetupWizardImplementation.java:151 #, java-format From d0e0e5e6e02212451acc4b6fab5399d759ba03b7 Mon Sep 17 00:00:00 2001 From: Luke Short Date: Thu, 14 Jun 2018 11:47:03 -0400 Subject: [PATCH 63/76] Fix build documentation for Fedora: Oracle Java is required (#1351) --- docs/_docs/Users/build.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/_docs/Users/build.md b/docs/_docs/Users/build.md index df3f3ab54fd..1fd6d627b55 100644 --- a/docs/_docs/Users/build.md +++ b/docs/_docs/Users/build.md @@ -5,7 +5,8 @@ order: 1 toc: true --- -### Ubuntu 16.04 +## Ubuntu 16.04 + * Install the dependencies: ``` sudo apt-get update @@ -29,7 +30,8 @@ cd phoenicis mvn clean package ``` -### Arch Linux +## Arch Linux + * Install the dependencies. Set the JAVA_HOME after installing `jdk8-openjdk`, but before installing `openjfx`. * git * jdk8-openjdk @@ -54,13 +56,15 @@ cd phoenicis mvn clean package ``` -### Fedora >= 26 +## Fedora >= 26 * Install the dependencies: ``` -sudo dnf install git java-1.8.0-openjdk java-1.8.0-openjdk-openjfx maven openjfx +sudo dnf install git maven ``` +* Install Oracle Java using the steps outlined in the [official Fedora wiki](https://fedoraproject.org/wiki/JDK_on_Fedora#Installing_Oracle_JDK_on_Fedora). Be sure to run the "update-alternatives" commands to change the default Java to Oracle's in case OpenJDK is installed. Due to Fedora's restriction on proprietary software, their OpenJFX library is missing components required for Phoenicis to run. + * Clone the repository from GitHub: ``` git clone https://github.com/PhoenicisOrg/phoenicis.git @@ -72,7 +76,7 @@ cd phoenicis mvn clean package ``` -### TrueOS +## TrueOS * Install the dependencies: ``` @@ -92,13 +96,7 @@ application.name = Phoenicis PlayOnBSD Note : As there is not FreeBSD wine at the moment, the linux wine package will be displayed in the engine window. ## Run -``` -cd phoenicis/phoenicis-dist/target -unzip phoenicis-dist.zip -d built -./phoenicis-dist/phoenicis.sh -``` -* On TrueOs, do : ``` cd phoenicis/phoenicis-dist/target unzip phoenicis-dist.zip -d built @@ -106,7 +104,9 @@ bash ./phoenicis-dist/phoenicis.sh ``` ## Troubleshooting -#### Old Java version on Arch Linux + +### Old Java version on Arch Linux + Problem: ``` Exception in thread "main" java.lang.UnsupportedClassVersionError: org/phoenicis/javafx/JavaFXApplication : Unsupported major.minor version 52.0 From 2b3d3a9504f2184d0d219126f9926ac1e04db105 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 14 Jun 2018 23:11:45 +0200 Subject: [PATCH 64/76] Bump spring.version from 5.0.6.RELEASE to 5.0.7.RELEASE (#1350) Bumps `spring.version` from 5.0.6.RELEASE to 5.0.7.RELEASE. Updates `spring-context` from 5.0.6.RELEASE to 5.0.7.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.0.6.RELEASE...v5.0.7.RELEASE) Updates `spring-core` from 5.0.6.RELEASE to 5.0.7.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.0.6.RELEASE...v5.0.7.RELEASE) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 520a0f6b436..7d39a361b9e 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2.3 4.12 2.18.3 - 5.0.6.RELEASE + 5.0.7.RELEASE 2.7.3 From 353155b2654ec16b969a8fc043c026c72a3f2aa4 Mon Sep 17 00:00:00 2001 From: plata Date: Sat, 16 Jun 2018 14:33:51 +0200 Subject: [PATCH 65/76] Travis CI: test with OpenJDK 8 (#1334) --- .travis.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.travis.yml b/.travis.yml index f992375efba..d719b905b5d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,25 @@ jobs: script: mvn -Pcheck-formatted validate formatter:validate # build + test + - stage: Build + test + jdk: openjdk8 + sudo: required + services: + - docker + before_install: + - docker run -d --name ubuntu-16-04 -v $(pwd):/travis openjdk:8 tail -f /dev/null + install: + - docker exec -t ubuntu-16-04 bash -c "apt -qq update; + apt install -y git; + apt install -y maven; + apt install -y openjfx; + apt install -y gettext" + script: + - docker exec -t ubuntu-16-04 bash -c "cd /travis; + git clone https://github.com/PhoenicisOrg/phoenicis.git; + cd phoenicis; + mvn test -B" + # build + test - stage: Build + test os: linux dist: trusty From 9d41a91848e492de262bbf8411e3f3f4dc99a3e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quentin=20P=C3=A2ris?= Date: Fri, 22 Jun 2018 22:27:09 +0200 Subject: [PATCH 66/76] Fixed deb package (#1353) * Fixed deb package --- phoenicis-dist/src/scripts/phoenicis-cli | 2 +- phoenicis-dist/src/scripts/phoenicis-javafx | 2 +- phoenicis-dist/src/scripts/phoenicis.sh | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/phoenicis-dist/src/scripts/phoenicis-cli b/phoenicis-dist/src/scripts/phoenicis-cli index 5fb3f4d8dca..41ca2d5a2a3 100755 --- a/phoenicis-dist/src/scripts/phoenicis-cli +++ b/phoenicis-dist/src/scripts/phoenicis-cli @@ -1,4 +1,4 @@ #!/usr/bin/env bash -CLASSPATH=${CLASSPATH}:/usr/local/lib/phoenicis/* +CLASSPATH=/usr/local/lib/phoenicis/*:${CLASSPATH} java -classpath "$CLASSPATH" org.phoenicis.cli.PhoenicisCLI "$@" diff --git a/phoenicis-dist/src/scripts/phoenicis-javafx b/phoenicis-dist/src/scripts/phoenicis-javafx index f7331bfaf76..48f2a992bb2 100755 --- a/phoenicis-dist/src/scripts/phoenicis-javafx +++ b/phoenicis-dist/src/scripts/phoenicis-javafx @@ -1,4 +1,4 @@ #!/usr/bin/env bash -CLASSPATH=${CLASSPATH}:/usr/local/lib/phoenicis/* +CLASSPATH=/usr/local/lib/phoenicis/*:${CLASSPATH} java -classpath "$CLASSPATH" org.phoenicis.javafx.JavaFXApplication "$@" diff --git a/phoenicis-dist/src/scripts/phoenicis.sh b/phoenicis-dist/src/scripts/phoenicis.sh index 971b6c037d2..19fb8f281dc 100755 --- a/phoenicis-dist/src/scripts/phoenicis.sh +++ b/phoenicis-dist/src/scripts/phoenicis.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash -POL_HOME=$(dirname $0) +POL_HOME="$(dirname "$0")" +cd "$POL_HOME" +POL_HOME="$PWD" CLASSPATH=${CLASSPATH}:$POL_HOME/lib/* java -classpath "$CLASSPATH" org.phoenicis.javafx.JavaFXApplication "$@" From 2ee4666d4625b188c590be9f0b600bbea9f5597e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 26 Jun 2018 11:49:53 +0200 Subject: [PATCH 67/76] Bump org.eclipse.jgit from 4.11.0.201803080745-r to 5.0.1.201806211838-r (#1359) Bumps org.eclipse.jgit from 4.11.0.201803080745-r to 5.0.1.201806211838-r. Signed-off-by: dependabot[bot] --- phoenicis-repository/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-repository/pom.xml b/phoenicis-repository/pom.xml index 0f680ed2b2b..a20261fb2d5 100644 --- a/phoenicis-repository/pom.xml +++ b/phoenicis-repository/pom.xml @@ -88,7 +88,7 @@ org.eclipse.jgit org.eclipse.jgit - 4.11.0.201803080745-r + 5.0.1.201806211838-r From 73d224fc4cf08298bb6e4377933f64644efe23f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 26 Jun 2018 11:51:04 +0200 Subject: [PATCH 68/76] Bump mockserver-netty from 5.3.0 to 5.4.1 (#1356) Bumps mockserver-netty from 5.3.0 to 5.4.1. Signed-off-by: dependabot[bot] --- phoenicis-tools/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-tools/pom.xml b/phoenicis-tools/pom.xml index 1151c521759..5fe3750134c 100644 --- a/phoenicis-tools/pom.xml +++ b/phoenicis-tools/pom.xml @@ -100,7 +100,7 @@ org.mock-server mockserver-netty - 5.3.0 + 5.4.1 test From 74ba994a5b79c078e8cd82888579adcb1185fec9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 26 Jun 2018 11:51:27 +0200 Subject: [PATCH 69/76] Bump maven-surefire-plugin from 2.21.0 to 2.22.0 (#1355) Bumps maven-surefire-plugin from 2.21.0 to 2.22.0. Signed-off-by: dependabot[bot] --- phoenicis-javafx/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phoenicis-javafx/pom.xml b/phoenicis-javafx/pom.xml index 83b0dd303ff..556c8268a31 100644 --- a/phoenicis-javafx/pom.xml +++ b/phoenicis-javafx/pom.xml @@ -113,7 +113,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.21.0 + 2.22.0 -Djava.awt.headless=true -Dtestfx.robot=glass -Dtestfx.headless=true -Dprism.order=sw -Dprism.text=t2k From fe6bfc9f062ec9bffdc04adcfc2994f4004174ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 26 Jun 2018 11:51:46 +0200 Subject: [PATCH 70/76] Bump mockito-core from 2.18.3 to 2.19.0 (#1354) Bumps [mockito-core](https://github.com/mockito/mockito) from 2.18.3 to 2.19.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.18.3...v2.19.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7d39a361b9e..5860fa7c263 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 1.7.25 1.2.3 4.12 - 2.18.3 + 2.19.0 5.0.7.RELEASE 2.7.3 From 60d6647e91cf14e59388b178381de615d0930bd6 Mon Sep 17 00:00:00 2001 From: plata Date: Tue, 26 Jun 2018 18:22:26 +0200 Subject: [PATCH 71/76] Travis: test .deb (#1326) --- .travis.yml | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index d719b905b5d..f5b242faa3f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,30 @@ language: java -sudo: false +sudo: true # must have same "sudo" state in stages for caching # avoid double builds on pull requests branches: only: master +# caches for build artifacts +cache: + directories: + - $HOME/travis_cache + jobs: include: + # build cache + - stage: Build cache + os: linux + dist: trusty + jdk: openjdk8 + sudo: required + install: true + script: + - mv $HOME/travis_cache $HOME/travis_cache_old + - mkdir $HOME/travis_cache + - echo "$TRAVIS_BUILD_ID" > $HOME/travis_cache/travis_build_id + # Check format - stage: Check format # do not use default install (runs formatter) @@ -16,12 +33,14 @@ jobs: # build + test - stage: Build + test + os: linux + dist: trusty jdk: openjdk8 sudo: required services: - docker before_install: - - docker run -d --name ubuntu-16-04 -v $(pwd):/travis openjdk:8 tail -f /dev/null + - docker run -d --name ubuntu-16-04 -v $HOME:/travis openjdk:8 tail -f /dev/null install: - docker exec -t ubuntu-16-04 bash -c "apt -qq update; apt install -y git; @@ -32,7 +51,9 @@ jobs: - docker exec -t ubuntu-16-04 bash -c "cd /travis; git clone https://github.com/PhoenicisOrg/phoenicis.git; cd phoenicis; - mvn test -B" + mvn -B clean package" + before_cache: + - docker exec -t ubuntu-16-04 bash -c "cp /travis/phoenicis/phoenicis-dist/target/*.deb /travis/travis_cache/" # build + test - stage: Build + test os: linux @@ -52,6 +73,27 @@ jobs: os: osx osx_image: xcode9.2 + # Install packages + # .deb + - stage: Install packages + os: linux + dist: trusty + jdk: openjdk8 + sudo: required + services: + - docker + before_install: + - docker run -d --name ubuntu-16-04 -v $HOME:/travis ubuntu:16.04 tail -f /dev/null + install: + - docker exec -t ubuntu-16-04 bash -c "dpkg --add-architecture i386 && apt -qq update" + script: + # check that cache has been filled in current build + - if test "$TRAVIS_BUILD_ID" != `cat $HOME/travis_cache/travis_build_id`; then travis_terminate 1; fi + - rm -f $HOME/travis_cache/travis_build_id + - docker exec -t ubuntu-16-04 bash -c "apt install -y /travis/travis_cache/*.deb" + - mv $HOME/travis_cache $HOME/travis_cache_old + - mkdir $HOME/travis_cache # clear the cache + # Check GitHub Pages - stage: Check GitHub Pages env: NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer From 274523707cba5e847f482de69b0c2aafc973005c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 17 Jul 2018 13:10:09 +0200 Subject: [PATCH 72/76] Bump mockito-core from 2.19.0 to 2.19.1 (#1362) Bumps [mockito-core](https://github.com/mockito/mockito) from 2.19.0 to 2.19.1. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.19.0...v2.19.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5860fa7c263..30cd0080463 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 1.7.25 1.2.3 4.12 - 2.19.0 + 2.19.1 5.0.7.RELEASE 2.7.3 From 0284d1ffc5f481e835353fe7194d42a26c9c1143 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 17 Jul 2018 13:10:30 +0200 Subject: [PATCH 73/76] Bump formatter-maven-plugin from 2.7.3 to 2.7.4 (#1360) Bumps [formatter-maven-plugin](https://github.com/revelc/formatter-maven-plugin) from 2.7.3 to 2.7.4. - [Release notes](https://github.com/revelc/formatter-maven-plugin/releases) - [Changelog](https://github.com/revelc/formatter-maven-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/revelc/formatter-maven-plugin/compare/formatter-maven-plugin-2.7.3...formatter-maven-plugin-2.7.4) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 30cd0080463..f5065972485 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 4.12 2.19.1 5.0.7.RELEASE - 2.7.3 + 2.7.4 From d2045f82003947ea65729dfe5c76cf2dcb362b6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 27 Jul 2018 23:07:55 +0200 Subject: [PATCH 74/76] Bump mockito-core from 2.19.1 to 2.20.1 (#1366) Bumps [mockito-core](https://github.com/mockito/mockito) from 2.19.1 to 2.20.1. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.19.1...v2.20.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f5065972485..917e7e84e37 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 1.7.25 1.2.3 4.12 - 2.19.1 + 2.20.1 5.0.7.RELEASE 2.7.4 From 2f5be2076409f9c29f9306c879248614518b3bfa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Sat, 28 Jul 2018 11:16:58 +0200 Subject: [PATCH 75/76] Bump spring.version from 5.0.7.RELEASE to 5.0.8.RELEASE (#1365) Bumps `spring.version` from 5.0.7.RELEASE to 5.0.8.RELEASE. Updates `spring-context` from 5.0.7.RELEASE to 5.0.8.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.0.7.RELEASE...v5.0.8.RELEASE) Updates `spring-core` from 5.0.7.RELEASE to 5.0.8.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.0.7.RELEASE...v5.0.8.RELEASE) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 917e7e84e37..eba0f1b1af0 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 1.2.3 4.12 2.20.1 - 5.0.7.RELEASE + 5.0.8.RELEASE 2.7.4 From bc937cb870351004ea61991d0d11ca9cae93bb06 Mon Sep 17 00:00:00 2001 From: RattyDAVE Date: Sun, 29 Jul 2018 10:11:21 +0100 Subject: [PATCH 76/76] Add build description for Ubuntu 18.04 and Linux Mint 19 (#1367) --- docs/_docs/Users/build.md | 55 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/docs/_docs/Users/build.md b/docs/_docs/Users/build.md index 1fd6d627b55..6f34705a28f 100644 --- a/docs/_docs/Users/build.md +++ b/docs/_docs/Users/build.md @@ -5,6 +5,47 @@ order: 1 toc: true --- +## Ubuntu 18.04 and Linux Mint 19 + +* Add the Wine repository: +``` +sudo apt-add-repository https://dl.winehq.org/wine-builds/ubuntu/ +wget -nc https://dl.winehq.org/wine-builds/Release.key && sudo apt-key add Release.key +``` + +* Remove exising version of Wine: +``` +sudo apt-get purge wine* libwine +``` + +* Install Wine devel packages to fix empty dialog boxes: +``` +sudo apt-get update +sudo apt-get install --install-recommends winehq-devel +``` + +* Install the dependencies: +``` +sudo apt-get update +sudo apt-get install git maven openjdk-8-jdk openjfx libxext6:i386 +``` + +* Set the Java version (use Java 8 instead of Java 10): + * OpenJDK + * `export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"` + * `sudo update-java-alternatives --set /usr/lib/jvm/java-1.8.0-openjdk-amd64` + +* Clone the repository from GitHub: +``` +git clone https://github.com/PhoenicisOrg/phoenicis.git +``` + +* Build Phoenicis: +``` +cd phoenicis +mvn clean package +``` + ## Ubuntu 16.04 * Install the dependencies: @@ -105,6 +146,20 @@ bash ./phoenicis-dist/phoenicis.sh ## Troubleshooting +### Maven dependencies cannot be downloaded + +* Save an empty JKS file with the default 'changeit' password for Java cacerts. +``` +sudo /usr/bin/printf '\xfe\xed\xfe\xed\x00\x00\x00\x02\x00\x00\x00\x00\xe2\x68\x6e\x45\xfb\x43\xdf\xa4\xd9\x92\xdd\x41\xce\xb6\xb2\x1c\x63\x30\xd7\x92' > /etc/ssl/certs/java/cacerts +``` + +* Re-add all the CA certs into the previously empty file. +``` +sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure +``` + +If this doesn't help, you can try to delete the `.m2` directory in your home directory. This will force Maven to re-download all dependencies. + ### Old Java version on Arch Linux Problem: