package net.krazyweb.starmodmanager.view; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.geometry.VPos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.layout.Priority; import javafx.scene.layout.RowConstraints; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.Text; import javafx.stage.Stage; import net.krazyweb.helpers.CSSHelper; import net.krazyweb.helpers.FXHelper; import net.krazyweb.starmodmanager.data.Localizer; import net.krazyweb.starmodmanager.data.LocalizerFactory; import net.krazyweb.starmodmanager.data.LocalizerModelInterface; import net.krazyweb.starmodmanager.data.Mod; import net.krazyweb.starmodmanager.data.ModList; 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 org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class ModView implements Observer { @SuppressWarnings("unused") private static final Logger log = LogManager.getLogger(ModView.class); private GridPane collapsedRoot; private Button collapsedInstallButton; private Button collapsedExpandButton; private Text collapsedStatusText; private Text collapsedDisplayName; private Text collapsedModVersion; private HBox collapsedButtons; private Button collapsedDeleteButton; private Button collapsedHideButton; private Button collapsedLinkButton; private GridPane expandedRoot; private BorderPane expandedHeader; private Button expandedInstallButton; private Button expandedExpandButton; private Text expandedStatusText; private Text expandedDisplayName; private Text expandedModVersion; private Text expandedAuthor; private Text expandedDescription; private VBox expandedButtons; private Button expandedDeleteButton; private Button expandedHideButton; private Button expandedLinkButton; private RowConstraints descriptionConstraints; private RowConstraints expandButtonConstraints; private Mod mod; private ModViewController controller; protected boolean moving; protected boolean showingMoreInfo; protected boolean expanded; private SettingsModelInterface settings; private LocalizerModelInterface localizer; protected ModView(final Mod mod, final ModList modList) { this.mod = mod; this.mod.addObserver(this); localizer = new LocalizerFactory().getInstance(); localizer.addObserver(this); settings = new SettingsFactory().getInstance(); controller = new ModViewController(this, modList, localizer); } protected void build(final boolean expanded) { this.expanded = expanded; buildExpanded(); buildUnexpanded(); createListeners(); updateStrings(); updateImages(); updateColors(); } private void buildExpanded() { expandedRoot = new GridPane(); //expandedRoot.setGridLinesVisible(true); expandedRoot.setId("modview-expanded-container"); if (mod.hasImage()) { expandedRoot.setStyle( "-fx-background-image: url(\"" + mod.getImageLocation() + "\");" + "-fx-background-position: 29px 0px;" ); } else { expandedRoot.setStyle( "-fx-background-color: " + CSSHelper.getColorHex("modview-expanded-not-installed-background-color", settings.getPropertyString("theme")) + ";" + "-fx-background-position: 29px 0px;" ); } expandedHeader = new BorderPane(); expandedHeader.setPrefHeight(29); expandedHeader.setMinHeight(29); expandedInstallButton = new Button(); expandedInstallButton.setId("modview-install-button"); expandedInstallButton.setFocusTraversable(false); expandedInstallButton.setPrefHeight(30); //expandedInstallButton.setPrefWidth(73); //expandedInstallButton.setMinWidth(73); expandedInstallButton.setMinHeight(30); expandedInstallButton.setAlignment(Pos.CENTER); expandedExpandButton = new Button(); expandedExpandButton.setId("modview-expand-button"); expandedStatusText = new Text(); expandedStatusText.setId("modview-expanded-header-text"); expandedDisplayName = new Text(); expandedDisplayName.setId("modview-expanded-title"); expandedModVersion = new Text(); expandedModVersion.setId("modview-expanded-header-text"); expandedAuthor = new Text(); expandedAuthor.setId("modview-expanded-sub-text"); expandedDescription = new Text(); expandedDescription.setId("modview-expanded-sub-text"); expandedDescription.wrappingWidthProperty().bind(expandedRoot.widthProperty().subtract(210)); expandedButtons = new VBox(); expandedButtons.setAlignment(Pos.TOP_CENTER); expandedButtons.setSpacing(12); expandedDeleteButton = new Button(); expandedDeleteButton.setId("modview-action-button"); expandedHideButton = new Button(); expandedHideButton.setId("modview-action-button"); expandedLinkButton = new Button(); expandedLinkButton.setId("modview-action-button"); expandedDeleteButton.setGraphic(new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("delete-icon-large.png")))); expandedHideButton.setGraphic(new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("hide-icon-large.png")))); expandedLinkButton.setGraphic(new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("link-icon-large.png")))); Color color = CSSHelper.getColor("modview-not-installed-button-color", settings.getPropertyString("theme")); FXHelper.setColor(expandedDeleteButton.getGraphic(), color); FXHelper.setColor(expandedHideButton.getGraphic(), color); FXHelper.setColor(expandedLinkButton.getGraphic(), color); expandedHeader.setPadding(new Insets(8, 10, 0, 10)); expandedHeader.setLeft(expandedStatusText); expandedHeader.setRight(expandedModVersion); expandedButtons.getChildren().addAll( expandedDeleteButton, expandedHideButton, expandedLinkButton ); expandedRoot.add(expandedHeader, 1, 1); expandedRoot.add(expandedDisplayName, 1, 2); expandedRoot.add(expandedAuthor, 1, 3); expandedRoot.add(expandedInstallButton, 2, 2); expandedRoot.add(expandedExpandButton, 3, 2); GridPane.setColumnSpan(expandedHeader, 3); GridPane.setRowSpan(expandedExpandButton, 2); GridPane.setRowSpan(expandedInstallButton, 2); GridPane.setRowSpan(expandedButtons, 3); GridPane.setHgrow(expandedDisplayName, Priority.ALWAYS); GridPane.setMargin(expandedDisplayName, new Insets(6, 0, 0, 15)); GridPane.setMargin(expandedAuthor, new Insets(2, 0, 9, 15)); GridPane.setMargin(expandedExpandButton, new Insets(1, 17, 0, 19)); GridPane.setMargin(expandedButtons, new Insets(23, 0, 0, 0)); GridPane.setMargin(expandedDescription, new Insets(10, 0, 0, 35)); GridPane.setValignment(expandedDescription, VPos.TOP); RowConstraints fillerConstraints = new RowConstraints(); expandedRoot.getRowConstraints().add(fillerConstraints); fillerConstraints = new RowConstraints(); expandedRoot.getRowConstraints().add(fillerConstraints); fillerConstraints = new RowConstraints(); expandedRoot.getRowConstraints().add(fillerConstraints); fillerConstraints = new RowConstraints(); expandedRoot.getRowConstraints().add(fillerConstraints); descriptionConstraints = new RowConstraints(); descriptionConstraints.setMinHeight(130); expandButtonConstraints = new RowConstraints(); expandButtonConstraints.setMinHeight(45); } private void buildUnexpanded() { collapsedRoot = new GridPane(); collapsedRoot.setId("modview-container"); collapsedRoot.setMinHeight(44.0); collapsedRoot.setPadding(new Insets(7, 11, 6, 16)); collapsedDisplayName = new Text(); collapsedDisplayName.setId("modview-title"); collapsedStatusText = new Text(); collapsedStatusText.setId("modview-small-info"); collapsedModVersion = new Text(); collapsedModVersion.setId("modview-small-info"); collapsedInstallButton = new Button(); collapsedInstallButton.setId("modview-install-button"); collapsedInstallButton.setFocusTraversable(false); collapsedInstallButton.setPrefHeight(30.0); //collapsedInstallButton.setPrefWidth(73.0); collapsedInstallButton.setAlignment(Pos.CENTER); collapsedExpandButton = new Button(); collapsedExpandButton.setId("modview-expand-button"); collapsedButtons = new HBox(); collapsedDeleteButton = new Button(); collapsedDeleteButton.setId("modview-action-button"); collapsedHideButton = new Button(); collapsedHideButton.setId("modview-action-button"); collapsedLinkButton = new Button(); collapsedLinkButton.setId("modview-action-button"); collapsedDeleteButton.setGraphic(new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("delete-icon.png")))); collapsedHideButton.setGraphic(new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("hide-icon.png")))); collapsedLinkButton.setGraphic(new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("link-icon.png")))); collapsedButtons.setAlignment(Pos.CENTER); collapsedButtons.setSpacing(15.0); collapsedButtons.setMinHeight(25); collapsedButtons.setPadding(new Insets(0, 0, 5, 0)); collapsedButtons.getChildren().addAll( collapsedDeleteButton, collapsedHideButton, collapsedLinkButton ); collapsedRoot.add(collapsedDisplayName, 1, 1); collapsedRoot.add(collapsedStatusText, 2, 1); collapsedRoot.add(collapsedModVersion, 2, 2); collapsedRoot.add(collapsedInstallButton, 3, 1); collapsedRoot.add(collapsedExpandButton, 4, 1); GridPane.setRowSpan(collapsedDisplayName, 2); GridPane.setRowSpan(collapsedInstallButton, 2); GridPane.setRowSpan(collapsedButtons, 2); GridPane.setColumnSpan(collapsedButtons, 2); GridPane.setRowSpan(collapsedExpandButton, 2); GridPane.setHgrow(collapsedDisplayName, Priority.ALWAYS); GridPane.setVgrow(collapsedDisplayName, Priority.ALWAYS); GridPane.setHalignment(collapsedStatusText, HPos.RIGHT); GridPane.setHalignment(collapsedModVersion, HPos.RIGHT); GridPane.setMargin(collapsedStatusText, new Insets(0, 10, 0, 0)); GridPane.setMargin(collapsedModVersion, new Insets(1, 9, 0, 0)); GridPane.setMargin(collapsedInstallButton, new Insets(0, 11, 0, 0)); GridPane.setMargin(collapsedExpandButton, new Insets(2, 0, 0, 0)); GridPane.setMargin(collapsedButtons, new Insets(5, 11, 0, 0)); } protected void createListeners() { collapsedInstallButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent e) { if (mod.isInstalled()) { controller.uninstallButtonClicked(); } else { controller.installButtonClicked(); } } }); collapsedExpandButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent e) { controller.moreInfoButtonClicked(); } }); collapsedDeleteButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent e) { controller.deleteButtonClicked(); } }); collapsedHideButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent e) { controller.hideButtonClicked(); } }); collapsedLinkButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent e) { controller.linkButtonClicked(); } }); expandedInstallButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent e) { if (mod.isInstalled()) { controller.uninstallButtonClicked(); } else { controller.installButtonClicked(); } } }); expandedExpandButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent e) { controller.moreInfoButtonClicked(); } }); expandedDeleteButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent e) { controller.deleteButtonClicked(); } }); expandedHideButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent e) { controller.hideButtonClicked(); } }); expandedLinkButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent e) { controller.linkButtonClicked(); } }); } protected Mod getMod() { return mod; } private void updateStrings() { expandedInstallButton.setText(localizer.getMessage(mod.isInstalled() ? "modview.uninstall" : "modview.install")); expandedStatusText.setText(localizer.getMessage(mod.isInstalled() ? "modview.installed" : "modview.notinstalled").toUpperCase()); expandedDisplayName.setText(mod.getDisplayName()); expandedModVersion.setText(mod.getModVersion().toUpperCase()); expandedAuthor.setText(mod.getAuthor()); expandedDescription.setText(mod.getDescription()); collapsedInstallButton.setText(localizer.getMessage(mod.isInstalled() ? "modview.uninstall" : "modview.install")); collapsedStatusText.setText(localizer.getMessage(mod.isInstalled() ? "modview.installed" : "modview.notinstalled").toUpperCase()); collapsedDisplayName.setText(mod.getDisplayName()); collapsedModVersion.setText(mod.getModVersion().toUpperCase()); Text test = new Text(); test.setFont(Font.loadFont(ModView.class.getClassLoader().getResourceAsStream("Lato-Medium.ttf"), 12)); test.setId("modview-install-button"); VBox t = new VBox(); t.getChildren().add(test); Stage s = new Stage(); s.setOpacity(0); s.setScene(new Scene(t, 500, 500)); s.show(); test.setText(localizer.getMessage("modview.uninstall")); int width = (int) (test.getLayoutBounds().getWidth() + 24); expandedInstallButton.setPrefWidth(width); expandedInstallButton.setMinWidth(width); collapsedInstallButton.setPrefWidth(width); collapsedInstallButton.setMinWidth(width); s.close(); } private void updateImages() { if (showingMoreInfo) { expandedExpandButton.setGraphic(new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("collapse-arrow-large.png")))); collapsedExpandButton.setGraphic(new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("collapse-arrow.png")))); } else { expandedExpandButton.setGraphic(new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("expand-arrow-large.png")))); collapsedExpandButton.setGraphic(new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("expand-arrow.png")))); } Color color = CSSHelper.getColor("modview-expand-button-color", settings.getPropertyString("theme")); FXHelper.setColor(expandedExpandButton.getGraphic(), color); FXHelper.setColor(collapsedExpandButton.getGraphic(), color); } protected Pane getContent() { return expanded ? expandedRoot : collapsedRoot; } protected void toggleMoreInfo() { if (showingMoreInfo) { collapsedRoot.getChildren().remove(collapsedButtons); collapsedRoot.add(collapsedStatusText, 2, 1); collapsedRoot.add(collapsedModVersion, 2, 2); collapsedRoot.add(collapsedInstallButton, 3, 1); expandedRoot.getChildren().remove(expandedExpandButton); expandedRoot.getChildren().remove(expandedButtons); expandedRoot.getChildren().remove(expandedDescription); expandedRoot.add(expandedExpandButton, 3, 2); GridPane.setValignment(expandedExpandButton, VPos.CENTER); expandedRoot.getRowConstraints().remove(descriptionConstraints); expandedRoot.getRowConstraints().remove(expandButtonConstraints); GridPane.setRowSpan(expandedExpandButton, 2); showingMoreInfo = false; } else { collapsedRoot.getChildren().remove(collapsedInstallButton); collapsedRoot.getChildren().remove(collapsedModVersion); collapsedRoot.getChildren().remove(collapsedStatusText); collapsedRoot.add(collapsedButtons, 2, 1); expandedRoot.getChildren().remove(expandedExpandButton); expandedRoot.add(expandedButtons, 3, 2); expandedRoot.add(expandedExpandButton, 3, 5); expandedRoot.add(expandedDescription, 1, 4); GridPane.setHalignment(expandedButtons, HPos.CENTER); GridPane.setValignment(expandedButtons, VPos.CENTER); GridPane.setValignment(expandedExpandButton, VPos.TOP); expandedRoot.getRowConstraints().add(descriptionConstraints); expandedRoot.getRowConstraints().add(expandButtonConstraints); GridPane.setRowSpan(expandedExpandButton, 1); showingMoreInfo = true; } updateImages(); } public void expand(final boolean expand) { expanded = expand; } private void updateColors() { collapsedRoot.getStyleClass().clear(); collapsedDisplayName.getStyleClass().clear(); collapsedStatusText.getStyleClass().clear(); collapsedModVersion.getStyleClass().clear(); collapsedInstallButton.getStyleClass().remove("modview-installed-button-color"); collapsedInstallButton.getStyleClass().remove("modview-not-installed-button-color"); expandedStatusText.getStyleClass().clear(); expandedDisplayName.getStyleClass().clear(); expandedModVersion.getStyleClass().clear(); expandedAuthor.getStyleClass().clear(); expandedDescription.getStyleClass().clear(); expandedInstallButton.getStyleClass().remove("modview-installed-button-color"); expandedInstallButton.getStyleClass().remove("modview-not-installed-button-color"); if (mod.isInstalled()) { collapsedRoot.getStyleClass().add("modview-installed"); collapsedDisplayName.getStyleClass().add("modview-installed-text-color"); collapsedStatusText.getStyleClass().add("modview-installed-text-color"); collapsedModVersion.getStyleClass().add("modview-installed-text-color"); collapsedInstallButton.getStyleClass().add("modview-installed-button-color"); expandedHeader.setId("modview-expanded-header-installed"); expandedStatusText.getStyleClass().add("modview-expanded-installed-header-color"); expandedDisplayName.getStyleClass().add("modview-expanded-installed-text-color"); expandedAuthor.getStyleClass().add("modview-expanded-installed-text-color"); expandedModVersion.getStyleClass().add("modview-expanded-installed-header-color"); expandedDescription.getStyleClass().add("modview-expanded-installed-description-text-color"); expandedInstallButton.getStyleClass().add("modview-installed-button-color"); Color color = CSSHelper.getColor("modview-installed-button-color", settings.getPropertyString("theme")); FXHelper.setColor(collapsedDeleteButton.getGraphic(), color); FXHelper.setColor(collapsedHideButton.getGraphic(), color); FXHelper.setColor(collapsedLinkButton.getGraphic(), color); } else { collapsedRoot.getStyleClass().add("modview-not-installed"); collapsedDisplayName.getStyleClass().add("modview-not-installed-text-color"); collapsedStatusText.getStyleClass().add("modview-not-installed-text-color"); collapsedModVersion.getStyleClass().add("modview-not-installed-text-color"); collapsedInstallButton.getStyleClass().add("modview-not-installed-button-color"); expandedHeader.setId("modview-expanded-header-not-installed"); expandedStatusText.getStyleClass().add("modview-expanded-not-installed-header-color"); expandedDisplayName.getStyleClass().add("modview-expanded-not-installed-text-color"); expandedModVersion.getStyleClass().add("modview-expanded-not-installed-header-color"); expandedAuthor.getStyleClass().add("modview-expanded-not-installed-text-color"); expandedDescription.getStyleClass().add("modview-expanded-not-installed-description-text-color"); expandedInstallButton.getStyleClass().add("modview-not-installed-button-color"); Color color = CSSHelper.getColor("modview-not-installed-button-color", settings.getPropertyString("theme")); FXHelper.setColor(collapsedDeleteButton.getGraphic(), color); FXHelper.setColor(collapsedHideButton.getGraphic(), color); FXHelper.setColor(collapsedLinkButton.getGraphic(), color); } } @Override public void update(final Observable observable, final Object message) { if (observable instanceof Localizer && message.equals("localechanged")) { updateStrings(); } else if (observable == mod) { String msg = (String) message; switch (msg) { case "installstatuschanged": updateImages(); updateColors(); updateStrings(); break; } } } }