/* Copyright 2019-2020 Dmitry Isaenko This file is part of Konogonka. Konogonka 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 3 of the License, or (at your option) any later version. Konogonka 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 Konogonka. If not, see . */ package konogonka.Controllers; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.*; import javafx.scene.input.DragEvent; import javafx.scene.input.TransferMode; import javafx.scene.layout.AnchorPane; import javafx.stage.FileChooser; import konogonka.AppPreferences; import konogonka.Child.ChildWindow; import konogonka.Controllers.NCA.NCAController; import konogonka.Controllers.NPDM.NPDMController; import konogonka.Controllers.NSP.NSPController; import konogonka.Controllers.RFS.RomFsController; import konogonka.Controllers.TIK.TIKController; import konogonka.Controllers.XCI.XCIController; import konogonka.Controllers.XML.XMLController; import konogonka.MediatorControl; import konogonka.Settings.SettingsWindow; import konogonka.Tools.ISuperProvider; import java.io.*; import java.net.URL; import java.util.List; import java.util.ResourceBundle; public class MainController implements Initializable { @FXML private SplitPane splitPane; @FXML private AnchorPane logPane; @FXML private TabPane tabPane; @FXML public TextArea logArea; @FXML public ProgressBar progressBar; @FXML private Label filenameSelected; @FXML private Button analyzeBtn, settingsBtn; private String previouslyOpenedPath; @FXML private NSPController NSPTabController; @FXML private XCIController XCITabController; @FXML private NCAController NCATabController; @FXML private TIKController TIKTabController; @FXML private XMLController XMLTabController; @FXML private NPDMController NPDMTabController; @FXML private RomFsController RFSTabController; private File selectedFile; private ResourceBundle rb; @Override public void initialize(URL url, ResourceBundle resourceBundle) { this.rb = resourceBundle; MediatorControl.getInstance().setController(this); progressBar.setPrefWidth(Double.POSITIVE_INFINITY); previouslyOpenedPath = AppPreferences.getInstance().getRecentPath(); analyzeBtn.setOnAction(e->this.analyzeFile()); splitPane.getItems().remove(logPane); settingsBtn.setOnAction(e->{ new SettingsWindow(); }); } /** * Functionality for selecting NSP button. * */ public void selectFilesBtnAction(){ FileChooser fileChooser = new FileChooser(); fileChooser.setTitle(rb.getString("btnFileOpen")); File validator = new File(previouslyOpenedPath); if (validator.exists()) fileChooser.setInitialDirectory(validator); else fileChooser.setInitialDirectory(new File(System.getProperty("user.home"))); fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("NS files", "*.nsp", "*.nsz", "*.xci", "*.nca", "*.tik", "*.xml", "*.npdm", "*.romfs")); this.selectedFile = fileChooser.showOpenDialog(analyzeBtn.getScene().getWindow()); if (this.selectedFile != null && this.selectedFile.exists()) { resetAllTabsContent(); filenameSelected.setText(this.selectedFile.getAbsolutePath()); previouslyOpenedPath = this.selectedFile.getParent(); analyzeBtn.setDisable(false); String fileExtension = this.selectedFile.getName().toLowerCase().replaceAll("^.*\\.", ""); setFocusOnPane(fileExtension); } logArea.clear(); } private void resetAllTabsContent(){ analyzeBtn.setDisable(true); NSPTabController.resetTab(); XCITabController.resetTab(); NCATabController.resetTab(); TIKTabController.resetTab(); XMLTabController.resetTab(); NPDMTabController.resetTab(); RFSTabController.resetTab(); } private void setFocusOnPane(String fileExtension){ switch (fileExtension){ case "nsp": case "nsz": tabPane.getSelectionModel().select(0); break; case "xci": tabPane.getSelectionModel().select(1); break; case "nca": tabPane.getSelectionModel().select(2); break; case "tic": tabPane.getSelectionModel().select(3); break; case "xml": tabPane.getSelectionModel().select(4); break; case "npdm": tabPane.getSelectionModel().select(5); break; case "romfs": tabPane.getSelectionModel().select(6); } } /** * Start analyze * */ private void analyzeFile(){ final String fileExtension = selectedFile.getName().toLowerCase().replaceAll("^.*\\.", ""); switch (fileExtension){ case "nsp": case "nsz": NSPTabController.analyze(selectedFile); // TODO: NSP OR NSZ ? break; case "xci": XCITabController.analyze(selectedFile); break; case "nca": NCATabController.analyze(selectedFile); break; case "tic": TIKTabController.analyze(selectedFile); break; case "xml": XMLTabController.analyze(selectedFile); break; case "npdm": NPDMTabController.analyze(selectedFile); break; case "romfs": RFSTabController.analyze(selectedFile); } } private boolean isNotSupportedFileFormat(String fileExtension){ switch (fileExtension){ case "nsp": case "nsz": case "xci": case "nca": case "tic": case "xml": case "npdm": case "romfs": return false; default: return true; } } @FXML private void showHideLogs(){ if (splitPane.getItems().size() == 2) splitPane.getItems().remove(logPane); else splitPane.getItems().add(logPane); } /** * Drag-n-drop support (dragOver consumer) * */ @FXML private void handleDragOver(DragEvent event){ event.acceptTransferModes(TransferMode.ANY); event.consume(); } /** * Drag-n-drop support (drop consumer) * */ @FXML private void handleDrop(DragEvent event){ List filesDropped = event.getDragboard().getFiles(); if ( filesDropped.isEmpty() ) { event.setDropCompleted(true); event.consume(); return; } File droppedFile = filesDropped.get(0); String fileExtension = droppedFile.getName().toLowerCase().replaceAll("^.*\\.", ""); if (isNotSupportedFileFormat(fileExtension)) { event.setDropCompleted(true); event.consume(); return; } selectedFile = droppedFile; resetAllTabsContent(); filenameSelected.setText(selectedFile.getAbsolutePath()); previouslyOpenedPath = selectedFile.getParent(); analyzeBtn.setDisable(false); setFocusOnPane(fileExtension); event.setDropCompleted(true); event.consume(); } public void showContentWindow(ISuperProvider provider, IRowModel model){ try{ new ChildWindow(provider, model); } catch (IOException e){ logArea.appendText("\nUnable to create windows for "+model.getFileName()+"\n"+e.getMessage()); } }; public void exit(){ AppPreferences.getInstance().setRecentPath(previouslyOpenedPath); } }