server

Clone or download

refactored about tab

Modified Files

package com.stream_pi.server.window;
package com.stream_pi.server.window;
import com.stream_pi.server.connection.ServerListener;
import com.stream_pi.server.connection.ServerListener;
import com.stream_pi.server.io.Config;
import com.stream_pi.server.io.Config;
import com.stream_pi.server.info.ServerInfo;
import com.stream_pi.server.info.ServerInfo;
import com.stream_pi.server.Main;
import com.stream_pi.server.Main;
import com.stream_pi.server.window.dashboard.DashboardBase;
import com.stream_pi.server.window.dashboard.DashboardBase;
import com.stream_pi.server.window.settings.SettingsBase;
import com.stream_pi.server.window.settings.SettingsBase;
import com.stream_pi.theme_api.Theme;
import com.stream_pi.theme_api.Theme;
import com.stream_pi.theme_api.Themes;
import com.stream_pi.theme_api.Themes;
import com.stream_pi.util.alert.StreamPiAlert;
import com.stream_pi.util.alert.StreamPiAlert;
import com.stream_pi.util.exception.MinorException;
import com.stream_pi.util.exception.MinorException;
import com.stream_pi.util.exception.SevereException;
import com.stream_pi.util.exception.SevereException;
import com.stream_pi.util.iohelper.IOHelper;
import com.stream_pi.util.iohelper.IOHelper;
import com.stream_pi.util.loggerhelper.StreamPiLogFallbackHandler;
import com.stream_pi.util.loggerhelper.StreamPiLogFallbackHandler;
import com.stream_pi.util.loggerhelper.StreamPiLogFileHandler;
import com.stream_pi.util.loggerhelper.StreamPiLogFileHandler;
import com.stream_pi.util.platform.Platform;
import com.stream_pi.util.platform.Platform;
import javafx.application.HostServices;
import javafx.application.HostServices;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.image.Image;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Font;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.stage.Stage;
import java.awt.*;
import java.awt.*;
import java.io.File;
import java.io.File;
import java.util.logging.Logger;
import java.util.logging.Logger;
public abstract class Base extends StackPane implements ExceptionAndAlertHandler, ServerListener {
public abstract class Base extends StackPane implements ExceptionAndAlertHandler, ServerListener {
private Config config;
private Config config;
private ServerInfo serverInfo;
private ServerInfo serverInfo;
private Stage stage;
private Stage stage;
private HostServices hostServices;
private HostServices hostServices;
private SettingsBase settingsBase;
private SettingsBase settingsBase;
private DashboardBase dashboardBase;
private DashboardBase dashboardBase;
private StackPane alertStackPane;
private StackPane alertStackPane;
private StreamPiLogFileHandler logFileHandler = null;
private StreamPiLogFileHandler logFileHandler = null;
private StreamPiLogFallbackHandler logFallbackHandler = null;
private StreamPiLogFallbackHandler logFallbackHandler = null;
private Logger logger = null;
private Logger logger = null;
public Logger getLogger(){
public Logger getLogger(){
return logger;
return logger;
}
}
public void setHostServices(HostServices hostServices)
public void setHostServices(HostServices hostServices)
{
{
this.hostServices = hostServices;
this.hostServices = hostServices;
}
}
public HostServices getHostServices()
public HostServices getHostServices()
{
{
return hostServices;
return hostServices;
}
}
@Override
@Override
public void initLogger()
public void initLogger()
{
{
try
try
{
{
if(logFileHandler != null)
if(logFileHandler != null)
return;
return;
closeLogger();
closeLogger();
logger = Logger.getLogger("");
logger = Logger.getLogger("");
if(new File(ServerInfo.getInstance().getPrePath()).getAbsoluteFile().getParentFile().canWrite())
if(new File(ServerInfo.getInstance().getPrePath()).getAbsoluteFile().getParentFile().canWrite())
{
{
String path = ServerInfo.getInstance().getPrePath()+"../stream-pi-server.log";
String path = ServerInfo.getInstance().getPrePath()+"../stream-pi-server.log";
if(ServerInfo.getInstance().getPlatform() == Platform.ANDROID)
if(ServerInfo.getInstance().getPlatform() == Platform.ANDROID)
path = ServerInfo.getInstance().getPrePath()+"stream-pi-server.log";
path = ServerInfo.getInstance().getPrePath()+"stream-pi-server.log";
logFileHandler = new StreamPiLogFileHandler(path);
logFileHandler = new StreamPiLogFileHandler(path);
logger.addHandler(logFileHandler);
logger.addHandler(logFileHandler);
}
}
else
else
{
{
logFallbackHandler = new StreamPiLogFallbackHandler();
logFallbackHandler = new StreamPiLogFallbackHandler();
logger.addHandler(logFallbackHandler);
logger.addHandler(logFallbackHandler);
}
}
}
}
catch(Exception e)
catch(Exception e)
{
{
e.printStackTrace();
e.printStackTrace();
logFallbackHandler = new StreamPiLogFallbackHandler();
logFallbackHandler = new StreamPiLogFallbackHandler();
logger.addHandler(logFallbackHandler);
logger.addHandler(logFallbackHandler);
}
}
}
}
public void closeLogger()
public void closeLogger()
{
{
if(logFileHandler != null)
if(logFileHandler != null)
logFileHandler.close();
logFileHandler.close();
else if(logFallbackHandler != null)
else if(logFallbackHandler != null)
logFallbackHandler.close();
logFallbackHandler.close();
}
}
public void initBase() throws SevereException
public void initBase() throws SevereException
{
{
stage = (Stage) getScene().getWindow();
stage = (Stage) getScene().getWindow();
getStage().getIcons().add(new Image(Main.class.getResourceAsStream("app_icon.png")));
getStage().getIcons().add(new Image(Main.class.getResourceAsStream("app_icon.png")));
getStage().setMinWidth(500);
getStage().setMinWidth(710);
getStage().setMinHeight(500);
getStage().setMinHeight(530);
serverInfo = ServerInfo.getInstance();
serverInfo = ServerInfo.getInstance();
settingsBase = new SettingsBase(getHostServices(), this, this);
settingsBase = new SettingsBase(getHostServices(), this, this);
settingsBase.prefWidthProperty().bind(widthProperty());
settingsBase.prefWidthProperty().bind(widthProperty());
settingsBase.prefHeightProperty().bind(heightProperty());
settingsBase.prefHeightProperty().bind(heightProperty());
dashboardBase = new DashboardBase(this, getHostServices());
dashboardBase = new DashboardBase(this, getHostServices());
dashboardBase.prefWidthProperty().bind(widthProperty());
dashboardBase.prefWidthProperty().bind(widthProperty());
dashboardBase.prefHeightProperty().bind(heightProperty());
dashboardBase.prefHeightProperty().bind(heightProperty());
alertStackPane = new StackPane();
alertStackPane = new StackPane();
alertStackPane.setVisible(false);
alertStackPane.setVisible(false);
StreamPiAlert.setParent(alertStackPane);
StreamPiAlert.setParent(alertStackPane);
getChildren().clear();
getChildren().clear();
getChildren().addAll(alertStackPane);
getChildren().addAll(alertStackPane);
initLogger();
initLogger();
checkPrePathDirectory();
checkPrePathDirectory();
getChildren().addAll(settingsBase, dashboardBase);
getChildren().addAll(settingsBase, dashboardBase);
config = Config.getInstance();
config = Config.getInstance();
initThemes();
initThemes();
stage.setWidth(config.getStartupWindowWidth());
stage.setWidth(config.getStartupWindowWidth());
stage.setHeight(config.getStartupWindowHeight());
stage.setHeight(config.getStartupWindowHeight());
stage.centerOnScreen();
stage.centerOnScreen();
dashboardBase.toFront();
dashboardBase.toFront();
}
}
private void checkPrePathDirectory() throws SevereException
private void checkPrePathDirectory() throws SevereException
{
{
try
try
{
{
File filex = new File(ServerInfo.getInstance().getPrePath());
File filex = new File(ServerInfo.getInstance().getPrePath());
if(!filex.exists())
if(!filex.exists())
{
{
boolean result = filex.mkdirs();
boolean result = filex.mkdirs();
if(result)
if(result)
{
{
IOHelper.unzip(Main.class.getResourceAsStream("Default.zip"), ServerInfo.getInstance().getPrePath());
IOHelper.unzip(Main.class.getResourceAsStream("Default.zip"), ServerInfo.getInstance().getPrePath());
Config.getInstance().setThemesPath(ServerInfo.getInstance().getPrePath()+"Themes/");
Config.getInstance().setThemesPath(ServerInfo.getInstance().getPrePath()+"Themes/");
Config.getInstance().setPluginsPath(ServerInfo.getInstance().getPrePath()+"Plugins/");
Config.getInstance().setPluginsPath(ServerInfo.getInstance().getPrePath()+"Plugins/");
if(SystemTray.isSupported())
if(SystemTray.isSupported())
{
{
Config.getInstance().setMinimiseToSystemTrayOnClose(true);
Config.getInstance().setMinimiseToSystemTrayOnClose(true);
}
}
Config.getInstance().save();
Config.getInstance().save();
initLogger();
initLogger();
}
}
else
else
{
{
setPrefSize(300,300);
setPrefSize(300,300);
clearStylesheets();
clearStylesheets();
applyDefaultStylesheet();
applyDefaultStylesheet();
applyDefaultIconsStylesheet();
applyDefaultIconsStylesheet();
getStage().show();
getStage().show();
throw new SevereException("No storage permission. Give it!");
throw new SevereException("No storage permission. Give it!");
}
}
}
}
}
}
catch (Exception e)
catch (Exception e)
{
{
e.printStackTrace();
e.printStackTrace();
throw new SevereException(e.getMessage());
throw new SevereException(e.getMessage());
}
}
}
}
public void initThemes() throws SevereException {
public void initThemes() throws SevereException {
clearStylesheets();
clearStylesheets();
registerThemes();
registerThemes();
applyDefaultStylesheet();
applyDefaultStylesheet();
applyDefaultTheme();
applyDefaultTheme();
applyDefaultIconsStylesheet();
applyDefaultIconsStylesheet();
}
}
@Override
@Override
public Stage getStage()
public Stage getStage()
{
{
return stage;
return stage;
}
}
public void applyDefaultStylesheet()
public void applyDefaultStylesheet()
{
{
logger.info("Applying default stylesheet ...");
logger.info("Applying default stylesheet ...");
Font.loadFont(Main.class.getResourceAsStream("Roboto.ttf"), 13);
Font.loadFont(Main.class.getResourceAsStream("Roboto.ttf"), 13);
getStylesheets().add(Main.class.getResource("style.css").toExternalForm());
getStylesheets().add(Main.class.getResource("style.css").toExternalForm());
logger.info("... Done!");
logger.info("... Done!");
}
}
public void applyDefaultIconsStylesheet()
public void applyDefaultIconsStylesheet()
{
{
Font.loadFont(Main.class.getResourceAsStream("Roboto.ttf"), 13);
Font.loadFont(Main.class.getResourceAsStream("Roboto.ttf"), 13);
getStylesheets().add(Main.class.getResource("default_icons.css").toExternalForm());
getStylesheets().add(Main.class.getResource("default_icons.css").toExternalForm());
}
}
public DashboardBase getDashboardBase()
public DashboardBase getDashboardBase()
{
{
return dashboardBase;
return dashboardBase;
}
}
public SettingsBase getSettingsBase()
public SettingsBase getSettingsBase()
{
{
return settingsBase;
return settingsBase;
}
}
public Config getConfig()
public Config getConfig()
{
{
return config;
return config;
}
}
public ServerInfo getServerInfo()
public ServerInfo getServerInfo()
{
{
return serverInfo;
return serverInfo;
}
}
private Theme currentTheme;
private Theme currentTheme;
public Theme getCurrentTheme()
public Theme getCurrentTheme()
{
{
return currentTheme;
return currentTheme;
}
}
public void applyTheme(Theme t)
public void applyTheme(Theme t)
{
{
logger.info("Applying theme '"+t.getFullName()+"' ...");
logger.info("Applying theme '"+t.getFullName()+"' ...");
if(t.getFonts() != null)
if(t.getFonts() != null)
{
{
for(String fontFile : t.getFonts())
for(String fontFile : t.getFonts())
{
{
Font.loadFont(fontFile.replace("%20",""), 13);
Font.loadFont(fontFile.replace("%20",""), 13);
}
}
}
}
currentTheme = t;
currentTheme = t;
getStylesheets().addAll(t.getStylesheets());
getStylesheets().addAll(t.getStylesheets());
logger.info("... Theme applied successfully!");
logger.info("... Theme applied successfully!");
}
}
public void clearStylesheets()
public void clearStylesheets()
{
{
getStylesheets().clear();
getStylesheets().clear();
}
}
Themes themes;
Themes themes;
public void registerThemes() throws SevereException
public void registerThemes() throws SevereException
{
{
logger.info("Loading themes ...");
logger.info("Loading themes ...");
themes = new Themes(getConfig().getThemesPath(), getConfig().getCurrentThemeFullName(), serverInfo.getMinThemeSupportVersion());
themes = new Themes(getConfig().getThemesPath(), getConfig().getCurrentThemeFullName(), serverInfo.getMinThemeSupportVersion());
if(!themes.getErrors().isEmpty())
if(!themes.getErrors().isEmpty())
{
{
StringBuilder themeErrors = new StringBuilder();
StringBuilder themeErrors = new StringBuilder();
for(MinorException eachException : themes.getErrors())
for(MinorException eachException : themes.getErrors())
{
{
themeErrors.append("\n * ").append(eachException.getShortMessage());
themeErrors.append("\n * ").append(eachException.getShortMessage());
}
}
if(themes.getIsBadThemeTheCurrentOne())
if(themes.getIsBadThemeTheCurrentOne())
{
{
themeErrors.append("\n\nReverted to default theme! (").append(getConfig().getDefaultCurrentThemeFullName()).append(")");
themeErrors.append("\n\nReverted to default theme! (").append(getConfig().getDefaultCurrentThemeFullName()).append(")");
getConfig().setCurrentThemeFullName(getConfig().getDefaultCurrentThemeFullName());
getConfig().setCurrentThemeFullName(getConfig().getDefaultCurrentThemeFullName());
getConfig().save();
getConfig().save();
}
}
handleMinorException(new MinorException("Theme Loading issues", themeErrors.toString()));
handleMinorException(new MinorException("Theme Loading issues", themeErrors.toString()));
}
}
logger.info("...Themes loaded successfully !");
logger.info("...Themes loaded successfully !");
}
}
public Themes getThemes()
public Themes getThemes()
{
{
return themes;
return themes;
}
}
public void applyDefaultTheme()
public void applyDefaultTheme()
{
{
logger.info("Applying default theme ...");
logger.info("Applying default theme ...");
boolean foundTheme = false;
boolean foundTheme = false;
for(Theme t: themes.getThemeList())
for(Theme t: themes.getThemeList())
{
{
if(t.getFullName().equals(config.getCurrentThemeFullName()))
if(t.getFullName().equals(config.getCurrentThemeFullName()))
{
{
foundTheme = true;
foundTheme = true;
applyTheme(t);
applyTheme(t);
break;
break;
}
}
}
}
if(!foundTheme)
if(!foundTheme)
{
{
logger.info("Theme not found. reverting to light theme ...");
logger.info("Theme not found. reverting to light theme ...");
try {
try {
Config.getInstance().setCurrentThemeFullName("com.streampi.DefaultLight");
Config.getInstance().setCurrentThemeFullName("com.streampi.DefaultLight");
Config.getInstance().save();
Config.getInstance().save();
applyDefaultTheme();
applyDefaultTheme();
}
}
catch (SevereException e)
catch (SevereException e)
{
{
handleSevereException(e);
handleSevereException(e);
}
}
}
}
}
}
}
}
package com.stream_pi.server.window.settings;
import com.stream_pi.action_api.ActionAPI;
import com.stream_pi.server.info.License;
import com.stream_pi.server.info.ServerInfo;
import com.stream_pi.server.Main;
import javafx.application.HostServices;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Hyperlink;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
public class About extends VBox{
private HostServices hostServices;
public About(HostServices hostServices)
{
getStyleClass().add("about");
this.hostServices = hostServices;
setAlignment(Pos.TOP_CENTER);
Image appIcon = new Image(Main.class.getResourceAsStream("app_icon.png"));
ImageView appIconImageView = new ImageView(appIcon);
appIconImageView.setFitHeight(196);
appIconImageView.setFitWidth(182);
Label licenseLabel = new Label("License");
licenseLabel.getStyleClass().add("about_license_label");
VBox.setMargin(licenseLabel, new Insets(20, 0 , 10 ,0));
TextArea licenseTextArea = new TextArea(License.getLicense());
licenseTextArea.getStyleClass().add("about_license_text_area");
licenseTextArea.setWrapText(false);
licenseTextArea.setEditable(false);
licenseTextArea.setMaxWidth(600);
VBox.setVgrow(licenseTextArea, Priority.ALWAYS);
HBox links = new HBox();
links.getStyleClass().add("about_links_box");
Hyperlink github = new Hyperlink("GitHub");
github.setOnAction(event -> openWebpage("https://github.com/Stream-Pi"));
Hyperlink discord = new Hyperlink("Discord");
discord.setOnAction(event -> openWebpage("https://discord.gg/BExqGmk"));
Hyperlink website = new Hyperlink("Website");
website.setOnAction(event -> openWebpage("https://stream-pi.com"));
Hyperlink twitter = new Hyperlink("Twitter");
twitter.setOnAction(event -> openWebpage("https://twitter.com/Stream_Pi"));
Hyperlink matrix = new Hyperlink("Matrix");
matrix.setOnAction(event -> openWebpage("https://matrix.to/#/#stream-pi_general:matrix.org"));
links.setAlignment(Pos.CENTER);
links.getChildren().addAll(github, matrix, discord, website, twitter);
Hyperlink donateButton = new Hyperlink("DONATE");
donateButton.setOnAction(event -> openWebpage("https://www.patreon.com/streampi"));
donateButton.getStyleClass().add("about_donate_hyperlink");
ServerInfo serverInfo = ServerInfo.getInstance();
Label versionText = new Label(serverInfo.getVersion().getText() + " - "+ serverInfo.getPlatform().getUIName() + " - "+ serverInfo.getReleaseStatus().getUIName());
versionText.getStyleClass().add("about_version_label");
Label commStandardLabel = new Label("Comm Standard "+serverInfo.getCommStandardVersion().getText());
commStandardLabel.getStyleClass().add("about_comm_standard_label");
Label minThemeAPILabel = new Label("Min ThemeAPI "+serverInfo.getMinThemeSupportVersion().getText());
minThemeAPILabel.getStyleClass().add("about_min_theme_api_label");
Label minActionAPILabel = new Label("Min ActionAPI "+serverInfo.getMinPluginSupportVersion().getText());
minActionAPILabel.getStyleClass().add("about_min_action_api_label");
Label currentActionAPILabel = new Label("ActionAPI "+ ActionAPI.API_VERSION.getText());
currentActionAPILabel.getStyleClass().add("about_current_action_api_label");
getChildren().addAll(appIconImageView, licenseLabel, licenseTextArea, links, donateButton, versionText, commStandardLabel, minThemeAPILabel, minActionAPILabel, currentActionAPILabel);
}
public void openWebpage(String url) {
hostServices.showDocument(url);
}
}
package com.stream_pi.server.window.settings.About;
import com.stream_pi.action_api.ActionAPI;
import com.stream_pi.server.info.ServerInfo;
import com.stream_pi.server.Main;
import javafx.application.HostServices;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
public class About extends VBox
{
private HostServices hostServices;
public About(HostServices hostServices)
{
getStyleClass().add("about");
this.hostServices = hostServices;
setAlignment(Pos.TOP_CENTER);
Image appIcon = new Image(Main.class.getResourceAsStream("app_icon.png"));
ImageView appIconImageView = new ImageView(appIcon);
appIconImageView.setFitHeight(196);
appIconImageView.setFitWidth(182);
TabPane tabPane = new TabPane();
tabPane.getStyleClass().add("settings_about_tab_internal");
tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
tabPane.setMaxWidth(600);
VBox.setVgrow(tabPane, Priority.ALWAYS);
Tab licenseTab = new Tab("License");
licenseTab.setContent(new LicenseTab());
Tab contributorsTab = new Tab("Contributors");
contributorsTab.setContent(new ContributorsTab());
Tab contactTab = new Tab("Contact");
contactTab.setContent(new ContactTab(hostServices));
tabPane.getTabs().addAll(licenseTab, contributorsTab, contactTab);
Hyperlink donateButton = new Hyperlink("DONATE");
donateButton.setOnAction(event -> openWebpage("https://www.patreon.com/streampi"));
donateButton.getStyleClass().add("about_donate_hyperlink");
ServerInfo serverInfo = ServerInfo.getInstance();
Label versionText = new Label(serverInfo.getVersion().getText() + " - "+ serverInfo.getPlatform().getUIName() + " - "+ serverInfo.getReleaseStatus().getUIName());
versionText.getStyleClass().add("about_version_label");
Label commStandardLabel = new Label("Comm Standard "+serverInfo.getCommStandardVersion().getText());
commStandardLabel.getStyleClass().add("about_comm_standard_label");
Label minThemeAPILabel = new Label("Min ThemeAPI "+serverInfo.getMinThemeSupportVersion().getText());
minThemeAPILabel.getStyleClass().add("about_min_theme_api_label");
Label minActionAPILabel = new Label("Min ActionAPI "+serverInfo.getMinPluginSupportVersion().getText());
minActionAPILabel.getStyleClass().add("about_min_action_api_label");
Label currentActionAPILabel = new Label("ActionAPI "+ ActionAPI.API_VERSION.getText());
currentActionAPILabel.getStyleClass().add("about_current_action_api_label");
HBox hBox = new HBox(versionText, getSep(),
commStandardLabel, getSep(),
minThemeAPILabel, getSep(),
minActionAPILabel, getSep(),
currentActionAPILabel);
hBox.setAlignment(Pos.CENTER);
hBox.setSpacing(10);
getChildren().addAll(appIconImageView, tabPane, donateButton, hBox);
}
public void openWebpage(String url)
{
hostServices.showDocument(url);
}
private Label getSep()
{
Label label = new Label("|");
label.getStyleClass().add("separator_ui_label");
return label;
}
}
package com.stream_pi.server.window.settings.About;
import javafx.application.HostServices;
import javafx.geometry.Insets;
import javafx.scene.control.Hyperlink;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.VBox;
public class ContactTab extends ScrollPane
{
private final HostServices hostServices;
public ContactTab(HostServices hostServices)
{
this.hostServices = hostServices;
getStyleClass().add("about_contact_tab_scroll_pane");
Hyperlink github = new Hyperlink("GitHub");
github.setOnAction(event -> openWebpage("https://github.com/Stream-Pi"));
Hyperlink discord = new Hyperlink("Discord");
discord.setOnAction(event -> openWebpage("https://discord.gg/BExqGmk"));
Hyperlink website = new Hyperlink("Website");
website.setOnAction(event -> openWebpage("https://stream-pi.com"));
Hyperlink twitter = new Hyperlink("Twitter");
twitter.setOnAction(event -> openWebpage("https://twitter.com/Stream_Pi"));
Hyperlink matrix = new Hyperlink("Matrix");
matrix.setOnAction(event -> openWebpage("https://matrix.to/#/#stream-pi_general:matrix.org"));
VBox vBox = new VBox(github, discord, website, twitter, matrix);
vBox.setSpacing(10.0);
setContent(vBox);
}
public void openWebpage(String url)
{
hostServices.showDocument(url);
}
}
package com.stream_pi.server.window.settings.About;
public class Contributor
{
private String name = null;
private String email = null;
private String description = null;
private String location = null;
public Contributor(String name, String email, String description, String location)
{
this.name = name;
this.email = email;
this.description = description;
this.location = location;
}
public void setName(String name) {
this.name = name;
}
public void setEmail(String email) {
this.email = email;
}
public void setDescription(String description) {
this.description = description;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public String getDescription() {
return description;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
package com.stream_pi.server.window.settings.About;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
public class ContributorsTab extends VBox
{
public ContributorsTab()
{
getStyleClass().add("about_license_contributors_vbox");
TableView<Contributor> tableView = new TableView<>();
tableView.getStyleClass().add("about_license_contributors_table_view");
TableColumn<Contributor, String> descriptionColumn = new TableColumn<>("Description");
descriptionColumn.setReorderable(false);
descriptionColumn.setPrefWidth(170);
descriptionColumn.setResizable(false);
descriptionColumn.setCellValueFactory(new PropertyValueFactory<>("description"));
TableColumn<Contributor, String> nameColumn = new TableColumn<>("Name (GitHub)");
nameColumn.setReorderable(false);
nameColumn.setPrefWidth(220);
nameColumn.setResizable(false);
nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
TableColumn<Contributor, String> emailColumn = new TableColumn<>("Email");
emailColumn.setReorderable(false);
emailColumn.setPrefWidth(200);
emailColumn.setResizable(false);
emailColumn.setCellValueFactory(new PropertyValueFactory<>("email"));
TableColumn<Contributor, String> locationColumn = new TableColumn<>("Location");
locationColumn.setReorderable(false);
locationColumn.setPrefWidth(100);
locationColumn.setResizable(false);
locationColumn.setCellValueFactory(new PropertyValueFactory<>("location"));
tableView.getColumns().addAll(descriptionColumn, nameColumn, emailColumn, locationColumn);
tableView.setPrefWidth(descriptionColumn.getPrefWidth() + nameColumn.getPrefWidth() + emailColumn.getPrefWidth());
tableView.getItems().addAll(
new Contributor("Debayan Sutradhar (rnayabed)",
"debayansutradhar3@gmail.com",
"Original Author, Maintainer",
"India"),
new Contributor("Abhinay Agarwal (abhinayagarwal)",
"",
"Refactoring, Minor Fixes",
"India"),
new Contributor("Jordan Duabe (j4ckofalltrades)",
"jordan.duabe@gmail.com",
"Minor Fix (#0dafac9)",
"Australia")
);
Label disclaimerLabel = new Label("This contributor list shows only those who have contributed " +
"to the Server Source code.\nTo know about the contributors of Action API, Theme API, Util, " +
"visit the respective repositories.");
disclaimerLabel.getStyleClass().add("about_license_contributors_disclaimer_label");
disclaimerLabel.setWrapText(true);
getChildren().addAll(tableView, disclaimerLabel);
}
}
package com.stream_pi.server.window.settings.About;
import com.stream_pi.server.info.License;
import javafx.scene.control.TextArea;
public class LicenseTab extends TextArea
{
public LicenseTab()
{
setText(License.getLicense());
getStyleClass().add("about_license_text_area");
setWrapText(false);
setEditable(false);
}
}
package com.stream_pi.server.window.settings;
package com.stream_pi.server.window.settings;
import com.stream_pi.server.connection.ServerListener;
import com.stream_pi.server.connection.ServerListener;
import com.stream_pi.server.window.ExceptionAndAlertHandler;
import com.stream_pi.server.window.ExceptionAndAlertHandler;
import com.stream_pi.server.window.settings.About.About;
import javafx.application.HostServices;
import javafx.application.HostServices;
import javafx.geometry.Insets;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.Pos;
import javafx.scene.CacheHint;
import javafx.scene.CacheHint;
import javafx.scene.control.*;
import javafx.scene.control.*;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.layout.VBox;
public class SettingsBase extends VBox {
public class SettingsBase extends VBox {
private TabPane tabPane;
private TabPane tabPane;
private GeneralSettings generalSettings;
private GeneralSettings generalSettings;
private PluginsSettings pluginsSettings;
private PluginsSettings pluginsSettings;
private ThemesSettings themesSettings;
private ThemesSettings themesSettings;
private ClientsSettings clientsSettings;
private ClientsSettings clientsSettings;
private Button closeButton;
private Button closeButton;
private HostServices hostServices;
private HostServices hostServices;
private ExceptionAndAlertHandler exceptionAndAlertHandler;
private ExceptionAndAlertHandler exceptionAndAlertHandler;
public SettingsBase(HostServices hostServices, ExceptionAndAlertHandler exceptionAndAlertHandler,
public SettingsBase(HostServices hostServices, ExceptionAndAlertHandler exceptionAndAlertHandler,
ServerListener serverListener)
ServerListener serverListener)
{
{
this.exceptionAndAlertHandler = exceptionAndAlertHandler;
this.exceptionAndAlertHandler = exceptionAndAlertHandler;
this.hostServices = hostServices;
this.hostServices = hostServices;
tabPane = new TabPane();
tabPane = new TabPane();
tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
VBox.setVgrow(tabPane, Priority.ALWAYS);
VBox.setVgrow(tabPane, Priority.ALWAYS);
Tab generalSettingsTab = new Tab("General");
Tab generalSettingsTab = new Tab("General");
generalSettings = new GeneralSettings(exceptionAndAlertHandler, serverListener, hostServices);
generalSettings = new GeneralSettings(exceptionAndAlertHandler, serverListener, hostServices);
generalSettingsTab.setContent(generalSettings);
generalSettingsTab.setContent(generalSettings);
Tab pluginsSettingsTab = new Tab("Plugins");
Tab pluginsSettingsTab = new Tab("Plugins");
pluginsSettings = new PluginsSettings(exceptionAndAlertHandler, hostServices);
pluginsSettings = new PluginsSettings(exceptionAndAlertHandler, hostServices);
pluginsSettingsTab.setContent(pluginsSettings);
pluginsSettingsTab.setContent(pluginsSettings);
Tab themesSettingsTab = new Tab("Themes");
Tab themesSettingsTab = new Tab("Themes");
themesSettings = new ThemesSettings(hostServices);
themesSettings = new ThemesSettings(hostServices);
themesSettingsTab.setContent(themesSettings);
themesSettingsTab.setContent(themesSettings);
Tab clientsSettingsTab = new Tab("Clients");
Tab clientsSettingsTab = new Tab("Clients");
clientsSettings = new ClientsSettings(exceptionAndAlertHandler, serverListener);
clientsSettings = new ClientsSettings(exceptionAndAlertHandler, serverListener);
clientsSettingsTab.setContent(clientsSettings);
clientsSettingsTab.setContent(clientsSettings);
Tab aboutTab = new Tab("About");
Tab aboutTab = new Tab("About");
aboutTab.setContent(new About(hostServices));
aboutTab.setContent(new About(hostServices));
tabPane.getTabs().addAll(generalSettingsTab, pluginsSettingsTab, themesSettingsTab, clientsSettingsTab, aboutTab);
tabPane.getTabs().addAll(generalSettingsTab, pluginsSettingsTab, themesSettingsTab, clientsSettingsTab, aboutTab);
setAlignment(Pos.TOP_RIGHT);
setAlignment(Pos.TOP_RIGHT);
closeButton = new Button("Close");
closeButton = new Button("Close");
VBox.setMargin(closeButton, new Insets(10.0));
VBox.setMargin(closeButton, new Insets(10.0));
getChildren().addAll(tabPane, closeButton);
getChildren().addAll(tabPane, closeButton);
setCache(true);
setCache(true);
setCacheHint(CacheHint.SPEED);
setCacheHint(CacheHint.SPEED);
}
}
public void setDefaultTabToGeneral()
public void setDefaultTabToGeneral()
{
{
tabPane.getSelectionModel().selectFirst();
tabPane.getSelectionModel().selectFirst();
}
}
public Button getCloseButton()
public Button getCloseButton()
{
{
return closeButton;
return closeButton;
}
}
public GeneralSettings getGeneralSettings()
public GeneralSettings getGeneralSettings()
{
{
return generalSettings;
return generalSettings;
}
}
public PluginsSettings getPluginsSettings()
public PluginsSettings getPluginsSettings()
{
{
return pluginsSettings;
return pluginsSettings;
}
}
public ThemesSettings getThemesSettings()
public ThemesSettings getThemesSettings()
{
{
return themesSettings;
return themesSettings;
}
}
public ClientsSettings getClientsSettings()
public ClientsSettings getClientsSettings()
{
{
return clientsSettings;
return clientsSettings;
}
}
}
}
module com.stream_pi.server {
module com.stream_pi.server
{
uses com.stream_pi.action_api.action.Action;
uses com.stream_pi.action_api.action.Action;
uses com.stream_pi.action_api.externalplugin.NormalAction;
uses com.stream_pi.action_api.externalplugin.NormalAction;
uses com.stream_pi.action_api.externalplugin.ExternalPlugin;
uses com.stream_pi.action_api.externalplugin.ExternalPlugin;
requires com.stream_pi.action_api;
requires com.stream_pi.action_api;
requires com.stream_pi.util;
requires com.stream_pi.util;
requires com.stream_pi.theme_api;
requires com.stream_pi.theme_api;
requires org.kordamp.ikonli.javafx;
requires org.kordamp.ikonli.javafx;
requires java.xml;
requires java.xml;
requires javafx.base;
requires javafx.base;
requires javafx.graphics;
requires javafx.graphics;
requires javafx.controls;
requires javafx.controls;
requires javafx.media;
requires javafx.media;
requires java.desktop;
requires java.desktop;
requires java.sql;
requires java.sql;
opens com.stream_pi.server.window.settings;
exports com.stream_pi.server;
exports com.stream_pi.server;
opens com.stream_pi.server.window.settings.About;
}
}
.root {
.root {
-fx-font-family : 'Roboto';
-fx-font-family : 'Roboto';
}
}
.about_donate_hyperlink
.about_donate_hyperlink
{
{
-fx-font-size : 19;
-fx-font-size : 19;
-fx-font-weight : bold;
-fx-font-weight : bold;
}
}
.plugins_settings_each_plugin_button_bar
.plugins_settings_each_plugin_button_bar
{
{
-fx-alignment:center-right;
-fx-alignment:center-right;
}
}
.about_license_label
.about_license_label
{
{
-fx-font-size : 16;
-fx-font-size : 16;
}
}
.theme_settings_each_theme_box, .plugins_settings_each_plugin_box, .clients_settings_each_client_box
.theme_settings_each_theme_box, .plugins_settings_each_plugin_box, .clients_settings_each_client_box
{
{
-fx-border-width : 0 0 1 0;
-fx-border-width : 0 0 1 0;
-fx-border-color : grey;
-fx-border-color : grey;
}
}
.plugins_settings_each_plugin_heading_label, .themes_settings_each_theme_heading, .client_settings_each_client_nick_name_label
.plugins_settings_each_plugin_heading_label, .themes_settings_each_theme_heading, .client_settings_each_client_nick_name_label
{
{
-fx-font-size : 19;
-fx-font-size : 19;
}
}
.action_box
.action_box
{
{
-fx-border-width: 1px;
-fx-border-width: 1px;
-fx-border-color : grey;
-fx-border-color : grey;
}
}
.action_box_icon_present
.action_box_icon_present
{
{
}
}
.action_box_icon_not_present
.action_box_icon_not_present
{
{
}
}
.action_box_valid
.action_box_valid
{
{
-fx-border-color: grey;
-fx-border-color: grey;
}
}
.action_box_invalid
.action_box_invalid
{
{
-fx-border-color: red;
-fx-border-color: red;
}
}
.action_box_display_text_label
.action_box_display_text_label
{
{
-fx-font-size : 16;
-fx-font-size : 16;
-fx-background-color : transparent;
-fx-background-color : transparent;
}
}
.action_details_pane_heading_label
.action_details_pane_heading_label
{
{
-fx-font-size : 16;
-fx-font-size : 16;
}
}
.client_settings_each_client_socket_connection_label
.client_settings_each_client_socket_connection_label
{
{
-fx-font-size : 16;
-fx-font-size : 16;
}
}
.general_settings{
.general_settings{
-fx-alignment : TOP_CENTER;
-fx-alignment : TOP_CENTER;
-fx-padding : 10;
-fx-padding : 10;
}
}
.alert_header
.alert_header
{
{
-fx-padding: 5;
-fx-padding: 5;
}
}
.alert_pane
.alert_pane
{
{
-fx-border-width : 5;
-fx-border-width : 5;
-fx-border-radius : 5;
-fx-border-radius : 5;
-fx-background-radius : 5;
-fx-background-radius : 5;
-fx-max-width : 400;
-fx-max-width : 400;
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0.0 , 0 );
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0.0 , 0 );
}
}
.alert_header_icon
.alert_header_icon
{
{
-fx-icon-size : 30;
-fx-icon-size : 30;
}
}
.alert_content_pane
.alert_content_pane
{
{
-fx-padding: 5;
-fx-padding: 5;
}
}
.alert_pane_parent
.alert_pane_parent
{
{
-fx-background-color : rgba(0,0,0,0.5);
-fx-background-color : rgba(0,0,0,0.5);
}
}
.alert_pane_header_text
.alert_pane_header_text
{
{
-fx-font-size: 18;
-fx-font-size: 18;
}
}
.alert_button_bar
.alert_button_bar
{
{
-fx-alignment: CENTER_RIGHT;
-fx-alignment: CENTER_RIGHT;
-fx-spacing: 5;
-fx-spacing: 5;
-fx-padding: 5;
-fx-padding: 5;
}
}
.alert_scroll_pane {
.alert_scroll_pane {
-fx-max-height : 300;
-fx-max-height : 300;
/*-fx-focus-color: #FFFFFF;
/*-fx-focus-color: #FFFFFF;
-fx-faint-focus-color:#FFFFFF;*/
-fx-faint-focus-color:#FFFFFF;*/
}
}
.plugins_pane
.plugins_pane
{
{
-fx-spacing: 5;
-fx-spacing: 5;
}
}
.plugins_pane_each_plugin_button_imageview
.plugins_pane_each_plugin_button_imageview
{
{
-fx-width:20;
-fx-width:20;
-fx-height:20;
-fx-height:20;
}
}
.about_donate_hyperlink
.about_donate_hyperlink
{
{
-fx-padding : 10 0 0 0;
-fx-padding : 10 0 0 0;
-fx-font-size : 25;
-fx-font-size : 25;
}
}
.first_time_use_pane
.first_time_use_pane
{
{
-fx-padding : 5;
-fx-padding : 5;
}
}
.first_time_use_pane_heading_label
.first_time_use_pane_heading_label
{
{
-fx-font-size: 20;
-fx-font-size: 20;
}
}
.first_time_use_pane_stackpane
.first_time_use_pane_stackpane
{
{
}
}
.first_time_use_pane_welcome
.first_time_use_pane_welcome
{
{
}
}
.first_time_use_pane_license
.first_time_use_pane_license
{
{
-fx-spacing : 10;
-fx-spacing : 10;
}
}
.first_time_use_pane_final_config
.first_time_use_pane_final_config
{
{
}
}
.first_time_use_pane_final_config_label
.first_time_use_pane_final_config_label
{
{
-fx-padding: 0 0 30 0;
-fx-padding: 0 0 30 0;
}
}
.first_time_use_welcome_pane_welcome_label
.first_time_use_welcome_pane_welcome_label
{
{
-fx-font-size: 30;
-fx-font-size: 30;
}
}
.first_time_use_welcome_pane_next_to_continue_label
.first_time_use_welcome_pane_next_to_continue_label
{
{
-fx-font-size: 15;
-fx-font-size: 15;
}
}
.scroll-pane
.scroll-pane
{
{
-fx-focus-color:transparent;
-fx-focus-color:transparent;
-fx-faint-focus-color:transparent;
-fx-faint-focus-color:transparent;
}
}
.plugins_settings_scroll_pane, .themes_settings_scroll_pane, .clients_settings_scroll_pane
.plugins_settings_scroll_pane, .themes_settings_scroll_pane, .clients_settings_scroll_pane
{
{
-fx-padding: 10 0 0 0;
-fx-padding: 10 0 0 0;
}
}
.plugins_settings_each_plugin_box, .theme_settings_each_theme_box, .clients_settings_each_client_box
.plugins_settings_each_plugin_box, .theme_settings_each_theme_box, .clients_settings_each_client_box
{
{
-fx-spacing : 5;
-fx-spacing : 5;
-fx-padding : 10 0 10 0;
-fx-padding : 10 0 10 0;
}
}
.plugins_pane_each_plugin_box_parent, .plugins_pane_each_plugin_box
.plugins_pane_each_plugin_box_parent, .plugins_pane_each_plugin_box
{
{
-fx-spacing : 5;
-fx-spacing : 5;
}
}
.about
.about
{
{
-fx-spacing : 5;
-fx-spacing : 5;
}
}
.about_links_box
.about_links_box
{
{
-fx-spacing : 15;
-fx-spacing : 15;
}
}
.action_details_pane_delete_button
.action_details_pane_delete_button
{
{
-fx-text-fill : red;
-fx-text-fill : red;
}
}
.action_details_pane_reset_button
.action_details_pane_reset_button
{
{
-fx-text-fill : orange;
-fx-text-fill : orange;
}
}
.client_and_profile_selector_pane_stack
.client_and_profile_selector_pane_stack
{
{
-fx-spacing: 5;
-fx-spacing: 5;
}
}
.plugins_settings, .themes_settings, .clients_settings
.plugins_settings, .themes_settings, .clients_settings
{
{
-fx-padding: 0 10 0 0;
-fx-padding: 0 10 0 0;
}
}
/*Alert Classes added to default stylesheet to show init error, if occurs */
/*Alert Classes added to default stylesheet to show init error, if occurs */
.action_box_display_text_label
.action_box_display_text_label
{
{
-fx-font-size : 16;
-fx-font-size : 16;
-fx-background-color : transparent;
-fx-background-color : transparent;
}
}
.alert_pane
.alert_pane
{
{
-fx-background-color : white;
-fx-background-color : white;
-fx-border-color : white;
-fx-border-color : white;
}
}
.alert_content_pane
.alert_content_pane
{
{
-fx-background-color: white;
-fx-background-color: white;
-fx-padding: 5;
-fx-padding: 5;
}
}
.alert_scroll_pane
.alert_scroll_pane
{
{
-fx-background: white;
-fx-background: white;
-fx-border-color:white;
-fx-border-color:white;
}
}
.alert_button_bar
.alert_button_bar
{
{
-fx-background-color:white;
-fx-background-color:white;
}
}
.split-pane-divider {
.split-pane-divider {
-fx-padding: 2;
-fx-padding: 2;
}
.separator_ui_label
{
-fx-text-fill: grey;
}
.about_license_contributors_disclaimer_label
{
-fx-min-height : 50;
}
}
M style_classes.txt
+8 −3
dashboard
dashboard
Action Details Pane - action_details_pane
Action Details Pane - action_details_pane
Heading HBox - action_details_pane_heading_box
Heading HBox - action_details_pane_heading_box
Heading Label - action_details_pane_heading_label
Heading Label - action_details_pane_heading_label
Scroll Pane - action_details_pane_scroll_pane
Scroll Pane - action_details_pane_scroll_pane
VBox (Content Pane) - action_details_pane_vbox
VBox (Content Pane) - action_details_pane_vbox
Bottom Button Bar - action_details_pane_button_bar
Bottom Button Bar - action_details_pane_button_bar
Delete Button - action_details_pane_delete_button
Delete Button - action_details_pane_delete_button
Icon - action_details_pane_delete_button_icon
Icon - action_details_pane_delete_button_icon
Action Grid Pane (Scroll Pane) - action_grid_pane_parent
Action Grid Pane (Scroll Pane) - action_grid_pane_parent
Main Grid Pane - action_grid_pane
Main Grid Pane - action_grid_pane
Action Box - action_box
Action Box - action_box
if folder back button :
if folder back button :
Icon : folder_action_back_button_icon
Icon : folder_action_back_button_icon
Is Icon Present ?
Is Icon Present ?
yes : action_box_icon_present
yes : action_box_icon_present
no : action_box_icon_not_present
no : action_box_icon_not_present
Is Action Valid (is plugin by module name found) ?
Is Action Valid (is plugin by module name found) ?
yes : action_box_valid
yes : action_box_valid
no : action_box_invalid
no : action_box_invalid
Display Text Label - action_box_display_text_label
Display Text Label - action_box_display_text_label
Client & Profile Selector Pane - client_and_profile_selector_pane
Client & Profile Selector Pane - client_and_profile_selector_pane
Stack VBox - client_and_profile_selector_pane_stack
Stack VBox - client_and_profile_selector_pane_stack
"No Clients Connected" Label - client_and_profile_selector_pane_no_clients_connected_label
"No Clients Connected" Label - client_and_profile_selector_pane_no_clients_connected_label
Client Combo Box - client_and_profile_selector_pane_client_selector_combo_box
Client Combo Box - client_and_profile_selector_pane_client_selector_combo_box
Profile Combo Box - client_and_profile_selector_pane_profile_selector_combo_box
Profile Combo Box - client_and_profile_selector_pane_profile_selector_combo_box
Plugins Pane - plugins_pane
Plugins Pane - plugins_pane
"Plugins" Label - plugins_pane_top_label
"Plugins" Label - plugins_pane_top_label
Accordion - plugins_pane_accordion
Accordion - plugins_pane_accordion
Category - plugins_pane_each_plugin_category_titled_pane
Category - plugins_pane_each_plugin_category_titled_pane
VBox - plugins_pane_each_plugin_box_parent
VBox - plugins_pane_each_plugin_box_parent
HBox - plugins_pane_each_plugin_box
HBox - plugins_pane_each_plugin_box
Each Plugin Button - plugins_pane_each_plugin_button
Each Plugin Button - plugins_pane_each_plugin_button
Icon - plugins_pane_each_plugin_button_icon
Icon - plugins_pane_each_plugin_button_icon
OR
OR
ImageView (NOT RECOMMENDED FOR USE) - plugins_pane_each_plugin_button_imageview]
ImageView (NOT RECOMMENDED FOR USE) - plugins_pane_each_plugin_button_imageview]
Help Button - plugins_pane_each_plugin_button_help_icon
Help Button - plugins_pane_each_plugin_button_help_icon
Icon - plugins_pane_each_plugin_button_help_button_icon
Icon - plugins_pane_each_plugin_button_help_button_icon
HBox - plugins_pane_settings_button
HBox - plugins_pane_settings_button
Settings Button - plugins_pane_settings_button
Settings Button - plugins_pane_settings_button
settings
settings
General - general_settings
General - general_settings
Plugins - plugins_settings
Plugins - plugins_settings
Scroll Pane (CENTER) - plugins_settings_scroll_pane
Scroll Pane (CENTER) - plugins_settings_scroll_pane
VBox - plugins_settings_vbox
VBox - plugins_settings_vbox
"No Plugins Present Label" - plugins_pane_no_plugins_installed_label
"No Plugins Present Label" - plugins_pane_no_plugins_installed_label
Each Plugin Box - plugins_settings_each_plugin_box
Each Plugin Box - plugins_settings_each_plugin_box
Header HBox - plugins_settings_each_plugin_header
Header HBox - plugins_settings_each_plugin_header
Heading Label - plugins_settings_each_plugin_heading_label
Heading Label - plugins_settings_each_plugin_heading_label
Help Button - plugins_settings_each_plugin_help_button
Help Button - plugins_settings_each_plugin_help_button
Help Icon - plugins_settings_each_plugin_help_icon
Help Icon - plugins_settings_each_plugin_help_icon
Author Label - plugins_settings_each_plugin_author_label
Author Label - plugins_settings_each_plugin_author_label
Module Label - plugins_settings_each_plugin_module_label
Module Label - plugins_settings_each_plugin_module_label
Version Label - plugins_settings_each_plugin_version_label
Version Label - plugins_settings_each_plugin_version_label
Server Properties Box - plugins_settings_each_plugin_server_properties_box
Server Properties Box - plugins_settings_each_plugin_server_properties_box
buttonBarHBox - plugins_settings_each_plugin_button_bar
buttonBarHBox - plugins_settings_each_plugin_button_bar
Themes - themes_settings
Themes - themes_settings
Scroll Pane (CENTER) - themes_settings_scroll_pane
Scroll Pane (CENTER) - themes_settings_scroll_pane
VBox - themes_settings_vbox
VBox - themes_settings_vbox
Each Theme Box - theme_settings_each_theme_box
Each Theme Box - theme_settings_each_theme_box
Heading HBox - themes_settings_each_theme_header
Heading HBox - themes_settings_each_theme_header
Heading Label - themes_settings_each_theme_heading
Heading Label - themes_settings_each_theme_heading
Help Button - themes_settings_each_theme_help_button
Help Button - themes_settings_each_theme_help_button
Help Icon - themes_settings_each_theme_help_icon
Help Icon - themes_settings_each_theme_help_icon
Author Label - themes_settings_each_theme_author_label
Author Label - themes_settings_each_theme_author_label
Full Name Label - themes_settings_each_theme_full_name_label
Full Name Label - themes_settings_each_theme_full_name_label
Version Label - themes_settings_each_theme_version_label
Version Label - themes_settings_each_theme_version_label
Toggle Button HBox - themes_settings_each_theme_toggle_button_parent
Toggle Button HBox - themes_settings_each_theme_toggle_button_parent
Toggle Button - themes_settings_each_theme_toggle_button
Toggle Button - themes_settings_each_theme_toggle_button
Client - clients_settings
Client - clients_settings
Scroll Pane (CENTER) - clients_settings_scroll_pane
Scroll Pane (CENTER) - clients_settings_scroll_pane
VBox - clients_settings_vbox
VBox - clients_settings_vbox
Each Client Box - clients_settings_each_client_box
Each Client Box - clients_settings_each_client_box
Nick Name Label - client_settings_each_client_nick_name_label
Nick Name Label - client_settings_each_client_nick_name_label
Socket Connection Label - client_settings_each_client_socket_connection_label
Socket Connection Label - client_settings_each_client_socket_connection_label
Platform Label - client_settings_each_client_platform_label
Platform Label - client_settings_each_client_platform_label
Version Label - client_settings_each_client_version_label
Version Label - client_settings_each_client_version_label
Profiles Accordion - client_settings_each_client_profiles_accordion
Profiles Accordion - client_settings_each_client_profiles_accordion
Each Titled Pane - client_settings_each_client_accordion_each_titled_pane
Each Titled Pane - client_settings_each_client_accordion_each_titled_pane
Content VBox - client_settings_each_client_accordion_each_profile_box
Content VBox - client_settings_each_client_accordion_each_profile_box
About - about
About - about
License Label - about_license_label
License Text Area - about_license_text_area
Tab Pane - settings_about_tab_internal
Links HBox - about_links_box
License Tab (Text Area) - about_license_text_area
Contributors Tab (VBox) - about_license_contributors_vbox
Table View - about_license_contributors_table_view
Disclaimer Label - about_license_contributors_disclaimer_label
Contact Tab (Scroll Pane) - about_contact_tab_scroll_pane
DONATE Hyperlink - about_donate_hyperlink
DONATE Hyperlink - about_donate_hyperlink
Version Label - about_version_label
Version Label - about_version_label
Comm Standard Label - about_comm_standard_label
Comm Standard Label - about_comm_standard_label
Min Theme API Label - about_min_theme_api_label
Min Theme API Label - about_min_theme_api_label
Min Action API Label - about_min_action_api_label
Min Action API Label - about_min_action_api_label
Current Action API Label - about_current_action_api_label
Current Action API Label - about_current_action_api_label