package spdxedit;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.Pane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.Window;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.spdx.rdfparser.SpdxDocumentContainer;
import org.spdx.rdfparser.model.SpdxPackage;
import spdxedit.license.LicenseEditControl;
import spdxedit.util.UiUtils;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Optional;
public class NewPackageDialog {
private static final Logger logger = LoggerFactory.getLogger(NewPackageDialog.class);
@FXML
private Button ok;
@FXML
private Button cancel;
@FXML
private TextField name;
@FXML
private CheckBox chkOmitHiddenFiles;
@FXML
private CheckBox chkRemotePackage;
@FXML
private TextArea downloadLocation;
@FXML
private TitledPane paneDeclaredLicense;
private Path path;
private SpdxDocumentContainer documentContainer;
private LicenseEditControl declaredLicenseEdit;
public static SpdxPackage createPackageWithPrompt(Window parentWindow, Optional<Path> path, SpdxDocumentContainer documentContainer) {
final NewPackageDialog controller = new NewPackageDialog(path, documentContainer);
final Stage dialogStage = new Stage();
dialogStage.setTitle("Create SPDX Package");
dialogStage.initModality(Modality.APPLICATION_MODAL);
dialogStage.setY(parentWindow.getX() + parentWindow.getWidth() / 2);
dialogStage.setY(parentWindow.getY() + parentWindow.getHeight() / 2);
try {
FXMLLoader loader = new FXMLLoader(NewPackageDialog.class.getResource("/NewPackageDialog.fxml"));
loader.setController(controller);
Pane pane = loader.load();
Scene scene = new Scene(pane);
dialogStage.getIcons().clear();
dialogStage.getIcons().add(UiUtils.ICON_IMAGE_VIEW.getImage());
dialogStage.setScene(scene);
dialogStage.setOnShown(event -> {
if (path.isPresent()) {
controller.name.setText(path.get().getFileName().toString());
}
});
//Won't assign this event through FXML - don't want to propagate the stage beyond this point.
controller.ok.setOnMouseClicked(event -> dialogStage.close());
if (!path.isPresent()){//No path provided. Must be remote.
controller.chkRemotePackage.setSelected(true);
controller.chkRemotePackage.setDisable(true);
controller.chkOmitHiddenFiles.setSelected(false);
controller.chkOmitHiddenFiles.setDisable(true);
}
dialogStage.showAndWait();
return controller.createSpdxPackageFromInputs();
} catch (IOException ioe) {
throw new RuntimeException("Unable to load dialog", ioe);
}
}
private NewPackageDialog(Optional<Path> path, SpdxDocumentContainer documentContainer) {
this.path = path.orElse(null);
this.documentContainer = documentContainer;
}
@FXML
void initialize() {
assert ok != null : "fx:id=\"ok\" was not injected: check your FXML file 'NewPackageDialog.fxml'.";
assert cancel != null : "fx:id=\"cancel\" was not injected: check your FXML file 'NewPackageDialog.fxml'.";
assert name != null : "fx:id=\"name\" was not injected: check your FXML file 'NewPackageDialog.fxml'.";
assert downloadLocation != null : "fx:id=\"downloadLocation\" was not injected: check your FXML file 'NewPackageDialog.fxml'.";
assert chkOmitHiddenFiles != null : "fx:id=\"chkOmitHiddenFiles\" was not injected: check your FXML file 'NewPackageDialog.fxml'.";
assert chkRemotePackage != null : "fx:id=\"chkRemotePackage\" was not injected: check your FXML file 'NewPackageDialog.fxml'.";
assert paneDeclaredLicense != null : "fx:id=\"paneDeclaredLicense\" was not injected: check your FXML file 'NewPackageDialog.fxml'.";
declaredLicenseEdit = new LicenseEditControl(this.documentContainer, null, false);
paneDeclaredLicense.setContent(declaredLicenseEdit.getUi());
}
private SpdxPackage createSpdxPackageFromInputs() {
Optional<Path> pathForPackage = chkRemotePackage.isSelected() ? Optional.empty() : Optional.of(this.path);
return SpdxLogic.createSpdxPackageForPath(pathForPackage, this.documentContainer.getSpdxDocument(), declaredLicenseEdit.getValue(), name.getText(), downloadLocation.getText(), chkOmitHiddenFiles.isSelected());
}
}