11package ihm ;
22
33import java .util .logging .Logger ;
4- import java .util .logging .Level ;
54import java .awt .Color ;
65import java .awt .Dimension ;
76import java .awt .event .ActionEvent ;
87import java .awt .event .ActionListener ;
98import java .awt .event .MouseEvent ;
109import java .awt .event .MouseListener ;
1110import java .awt .event .MouseMotionListener ;
12- import java .io .BufferedWriter ;
1311import java .io .File ;
14- import java .io .FileWriter ;
1512import java .io .IOException ;
13+ import java .nio .file .StandardOpenOption ;
1614
1715import com .google .common .annotations .VisibleForTesting ;
1816import javax .swing .*;
1917
2018import logic .TileType ;
2119import logic .Controller ;
2220import logic .LevelFile ;
21+ import one .util .streamex .IntStreamEx ;
2322
2423public class Editor extends JFrame implements MouseListener , MouseMotionListener {
24+
25+ private final LevelFile levelFile ;
26+
2527 @ VisibleForTesting
2628 enum Component {
2729 // Tool buttons
@@ -63,18 +65,13 @@ TileType getContent() {
6365
6466 public Editor (int rowCount , int columnCount , String name ) throws IOException {
6567
66- FileWriter levelWriter = new FileWriter (new File (new File ("." ).getCanonicalPath () + "/levels/" + name + ".txt" ));
67- BufferedWriter lowerWriter = new BufferedWriter (levelWriter );
68- for (int i = 0 ; i < rowCount ; i ++ ) {
69- lowerWriter .write ("_" .repeat (columnCount ));
70- lowerWriter .newLine ();
71- }
72- lowerWriter .close ();
73- levelWriter .close ();
68+ levelFile = LevelFile .of (name );
69+ initializeEmptyLevel (rowCount , columnCount );
7470
75- controller = new Controller (new File (new File ("." ).getCanonicalPath () + "/levels/" + name + ".txt" ).getPath ());
71+ controller = new Controller (new File (new File ("." ).getCanonicalPath () + "/levels/" + name + ".txt" ).getPath ());
7672 windowWidth = controller .warehouse .getColumns () * TILE_SIZE ;
7773 windowHeight = controller .warehouse .getLines () * TILE_SIZE ;
74+
7875 this .setDefaultCloseOperation ( JFrame .EXIT_ON_CLOSE );
7976 this .setTitle ("Sokoban v1.0 par Gabriel FARAGO" );
8077 this .setPreferredSize (new Dimension (windowWidth + 150 , Math .max (windowHeight + 150 , 330 )));
@@ -171,34 +168,16 @@ public void actionPerformed(ActionEvent e) {
171168 }
172169
173170 if (line .length () == columnCount && i +1 == columnCount ) {
174- try {
175- FileWriter levelWriter = new FileWriter (new File (new File ("." ).getCanonicalPath () + "/levels/" + name + ".txt" ));
176- BufferedWriter lowerWriter = new BufferedWriter (levelWriter );
177- lowerWriter .write (line );
178- lowerWriter .close ();
179- levelWriter .close ();
180- line = "" ;
181- } catch (IOException e1 ) {
182- LOGGER .log (Level .SEVERE , "Error while writing level file: " + name , e1 );
183- }
171+ LevelFile .of (name ).write (line );
172+ line = "" ;
184173 }
185174 else if (line .length () == columnCount ) {
186- try {
187- FileWriter levelWriter = new FileWriter (new File (new File ("." ).getCanonicalPath () + "/levels/" + name + ".txt" ), true );
188- BufferedWriter lowerWriter = new BufferedWriter (levelWriter );
189- lowerWriter .newLine ();
190- lowerWriter .write (line );
191- lowerWriter .close ();
192- levelWriter .close ();
193- line = "" ;
194- } catch (IOException e1 ) {
195- LOGGER .log (Level .SEVERE , "Error while writing level file: " + name , e1 );
196- }
175+ LevelFile .of (name ).write (System .lineSeparator () + line , StandardOpenOption .APPEND );
176+ line = "" ;
197177 }
198178 }
199179 dispose ();
200180 new HomeWindow ();
201-
202181 }
203182 else {
204183 invalid_level .setText ("Invalid level!" );
@@ -222,6 +201,14 @@ else if (line.length() == columnCount) {
222201 this .setVisible ( true );
223202 }
224203
204+ private void initializeEmptyLevel (int rowCount , int columnCount ) {
205+ String content = IntStreamEx
206+ .range (rowCount )
207+ .mapToObj (i -> "_" .repeat (columnCount ))
208+ .joining (System .lineSeparator ());
209+ levelFile .write (content );
210+ }
211+
225212 private void createQuitButton (String name ) {
226213 JButton quit = new JButton ("Quit" );
227214 quit .setName (Component .QUIT_BUTTON .name ());
0 commit comments