2424import br .com .pinter .tqrespec .core .UnhandledRuntimeException ;
2525import br .com .pinter .tqrespec .core .WorkerThread ;
2626import br .com .pinter .tqrespec .logging .Log ;
27+ import br .com .pinter .tqrespec .save .SaveLocation ;
28+ import br .com .pinter .tqrespec .save .player .Archiver ;
2729import br .com .pinter .tqrespec .save .player .PlayerLoader ;
2830import br .com .pinter .tqrespec .tqdata .*;
2931import br .com .pinter .tqrespec .util .Build ;
3638import javafx .scene .Cursor ;
3739import javafx .scene .Scene ;
3840import javafx .scene .control .*;
41+ import javafx .scene .control .Button ;
42+ import javafx .scene .control .Label ;
43+ import javafx .scene .control .MenuItem ;
3944import javafx .scene .control .cell .PropertyValueFactory ;
4045import javafx .scene .input .KeyCode ;
4146import javafx .scene .input .KeyEvent ;
4550import javafx .scene .paint .Color ;
4651import javafx .scene .text .Text ;
4752import javafx .stage .*;
53+ import javafx .stage .Window ;
4854import javafx .util .Callback ;
4955import org .apache .commons .lang3 .SystemUtils ;
5056
@@ -91,6 +97,9 @@ public class CharactersViewController implements Initializable {
9197 @ FXML
9298 private TableColumn <PlayerCharacter , String > colName ;
9399
100+ @ FXML
101+ private TableColumn <PlayerCharacter , String > colStore ;
102+
94103 @ FXML
95104 private TableColumn <PlayerCharacter , Integer > colLevel ;
96105
@@ -176,6 +185,9 @@ public class CharactersViewController implements Initializable {
176185
177186 private AtomicBoolean loadingCharacters = new AtomicBoolean (false );
178187
188+ @ Inject
189+ private Archiver archiver ;
190+
179191 @ FXML
180192 public void closeWindow (@ SuppressWarnings ("unused" ) MouseEvent evt ) {
181193 close ();
@@ -225,6 +237,34 @@ public void moveWindow(MouseEvent evt) {
225237 }
226238 }
227239
240+ private void loadCharacters () {
241+ loadingCharacters .set (true );
242+
243+ Platform .runLater (() -> {
244+ charactersTable .setPlaceholder (new Label (ResourceHelper .getMessage ("characters.loadingPlaceholder" )));
245+ rootElement .getScene ().setCursor (Cursor .WAIT );
246+
247+ });
248+
249+ characters = new ArrayList <>();
250+ for (PlayerCharacterFile p : gameInfo .getPlayerCharacterList ()) {
251+ try {
252+ player .loadPlayer (p .getPlayerName (), p .getLocation ());
253+ } catch (RuntimeException e ) {
254+ logger .log (System .Logger .Level .ERROR , String .format ("Error loading character '%s'" , p ));
255+ continue ;
256+ }
257+ characters .add (player .getCharacter ());
258+ }
259+
260+ Platform .runLater (() -> {
261+ setupTable ();
262+ charactersTable .setPlaceholder (new Label ("" ));
263+ Platform .runLater (() -> rootElement .getScene ().setCursor (Cursor .DEFAULT ));
264+ loadingCharacters .set (false );
265+ });
266+ }
267+
228268 @ Override
229269 public void initialize (URL url , ResourceBundle resourceBundle ) {
230270 player .reset ();
@@ -269,31 +309,7 @@ public void initialize(URL url, ResourceBundle resourceBundle) {
269309 stage .addEventHandler (WindowEvent .WINDOW_SHOWING , e -> new WorkerThread (new MyTask <>() {
270310 @ Override
271311 protected Void call () {
272- loadingCharacters .set (true );
273-
274- Platform .runLater (() -> {
275- charactersTable .setPlaceholder (new Label (ResourceHelper .getMessage ("characters.loadingPlaceholder" )));
276- rootElement .getScene ().setCursor (Cursor .WAIT );
277-
278- });
279-
280- characters = new ArrayList <>();
281- for (PlayerCharacterFile p : gameInfo .getPlayerCharacterList ()) {
282- try {
283- player .loadPlayer (p .getPlayerName (), p .isExternal ());
284- } catch (RuntimeException e ) {
285- logger .log (System .Logger .Level .ERROR , String .format ("Error loading character '%s'" , p ));
286- continue ;
287- }
288- characters .add (player .getCharacter ());
289- }
290-
291- Platform .runLater (() -> {
292- setupTable ();
293- charactersTable .setPlaceholder (new Label ("" ));
294- Platform .runLater (() -> rootElement .getScene ().setCursor (Cursor .DEFAULT ));
295- loadingCharacters .set (false );
296- });
312+ loadCharacters ();
297313 return null ;
298314 }
299315 }).start ());
@@ -305,14 +321,84 @@ protected Void call() {
305321
306322 exportButton .setGraphic (Icon .FA_FILE_EXPORT .create ());
307323
324+ ContextMenu contextMenu = new ContextMenu ();
325+ MenuItem archive = new MenuItem (ResourceHelper .getMessage ("characters.archive" ));
326+ MenuItem unarchive = new MenuItem (ResourceHelper .getMessage ("characters.unarchive" ));
327+ MenuItem explore = new MenuItem (ResourceHelper .getMessage ("characters.explore" ));
328+ contextMenu .getItems ().add (explore );
329+ contextMenu .getItems ().add (new SeparatorMenuItem ());
330+ contextMenu .getItems ().add (archive );
331+ contextMenu .getItems ().add (unarchive );
332+
333+ explore .setOnAction (event -> {
334+ try {
335+ Runtime .getRuntime ().exec (Constants .EXPLORER_COMMAND + " "
336+ + charactersTable .getSelectionModel ().getSelectedItem ().getPath ().toString ());
337+ } catch (IOException e ) {
338+ logger .log (System .Logger .Level .WARNING , "unable to open explorer: " , e );
339+ }
340+ });
341+ archive .setOnAction (event -> archiveAction (false ));
342+ unarchive .setOnAction (event -> archiveAction (true ));
343+
344+ charactersTable .setContextMenu (contextMenu );
345+ contextMenu .setOnShowing (e -> {
346+ int selectedCount = charactersTable .getSelectionModel ().getSelectedItems ().size ();
347+ PlayerCharacter selected = charactersTable .getSelectionModel ().getSelectedItem ();
348+ archive .setDisable (selectedCount > 1 || !selected .isArchivable ());
349+ unarchive .setDisable (selectedCount > 1 || !selected .isArchived ());
350+ });
308351 stage .show ();
309352 }
310353
354+ private void archiveAction (boolean undo ) {
355+ PlayerCharacter selected = charactersTable .getSelectionModel ().getSelectedItem ();
356+
357+ String toastHeader = null ;
358+ String toastContent = null ;
359+
360+ try {
361+ rootElement .getScene ().setCursor (Cursor .WAIT );
362+ if (undo ) {
363+ archiver .unarchive (selected );
364+ toastHeader = "characters.unarchive" ;
365+ toastContent = "characters.unarchivedmessage" ;
366+ } else {
367+ archiver .archive (selected );
368+ toastHeader = "characters.archive" ;
369+ toastContent = "characters.archivedmessage" ;
370+ }
371+ } catch (IOException e ) {
372+ throw new UnhandledRuntimeException (e );
373+ } finally {
374+ reset ();
375+ SaveLocation locationMessage = selected .getLocation ();
376+ if (locationMessage .equals (SaveLocation .ARCHIVEMAIN )) {
377+ locationMessage = SaveLocation .MAIN ;
378+ }
379+ if (locationMessage .equals (SaveLocation .ARCHIVEUSER )) {
380+ locationMessage = SaveLocation .USER ;
381+ }
382+
383+ rootElement .getScene ().setCursor (Cursor .DEFAULT );
384+ Toast .show ((Stage ) rootElement .getScene ().getWindow (),
385+ ResourceHelper .getMessage (toastHeader ),
386+ ResourceHelper .getMessage (toastContent ,
387+ selected .getName (), ResourceHelper .getMessage ("characters.store." + locationMessage )),
388+ 5000 );
389+ }
390+ }
391+
311392 private void setupTable () {
312393 //setup tableview
313394 setupTableColumnString (colName , ResourceHelper .getMessage ("characters.characterName" ), "name" );
395+ setupTableColumnString (colStore , ResourceHelper .getMessage ("characters.store" ), null );
314396 setupTableColumnInteger (colLevel , ResourceHelper .getMessage ("main.charlevel" ), "level" );
315397 setupTableColumnString (colGender , ResourceHelper .getMessage ("main.gender" ), null );
398+
399+ colStore .setCellValueFactory ( f -> new SimpleStringProperty (
400+ ResourceHelper .getMessage ("characters.store." + f .getValue ().getLocation ().toString ().toUpperCase ())
401+ ));
316402 colGender .setCellValueFactory (f -> new SimpleStringProperty (
317403 ResourceHelper .getMessage ("main.gender." + f .getValue ().getGender ().name ().toLowerCase ())));
318404
@@ -399,6 +485,15 @@ private void setupTable() {
399485
400486 charactersTable .getItems ().addAll (characters );
401487
488+ charactersTable .getSelectionModel ().setSelectionMode (SelectionMode .MULTIPLE );
489+
490+ resizeCharactersTable ();
491+ }
492+
493+ private void reset () {
494+ charactersTable .getItems ().clear ();
495+ characters .clear ();
496+ loadCharacters ();
402497 resizeCharactersTable ();
403498 }
404499
@@ -448,6 +543,7 @@ public void exportCsv() {
448543
449544 String [] header = new String []{
450545 ResourceHelper .getMessage ("characters.characterName" ),
546+ ResourceHelper .getMessage ("characters.store" ),
451547 ResourceHelper .getMessage ("main.charlevel" ),
452548 ResourceHelper .getMessage ("main.gender" ),
453549 ResourceHelper .getMessage ("main.charclass" ),
@@ -517,6 +613,7 @@ public void exportCsv() {
517613
518614 String [] row = new String []{
519615 p .getName (),
616+ ResourceHelper .getMessage ("characters.store." + p .getLocation ()),
520617 String .valueOf (p .getLevel ()),
521618 gender ,
522619 p .getCharacterClass (),
0 commit comments