Table des matières

TD 7 : Cartographie martienne (suite)

Création d’une carte vierge

Nous allons ajouter la possibilité de créer une carte vierge d’une certaine taille. Ajoutez les lignes suivantes dans la classe EditorView.

MenuItem newItem = new MenuItem("New map");

// New map
newItem.setOnAction(e -> {
    Form form = new Form(stage, "Size of the map : width x height");
    String[] parts = form.getText().replaceAll("\\s+","").split("x");
    if (parts.length != 2)
        return;
    try {
        int x = Integer.parseInt(parts[0]);
        int y = Integer.parseInt(parts[1]);
        this.grid = gridRepoString.create(x, y);
        updateGrid(grid);
    } catch (NumberFormatException numberFormatException) {
        return;
    }
});

1) Ajoutez la ligne newItem, new SeparatorMenuItem(), dans fileMenu.getItems().addAll(`

2) Implémentez la méthode public Grid create(int width, int height) { } dans la classe GridRepoString et testez votre code. Cette méthode doit créer une nouvelle carte et la remplir avec Entity.GROUND.

3) Pour rendre la manipulation des cartes plus faciles, ajoutez les lignes suivantes dans la méthode createTile de la classe GridView.

ColorAdjust colorAdjust = new ColorAdjust();
colorAdjust.setBrightness(-0.2);
tile.setOnMouseEntered(e -> {
    if (e.isShiftDown()) {
        update(tile, i, j);
    }
    tile.setEffect(colorAdjust);
});
tile.setOnMouseExited(e -> {
    tile.setEffect(null);
});

Gestion des fichiers

Nous allons faire évoluer notre classe gridRepoStringRLE pour qu’elle puisse être utilisée pour lire et écrire dans un fichier. L’objectif est que cette classe implémente une deuxième interface GridRepoIO définie ci-dessous.

public interface GridRepoIO {
    Grid load(Reader in) throws IOException;
    void export(Grid grid, Writer ou) throws IOException;
}

1) Modifiez la déclaration de la variable gridRepoStringRLE dans la classe EditorView pour que son type soit le suivant :

GridRepoStringRLE gridRepoStringRLE = new GridRepoStringRLE();

2) Ajoutez les méthodes nécessaires dans la classe gridRepoStringRLE. Faites en sorte de factoriser les traitements entre les différentes méthodes load et export.

3) Ajoutez les lignes suivantes dans la classe EditorView. Ajoutez les déclarations nécessaires et faites en sorte que le menu soit mis à jour. Testez votre application.

// Load from file
loadItemF.setOnAction(e -> {
    File file = fileChooser.showOpenDialog(stage);
    if (file != null) {
        // Chargement depuis un fichier (avec compression)
    }
});

// Export to file
exportItemF.setOnAction(e -> {
    File file = fileChooser.showSaveDialog(stage);
    if (file != null) {
        // Sauvegarde dans un fichier (avec compression)
    }
});