package net.krazyweb.starmodmanager.view; import javafx.animation.TranslateTransition; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.Button; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import javafx.util.Duration; 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.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 ModListView implements Observer { @SuppressWarnings("unused") private static final Logger log = LogManager.getLogger(ModListView.class); private VBox root; private VBox modsBox; private AnchorPane addModPane; private Button addModButton; private ModListViewController controller; private LocalizerModelInterface localizer; private SettingsModelInterface settings; protected ModListView(final ModList modList) { settings = new SettingsFactory().getInstance(); localizer = new LocalizerFactory().getInstance(); localizer.addObserver(this); this.controller = new ModListViewController(this, modList); } protected void build() { root = new VBox(); root.setSpacing(25.0); modsBox = new VBox(); modsBox.setSpacing(10.0); addModButton = new Button(); addModButton.prefWidthProperty().bind(root.widthProperty()); addModButton.setGraphic(new ImageView(new Image(ModView.class.getClassLoader().getResourceAsStream("add-mods-plus.png")))); addModButton.setId("modlistview-add-mods-button"); addModButton.setGraphicTextGap(15); addModPane = new AnchorPane(); VBox.setVgrow(addModPane, Priority.ALWAYS); addModPane.getChildren().add(addModButton); addModButton.prefWidthProperty().bind(root.widthProperty().subtract(20)); AnchorPane.setBottomAnchor(addModButton, 0.0); AnchorPane.setLeftAnchor(addModButton, 0.0); root.getChildren().addAll( modsBox, addModPane ); createListeners(); updateStrings(); updateColors(); } private void createListeners() { addModButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(final ActionEvent e) { controller.addModButtonClicked(); } }); } private void updateStrings() { addModButton.setText(localizer.getMessage("modlistview.addmodsbutton")); } private void updateColors() { FXHelper.setColor(addModButton.getGraphic(), CSSHelper.getColor("modlistview-add-mods-button-color", settings.getPropertyString("theme"))); } protected VBox getContent() { return root; } protected void clearMods() { modsBox.getChildren().clear(); } protected void addMod(final ModView modView) { createDragListeners(modView); modsBox.getChildren().add(modView.getContent()); } protected void removeMod(final ModView modView) { modsBox.getChildren().remove(modView.getContent()); } private void createDragListeners(final ModView modView) { modView.getContent().setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(final MouseEvent e) { controller.modViewMousePressed(modView, e); e.consume(); } }); modView.getContent().setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(final MouseEvent e) { controller.modViewMouseDragged(modView, e); e.consume(); } }); modView.getContent().setOnMouseReleased(new EventHandler<MouseEvent>() { @Override public void handle(final MouseEvent e) { controller.modViewMouseReleased(modView, e); e.consume(); } }); } protected void animate(final ModView modView, final int amount) { TranslateTransition tt = new TranslateTransition(Duration.millis(80), modView.getContent()); tt.setByY(amount); tt.setCycleCount(1); tt.setAutoReverse(false); tt.setOnFinished(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { modView.moving = false; } }); tt.play(); } protected VBox getModsBox() { return modsBox; } protected void toggleExpansion() { controller.toggleExpansion(); } protected void toggleLock() { controller.toggleLock(); } protected void getNewMods() { controller.getNewMods(); } protected void searchForMods() { controller.addModButtonClicked(); } @Override public void update(final Observable observable, final Object message) { if (observable instanceof Localizer && message.equals("localechanged")) { updateStrings(); } } }