package net.krazyweb.starmodmanager.view;
import java.io.IOException;
import java.net.URISyntaxException;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import net.krazyweb.helpers.CSSHelper;
import net.krazyweb.helpers.FXHelper;
import net.krazyweb.starmodmanager.data.LocalizerFactory;
import net.krazyweb.starmodmanager.data.LocalizerModelInterface;
import net.krazyweb.starmodmanager.data.Observable;
import net.krazyweb.starmodmanager.data.Observer;
import net.krazyweb.starmodmanager.data.SettingsFactory;
import net.krazyweb.starmodmanager.data.SettingsModelInterface;
import net.krazyweb.starmodmanager.dialogue.MessageDialogue;
import net.krazyweb.starmodmanager.dialogue.MessageDialogue.MessageType;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class AboutView implements Observer {
private static final Logger log = LogManager.getLogger(AboutView.class);
private VBox root;
private AnchorPane browseRepoPane;
private AboutViewController controller;
private SettingsModelInterface settings;
private LocalizerModelInterface localizer;
private Text title;
private Text versionName;
private Text createdBy;
private Text createdByPerson;
private Text withContributionsFrom;
private Text[] contributors;
private Text writtenIn;
private Text[] writtenUsing;
private Text browseRepo;
private ImageView browseRepoArrow;
protected AboutView() {
settings = new SettingsFactory().getInstance();
localizer = new LocalizerFactory().getInstance();
localizer.addObserver(this);
controller = new AboutViewController(this);
}
protected void build() {
root = new VBox();
root.setPadding(new Insets(0, 0, 0, 18));
title = new Text();
title.setId("about-view-title");
versionName = new Text();
versionName.setId("about-view-version");
createdBy = new Text();
createdBy.setId("about-view-sub-title");
createdByPerson = getLinkedText("KrazyTheFox", "https://github.com/KrazyTheFox");
createdByPerson.setId("about-view-sub-title-link");
HBox createdByContainer = new HBox();
createdByContainer.getChildren().addAll(createdBy, createdByPerson);
withContributionsFrom = new Text();
withContributionsFrom.setId("about-view-sub-title");
writtenIn = new Text();
writtenIn.setId("about-view-sub-title");
contributors = new Text[1];
contributors[0] = getLinkedText("kyr (German Translation)", "http://kyr.li/");
writtenUsing = new Text[9];
writtenUsing[0] = getLicensedText("7-Zip-JBinding", new LicenseView("7-Zip-JBinding", "license_7zjb.txt"));
writtenUsing[1] = getLicensedText("commons-io", new LicenseView("Apache commons-io", "license_commons-io.txt"));
writtenUsing[2] = getLicensedText("hsqldb", new LicenseView("HyperSQL", "license_hsqldb.txt"));
writtenUsing[3] = getLicensedText("icu4j", new LicenseView("International Components for Unicode", "license_icu4j.txt"));
writtenUsing[4] = getLicensedText("junit", new LicenseView("JUnit", "license_junit.txt"));
writtenUsing[5] = getLicensedText("Lato", new LicenseView("Lato", "license_lato.txt"));
writtenUsing[6] = getLicensedText("log4j2", new LicenseView("log4j2", "license_log4j2.txt"));
writtenUsing[7] = getLicensedText("minimal-json", new LicenseView("minimal-json", "license_minimal-json.txt"));
writtenUsing[8] = getLicensedText("StarDB for Java", new LicenseView("StarDB for Java", "license_stardb4j.txt"));
root.getChildren().addAll(
title,
versionName,
new Text(),
createdByContainer,
new Text(),
withContributionsFrom
);
for (Text t : contributors) {
t.setId("about-view-contributor");
root.getChildren().add(t);
}
root.getChildren().addAll(new Text(), writtenIn);
for (Text t : writtenUsing) {
t.setId("about-view-library");
root.getChildren().add(t);
}
browseRepoPane = new AnchorPane();
VBox.setVgrow(browseRepoPane, Priority.ALWAYS);
browseRepoArrow = new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("browse-repo-arrow.png")));
browseRepoPane.getChildren().add(browseRepoArrow);
AnchorPane.setBottomAnchor(browseRepoArrow, 3.0);
AnchorPane.setLeftAnchor(browseRepoArrow, 0.0);
root.getChildren().addAll(new Text(), browseRepoPane);
updateStrings();
updateColors();
}
private void updateStrings() {
title.setText(localizer.getMessage("appname"));
versionName.setText(localizer.formatMessage("versionwithapple", settings.getVersion(), settings.getApple()));
createdBy.setText(localizer.getMessage("aboutview.createdby"));
withContributionsFrom.setText(localizer.getMessage("aboutview.contributions"));
writtenIn.setText(localizer.getMessage("aboutview.writtenin"));
browseRepoPane.getChildren().remove(browseRepo);
browseRepo = getLinkedText(localizer.getMessage("aboutview.browserepo"), "https://github.com/KrazyTheFox/Starbound-Mod-Manager");
browseRepo.setId("about-view-browse-repo");
AnchorPane.setBottomAnchor(browseRepo, 0.0);
AnchorPane.setLeftAnchor(browseRepo, 22.0);
browseRepoPane.getChildren().add(browseRepo);
}
private void updateColors() {
FXHelper.setColor(browseRepoArrow, CSSHelper.getColor("browse-repo-arrow-color", settings.getPropertyString("theme")));
}
protected Node getContent() {
return root;
}
private Text getLinkedText(final String text, final String url) {
Text output = new Text(text);
output.setId("about-view-linked-text");
output.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
try {
controller.openWebpage(url);
} catch (URISyntaxException | IOException e) {
log.error("", e);
MessageDialogue dialogue = new MessageDialogue(localizer.getMessage("aboutview.linkerror"), localizer.getMessage("aboutview.linkerror.title"), MessageType.ERROR, new LocalizerFactory());
dialogue.getResult();
}
}
});
return output;
}
private Text getLicensedText(final String text, final LicenseView license) {
Text output = new Text(text);
output.setId("about-view-linked-text");
output.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
license.open();
}
});
return output;
}
@Override
public void update(final Observable observable, final Object message) {
if (observable instanceof LocalizerModelInterface && message.equals("localechanged")) {
updateStrings();
}
}
}