konogonka/src/main/java/konogonka/Controllers/MainController.java

268 lines
8.3 KiB
Java

/*
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 <https://www.gnu.org/licenses/>.
*/
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<File> 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); }
}